2012-03-22 5 views
1
while not TBLOrder.Eof do 
begin 
    TBLOrder.Locate('OrderID', Total, []); 
    TBLOrder.Delete; 
end; 

これはアクセスデータベースのすべての行を削除するだけです。これは本当に面倒です。DelphiからAccessから特定の行を削除する方法はありますか?

私は選択された行(合計)を削除するプログラムを取得しようとしています。

私が理解しているところでは、選択した行は[合計]と同じになります。例えば合計= 3の場合は、OrderID = 3の行を見つけてその行を削除する必要があります。

何か助けていただければ幸いです。

+2

"これは本当に面倒です" - その月の控えめな言い方で+1! –

答えて

3

(それはそれで多くの行を持っていない限り、Maxのルーチンは結構ですデータセット全体、をループする必要があります)の代わりにこれを試してみてください:

while (TblOrder.Locate('OrderID', Total, [])) do 
    TblOrder.Delete; 

ブールを返しTDataSet.Locate。 Trueの場合は、見つかったレコードがアクティブなレコードになり、削除することができます。 False(レコードが見つからないことを意味する)を返した場合、Deleteへの呼び出しは行われません。

ところで、元のコードの問題は、Eofをテストすることですが、Locateがレコードを検出するかどうかを確認することはありません。あなたは現在のレコードを削除して、Eofを再度テストします。 Eofにいない場合は、Locateに電話し、レコードが見つかったかどうかを無視し、現在行っている行を削除します。これ以上のレコードがなくなるまで何度も何度も何度も繰り返します。その時点でEofがtrueを返し、ループを壊します。

+0

ありがとうございます!これは私の問題を修正したようだ! – Craig

+0

私のブルートフォースアプローチよりもずっと優れています。 ...

+0

@MaxWilliams - ありがとう。 :)私が言ったように、多くの行がない限り、あなたの作品はうまく動作し、あなたの答えにあなたのコードコメントで言及しました。 –

2

ORDERIDが3の行が1つしかない場合は、WHILEループは必要ありません。あなたは3に等しいORDERID持つ複数の行が予想される場合は

、次の操作を行います。

TBLOrder.first; // you could also do the locate here if it's a big table 
while not TBLOrder.Eof do 
begin 
if TBLOrder.FieldByName('OrderID').AsInteger = 3 then 
    TBLOrder.delete 
else 
    TBLOrder.next; 
end; 

そうでない場合、あなたはまた、SQLを使用することができます。

関連する問題