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)