Modify SQL

anjey
Дата: 12.10.2004 12:22:04
У меня что-то видимо с головой. D7 IB6 IBX
Есть таблица :
tab1(
ID Integer
F1 String
)
Для просмотра использую IBQuery, для редактирование соответственно IBUpdateSQL

вот запросы (свойство SQL класса IBQuery):
select * from tab1

InsertSQL класса IBUpdateSQL:
insert into tab1 values(:F1)

ModifySQL:
update tab1 set F1=:F1 where ID=:ID

RefreshSQL:
select * from tab1 where ID=:ID

вставляются данные в таблицу нормально, но вот изменять я их НИКАК не могу!!! Получаю сообщение: Update Failed и все!!!!

что за хрень!??
Programmer_Ortodox
Дата: 12.10.2004 12:45:42
Не хрень, а кривые ручонки, мастер IBX не кривее их будет и вместо

ModifySQL:
update tab1 set F1=:F1 where ID=:ID

сделает:

update tab1 set F1=:F1 where ID=:OLD_ID
чорнапианецъ
Дата: 12.10.2004 12:55:39
А па-моиму, жёпа здесь:
anjey

insert into tab1 values(:F1)


ты ш иму ни указалъ, ф какуйа калонку пишыш F1

надуть такмо:
insert into tab1 F1 values (:F1)

и фсё будитъ нармальна....

_
сцылконаххъ
anjey
Дата: 13.10.2004 05:28:25
спасибо, но дело видимо не в этом...
2 Programmer_Ortodox:
никакой разницы в ID или OLD_ID нету, это я "подсмотрел" SQL-монитором, и в том и в другом случае ID один и тот же, и в том и вдругом случае я получаю ту же ошибку...

2 чорнапианецъ:
пардон за описку. Конечно же Insert запрос должне быть (и есть) полным.
Но вставка записей в базу идет нормально... а вот изменение..... :(

Кстати при использовании IBDataSet все просто замечательно!!! при тех же запросах, скопированных из IBUpdateSql !?!?!?! Может это какой косяк IBX, поскольку такая же песня повторяется и в другой среде Дельфи, на другой машине?

Буду использовать IBDataSet .
Shr
Дата: 13.10.2004 07:23:40
При вставке записи значение поля ID еще неопределено (обычно оно генерируется на сервере в триггере). Если UpdateSql.RefreshSql такой:
select f1 from tab1 where id = :id
то и id для обновления (как параметр) передастся пустым (null) и сервер ничего не вернет. Выхода два:
1. После вставки делать Refresh не одной записи, а всего запроса (Close, Open)
2. Перед вствкой генерить id на клиенте, примерно так:

function GenerateId(GeneratorName: string): integer;
begin
  with TIBSQL.Create(nil) do
    try
      Sql.Text := Format('select gen_id(%s, 1) from rdb$database', [GeneratorName]);
      ExecQuery;
      Result := Fields[0].AsInteger;
    finally
      Free;
    end;
end;

procedure TForm1.Tab1QueryBeforePost(DataSet: TDataSet);
begin
  if (DataSet.State = dsInsert) and VarIsNull(DataSet['id']) then
    DataSet['id'] := GenerateId('Tab1_gen');
end;

PS синтаксис IB Sql немного подзабыл - так что мог и ошибиться
Shr
Дата: 13.10.2004 07:39:37
И, конечно, при втором варианте не забыть в триггере сделать проверку на заполненность поля id:

CREATE TRIGGER GEN_TAB1_ID_TRIGGER FOR TAB1
ACTIVE BEFORE INSERT POSITION 1
AS BEGIN
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(TAB1_GEN, 1);
END

PS Интересно, почему на форуме sql.ru не сделали подсветку синтаксиса sql?! Пускай даже только стандарта
Shr
Дата: 13.10.2004 07:42:34
Это опять я :)
Собственно, по теме - update не работает потому, что у свежевставленных записей не заполнено поле id, а update ориентируется именно по нему
anjey
Дата: 13.10.2004 10:59:31
у IBQuery есть свойство GeneratorField, в котором Apply Event уставнолено:
On New Record. И когда в сетке курсор сдвигается с последней записи на новую, я тут же в сетке в поле ID вижу новое сгенерированное значение.
Я заполняю поле F1, сдвигаю курсор с этой, только что введенной записи, затем возвращаю курсор на неё и пытаюсь изменить значение поля F1, значение в ячейке сетки меняется а в момент смещения курсора с этой строки я получаю сообщение Update Failed
Shr
Дата: 13.10.2004 11:07:39
Ок, тогда у меня два варианта:
1. Триггер меняет значение id в новой записи
2. Запись добавлена в другой транзакции без commit и при update не видится
Shr
Дата: 13.10.2004 11:16:12
и вот еще:
InsertSQL класса IBUpdateSQL:
insert into tab1 (id, f1) values(:id, :F1)