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

이 작업은 Access 데이터베이스의 모든 행을 하나씩 삭제하므로 매우 귀찮습니다.Delphi를 통해 Access에서 특정 행을 삭제하는 방법은 무엇입니까?

선택한 행 (총계)을 삭제하는 프로그램을 얻으려고합니다.

내가 이해하는 것으로부터, 그것은 합계와 같은 선택된 행을 찾아야합니다. 예 : Total = 3이면 OrderID = 3 인 행을 찾은 다음 해당 행을 삭제해야합니다.

도움을 주시면 감사하겠습니다.

+2

"정말 짜증이납니다."- 이달의 삼가면서 말하는 +1! –

답변

3

이 시도 대신 (최대의 루틴은 그것에서 많은 행을 가지고하지 않는 한 괜찮 전체 데이터 세트를 통해 루프를 필요) :

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

TDataSet.Locate는 부울 반환 그것이 참이면 발견 된 레코드가 활성 레코드가되고 그 레코드를 삭제할 수 있습니다. False (레코드가 발견되지 않음을 의미)를 반환하면 Delete 호출이 수행되지 않습니다.

사실 원래 코드의 문제는 Eof을 테스트하지만 Locate이 레코드를 찾는 지 확인하지 않는 것입니다. 현재 사용중인 레코드를 삭제 한 다음 Eof을 다시 테스트하십시오. Eof이 아닌 경우 Locate으로 전화하고 레코드를 찾았는지 여부를 무시하고 현재 사용중인 행을 삭제하십시오. 그런 다음 더 이상 레코드가 없을 때까지 반복하여 반복합니다.이 시점에서 Eof이 true를 반환하고 루프를 중단합니다.

+0

대단히 감사합니다! 이것은 내 문제를 해결 한 것 같습니다! – Craig

+0

나의 무차별 적 접근보다 훨씬 낫다. ...

+0

@MaxWilliams - 감사합니다. :) 내가 말했듯이, 많은 행이 없으면 당신의 코드는 잘 동작하며, 코드 주석에서 대답을 언급했다. –

2

ORDERID가 3 인 행이 하나만 있으면 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을 사용할 수 있습니다.

관련 문제