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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2012, 18:38   #1
GROSS777
Пользователь
 
Регистрация: 27.05.2010
Сообщений: 18
По умолчанию Добавление новой записи в IBQuery

Собственно вопрос: Надо при нажатии на кнопку создавать новую запись. В ADO это делал вот так, DataSet.Append. Как в IBQuery это реализовать? Добавляю записи с помощью хранимой процедуры в файербёрде (Если id<0 то Insert Иначе Update)..

Вот как это выглядит:
нажимаю на кнопку, и вывожу форму редактирования
PHP код:
procedure TfMain.N2Click(SenderTObject);
begin
  FNew 
:= true;
  
fEdit.ShowModal;
end
Далее по нажатии на кнопку сохраняю все данные
PHP код:
...    
with fDM.QAdd do
    
begin
      
if fMain.FNew then
      begin
        SQL
.Text := 'EXECUTE PROCEDURE PROC_INSERT(-1' ',' +
          
quotedstr(Edit3.Text) + ',' quotedstr(Edit4.Text) + ',' +
          
quotedstr(Edit5.Text) + ',' quotedstr(ComboBox1.Text) + ',' +
          
quotedstr(DateToStr(DBDateTimeEditEh1.Value)) + ',' +
          
quotedstr(Edit6.Text) + ',' quotedstr(Edit7.Text) + ',' +
          
quotedstr(Edit11.Text) + ',' quotedstr(Edit12.Text) + ',' +
          
quotedstr(Edit8.Text) + ',' +
          
quotedstr(DateToStr(DateTimePicker2.Date)) + ',' +
          
quotedstr(Edit9.Text) + ',' quotedstr(Edit10.Text) +
          
', NULL, NULL, NULL)';
      
end
      
else
 .......................
      
Transaction.StartTransaction;
      try
        
ExecSQL;
        
Transaction.Commit;
      finally
        
Transaction.Active := false;
      
end
В общем вся запарка в том, что есть две связанные таблицы Клиенты и Услуги, и надо чтобы при добавлении нового Клиента в форме редактирования отображались его услуги, а у меня отображаются услуги того, на ком стоит курсор. То есть получается, клиент новый добавлен, а услуги от старого отображаются. Услуги вывожу запросом
PHP код:
Select From USl Where Usl.Client_Id=Client.ID
GROSS777 вне форума Ответить с цитированием
Старый 22.10.2012, 21:50   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
То есть получается, клиент новый добавлен, а услуги от старого отображаются.
Т.е. проблема не в добавлении? Если да то просто переоткрывай запросом список услуг после добавления.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.10.2012, 06:49   #3
GROSS777
Пользователь
 
Регистрация: 27.05.2010
Сообщений: 18
По умолчанию

Цитата:
Т.е. проблема не в добавлении? Если да то просто переоткрывай запросом список услуг после добавления.
Нет не так. Проблема в получении ID после добавления записи в таблицу
GROSS777 вне форума Ответить с цитированием
Старый 23.10.2012, 07:06   #4
BARNEY
Участник клуба
 
Регистрация: 23.04.2009
Сообщений: 1,058
По умолчанию

если юзаете процедуру дык пусть она вам id и возвращает
Если вам человек помог, не стесняйтесь говорить спасибо (весы под аватаром)
BARNEY вне форума Ответить с цитированием
Старый 23.10.2012, 08:07   #5
GROSS777
Пользователь
 
Регистрация: 27.05.2010
Сообщений: 18
По умолчанию

Если не сложно, подскажите как ее переделать, чтобы выходной параметр выводила?
PHP код:
SET TERM ^ ;

create or alter procedure PROC_INSERT (
    
FIN_ID integer,
    
FIN_SURNAME varchar(30),
    
FIN_FNAME varchar(30),
    
FIN_PATRONYMIC varchar(30),
    
FIN_SEX varchar(10),
    
FIN_BIRTHDAY date,
    
FIN_CITY varchar(30),
    
FIN_STREET varchar(90),
    
FIN_ORG varchar(150),
    
FIN_DOLJN varchar(100),
    
FIN_PASP varchar(100),
    
FIN_D_ZAP date,
    
FIN_KVIT varchar(12),
    
FIN_DOG varchar(10),
    
FIN_MPOL varchar(30),
    
FIN_PZDOR varchar(10),
    
FIN_IDUSER varchar(15))
as
begin
  
if (:fin_id<0then
  begin
   insert into base_name
(SURNAMEFNAMEPATRONYMICSEXBIRTHDAYCITYSTREET,
   
ORGDOLJNPASPD_ZAPKVITDOGMPOLPZDORIDUSER)
   
values (:FIN_SURNAME, :FIN_FNAME, :FIN_PATRONYMIC, :FIN_SEX, :FIN_BIRTHDAY, :FIN_CITY, :FIN_STREET,
   :
FIN_ORG, :FIN_DOLJN, :FIN_PASP, :FIN_D_ZAP, :FIN_KVIT, :FIN_DOG, :FIN_MPOL, :FIN_PZDOR, :FIN_IDUSER);
  
end
  
else
    
begin
      update
       base_name
      set
       SURNAME
=:fin_surname,
       
FNAME=:fin_fname,
       
PATRONYMIC=:fin_patronymic,
       
SEX=:fin_sex,
       
BIRTHDAY=:fin_birthday,
       
CITY=:fin_city,
       
STREET=:fin_street,
       
ORG=:fin_org,
       
DOLJN=:fin_doljn,
       
PASP=:fin_pasp,
       
D_ZAP=:fin_d_zap,
       
KVIT=:fin_kvit,
       
DOG=:fin_dog
       
MPOL=:fin_mpol,
       
PZDOR=:fin_pzdor,
       
IDUSER=:fin_iduser
       where
       id
=:fin_id;
    
end

end
^

SET TERM ; ^ 
GROSS777 вне форума Ответить с цитированием
Старый 23.10.2012, 08:14   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Хм... Я в огнептичке особо не разбираюсь но думаю что:
Код:
  if (:fin_id<0) then
  begin
   declare aid int;
   insert into base_name(SURNAME, FNAME, PATRONYMIC, SEX, BIRTHDAY, CITY, STREET,
   ORG, DOLJN, PASP, D_ZAP, KVIT, DOG, MPOL, PZDOR, IDUSER)
   values (:FIN_SURNAME, :FIN_FNAME, :FIN_PATRONYMIC, :FIN_SEX, :FIN_BIRTHDAY, :FIN_CITY, :FIN_STREET,
   :FIN_ORG, :FIN_DOLJN, :FIN_PASP, :FIN_D_ZAP, :FIN_KVIT, :FIN_DOG, :FIN_MPOL, :FIN_PZDOR, :FIN_IDUSER);
  select max(id) from base_name into aid;
  return aid;
  end
  else
...
И вызов через select * from PROC_INSERT(тут ее параметры
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.10.2012, 09:06   #7
GROSS777
Пользователь
 
Регистрация: 27.05.2010
Сообщений: 18
По умолчанию

PHP код:
create or alter procedure PROC_INSERT входные парметры)
returns (
    
OUT_ID integer)
as
declare 
variable VAR_ID integer;
begin
  
if (:fin_id<0then
  begin
   var_id
=gen_id(gen_base_name_id,1);
   
insert into base_name(IDSURNAMEFNAMEPATRONYMICSEXBIRTHDAYCITYSTREET,
   
ORGDOLJNPASPD_ZAPKVITDOGMPOLPZDORIDUSER)
   
values (:var_id, :FIN_SURNAME, :FIN_FNAME, :FIN_PATRONYMIC, :FIN_SEX, :FIN_BIRTHDAY, :FIN_CITY, :FIN_STREET,
   :
FIN_ORG, :FIN_DOLJN, :FIN_PASP, :FIN_D_ZAP, :FIN_KVIT, :FIN_DOG, :FIN_MPOL, :FIN_PZDOR, :FIN_IDUSER);
   
out_id=:var_id
вот так в файерберде все работает, а в делфях при вызове процедуры выдает ошибку Dynamic SQL Error. Token unknow...
PHP код:
EXECUTE PROCEDURE PROC_INSERTвходные параметрыRETURNING_VALUES :out_id'; 
GROSS777 вне форума Ответить с цитированием
Старый 23.10.2012, 09:33   #8
BARNEY
Участник клуба
 
Регистрация: 23.04.2009
Сообщений: 1,058
По умолчанию

слушайте? может почитаете про "update or insert" или "insert or update " не помню функцию. А на выходе будет :id=new.id
Если вам человек помог, не стесняйтесь говорить спасибо (весы под аватаром)
BARNEY вне форума Ответить с цитированием
Старый 23.10.2012, 09:34   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Не наверное возвращать нужно как я говорил через select
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.10.2012, 09:52   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

IBStoredProc не подходит? И хранимку выполнит и возвращаемое значение вернет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавление новой записи в DBGrid из 2х DBLookupComboBox ta_n_u_s_h_ka БД в Delphi 0 05.06.2012 18:21
Удаление записи запросом IBQuery alTor БД в Delphi 3 23.10.2011 13:08
Добавление новой строки staniiislav Microsoft Office Excel 6 21.04.2011 09:04
добавление новой колонки в ADOTable abakumov БД в Delphi 2 19.02.2007 15:04