Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.08.2011, 08:00   #1
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию Interbase как правильно заполненить поле по Default

Вопрос ламемерский, не пинайте сильно пожалуйста. Просто не знаю как правильно спросить это у google.
Есть, например, таблица MAN с полями
Табельный номер (tab_num) - типа integer
ФИО (FIO)- типа Varchar
Дата рождения (Data_r)- типа date
пишу такой код
Код:
ibsql.sql.clear;
ibsql.sql.add('insert into man (tab_num, FIO, Data_r) values (:tab_num, :FIO, :Data_r)');
ibsql.parambyname('tab_num').asinteger:=tab_numEdit.value; //Компонент из набора EhLib (DBNumberEditEh1)
ibsql.parambyname('FIO').asstring:=FioEdit.text;
ibsql.parambyname('Data_r').asdate:=Data_rEdit.text; //Компонент из набора EhLib (DBDateTimeEditEh1)
ibsql.execquery;
Все отлично если все Edit'ы заполнены, а если не заполнена дата или номер, как в этом случае заполнить значением по умолчанию? каждый раз проверять Edit? Как правильно поступать в таких ситуациях?
tarakan1983 вне форума Ответить с цитированием
Старый 19.08.2011, 08:37   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
каждый раз проверять Edit?
ну а почем бы и нет?!

я бы проверял все нужные Edit'ы и формировал в RunTime нужную строку запроса в зависимости от того, заполнены они или нет...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.08.2011, 08:41   #3
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
формировал в RunTime нужную строку запроса
а можно пример?
tarakan1983 вне форума Ответить с цитированием
Старый 19.08.2011, 08:44   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

default из СУБД в конкретное поле записи вставится только, если в перечне полей команды Insert нет упоминания этого поля. Программно использовать default? Если у СУБД есть средства, позволяющие запросом вернуть значения default - используйте этот прием, нет - тогда проблема. И зачем ibsql.parambyname('Data_r').asdate: =Data_rEdit.text? Почему не Data_rEdit.Date?

add Пока набирал, целый диалог прошел об том же самом
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 19.08.2011 в 08:48.
Аватар вне форума Ответить с цитированием
Старый 19.08.2011, 19:32   #5
BARNEY
Участник клуба
 
Регистрация: 23.04.2009
Сообщений: 1,058
По умолчанию

tarakan1983
Ну ещё есть понятие тригер
будет что то типо
Код:
if Data_rEdit='' then Data_rEdit='01.01.0001'
Но это если лень в проге строчку собирать
Если вам человек помог, не стесняйтесь говорить спасибо (весы под аватаром)
BARNEY вне форума Ответить с цитированием
Старый 19.08.2011, 19:37   #6
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

BARNEY
А где почитать как правильно сделать именно такой триггер? Если я его создам прямо в БД, то как потом к нему обратиться из Delphi?
tarakan1983 вне форума Ответить с цитированием
Старый 19.08.2011, 20:31   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А может всетки посмотреть в сторону Default?

P.S. разве что у тебя будет жесткое правило - в поле, выставляемом по умолчанке нет null в уже имеющихся записях, тогда еще можно копнуть триггер
Код:
CREATE TRIGGER NEW_TABLE_AI0 FOR NEW_TABLE
ACTIVE AFTER INSERT POSITION 0
AS
begin
  update new_table set ere='2011-01-01' where ere is null;
end
Который будет вставлять дату во все поля с null после запроса типа
Код:
ibsql.sql.text:='insert into new_table (new_field) values (89)';...
Но это далеко не всегда правильно и удобно, разве что ты в триггер поместишь некие многочисленные вычисления.
А раз тебе просто нужно по умолчанке дату вбить не парься с триггерами - нарвешся на баги.
I'm learning to live...

Последний раз редактировалось Stilet; 19.08.2011 в 20:35.
Stilet вне форума Ответить с цитированием
Старый 19.08.2011, 21:02   #8
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

короче я понял из всего прочитанного, что лучше сделать так
Код:
var
i:integer;
d:date
begin
try
i:=tab_numEdit.value;
d:=Data_rEdit.Date;
except
i:=0;
d:='01.01.0001';
end;
end;
это будет правильно?
tarakan1983 вне форума Ответить с цитированием
Старый 19.08.2011, 21:09   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
это будет правильно?
Но не перспективно.
А вдруг ты захочешь программу переписать с нуля, но скажем новым технологиям и тупо забудешь о том что она должна еше нести такую мусорную нагрузку?
Тем паче что это клиент, а клиентские части проекта такими вещами стараются не нагружать - опять таки приведу пример: у тебя одна БД на сервере и миллион компов с твоей прогой. ШЕф приказал "Немедленно поменяй дату по умолчанию". Ты что будешь заново прогу перекомпилировать, потом умолять слезно пользователей обновиться? А если к их компу сейчас доступа нет - (выключил-закрыл на замок комнату и уехал в командировку)? А правильный АБД, просто сменить в базе параметр, и это отразится на всех клиентах не прерывая их работы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.08.2011, 21:10   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Не уверен. Скорее всего компоненты из Data_rEdit.Date вернет 0 если введена недопустимая дата, tab_numEdit.value - value какого типа? Короче - except возможно никогда не возникнет. И date - какого типа? Наверно TDateTime. И d:='01.01.0001' - строку в TDatrTime?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ проблема с switch и default Script Помощь студентам 3 16.07.2011 16:07
как настроить Interbase Armina Общие вопросы C/C++ 1 24.09.2010 17:31
Как сделать backup restor в interbase tarakan1983 БД в Delphi 7 02.09.2010 15:42
default параметры NieL Общие вопросы Delphi 2 19.12.2008 17:16
Строка DEFAULT Altera Компоненты Delphi 2 07.03.2008 17:12