Форум: "Базы";
Текущий архив: 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
На основе этого сделай желаемое и поставь на AfterInsertprocedure 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