Как изменить значения полей в TDataSetProvider.OnUpdateData - PullRequest
1 голос
/ 30 июня 2011

После прочтения файла справки Delphi о TDataSetProvider.OnUpdateData объяснение события:

  1. Изучите данные (например, для значений или изменений данных, которые не должны быть разрешены) и создайте исключения, которые отменяют применение обновлений до того, как они произойдут.
  2. Изменение данных (например, шифрование или дешифрование значений) перед их отправкой на исходный набор данных или на сервер базы данных.

Я ищу пример кода, как изменить данные для OnUpdateData. Я старался изо всех сил искать решение. Вот чего я могу достичь:

Пример 1 :

procedure TDBNextDocNo.DSPUpdateData(Sender: TObject; DataSet: TCustomClientDataSet);
begin
  DataSet.First;
  while not DataSet.EOF do begin
    if DataSet.UpdateStatus = usUnmodified then begin
      TPacketDataSet(Dataset).InitAltRecBuffers(True);
      if DataSet.UpdateStatus in [usInserted, usModified] then begin
        Dataset.Edit;
        DataSet.FindField('MyField').AsString := 'zzz';
        Dataset.Post;
      end;
    end;
  end;
  DataSet.Next;
end;

Проблема для примера 1 : К сожалению, я получаю сообщение об ошибке, что отсутствует какое-либо значение поля. После некоторой отладки я обнаружил, что есть обязательные поля с пустым значением.

Пример 2:

procedure TDBNextDocNo.DSPUpdateData(Sender: TObject; DataSet: TCustomClientDataSet);
begin
  DataSet.First;
  while not DataSet.EOF do begin
    if DataSet.UpdateStatus = usUnmodified then begin
      TPacketDataSet(Dataset).InitAltRecBuffers(True);
      if DataSet.UpdateStatus in [usInserted, usModified] then 
        DataSet.FindField('MyField').NewValue:= 'zzz';     
    end;
    DataSet.Next;
  end;  
end;

Проблема для примера 2 : При написании этого пути нам не нужно вызывать DataSet.Edit & DataSet.Post. Но значение 'zzz', для которого установлено значение TField.NewValue, не сохраняется в базе данных.

У меня есть особая причина, по которой это обновление должно выполняться в OnUpdateData. BeforeUpdateRecord / AfterUpdateRecord.

Пожалуйста, совет. Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 30 июня 2011

Хорошо, начнем с начала.

В delta записываются изменения (по моему опыту работы с ним):

  • Хранение удаленных и вставленных записей отличается только на UpdateStatus
    • 1 запись с соответствующим статусом
  • Отредактированные записи сохраняются по-разному - таким образом сохраняются 2 записи (и IN THAT ORDER )
    • 1 запись с UpdateStatus = usUnModified
    • 1 запись с UpdateStatus = usModified - эта запись имеет только значения измененных полей.Все остальные поля пусты.

Как выполнить модификацию Delta

Для вставленных / удаленных записей

Установите StatusFilter на [usInserted] и / или [usDeleted].Перешить они.Все готово.

Для измененных записей

Установите SetStatusFiler на [usUnModified, usModified], чтобы увидеть обе записи в Delta.Сделайте While not DSDelta.Eof do и для каждого UpdateStatus = usUnModified проведите тест.Если да, вы переходите к модификации в следующей записи (UpdateStatus = usModified соответствует той, которую вы тестировали).Иначе, вы ищете следующую запись с UpdateStatus = usUnModified.

EDIT : Вы правы.Невозможно изменить поле в дельте измененной записи, если вы не включите все поля, помеченные как обязательные для заполнения.

Ваш код:

procedure TDBNextDocNo.DSPUpdateData(Sender: TObject; DataSet: TCustomClientDataSet);
begin
  DataSet.First;
  while not DataSet.EOF do begin
    if DataSet.UpdateStatus = usUnmodified then begin
      TPacketDataSet(Dataset).InitAltRecBuffers(True);
      if DataSet.UpdateStatus in [usInserted, usModified] then begin
        Dataset.Edit;
        DataSet.FindField('MyField').AsString := 'zzz';

        If Dataset.UpdateStatus in [usModified] then
        begin
          for i = 0 to Dataset.FieldCount - 1 do
          begin
            If Dataset.Fields[i].Name <> 'MyField' then
            begin
              If Dataset.Fields[i].Required then
                Dataset.Fields[i].Value := Dataset.Fields[i].OldValue; 
            end; 
          end;
        end;
        Dataset.Post;
      end;
    end;
  end;
  DataSet.Next;
end;
0 голосов
/ 30 июня 2011

Не

, если DataSet.UpdateStatus = usUnmodified, тогда начинаются

и

, если DataSet.UpdateStatus в [usInserted, usModified], то

Взаимоисключающий?У вас может быть неуместный конец или отсутствие другого.

...