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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.04.2014, 09:25   #1
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию Firebird 2.5 Delphi7 Не работаеть UPDATE

Здравствуйте ребята . Сразу скажу что первый раз работаю Firebird и подключения к БД через компонент (IBDatabase1, IBQuery1, IBTransaction1 и DataSource1)

1. Подключаюсь к БД через IBexpert и создаю таблиц

Код:
CREATE TABLE USERS (
    ID        INTEGER NOT NULL,
    FIO       VARCHAR(50) NOT NULL,
    DAT_WORK  DATE,
    SALARY    NUMERIC(15,2)
);
2. Создаю генератор
Код:
CREATE GENERATOR GEN_USER_ID;
----------------------------------------
SET GENERATOR gen_user_id TO 0;
3. Триггер для ID
Код:
CREATE TRIGGER user_BI FOR users
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.ID IS NULL) THEN
NEW.ID = GEN_ID(gen_user_id, 1);
END;
------------- INSERT работает нормально ---
Код:
 insert into users (FIO, DAT_WORK, SALARY)
 values('Кети Баратели','12.04.2014',7000)
А через Delphi с помощью компонент IBQuery1 тоже нормально INSERT
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  IBQuery1.Close;
  IBQuery1.SQL.Text := 'INSERT INTO users (FIO, DAT_WORK, SALARY) '+
                       'VALUES (:pFIO, :pDAT_WORK, :pSALARY)';
  IBQuery1.ParamByName('pFIO').AsString := Edit1.Text;
  IBQuery1.ParamByName('pDAT_WORK').AsDateTime := DateTimePicker1.Date;
  IBQuery1.ParamByName('pSALARY').AsFloat := StrToFloat(Edit2.Text);

  try
    IBQuery1.ExecSQL;
    IBQuery1.Transaction.Commit;
    IBQuery1.SQL.Text := 'SELECT * FROM Users';
    IBQuery1.Open;
  except
     showmessage('Ошибка при добавлении записи!');
  end;
Вот на UPDATE у меня вылетает ошибка
Код:
procedure TForm1.Button2Click(Sender: TObject);
begin
  IBQuery1.Close;
  IBQuery1.SQL.Text := 'UPDATE users SET FIO=:pFIO, DAT_WORK=:pDAT_WORK, SALARY=:pSALARY) '+
                       'WHERE (FIO=:pFIO) and (DAT_WORK=:pDAT_WORK) and(SALARY=:pSALARY)';
  IBQuery1.ParamByName('pFIO').AsString := Edit1.Text;
  IBQuery1.ParamByName('pDAT_WORK').AsDateTime := DateTimePicker1.Date;
  IBQuery1.ParamByName('pSALARY').AsString := Edit2.Text;

  try
    IBQuery1.ExecSQL;
    IBQuery1.Transaction.Commit;
    IBQuery1.SQL.Text := 'SELECT * FROM Users';
    IBQuery1.Open;
  except
     showmessage('Ошибка на обновление');
  end;
end;
Просьба : Дайте понять что я делаю не правильно ? Помогите пожалуйста, Я первый раз работаю работаю с Firebird и компонентом (IBDatabase1, IBQuery1, IBTransaction1 и DataSource1)
Изображения
Тип файла: jpg Update22.jpg (43.7 Кб, 87 просмотров)
xxbesoxx вне форума Ответить с цитированием
Старый 25.04.2014, 09:42   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В 1-ой строчке UPDATE закрывающая скобка справа лишняя
Условие where не в дугу. Есть ид, по нем и задавайте
И на обновление и отображение лучше отдельные Query
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 25.04.2014, 09:52   #3
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Аватар Спасибо за внимание . Но примерно как ? Помогите пожалуйста

Код:
'WHERE (id=: Как здесь задавать что то ид где стоить курсор  )
xxbesoxx вне форума Ответить с цитированием
Старый 25.04.2014, 09:53   #4
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Примерно как он должен работать ? Пожалуйста пример покажите
xxbesoxx вне форума Ответить с цитированием
Старый 25.04.2014, 10:01   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Так примерно.
Код:
  IBQuery1.SQL.Text := 'UPDATE users SET FIO=:pFIO, DAT_WORK=:pDAT_WORK, SALARY=:pSALARY WHERE ID=:pID';
  IBQuery1.ParamByName('pFIO').AsString := Edit1.Text;
  IBQuery1.ParamByName('pDAT_WORK').AsDateTime := DateTimePicker1.Date;
  IBQuery1.ParamByName('pSALARY').AsFloat := StrToFloat(Edit2.Text);
  IBQuery1.ParamByName('pID').AsInteger := IBQuery2.FieldByName('ID').AsInteger;
IBQuery2 c отображаемыми данными.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 25.04.2014, 12:05   #6
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Аватар Друг Спасибо за помочь , Пришлось еще подшаманить это код ! потому что UBDATE обновил только на 1 запись

За это я добавил фильтр
Код:
procedure TForm1.IBQuery1AfterScroll(DataSet: TDataSet);
begin
  IBQuery2.Close;
  IBQuery2.SQL.Clear;
  IBQuery2.SQL.Add('SELECT* FROM users');
  IBQuery2.SQL.Add('WHERE id LIKE '''+  IBQuery1.FieldByName('Id').AsString+ '%' +'''');
  IBQuery2.Open;
end;
И потом на ваши примере Закладки (bookmarks) что бы курсор не бегал верх вниз
Код:
procedure TForm1.Button2Click(Sender: TObject);
 var
   BM: TBookmarkStr;
begin
  BM := IBQuery1.Bookmark;
  IBQuery1.Close;
  IBQuery1.SQL.Text := 'UPDATE users SET FIO=:pFIO, DAT_WORK=:pDAT_WORK, SALARY=:pSALARY WHERE ID=:pID';
  IBQuery1.ParamByName('pFIO').AsString := Edit1.Text;
  IBQuery1.ParamByName('pDAT_WORK').AsDateTime := DateTimePicker1.Date;
  IBQuery1.ParamByName('pSALARY').AsFloat := StrToFloat(Edit2.Text);
  IBQuery1.ParamByName('pID').AsInteger := IBQuery2.FieldByName('ID').AsInteger;
  IBQuery1.ParamByName('pFIO').AsString := Edit1.Text;
  IBQuery1.ParamByName('pDAT_WORK').AsDateTime := DateTimePicker1.Date;
  IBQuery1.ParamByName('pSALARY').AsString := Edit2.Text;
  try
    IBQuery1.ExecSQL;
    IBQuery1.Transaction.Commit;
    IBQuery1.SQL.Text := 'SELECT * FROM Users';
    IBQuery1.Open;
    IBQuery1.Bookmark := BM;
  except
     showmessage('Îøèáêà îïåðàöèè Îáíîâëåíèÿ');
  end;
end;
Код выглядеть так и работает нормально .......... Огромное вам спасибо
xxbesoxx вне форума Ответить с цитированием
Старый 25.04.2014, 12:24   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
procedure TForm1.IBQuery1AfterScroll(DataSet: TDataSet);
Ну и зачем это нужно? Что бы помедленней работало? ID уже есть в IBQuery1. Его можно просто выдернуть из датасета перед IBQuery1.Close если уж настаиваете на использовании одного IBQuery для отображения и редактирования. И like для числовых полей кто научил использовать? И параметры зачем-то дважды задаете.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 25.04.2014, 12:39   #8
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Друг про LIKE да правильно-понял. убрал , Но без этого фильтра как обойтись ?
Код:
procedure TForm1.IBQuery1AfterScroll(DataSet: TDataSet);
begin
  IBQuery2.Close;
  IBQuery2.SQL.Clear;
  IBQuery2.SQL.Add('SELECT* FROM users');
  IBQuery2.SQL.Add('WHERE id = '''+  IBQuery1.FieldByName('Id').AsString +'''');
  IBQuery2.Open;
end;
У IBQuery2 при открытое курсор стоить на 1 запись и за это пришлось дописать фильтр из свойстве IBQuery1AfterScroll.
А про параметру тоже понял спасибо! исправил
Код:
procedure TForm1.Button2Click(Sender: TObject);
 var
   BM: TBookmarkStr;
begin
  BM := IBQuery1.Bookmark;
  IBQuery1.Close;
  IBQuery1.SQL.Text := 'UPDATE users SET FIO=:pFIO, DAT_WORK=:pDAT_WORK, SALARY=:pSALARY WHERE ID=:pID';
  IBQuery1.ParamByName('pFIO').AsString := Edit1.Text;
  IBQuery1.ParamByName('pSALARY').AsFloat := StrToFloat(Edit2.Text);
  IBQuery1.ParamByName('pID').AsInteger := IBQuery2.FieldByName('ID').AsInteger;
  IBQuery1.ParamByName('pFIO').AsString := Edit1.Text;
  IBQuery1.ParamByName('pDAT_WORK').AsDateTime := DateTimePicker1.Date;
  IBQuery1.ParamByName('pSALARY').AsString := Edit2.Text;
  try
    IBQuery1.ExecSQL;
    IBQuery1.Transaction.Commit;
    IBQuery1.SQL.Text := 'SELECT * FROM Users';
    IBQuery1.Open;
    IBQuery1.Bookmark := BM;
  except
     showmessage('Ошибка на обновление');
  end;
end;
Огромное спасибо Друг спишу и за это допускаю ошибки
xxbesoxx вне форума Ответить с цитированием
Старый 25.04.2014, 13:04   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
procedure TForm1.Button2Click(Sender: TObject);
 var
   BM: TBookmarkStr;
   Id: Integer;
begin
  BM := IBQuery1.Bookmark;
  Id:=IBQuery1.FieldByName('Id').AsInteger;
  IBQuery1.Close;
  IBQuery1.SQL.Text := 'UPDATE users SET FIO=:pFIO, DAT_WORK=:pDAT_WORK, SALARY=:pSALARY WHERE ID=:pID';
  IBQuery1.ParamByName('pFIO').AsString := Edit1.Text;
  IBQuery1.ParamByName('pDAT_WORK').AsDateTime := DateTimePicker1.Date;
  IBQuery1.ParamByName('pSALARY').AsFloat := StrToFloat(Edit2.Text);
  IBQuery1.ParamByName('pID').AsInteger := Id;
  try
  ...
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 25.04.2014, 13:16   #10
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Спасибо друг Вот это да, "Профессиональный подход" . Выбросил IBQuery2 и фильтр тоже удалил ... Работает отлично
Код:
procedure TForm1.Button2Click(Sender: TObject);
 var
   BM: TBookmarkStr;
   Id: Integer;
begin
  BM := IBQuery1.Bookmark;
  Id:=IBQuery1.FieldByName('Id').AsInteger;
  IBQuery1.Close;
  IBQuery1.SQL.Text := 'UPDATE users SET FIO=:pFIO, DAT_WORK=:pDAT_WORK, SALARY=:pSALARY WHERE ID=:pID';
  IBQuery1.ParamByName('pFIO').AsString := Edit1.Text;
  IBQuery1.ParamByName('pDAT_WORK').AsDateTime := DateTimePicker1.Date;
  IBQuery1.ParamByName('pSALARY').AsFloat := StrToFloat(Edit2.Text);
  IBQuery1.ParamByName('pID').AsInteger := Id;
  try
    IBQuery1.ExecSQL;
    IBQuery1.Transaction.Commit;
    IBQuery1.SQL.Text := 'SELECT * FROM Users';
    IBQuery1.Open;
    IBQuery1.Bookmark := BM;
  except
     showmessage('Ошибка на обновление');
  end;
Дай бог вам счастья и здоровья ... СПАСИБО
xxbesoxx вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Update or Insert и FireBird 2.5.2 Pashka_cool БД в Delphi 21 23.08.2013 23:55
Firebird - множественный Update никак не commit DeveloPerchik БД в Delphi 5 27.07.2012 23:27
Firebird embeded установка в Win7 Delphi7 d_adilet БД в Delphi 1 14.03.2012 08:31
Update Firebird RuVarez БД в Delphi 6 24.02.2012 20:42
Delphi7+DBGridEh+FireBird+IBDataSet Alekcey БД в Delphi 6 14.08.2010 05:06