Порядок изменений

Обсуждение возникших проблем, предложений и ошибок SDAC компонентов
Ответить
vso
Сообщения: 39
Зарегистрирован: Чт 24 янв 2013 11:08

Порядок изменений

Сообщение vso » Ср 27 мар 2013 14:33

Добрый день!

Подскажите, возможно ли в режиме CachedUpdates := true, когда выполняешь процедуру ApplyUpdates изменить порядок (хотя бы) в котором изменения отсылаются на сервер?

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Re: Порядок изменений

Сообщение AndreyZ » Чт 28 мар 2013 09:45

Здравствуйте,

Вы можете контролировать порядок изменений используя параметр UpdateRecKinds метода ApplyUpdates. Например:

Код: Выделить всё

MSQuery.ApplyUpdates([ukInsert]); // на сервер отправятся только добавленные записи
MSQuery.ApplyUpdates([ukUpdate]); // на сервер отправятся только измененные записи
MSQuery.ApplyUpdates([ukDelete]); // на сервер отправятся только удаленные записи
Более подробную информацию Вы можете найти в документации SDAC.

vso
Сообщения: 39
Зарегистрирован: Чт 24 янв 2013 11:08

Re: Порядок изменений

Сообщение vso » Чт 28 мар 2013 11:24

Спасибо за ответ!

но я имел ввиду другое, мне нужно чтобы внутри какого-то действия ([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 и TERMINAL создают уникальный индекс, в этой таблице редактировать необходимо только эти два поля. Если я добавляю запись, то поле GRADE пересчитывается.
Происходит нарушение уникальности, но если я буду отправлять на сервер записи от максимального GRADE к минимальному, то нарушения не произойдет.

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Re: Порядок изменений

Сообщение AndreyZ » Пт 29 мар 2013 12:49

По Вашему коду видно что поля Ref_NameTerminal и GRADE создают уникальный индекс, а не поля GRADE и TERMINAL. Поле GRADE пересчитывается Вашим кодом который Вы не привели здесь. Для решения проблемы с нарушением уникальности индекса, Вам следует изменить алгоритм пересчитывания значения поля GRADE.

vso
Сообщения: 39
Зарегистрирован: Чт 24 янв 2013 11:08

Re: Порядок изменений

Сообщение vso » Пт 29 мар 2013 13:46

Алгоритм пересчета изменений следующий

Код: Выделить всё

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;

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Re: Порядок изменений

Сообщение AndreyZ » Пн 01 апр 2013 08:47

Для обеспечения уникальности поля Вы можете использовать автоинкрементные поля. В SQL Server автоинкрементным полем является поле с установленным свойством IDENTITY. Более подробную информацию о свойстве IDENTITY Вы можете найти здесь: http://msdn.microsoft.com/en-us/library ... l.80).aspx

vso
Сообщения: 39
Зарегистрирован: Чт 24 янв 2013 11:08

Re: Порядок изменений

Сообщение vso » Пн 01 апр 2013 09:58

Такое поле существует у таблицы
CREATE TABLE Table1(
ID_STENCIL INT IDENTITY
а GRADE используется для сортировки в пределах поля Ref_NameTerminal

получается, что выход только в отказе от уникального индекса и в надежде что данные будут вноситься только через программу?

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Re: Порядок изменений

Сообщение AndreyZ » Вт 02 апр 2013 14:14

Алгоритм расчета значений для поля GRADE который Вы привели не обеспечивает его уникальности относительно поля Ref_NameTerminal.
Вы можете получать значение для поля GRADE выполняя следующий запрос на сервер:

Код: Выделить всё

SELECT max(GRADE) + 1 FROM Table1 WHERE Ref_NameTerminal = 1
Такой запрос вернет уникальное значение GRADE для Ref_NameTerminal = 1. Но такой подход корректен только если Ваше приложение одновременно не используется несколькими пользователями.

Ответить