Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.02;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.032 c
2-1150207607
Тимофей Юрьевич
2006-06-13 18:06
2006.07.02
ошибка


15-1149510150
oldman
2006-06-05 16:22
2006.07.02
Валуев защитил титул чемпиона мира.


3-1146878673
Olesya
2006-05-06 05:24
2006.07.02
Хранение фото в базе


2-1149847414
Balkon
2006-06-09 14:03
2006.07.02
Причина ошибки Access Violation


2-1149756378
worldmen
2006-06-08 12:46
2006.07.02
SQL. Вывод первых несколько записей