5

ClientDataSetのAfterPostイベントハンドラーで、現在のレコードのApplyUpdates関数が更新または挿入を行うかどうかの情報が必要です。

AfterPostイベントは、新しいレコードと更新されたレコードに対して実行されます。「更新」または「挿入」操作が進行中であるかどうかを示すために、新しいフラグ変数を宣言したくありません。

コード例:

procedure TdmMain.QryTestAfterPost(DataSet: TDataSet);
begin
  if IsInserting(QryTest) then
     // ShowMessage('Inserting')...
  else
     // ShowMessage('Updating');

  QryTest.ApplyUpdates(-1); 
end;

ApplyUpdateが完了した後、アプリケーションはAfterPostメソッドにログを書き込みます。したがって、このメソッドはアクションに最も近い場所です。このイベントハンドラーに完全に挿入できるソリューションをお勧めします。

ClientDataSetインスタンスQryTestの情報を使用して、IsInserting関数を実装するにはどうすればよいですか?

編集:ここで説明されているClientDataSet.UpdateStatusを試してみます。

4

3 に答える 3

6

ApplyUpdates はその情報を提供しません - 挿入、更新、および削除の可能性があるためです。

ApplyUpdates は、Delta 配列に保存されている変更情報を適用します。その変更情報には、たとえば、さまざまな種類の変更 (挿入、削除、および更新) をいくつでも含めることができ、これらすべてが同じ呼び出しに適用されます。

TDatasetProvider には、BeforeUpdateRecord イベントがあります (またはそのようなもので、スリープはメモリ上で面白いことを行います :-) )。そのイベントは、デルタの各レコードが基礎となるデータベース/データセットに適用される前に呼び出されるため、そのような情報を取得する場所です...しかし、Showmessage は適用プロセスを停止します。

編集: 別のオプションがあることを思い出しました。Delta を別の clientdataset Data プロパティに割り当て、そのレコードのデータセット 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;
于 2009-07-08T08:21:20.547 に答える
4

TDataSetProvider の BeforeUpdateRecord イベントは次のように定義されます。

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

パラメータUpdateKindは、 record: で何が行われるかを示しますukModify, ukInsert or 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 で変更されたかどうかはわかりません。

于 2009-07-08T08:55:24.033 に答える
3

ClientDataSet.StatusFilter を TUpdateStatus 値に設定してから、ClientDataSet.RecordCount を読み取ります。

例えば、

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

実行される削除クエリの数を返します。

ただし、2 つの点に注意してください。StatusFilter を usModified に設定すると、変更されたレコードと変更されていないレコードの両方が常に含まれるため、その値の半分を取ります (値 4 は、2 つの更新クエリが実行されることを意味します)。また、StatusFilter を [] (空のセット) に設定すると、既定のビュー (変更済み、未変更、および挿入済み) に復元できます。

これを行う前に、未投稿の変更が投稿されていることを確認してください。そうしないと、未投稿の変更が考慮されない場合があります。

于 2009-07-10T20:45:09.677 に答える