Порядок изменений
Порядок изменений
Добрый день!
Подскажите, возможно ли в режиме CachedUpdates := true, когда выполняешь процедуру ApplyUpdates изменить порядок (хотя бы) в котором изменения отсылаются на сервер?
Подскажите, возможно ли в режиме CachedUpdates := true, когда выполняешь процедуру ApplyUpdates изменить порядок (хотя бы) в котором изменения отсылаются на сервер?
Re: Порядок изменений
Здравствуйте,
Вы можете контролировать порядок изменений используя параметр UpdateRecKinds метода ApplyUpdates. Например:Более подробную информацию Вы можете найти в документации SDAC.
Вы можете контролировать порядок изменений используя параметр UpdateRecKinds метода ApplyUpdates. Например:
Код: Выделить всё
MSQuery.ApplyUpdates([ukInsert]); // на сервер отправятся только добавленные записи
MSQuery.ApplyUpdates([ukUpdate]); // на сервер отправятся только измененные записи
MSQuery.ApplyUpdates([ukDelete]); // на сервер отправятся только удаленные записи
Re: Порядок изменений
Спасибо за ответ!
но я имел ввиду другое, мне нужно чтобы внутри какого-то действия ([ukUpdate]) можно было бы задавать порядок отправки изменений на сервер.
Поясню, есть таблица
как видно поля GRADE и TERMINAL создают уникальный индекс, в этой таблице редактировать необходимо только эти два поля. Если я добавляю запись, то поле GRADE пересчитывается.
Происходит нарушение уникальности, но если я буду отправлять на сервер записи от максимального GRADE к минимальному, то нарушения не произойдет.
но я имел ввиду другое, мне нужно чтобы внутри какого-то действия ([ukUpdate]) можно было бы задавать порядок отправки изменений на сервер.
Поясню, есть таблица
Код: Выделить всё
CREATE TABLE Table1(
ID_STENCIL INT IDENTITY,
Ref_NameTerminal INT NULL,
TERMINAL NVARCHAR(10) NULL,
GRADE INT NOT NULL,
CONSTRAINT PK_Table1 PRIMARY KEY (ID_STENCIL),
CONSTRAINT FK_Table1_Table2 FOREIGN KEY (Ref_NameTerminal) REFERENCES Table2 (ID_NameTerminalStencil) ON DELETE CASCADE ON UPDATE CASCADE
) ON [PRIMARY]
GO
CREATE UNIQUE INDEX IX_sys_swgStencil ON Table1 (Ref_NameTerminal, GRADE) ON [PRIMARY]
Происходит нарушение уникальности, но если я буду отправлять на сервер записи от максимального GRADE к минимальному, то нарушения не произойдет.
Re: Порядок изменений
По Вашему коду видно что поля Ref_NameTerminal и GRADE создают уникальный индекс, а не поля GRADE и TERMINAL. Поле GRADE пересчитывается Вашим кодом который Вы не привели здесь. Для решения проблемы с нарушением уникальности индекса, Вам следует изменить алгоритм пересчитывания значения поля GRADE.
Re: Порядок изменений
Алгоритм пересчета изменений следующий
Код: Выделить всё
procedure TfAddDev.QslListTerminalBeforeInsert(DataSet: TDataSet);
begin
AIsLastRec := (DataSet.RecordCount = DataSet.RecNo);
AOldRec := DataSet.Bookmark;
if not AIsLastRec then
begin
try
AGrade := DataSet['GADE'];
DataSet.DisableControls;
Dataset.GotoBookmark(AOldRec);
while not DataSet.Eof do
begin
DataSet.Edit;
DataSet['GRADE'] := DataSet['GRADE'] + 1;
DataSet.Next;
end;
DataSet.GotoBookmark(AOldRec);
finally
DataSet.EnableControls;
end;
end;
end;
procedure TfAddDev.QslListTerminalAfterInsert(DataSet: TDataSet);
begin
if not AIsLastRec then
DataSet['GRADE'] := AGrade
else begin
if VarIsNull(DataSet['GRADE']) then
DataSet['GRADE'] := DataSet.RecordCount + 1;
end;
end;
Re: Порядок изменений
Для обеспечения уникальности поля Вы можете использовать автоинкрементные поля. В SQL Server автоинкрементным полем является поле с установленным свойством IDENTITY. Более подробную информацию о свойстве IDENTITY Вы можете найти здесь: http://msdn.microsoft.com/en-us/library ... l.80).aspx
Re: Порядок изменений
Такое поле существует у таблицы
получается, что выход только в отказе от уникального индекса и в надежде что данные будут вноситься только через программу?
а GRADE используется для сортировки в пределах поля Ref_NameTerminalCREATE TABLE Table1(
ID_STENCIL INT IDENTITY
получается, что выход только в отказе от уникального индекса и в надежде что данные будут вноситься только через программу?
Re: Порядок изменений
Алгоритм расчета значений для поля GRADE который Вы привели не обеспечивает его уникальности относительно поля Ref_NameTerminal.
Вы можете получать значение для поля GRADE выполняя следующий запрос на сервер:Такой запрос вернет уникальное значение GRADE для Ref_NameTerminal = 1. Но такой подход корректен только если Ваше приложение одновременно не используется несколькими пользователями.
Вы можете получать значение для поля GRADE выполняя следующий запрос на сервер:
Код: Выделить всё
SELECT max(GRADE) + 1 FROM Table1 WHERE Ref_NameTerminal = 1