![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Глюк отображения при модификации данных на клиенте [D5, IB5.x, ]
ZDN © (2002-01-28 15:24:00)Доброго времени суток, профи!!!
Есть простейшая база, в ней пока всего одна таблица с уникальным
/обеспечивается триггером на сервере/ первичным ключом. Индексы не сделал
ввиду гарантированно малого числа записей в этой таблице /30-50, не более/
CREATE TABLE WORKER (NUMBER INTEGER NOT NULL,
................................
PRIMARY KEY (NUMBER));
CREATE GENERATOR NUMBER_GEN;
CREATE TRIGGER NUMBER_TRIGGER FOR WORKER
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
NEW.NUMBER=GEN_ID(NUMBER_GEN,1);
END
Клиент реализован следующим образом: на форме расположены DBEdit"ы и
DBNavigator, в качестве источника данных используется IBDataSetSource,
связанный с набором данных IBDataSet1. Для IBDataSet1 включил локальное
кэширование /CachedUpdates=True/.
Содержимое запроса DeleteSQL для IBDataSet1 следующее:
DELETE FROM WORKER
WHERE NUMBER=:Old_NUMBER
Содержимое запроса SelectSQL
SELECT * FROM WORKER
Содержимое запроса InsertSQL:
INSERT INTO WORKER (FioWorker, DocType, Code, Seria)
VALUES (:FioWorker, :DocType, :Code, :Seria)
При этом получение уникального значения с сервера обеспечивается
элементарно посредством следующей процедуры:
procedure TDM.IBDataSet1AfterInsert(DataSet: TDataSet);
begin
if IBDataSetSource.State=dsInsert then
begin
NewIDQuery.Open;
DataSet.FieldByName("NUMBER").AsInteger:=NewIDQuery.Fields[0].asInteger;
NewIDQuery.Close;
end;
end;
Содержимое запроса ModifySQL:
UPDATE WORKER
SET FioWorker=:FioWorker, DocType=:DocType, Code=:Code, Seria=:Seria
WHERE NUMBER=:Old_NUMBER
К набору данных IBDataSet1 подключена транзакция ReadTransaction.
После коннекта с БД набор данных я получаю так:
if not DM.IBDataSet1.Prepared then
begin
DM.IBDataSet1.Close;
DM.IBDataSet1.Prepare;
DM.IBDataSet1.Open;
end;
Внесение изменений на сервер происходит так:
Try
DM.UnalDB.ApplyUpdates([DM.IBDataSet1]);
Except
MessageDlg("Изменения не сохранены", mtError, [mbOK], 0);
DM.IBDataSet1.CancelUpdates;
End;
Проблема в следующем:
при работе с локальными данными /навигация, добавление, удаление,
редактирование/ все работает отлично.
Обновление данных с сервера по кнопке - тоже без проблем.
С добавлением и удалением записей тоже все отлично.
Однако после передачи модифицированных данных на сервер на клиенте
наблюдается следующий СТРАШНЫЙ ГЛЮК/или я чего-то пока не знаю/: измененные
записи /только они, с добавленными все в порядке/ отображаются в DBEdit"ах
пустыми. После принудительного получения данных с сервера все отображается
нормально.
Почему так происходит, я понять не могу. В чем дело? В локальном кэше, в
DBEdit"ах или еще в чем-то?
Если сильно не затруднит, помогите.
Заранее благодарен.
ZDN (2002-01-28 15:26:00) [1]Просьба продублировать ответ на мыло. Спасибо.