Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[12596] [질문] ClientDataset에서 Delete를 실행하면 이상합니다.
고민중 [] 1852 읽음    2009-04-13 16:39
ClientDataSet에서 Delete를 실행하면 이상합니다.
결과는 같다면 같겠지만 while -- do --의 내용에 따라 실수할 수 있기 때문에
다른 방법이 있는지, 아니면 그런줄 알고 사용해야 하는지 궁금하여 질문드립니다.

델파이2007을 사용하고 있습니다.

폼에 TClientDataSet 컴포넌트를 놓고요..
특정 프로퍼티변경 없이 로컬데이터로만 사용했습니다.
인덱스는 없습니다.
  :
  :
ClientDataSet : TClientDataSet;
:
:

ClientDataSet의 필드는 Name필드가 있고,
Name필드에 1 -- 18까지 입력하여 18개의 레코드가 있습니다.
저는 이렇게 저장된 레코드에서 13, 14, 15번째것만 취하고 나머지는 지우고 싶습니다.
다음과 같이 코딩했습니다.

Memo.Line.clear;
with ClientDataSet do
begin
  IndexFieldNames := '';
  First;
  while not Eof do
  begin
    Memo.Line.Add( FieldByName('Name').asString );         
    if Name = 13 or 14 or 15 then // -- 컴파일에서는 오류가 나겠지만 코딩이 맞다고 가정하고요..
      Next
    else
      Delete;
  end;
end;

위의 코드 if 에서 제가 간략하게 기술했는요..
정상적으로 처리되어 원하는 것만 제외하고 삭제된다고 가정하고요.
Memo에 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 15 라고 표시됩니다.
결과는 역시 3개의 레코드가 남습니다.

제가 조건을 달리하여 테스트해보니 처음 레코드갯수만큼 진행된다는 것을 알수 있었습니다.
다른 레코드를 선택하여 지우도록 하면 같은 레코드가 여러번 처리되었습니다.

만약 위에서 Next전에 뭔가 연산하고 Next를 하는 결과라면
15의 내용은 2번 작업하게 됩니다.

같은 내용을 BDE의 Table이나 Rx의 MemoryTable을 사용하면 이상없이 처리됩니다.

원래 저렇게 처리된다면 피해갈 방법은 있겠지만
이해가 안가서요.
그럼 미리 감사드립니다.

+ -

관련 글 리스트
12596 [질문] ClientDataset에서 Delete를 실행하면 이상합니다. 고민중 1852 2009/04/13
12607     Re:[질문] ClientDataset에서 Delete를 실행하면 이상합니다. 무능력 1444 2009/04/15
12626         Re:Re:[질문] ClientDataset에서 Delete를 실행하면 이상합니다. 고민중 1418 2009/04/20
12606     Re:[질문] ClientDataset에서 Delete를 실행하면 이상합니다. 고민중 1430 2009/04/15
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.