2

ComponentAce の Absolute Database をテストしています

フォームに TABSTable、TABSDatabase、TDataSource があり、データは TDBAdvListView に表示され、MultiSelect と RowSelect は True です。テーブルは 1 つしかありません。

TDBAdvListView 内の 1 つ以上のアイテムが選択されている場合、選択したレコードをデータベースに削除させたいと考えています。

以下のコードでこの方法を試しました。

procedure TMain.DeleteEntry2Click(Sender: TObject);
var
  i: Integer;
begin
  with DBAdvListView1.DataSource.DataSet do
  begin
    for i := DBAdvListView1.Items.Count - 1 downto 0 do begin
    if DBAdvListView1.Items[i].Selected then
    begin
      DBAdvListView1.DataSource.DataSet.GotoBookmark(Pointer(DBAdvListView1.Items[i]));
      DBAdvListView1.DataSource.DataSet.Delete;
      end;
    end;
  end;
end;

これにより、常にエラー メッセージが表示されます。

Cannot retrieve record - Native error: 10026

データベース プログラミングの経験がほとんどないのですが、何が間違っていますか?

編集:

ID という名前の新しいフィールドを 0 から始まる整数としてデータベースに追加し、Locate メソッドでそれらを参照して以下のコードを試してみました。これによりエラーは発生しませんが、ListView の一番上のレコードのみが削除され、複数を選択すると、選択したレコードとは異なるレコードが削除されます。

私の新しいコード:

procedure TMain.DeleteEntry2Click(Sender: TObject);
var
  i: Integer;
begin
  with DBAdvListView1.DataSource.DataSet do
  begin
    DBAdvListView1.BeginUpdate;
    First;
    for i := DBAdvListView1.Items.Count - 1 downto 0 do begin
    if DBAdvListView1.Items[i].Selected then
    begin
      if dbTable.Locate('ID',DBAdvListView1.Items[i].Selected,[]) then
      dbTable.Delete;
      Next;
      end;
    end;
  dbTable.Close;
  dbTable.Open;
  DBAdvListView1.EndUpdate;
  end;
end;

何らかの奇妙な理由で変更を確認するには、dbTable を閉じてから開く必要があります。更新を試みましたが、役に立ちませんでした...

編集:

// 要求に応じてテーブル構造を含めるには...

  • ID 整数 0
  • タイトル文字列 200
  • 著者文字列 100
  • 日付文字列 20
  • ロケーション文字列 60
  • カテゴリ文字列 100
  • ISBN-13 文字列 20
  • ISBN-10 文字列 20

Absolute Database Utils ディレクトリには、実際のテーブルを作成するために使用した DatabaseManager.exe があり、ここでは次のタイプの主キーも設定しています。

タイプ - プライマリ名 - ID

インデックスのフィールド:

ColumnName - ID CaseInsensitive - False ASC - True MaxIndexSize - 20

4

3 に答える 3

2

削除するすべてのレコードの主キーがわかっている場合は、1 つの SQL クエリ ステートメントを使用して、選択したすべてのレコードを一度に削除できます。

delete from table
where id in (1, 7, 15, 23, 45);

このクエリは手動で作成する必要があります。つまり、ID 番号を保持する文字列を作成する必要があります。

于 2012-10-19T04:21:29.457 に答える
0

Next; を削除するだけで、2 番目のコードが機能します。if セクションから。すでに「for」ループ内にいるため、Database.Next を使用する必要はありません。

于 2014-11-03T11:17:52.537 に答える
0

自分の質問への回答...以下のコードを使用して、選択したレコードを削除します。

procedure TMain.Button5Click(Sender: TObject);
var
  i: Integer;
begin
  with DBAdvListView1 do
    for i := 0 to Items.Count - 1 do
      if Items[i].Selected then
      begin
        Memo1.Lines.Add(Items[i].Caption + ' - Selected!'); //Test for Correct ID's!
      if dbTable.Locate('ID', Items[i].Caption, []) then
      DBAdvListView1.Datasource.DataSet.Delete;
    end;
  dbTable.Close;
  dbTable.Open;
end;
于 2012-10-21T21:17:35.607 に答える