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

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

Вернуться   Форум программистов > Delphi программирование > Lazarus, Free Pascal, CodeTyphon
Регистрация

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 10.05.2013, 02:21   #11
Allant
 
Регистрация: 08.05.2013
Сообщений: 9
По умолчанию

Так,у меня тут сейчас картина следующая:На кнопку написана процедура вставки записи в таблицу
код:
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
    ZQuery1.SQL.Text:='select gen_id(gen_customers_id, 1) from RDB$DATABASE';
    begin
  with database do
    begin
    ZQuery1.SQL.Clear;
    ZQuery1.SQL.Add('insert into CUSTOMERS (PK_CLIENTID, CLIENTNAME, CLIENTPHONE, CLIENTFAMILY, CLIENTSECOND)');
    ZQuery1.SQL.Add( ' VALUES( :newPK_CLIENTID, :newCLIENTNAME,:newCLIENTPHONE, :newCLIENTFAMILY, :newCLIENTSECOND)');
    ZQuery1.ParamByName('newCLIENTFAMILY').AsString:=Form2.DBEdit1.Text;
    ZQuery1.ParamByName('newCLIENTNAME').AsString:=Form2.DBEdit2.Text;
    ZQuery1.ParamByName('newCLIENTSECOND').AsString:=Form2.DBEdit3.Text;
    ZQuery1.ParamByName('newCLIENTPHONE').AsString:=Form2.DBEdit4.Text;
    ZQuery1.ParamByName('newPK_CLIENTID').AsInteger:=StrToInt(Form2.DBEdit5.Text);
   try
    ZQuery1.ExecSQL;
    ZQuery1.CommitUpdates;
    ZQuery1.Open;
    Except

      showmessage('Ошибка операции добавления');

    end;
   end;
  end;
end;
Вот мне конкретно хотелось бы,чтобы при нажатии на эту кнопку сначала в поле ClientID подставлялся бы id,потому что это ключ и он пустым быть не должен,а потом уже дальше шла процедура вставки полей DBEdit.
Осмелюсь предположить что тут лучше
Цитата:
запросить новый ид у базы, потом отправить его в инсерте
Не подскажите как это здесь лучше сделать?
Процедура это,соответственно,не работает.Насколько я понимаю,потому что не вставляется ID.

Последний раз редактировалось Allant; 10.05.2013 в 02:38.
Allant вне форума
Старый 10.05.2013, 07:46   #12
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

http://www.sql.ru/forum/710879/uznat...vlennoy-zapisi
Да и вообще гугл + FIREBIRD узнать ID после вставки
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума
Старый 10.05.2013, 08:19   #13
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  ID : Integer;
begin
  ZQuery1.SQL.Text:='select gen_id(gen_customers_id, 1) as id from RDB$DATABASE';
  ZQuery1.Open;
  ID :=  ZQuery1['id'];

  with database do begin
    ZQuery1.SQL.Clear;
    ZQuery1.SQL.Add('insert into CUSTOMERS (PK_CLIENTID, CLIENTNAME, CLIENTPHONE, CLIENTFAMILY, CLIENTSECOND)');
    ZQuery1.SQL.Add( ' VALUES( :newPK_CLIENTID, :newCLIENTNAME,:newCLIENTPHONE, :newCLIENTFAMILY, :newCLIENTSECOND)');
    ZQuery1.ParamByName('newCLIENTFAMILY').AsString:=Form2.DBEdit1.Text;
    ZQuery1.ParamByName('newCLIENTNAME').AsString:=Form2.DBEdit2.Text;
    ZQuery1.ParamByName('newCLIENTSECOND').AsString:=Form2.DBEdit3.Text;
    ZQuery1.ParamByName('newCLIENTPHONE').AsString:=Form2.DBEdit4.Text;
    ZQuery1.ParamByName('newPK_CLIENTID').Value := ID;
   try
    ZQuery1.ExecSQL;
    ZQuery1.CommitUpdates;
//    ZQuery1.Open;   лишнее
  ...
DBEdit'ы чего здесь делают? Здесь им не место. Надо заменить на обычные TEdit'ы.
Прик вне форума
Старый 10.05.2013, 09:38   #14
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
Allant
Все рассказы в пустую, вы ваще читаете что вам пишут? тогда всегда так будет, вроде все сказано и написано, а не понятно.

И да, DBEdit'ы тут от того что вы хотите не читая все сразу схватить.
eval вне форума
Старый 10.05.2013, 13:43   #15
Allant
 
Регистрация: 08.05.2013
Сообщений: 9
По умолчанию

Уважаемый eval, из 5 сообщений,написанных Вами в этой теме,полезную информацию несли только 2.Где Вы ссылку кинули,и где перечислили возможные варианты вставки id.Остальные просто пышат надменными насмешками и выливают на мою голову тонны желчи.Я понимаю,что моя безграмотность Вас раздражает,но я сюда всё-таки пришёл за помощью. Да,я много примеров видел.И те из них,которые у меня получилось осознать и понять,я использовал.Но опять же,в силу своих,пока что,очень ограниченных знаний и отсутствия опыта,я не все примеры могу переделать под конкретно свою ситуацию.Поэтому я и написал тут,надеясь на помощь людей,которые знаю больше меня.Если Вы действительно можете и хотите ответить на вопрос по существу,очень Вас прошу, сделайте это и помогите дельным советом.Если же для Вас "помощь" новичку-это швырять в него кирпичи и тыкать его лицом в его же безграмотность в данном вопросе,то я совсем не расстроюсь,если Вы больше не будете отписываться в этой теме.

Теперь следующий вопрос.Прик,спасибо большое,сделал всё как Вы показали.Код следующий:
Код:
procedure TForm1.Button1Click(Sender: TObject);
 var
    ID : Integer;
    begin
    ZQuery1.SQL.Text:='select gen_id(gen_customers_id, 1) from RDB$DATABASE';
    ZQuery1.Open;
    ID :=  ZQuery1['id'];

    with database do
    begin
    ZQuery1.SQL.Clear;
    ZQuery1.SQL.Add('insert into CUSTOMERS (PK_CLIENTID, CLIENTNAME, CLIENTPHONE, CLIENTFAMILY, CLIENTSECOND)');
    ZQuery1.SQL.Add( ' VALUES( :newPK_CLIENTID, :newCLIENTNAME,:newCLIENTPHONE, :newCLIENTFAMILY, :newCLIENTSECOND)');
    ZQuery1.ParamByName('newCLIENTFAMILY').AsString:=Form2.Edit1.Text;
    ZQuery1.ParamByName('newCLIENTNAME').AsString:=Form2.Edit2.Text;
    ZQuery1.ParamByName('newCLIENTSECOND').AsString:=Form2.Edit3.Text;
    ZQuery1.ParamByName('newCLIENTPHONE').AsString:=Form2.Edit4.Text;
    ZQuery1.ParamByName('newPK_CLIENTID').Value := ID;
   try
    ZQuery1.ExecSQL;
    ZQuery1.CommitUpdates;
    Except

      showmessage('Ошибка операции добавления');

    end;
   end;
  end;
Теперь при нажатии на саму кнопку выскакивает ошибка "ZQuery1:Field not found CLIENTID".Подскажите пожалуйста,в чём моя ошибка?В самой базе поле есть,название точно такое же,кириллические знаки нигде не проскакивают.Что тут не так в коде?
Allant вне форума
Старый 10.05.2013, 13:56   #16
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ты уверен что ошибка именно тут возникает? Пошаговку делал?

По поводу темы:
Поскольку автоинкрементный механизм в огнептице не так развит я бы пошел следующим путем.
Допустим есть некое поле, которое должно самостоятельно получать значение. Создаем генератор. Создаем триггер:
Код:
create trigger new_table_bi for new_table
active before insert position 0
as
begin
  if (new.zxc is null) then
    new.zxc = gen_id(gen_new_table_id,1);
end
Который используя генератор будет автоинкрементировать перед вставкой
Т.е. сочетание триггера и генератора и дает нужный эффект.
В результате твой код упрощается:
Код:
procedure TForm1.Button1Click(Sender: TObject);

  begin

    with database do
    begin
    ZQuery1.SQL.Clear;
    ZQuery1.SQL.Add('insert into CUSTOMERS (CLIENTNAME, CLIENTPHONE, CLIENTFAMILY, CLIENTSECOND)');
    ZQuery1.SQL.Add( ' VALUES( :newCLIENTNAME,:newCLIENTPHONE, :newCLIENTFAMILY, :newCLIENTSECOND)');
    ZQuery1.ParamByName('newCLIENTFAMILY').AsString:=Form2.Edit1.Text;
    ZQuery1.ParamByName('newCLIENTNAME').AsString:=Form2.Edit2.Text;
    ZQuery1.ParamByName('newCLIENTSECOND').AsString:=Form2.Edit3.Text;
    ZQuery1.ParamByName('newCLIENTPHONE').AsString:=Form2.Edit4.Text;
   try
    ZQuery1.ExecSQL;
    ZQuery1.CommitUpdates;
    Except

      showmessage('Ошибка операции добавления');

    end;
   end;
  end;
База сама заботится о ключевом поле.
I'm learning to live...

Последний раз редактировалось Stilet; 10.05.2013 в 14:09.
Stilet вне форума
Старый 10.05.2013, 16:50   #17
Allant
 
Регистрация: 08.05.2013
Сообщений: 9
По умолчанию

Stilet, спасибо огромное!Сначала думал тоже триггером сделать,но потом вот оказалось что вроде как советуют Select-ом получать значения из генератора,старался именно этим способом сделать всё.Сейчас написал триггер в базе,теперь почти всё получается.Только ещё одна ошибка выскакивает,в строчке ZQuery1.CommitUpdates:
Код:
procedure TForm1.Button1Click(Sender: TObject);
     begin
       with database do
    begin
    ZQuery1.SQL.Clear;
    ZQuery1.SQL.Add('insert into CUSTOMERS (CLIENTNAME, CLIENTPHONE, CLIENTFAMILY, CLIENTSECOND)');
    ZQuery1.SQL.Add( ' VALUES(:newCLIENTNAME,:newCLIENTPHONE, :newCLIENTFAMILY, :newCLIENTSECOND)');
    ZQuery1.ParamByName('newCLIENTFAMILY').AsString:=Form2.Edit1.Text;
    ZQuery1.ParamByName('newCLIENTNAME').AsString:=Form2.Edit2.Text;
    ZQuery1.ParamByName('newCLIENTSECOND').AsString:=Form2.Edit3.Text;
    ZQuery1.ParamByName('newCLIENTPHONE').AsString:=Form2.Edit4.Text;
   try
    ZQuery1.ExecSQL;
    ZQuery1.CommitUpdates;
   Except

      showmessage('Ошибка операции добавления');

    end;
   end;
  end;
Ошибка следующая: operation cannot be performed on inactive dataset.
Здесь ещё не поможете?У меня в элементе ZQuery Active стоит в значении true,датасоурс подключен к коннекту.Вобщем саму таблицу дельфи видит,процедуру нажатия на кнопку он выполняет,но вот при попытке сохранить изменения говорит что датасет не активен.В чём может быть дело?

Последний раз редактировалось Allant; 10.05.2013 в 16:52.
Allant вне форума
Старый 10.05.2013, 17:17   #18
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Попробуй просто ZQuery1.Commit.
Я не знаю что это за компонент, но думаю у него несколько разных методов коммита.
I'm learning to live...
Stilet вне форума
Старый 11.05.2013, 00:49   #19
Allant
 
Регистрация: 08.05.2013
Сообщений: 9
По умолчанию

Всем кто помогал и подсказывал-большое спасибо за помощь!Не прошло и трёх дней,как у меня получилось сделать эту кнопку!))Тему можно считать закрытой.Stilet,отдельное Вам гигантское спасибо!Вы очень мне помогли.
Allant вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как создать свой язык программирования? future7 Свободное общение 19 05.05.2015 01:08
Составить приложение в среде Delphi (Lazarus) Novenki Помощь студентам 2 21.04.2012 13:12
Несколько условных операторов. Язык программирования Delphi 7 ZigFree Помощь студентам 0 27.12.2010 20:03
Вспомогательное окно!!! Язык программирования Delphi!!! S_Yevgeniy Помощь студентам 19 29.10.2009 15:29