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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.10.2009, 19:49   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,194
Вопрос Firebird.pFIBQuery.Вставка записи

Всем добрый вечер! По крайней мере у меня уже вечер . Вопрос заключается в следующем. Через pFIBDataSet генерируется такой запрос вставки в таблицу:
Код:
INSERT INTO CHETVERTY(ID,CHETVERT,DATASTART,DATAEND) VALUES(:ID,:CHETVERT,:DATASTART,:DATAEND)
. Вопрос в следующем: как вместо :ID,:CHETVERT,:DATASTART,:DATAEND записать правильно, что данные вставлялись из sDateEdit-a? Запись в строку DATASTART должна вставляться из sDateEdit1, а в строку DATAEND из sDateEdit2. Заранее спасибо за разъяснение.
Пробовал сделать хотя бы так:
Код:
procedure TForm3.sButton1Click(Sender: TObject);
begin
 Form3.pFIBQuery1.ParamValue('DATASTART').AsDate:=Form3.sDateEdit1.Date;
 Form3.pFIBQuery1.SQL.Clear;
 Form3.pFIBQuery1.SQL.Text:='insert into CHETVERTY(ID,CHETVERT,DATASTART,DATAEND) values(null,null,:DATASTART,null)';
 Form3.pFIBQuery1.ExecQuery;
end;
Но, не работает.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 08.10.2009 в 20:17. Причина: Пытался кое что придумать :)
artemavd вне форума Ответить с цитированием
Старый 08.10.2009, 20:24   #2
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

Form3.pFIBQuery1.ParamValue('DATAST ART').AsDate:=Form3.sDateEdit1.Date ;
Form3.pFIBQuery1.SQL.Clear;
а может строки эти местами поменять
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 08.10.2009, 22:43   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Sparky, мне кажется, что Вы правы, только задание параметров должно быть ПОСЛЕ задания текста запроса!

т.о., если бы использовался обычный TQuery
последовательность должна была быть такой:
Код:
 Form3.pFIBQuery1.SQL.Clear;
 Form3.pFIBQuery1.SQL.Text:='insert into CHETVERTY(ID,CHETVERT,DATASTART,DATAEND) values(null,null,:DATASTART,null)';
 Form3.pFIBQuery1.ParamValue('DATASTART').AsDate:=Form3.sDateEdit1.Date;
 Form3.pFIBQuery1.ExecQuery;
но, возможно, что потребуется дополнительно в коде ДОБАВИТЬ параметр в Form3.pFIBQuery1 !
а может и не потребуется...

Артём, я бы рекомендовал такой подход:
не надо ненужной универсальности. один "лишний" query много памяти не займёт...
Киньте на форму отдельный FIBQuery1
переменуйте его более осмысленно (например, FIBquery_InsertChetverti
в этот запрос прямо в Design-time задать текст запроса и добавить ПЕРЕМЕННУЮ ЗАПРОСА...
тогда добавление в коде полностью будет выглядеть так:
Код:
 Form3.FIBquery_InsertChetverti.ParamValue('DATASTART').AsDate:=Form3.sDateEdit1.Date;
 Form3.FIBquery_InsertChetverti.ExecQuery;
p.s. и последнее.
а что это за запрос?!!!!!!!
Код:
insert into CHETVERTY(ID,CHETVERT,DATASTART,DATAEND) values(null,null,:DATASTART,null)
У Вас что, ключевое поле ID может быть NULL ?!! Тогда у Вас неправильно спроектирована структура таблицы!!!!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.10.2009, 05:58   #4
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,194
По умолчанию

Цитата:
в этот запрос прямо в Design-time задать текст запроса и добавить ПЕРЕМЕННУЮ ЗАПРОСА...
В смысле? Это как?
Цитата:
p.s. и последнее.
а что это за запрос?!!!!!!!
Код:

Код:
insert into CHETVERTY(ID,CHETVERT,DATASTART,DATAEND) values(null,null,:DATASTART,null)
У Вас что, ключевое поле ID может быть NULL ?!! Тогда у Вас неправильно спроектирована структура таблицы!!!!
Нет, разумеется нет. Я просто пытался хоть как-то составить запрос. Под ID я подразумеваю (да это так и есть) ключевое поле, автоикриментное. Просто, не знал, что записать. С параметрами не работал ранее. Структура таблицы спроектирована правильно.
P.S. Serge_Bliznykov, Вы ж знаете, как она спроектирована)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 09.10.2009, 09:48   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Код:
 Form3.pFIBQuery1.SQL.Clear;
 Form3.pFIBQuery1.SQL.Text:='insert into CHETVERTY(CHETVERT,DATASTART) values(''Четвертушка'',:DSTART)';
 Form3.pFIBQuery1.ParamValue('DSTART').AsDate:=Form3.sDateEdit1.Date;
 Form3.pFIBQuery1.ExecQuery;
так работает?!


и ещё. на оффсайте FibPlus
лежит обалденнейший мануал:
"FIBPlus696 Developers Guide.pdf"
там ответы на все ваши (как возникшие (с параметрами, так и на почти все будущие ... )

Последний раз редактировалось Serge_Bliznykov; 09.10.2009 в 09:56.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.10.2009, 10:58   #6
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
а что это за запрос?!!!!!!!
Код:
insert into CHETVERTY(ID,CHETVERT,DATASTART,DATAEND) values(null,null,:DATASTART,null)
У Вас что, ключевое поле ID может быть NULL ?!! Тогда у Вас неправильно спроектирована структура таблицы!!!!
а чем плоха простановка значения в триггере (before insert) посредством генератора?
или скорее всего можно тот же самый генератор указать в самом компоненте (ФИБ+ много чего умеют - просто нужно уметь ими пользоваться)
soleil@mmc вне форума Ответить с цитированием
Старый 09.10.2009, 11:36   #7
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,194
По умолчанию

Цитата:
Form3.pFIBQuery1.SQL.Clear;
Form3.pFIBQuery1.SQL.Text:='insert into CHETVERTY(CHETVERT,DATASTART) values(''Четвертушка'',:DSTART)';
Form3.pFIBQuery1.ParamValue('DSTART ').AsDate:=Form3.sDateEdit1.Date;
Form3.pFIBQuery1.ExecQuery;


так работает?!
Нет. Выдает ошибку: "Invalid variant oreration" и выделяет строку:
Код:
 Form3.pFIBQuery1.SQL.Clear;
 Form3.pFIBQuery1.SQL.Text:='insert into CHETVERTY(CHETVERT,DATASTART) values("1 четверть",:DATASTART)';
 Form3.pFIBQuery1.ParamValue('DATASTART').AsDate:=Form3.sDateEdit1.Date;
 Form3.pFIBQuery1.ExecQuery;
Цитата:
и ещё. на оффсайте FibPlus
лежит обалденнейший мануал:
"FIBPlus696 Developers Guide.pdf"
там ответы на все ваши (как возникшие (с параметрами, так и на почти все будущие ... )
Я его курю понемногу
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 09.10.2009, 12:02   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

а так ?
Код:
Form3.pFIBQuery1.ParamByName('DATASTART').Value := Form3.sDateEdit1.Date;
стр. 26 руководства
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.10.2009, 17:31   #9
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,194
По умолчанию

Цитата:
а так ?
Код:

Form3.pFIBQuery1.ParamByName('DATAS TART').Value := Form3.sDateEdit1.Date;
Попробовал. Выдал ошибку. Скрин ошибки во вложении. ??
Мой код:
Код:
procedure TForm3.sButton1Click(Sender: TObject);
begin
 Form3.pFIBQuery1.SQL.Clear;
 Form3.pFIBQuery1.SQL.Text:='insert into CHETVERTY(CHETVERT,DATASTART,DATAEND) values(:CHETVERT,:DATASTART,:DATAEND)';
 Form3.pFIBQuery1.ParamByName('CHETVERT').Value:=Form3.sLabel1.Caption;
 Form3.pFIBQuery1.ParamByName('DATASTART').Value:=Form3.sDateEdit1.Date;
 Form3.pFIBQuery1.ParamByName('DATAEND').Value:=Form3.sDateEdit2.Date;
 Form3.pFIBQuery1.ExecQuery;
end;
Изображения
Тип файла: bmp 1.bmp (277.4 Кб, 128 просмотров)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 09.10.2009, 17:57   #10
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

там же аглицким по белому написано, что обязательное поле для констренйта не заполнено
напиши триггер для этой таблицы или объяви в компоненте генератор, который будет выставлять это самое уникальное значение

текст триггера (before insert) будет выглядеть как-то так
Код:
if :new.id is null then
  :new.id = gen_id(your_genereator_name, 1)
ну или какой там у тебя путь формирования айдишника (может он составной какой-нить)
soleil@mmc вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
FireBird Д'якон БД в Delphi 2 04.12.2008 11:15
FireBird 1.5.4 Nikola__ БД в Delphi 2 17.11.2008 14:42
Как получить ID для новой записи с использованием триггеров?(Firebird) Paul Hindenburg БД в Delphi 20 01.06.2008 16:39
Вставка записи в поле графического типа Bibigul БД в Delphi 3 10.04.2007 16:07