Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.07.02;
Скачать: [xml.tar.bz2];

Вниз

Как установить значения поля по умолчанию в добавляемой записи   Найти похожие ветки 

 
Nike   (2006-05-05 11:58) [0]

Здравствуйте! Пишу программу, использующую БД формата Access, доступ осуществляется через ADO. При создании базы в самом Access задал для некоторых полей (строковых и числовых) значения по умолчанию. При добавлении записи в моей программе (редактирование идет в DBGridе) в соответствующих полях не устанавливаются значения по умолчанию.  Чтобы отобразить эти значения необходимо сначала сохранить только что добавленную запись, а затем вызвать метод Refresh для таблицы. Тогда значения по умолчанию становятся видимыми в DbGride. Мне же надо чтобы при нажатии на "Добавить запись" в новой записи были уже установлены дефолтовые значение. Как этого добиться?


 
ANB ©   (2006-05-05 12:06) [1]

Есть событие OnNewRecord или AfterInsert;


 
Reindeer Moss Eater ©   (2006-05-05 12:09) [2]

Зачем устанавливать дефолтные значения для полей на уровне таблицы, если с клиента все равно идет вставка значений в эти поля?
Твои табличные дефолты все равно ни разу не сработают.


 
Nike   (2006-05-05 12:14) [3]

Проблема еще и в том, что если в инспекторе объектов просмотреть свойство ДефолтЭкспрессион для интересующих полей таблицы, то вместо введеных значений там хранятся пустые строки
To Reindeer Moss Eater
Я хочу тобы при нажатии на "Добавить запись" в новой записи были уже установлены дефолтовые значения, и пользователю не приходилось догадываться, что если он не отредактирует поле, то туда будет записано значение по умолчанию


 
ANB ©   (2006-05-05 12:17) [4]


> то туда будет записано значение по умолчанию

Оно туда не будет записано ни при каком раскладе. Разве что ты сам формируешь инсерт и анализируешь, вводил юзер данные или нет.


 
Sergey13 ©   (2006-05-05 12:35) [5]

2[2] Reindeer Moss Eater ©   (05.05.06 12:09)
А в чем тут противоречие? Клиентов как и способов ввода может быть множество.
Автор просто немного не понимает мехонизма работы дефолтных значений.


 
Nike   (2006-05-05 12:51) [6]

А разве нельзя сделать так - нажимаешь инсерт рекорд, в ДБГриде появляется новая запись, но вместо пустых значений в некоторых полях записаны значения по умолчанию??


 
Nike   (2006-05-05 13:07) [7]

Сабжа можно добиться, к примеру, следующим путем:

1. Пользователь нажимает добавить запись.
2. Я отменяю добавление записи методом Cancel
3. Я сам формирую новую запись, вставляя в нужные поля дефолтовые значения, в индексированные поля уникальные значения.
4. Добавляю сформированную запись методом AppendRecord(значения полей)
5. Ставлю указатель в таблице на эту запись и перевожу таблицу в режим редактирования (Edit).

В результате у пользователя должно сложиться впечатление, что при добавлении новой записи программа сама заполняет поля значениями по умолчанию.
Вот примерно этого я и хочу добиться, только более простым путем...


 
Sergey13 ©   (2006-05-05 13:07) [8]

2 [6] Nike   (05.05.06 12:51)
>А разве нельзя сделать так - нажимаешь инсерт рекорд, в ДБГриде появляется новая запись
Так она только в гриде (не в нем, а в датасете ессно) и появляется. В БД, где ты прописал дефолты ее еще нет. И БД не знает что ты там и где нажал. Отсюда и "проблема" твоя.


 
Sergey13 ©   (2006-05-05 13:08) [9]

2[7] Nike   (05.05.06 13:07)
Тебе даже путь для этого указали в [1] ANB ©   (05.05.06 12:06)


 
Reindeer Moss Eater ©   (2006-05-05 13:11) [10]

А в чем тут противоречие?

В том, что создаваемый констрейнт никогда не сработает.


 
Sergey13 ©   (2006-05-05 13:12) [11]

2[10] Reindeer Moss Eater ©   (05.05.06 13:11)
Никогда не говори никогда. 8-)


 
Reindeer Moss Eater ©   (2006-05-05 13:15) [12]

Они сработают, если юзер заюзает MSQuery и сделает ручной инсерт в таблицу, перечислив явно поля для вставки и уберет поле с дефолтом из списка полей.


 
Sergey13 ©   (2006-05-05 13:20) [13]

2[12] Reindeer Moss Eater ©   (05.05.06 13:15)
Ты в принципе отвергаешь такую вероятность? 8-)


 
Nike   (2006-05-05 13:23) [14]

To Sergey13 ©   (05.05.06 13:07) [8]
Я понимаю, что БД не может проверить ту запись, которой в ней еще нет. Но разве нет метода, который бы добавлял не пустую запись, а шаблон (с дефолтами)?

Почему инспектор объектов не видит мои аксессовские дефолты в поле DefaultExpression у объекта TField? (показывает пустую строку)


 
Reindeer Moss Eater ©   (2006-05-05 13:24) [15]

Нет не отвергаю. Это же Access.
Я говорю про корявость и нелогичность дизайнерского решения.
Там где требуется обработка на уровне newrecord датасета зачем-то лепят серверные биснес-правила.
Чума.


 
Sergey13 ©   (2006-05-05 13:26) [16]

2 [14] Nike   (05.05.06 13:23)
> Но разве нет метода
Есть один универсальный - написать нужный код.


 
Sergey13 ©   (2006-05-05 13:29) [17]

2[15] Reindeer Moss Eater ©   (05.05.06 13:24)
Просто ты рассматриваешь конкретно эту ситуацию, описанную автором для конкретной формы с конкретным гридом и конкретными желаниями.
А я говорю вообще. В нормально спроектированной и написанной системе большинство констрейнтов и исключений никогда не срабатывают. Но это не значит, что не надо вводить констрейнты и ловить возможные исключения. Не так?


 
Reindeer Moss Eater ©   (2006-05-05 13:33) [18]

Все это так.
Только я действительно нахожусь в конкретной ветке с конкретным вопросом и рассуждаю конкретно.

Если уж на то пошло, то в SQL explorer есть замечательный инструмент - Dictionary. Создать словарь для своей БД насовать туда нужную логику и IDE подружится с разрабатываемой БД по самое не грусти.

Не так?


 
Nike   (2006-05-05 13:41) [19]

Ответьте на второй вопрос, плиз:
Почему инспектор объектов не видит мои аксессовские дефолты в поле DefaultExpression у объекта TField? (показывает пустую строку)


 
Reindeer Moss Eater ©   (2006-05-05 13:43) [20]

Потому что поле асess и экземпляр TField - разные вещи, а не муж и жена.


 
ANB ©   (2006-05-05 16:30) [21]


> Nike   (05.05.06 13:41) [19]
> Ответьте на второй вопрос, плиз:
> Почему инспектор объектов не видит мои аксессовские дефолты
> в поле DefaultExpression у объекта TField? (показывает пустую
> строку)

А кто тебе сказал, что ADO умеет лазить по словарям всех типов БД, выцеплять оттуда дефолты и подставлять ? В списке полей их надо самому заполнить.


 
Anatoly Podgoretsky ©   (2006-05-05 19:57) [22]

Nike   (05.05.06 13:23) [14]
Шаблон и defaults - это разные вещи, если тебе нужен шаблон, так и сделай его.


 
Slym ©   (2006-05-06 05:29) [23]

Пример работы со схомой данных, применаятся на BeforePost
На основе этого сделай желаемое и поставь на AfterInsert
procedure TDM.ValidateTable(DataSet: TDataSet;const ATableName:string="");
var
 TableName:string;
 Strings:TStringList;
 DS:TADODataSet;
 IsNullable,Description:TField;
 i:integer;
begin
 if ATableName<>"" then TableName:=ATableName else TableName:=DataSet.Name;
 Strings:=TStringList.Create;
 try
   DS:=TADODataSet.Create(nil);
   try
     Conn.OpenSchema(siColumns,EmptyParam,EmptyParam,DS);
     IsNullable:=DS.FieldByName("IS_NULLABLE");
     Description:=DS.FieldByName("DESCRIPTION");
     for i:=0 to DataSet.FieldCount-1 do
     with DataSet.Fields[i] do
     begin
       if IsNull and not ReadOnly then
       begin
         if not DS.Locate("TABLE_NAME;COLUMN_NAME",VarArrayOf([TableName,FieldName]),[]) then
           Continue;
         if IsNullable.AsBoolean then Continue;
         if not Description.IsNull then
           Strings.Add("""+Description.AsString+""")
         else
           Strings.Add("""+FieldName+""");
       end;
     end;
   finally
     DS.Free;
   end;
   if Strings.Count>0 then
   begin
     Strings.Insert(0,"Не заполнены обязательные поля:");
     Application.MessageBox(Strings.GetText,"Ошибка!",MB_ICONERROR);
     Abort;
   end;
 finally
   Strings.Free;
 end;
end;



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2006.07.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.009 c
2-1150395605
Naduev Aleksei
2006-06-15 22:20
2006.07.02
TDUMP


15-1148145082
transgression
2006-05-20 21:11
2006.07.02
Депрессивная тема


10-1121666784
ORMADA
2005-07-18 10:06
2006.07.02
IDE получить имя текущего проекта


1-1148205429
RUNaum
2006-05-21 13:57
2006.07.02
Поворот PNG без искажений.


11-1129730250
Dmitry Galin
2005-10-19 17:57
2006.07.02
KOLPrinters





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский