문제

내가 일하고있는 프로젝트에서 아래와 같은 코드가 있습니다.

procedure TForm.EditBtnClick(Sender:TObject);
begin
  // Mark is form variable. It's private
  Mark = cdsMain.GetBookmark;
  // blabalbal
  .
  .   
  .
end;

procedure TForm.OkBtnClick(Sender:TObject);
var  
  mistakes: Integer;
begin
  //Validation stuff and transaction control
  //removed to not clutter the code
  If cdsMain.ChangeCount <> 0 then 
    mistakes := cdsMain.AppyUpdates(-1); 
  cdsMain.Refresh;
  try
    cdsMain.GotoBookmark(Mark);
    // Yes, I know I would have to call FreeBookmark
    // but I'm just reproducing 
  except
    cdsMain.First;
  end;
end;

개인적으로, 나는 북마크를 많이 사용하지 않습니다. 커서 위치 만 움직이는 데이터 세트를 재배치하는 것을 제외하고 (목록을 작성하고, 문자열 목록을 채우기 등). 만약 내가 Refresh, 업데이트 (특히 필터가 레코드를 보이지 않을 때), refetch (Close/Open) 또는 데이터 세트에서 데이터를 수정하는 작업은 북마크를 사용하지 않습니다. 나는 선호한다 Locate 기본 키에서 (a TClientDataset, 물론) 또는 requery 매개 변수 수정.

책갈피가 언제까지 유효합니까? a까지 Refresh? a까지 Close/Open 데이터를 리치하기 위해 완료 되었습니까? 안전 지대는 어디에서 끝나나요?

내가 사용하는 답변에서 고려하십시오 TClientDataset a TSQLQuery (dbexpress).

도움이 되었습니까?

해결책

둘 다처럼 C0RWIN 그리고 Skamradt 이미 언급 : 북마크 동작은 사용하는 Tdataset 자손에 따라 다릅니다.

일반적으로 북마크는 다음과 같이 유효하지 않습니다.

  1. 닫기/열기
  2. 새로 고침 (지원하는 데이터 세트)
  3. 데이터 변경 (때로는 삭제 만)

나는 1.와 2를 알고있다. 나는 tclientDatasets의 경우 어떤 기본 제공자가 사용되는지 (tsqlquery, tibquery 등) 중요하지 않다고 확신합니다.

무엇이 효과가 있고 테스트하지 않는 것이 무엇인지 확인하는 유일한 방법. 즉, 당신이 그것들을 사용하지 않는 것이 완전히 옳다는 것을 의미합니다. 북마크는 본질적으로 신뢰할 수없는 기회가 있습니다.

안전한 편이 되려면 항상 전화하십시오 BookmarkValid 북마크에 가기 전에.

다른 팁

개인적으로 나는 북마크를 거의 사용하지 않습니다. 대신에보고있는 레코드의 ID를 사용하고 새로 고침이 완료되면 위치를 수행합니다. 세트의 모든 레코드를 반복 해야하는 경우 TclientDataset (자체 커서를 얻음)의 클론을 사용하여 수행합니다.

북마크의 구현은 Tdataset Descendant의 공급 업체에 달려 있으며 구현마다 다를 수 있다는 것이 나의 이해입니다. 매우 간단한 데이터 세트에서 (tbindata), 레코드가 삭제되지 않는 한 레코드가 삭제되지 않는 한 새로 고침 사이에 책갈피를 구현했습니다. 나는 모든 구현에 대해 이것을 말할 수는 없습니다.

tdataset은 가상 북마크 방법을 구현합니다. 이러한 방법은 책갈피 메소드가 호출되면 tdataset에서 파생 된 모든 데이터 세트 객체를 리턴하는지 확인하지만, 반환 값은 단지 현재 위치를 추적하지 않는 기본값 일뿐입니다. tbdedataset과 같은 tdataset의 후손은 다음 목록에 설명 된대로 의미있는 값을 반환하도록 북마크 방법을 상환합니다.

  • BookmarkValid, 지정된 책갈피가 사용 중인지 결정하기 위해.
  • 비교 북마크, 두 개의 북마크를 테스트하여 동일인지 확인합니다.
  • getbookmark, 데이터 세트에서 현재 위치에 대한 책갈피를 할당합니다.
  • Gotobookmark, GetBookmark에서 이전에 만든 북마크로 돌아 가기
  • 프리 북 마크, GetBookmark에서 이전에 할당 된 북마크를 제거합니다.

그것을 얻으십시오 여기

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top