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();
}
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;
Событие 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.
Установите ClientDataSet.StatusFilter на значение TUpdateStatus, а затем прочтите ClientDataSet.RecordCount
например,
ClientDataSet1.StatusFilter := [usDeleted];
ShowMessage(IntToStr(ClientDataSet1.RecordCount));
вернет количество запросов на удаление, которые будут выполнены.
Однако обратите внимание на два момента. Установка для StatusFilter значения usModified всегда включает как измененные, так и немодифицированные записи, поэтому вы берете половину этого значения (значение 4 означает, что будут выполнены 2 запроса на обновление). Кроме того, установка для StatusFilter значения [] (пустой набор) позволяет восстановить представление по умолчанию (измененное, немодифицированное и вставленное)
. Перед этим убедитесь, что все неопубликованные изменения были опубликованы, в противном случае неопубликованные изменения могут не учитываться. .