3

バッチコンポーネントを使用して、テーブル内の古いレコードをアーカイブしたいと思います。Aceコンポーネントサイトで例を見ましたが、使い方がわかりません。コマンドは:

DestinationTable.BatchMove(SourceTable,TABSBatchMoveType(bmtAppend));

このタスクでは、2つのdatetimepickerを使用するつもりでした。したがって、クエリはパラメータのようになります。

SELECT * from MYTABLE where DATE BETWEEN :a1 and :a2
ABSTQuery1.Parameters.ParamByName ('a1').AsDate := DateTimePicker1.Date;
ABSTQuery1.Parameters.ParamByName ('a2').AsDate := DateTimePicker2.Date;
ABSQuery.ExecSql; 

クエリをbatchmoveコマンドに組み込むにはどうすればよいですか?取得したすべてのレコードをソーステーブルから宛先テーブルに移動したい。

4

1 に答える 1

3

Absolute Databaseは、2つのコンポーネントを必要とBatchMoveする古いBDEをモデルにしているようです。IIRC、それは動作しませんでしたが、私は間違ったことを覚えている可能性があります。(BDEは10年以上廃止されており、Delphi 1以降は使用していません。)TBatchMoveTTableTQuery

ただし、必要ありませんBatchMove。単一のクエリですべてを実行できます(簡潔にするために例外処理は省略されています)。

// Copy rows into destination
ABSTQuery1.SQL.Text := 'INSERT INTO DestTable'#32 +
  '(SELECT * from MYTABLE where DATE BETWEEN :a1 and :a2)';
ABSTQuery1.Parameters.ParamByName ('a1').AsDate := DateTimePicker1.Date;
ABSTQuery1.Parameters.ParamByName ('a2').AsDate := DateTimePicker2.Date;
ABSTQuery1.ExecSql; 
ABSTQuery1.Close;

// Remove them from source (you said "move", after all)
ABSTQuery1.SQL.Text := 'DELETE FROM MyTable'#32 +
  `WHERE Date BETWEEN :a1 and :a2';
ABSTQuery1.Parameters.ParamByName ('a1').AsDate := DateTimePicker1.Date;
ABSTQuery1.Parameters.ParamByName ('a2').AsDate := DateTimePicker2.Date;
ABSTQuery1.ExecSql; 
ABSTQuery1.Close;

DestTable最初のSQLステートメントの宛先テーブルの名前に置き換えます。

AbsoluteDatabaseオンラインマニュアルの詳細

私はAbsoluteDatabaseを使用していませんが、SQLサポートにスクリプト(その調査はあなたに任せます-上記のドキュメントリンク)と複数のステートメントが含まれている場合は、1回のパスで実行できます。

// Note addition of `;` at end of each SQL statement
// and change in param names for second statement.
// Some DBs will allow you to just use one pair, and
// set the value for each once. Some require setting
// each twice, and some require unique param names.
// Check the documentation for Absolute DB.
//
ABSTQuery1.SQL.Text := 'INSERT INTO DestTable'#32 +
  '(SELECT * from MYTABLE where DATE BETWEEN :a1 and :a2);'
  'DELETE FROM MyTable WHERE Date BETWEEN :d1 and :d2;';
ABSTQuery1.Parameters.ParamByName ('a1').AsDate := DateTimePicker1.Date;
ABSTQuery1.Parameters.ParamByName ('a2').AsDate := DateTimePicker2.Date;

// New param names for second pass
ABSTQuery1.Parameters.ParamByName ('d1').AsDate := DateTimePicker1.Date;
ABSTQuery1.Parameters.ParamByName ('d2').AsDate := DateTimePicker2.Date;
ABSTQuery1.ExecSQL;
ABSTQuery1.Close;
于 2012-06-06T02:35:56.630 に答える