Как я могу обнаружить, если ApplyUpdates Вставит или данные Обновления?

static final String AB = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
static SecureRandom rnd = new SecureRandom();

String randomString( int len ){
   StringBuilder sb = new StringBuilder( len );
   for( int i = 0; i < len; i++ ) 
      sb.append( AB.charAt( rnd.nextInt(AB.length()) ) );
   return sb.toString();
}
5
задан mjn 29 January 2010 в 18:42
поделиться

3 ответа

ApplyUpdates не предоставляет вам эту информацию, так как это может быть вставка, обновление и удаление.

ApplyUpdates применяет информацию об изменениях, хранящуюся в массиве Delta. Эта информация об изменении может, например, содержать любое количество изменений разных типов (вставки, удаления и обновления), и все они будут применены к одному и тому же вызову.

В TDatasetProvider у вас есть событие BeforeUpdateRecord (или что-то в этом роде, сон делает забавные вещи с памятью :-)). Это событие вызывается перед тем, как каждая запись Delta применяется к базовой базе данных / набору данных и, следовательно, к месту для получения такой информации ... Но Showmessage остановит процесс применения.

EDIT: Теперь я вспомнил, что есть еще один вариант: вы можете назначить Delta другому свойству Data clientdataset и прочитать UpdateStatus набора данных для этой записи. Конечно, вам нужно сделать это перед выполнением applyupdates ...

var
  cdsAux: TClientDataset;
begin
  .
  . 
  <creation of cdsAux>
  cdsAUx.Data := cdsUpdated.Delta;
  cdsAux.First;
  case cdsAux.UpdateStatus of
    usModified:
      ShowMessage('Modified');
    usInserted:
      ShowMessage('Inserted');
    usDeleted:
      ShowMessage('Deleted'); // For this to work you have to modify  
                              // TClientDataset.StatusFilter  
  end;
  <cleanup code>
end;
6
ответ дан 18 December 2019 в 14:49
поделиться

Событие BeforeUpdateRecord в TDataSetProvider определяется как:

procedure BeforeUpdateRecord(Sender: TObject;  SourceDS: TDataSet; DeltaDS:
                             TCustomClientDataSet; UpdateKind: TUpdateKind;
                             var Applied: Boolean);

Параметр UpdateKind указывает, что будет сделано с записью: ukModify, ukInsert или ukDelete . Вы можете проверить это следующим образом:

procedure TSomeRDM.SomeProviderBeforeUpdateRecord(Sender: TObject;
      SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind;
      var Applied: Boolean);
begin
  case UpdateKind of
    ukInsert :
         // Process Insert;
    ukModify :
         // Process update
    ukDelete :
         // Process Delete
  end;
end;

Примечание: эта сигнатура события взята из Delphi 7. Я не знаю, изменилось ли оно в более поздних версиях Delphi.

4
ответ дан 18 December 2019 в 14:49
поделиться

Установите ClientDataSet.StatusFilter на значение TUpdateStatus, а затем прочтите ClientDataSet.RecordCount

например,

 ClientDataSet1.StatusFilter := [usDeleted];
 ShowMessage(IntToStr(ClientDataSet1.RecordCount));

вернет количество запросов на удаление, которые будут выполнены.

Однако обратите внимание на два момента. Установка для StatusFilter значения usModified всегда включает как измененные, так и немодифицированные записи, поэтому вы берете половину этого значения (значение 4 означает, что будут выполнены 2 запроса на обновление). Кроме того, установка для StatusFilter значения [] (пустой набор) позволяет восстановить представление по умолчанию (измененное, немодифицированное и вставленное)

. Перед этим убедитесь, что все неопубликованные изменения были опубликованы, в противном случае неопубликованные изменения могут не учитываться. .

3
ответ дан 18 December 2019 в 14:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: