Q&A

  • DbiIsRecordLocked에 대해 질문합니다.
안녕하세요~
paradox를 네트워크 공유로 사용하는 프로그램을 하고 있습니다.
한 명이 그 레코드에 대해 수정 중일 때 다른 한 명이 그 데이터를 삭제를 못하게 하려고 DbiIsRecordLocked
함수를 이용하려고 합니다.
근데 결과값이 제가 원하는 데로 나오지가 않네요..
간단하게 다음과 같이만 했습니다.
DbiIsRecordLocked 함수에 대해 검색을 해도 별로 나오지가 않아서 컴파일은 됐는데 제대로 한 게 맞는지
잘 모르겠습니다.


procedure TForm1.sbt_delClick(Sender: TObject); //삭제버튼 클릭
// 수정중인 레코드에 대하여는 삭제 불가
var
    Locked, Result  : BOOL;
begin
  
    DbiIsRecordLocked(Query1.Handle, Locked);
    Result := Locked;

    if (not Result) then
    begin
        showmessage('사용중아님');
    end
    else
        showmessage('사용중');
    end;

-> 만약에 2번 레코드에 대해 a가 수정 edit모드라면, b가 2번 레코드를 삭제하려고 하면 '사용중'이라고
    나와야합니다.
    그러나 실제 실행하면 '사용중아님'이 나옵니다.
    그리고 또 이상한 점은. 2번이 아닌 5번 레코드를 삭제하려고 해도 '사용중아님'이 나옵니다.
    어떻게 수정을 해야할까요?
    도움 부탁드릴께요 ^^
3  COMMENTS
  • Profile
    소울해커 2008.04.12 22:25
    http://www.delphi.co.kr/zboard/view.php?desc=asc&id=qanda&no=3509&sc=on&select_arrange=headnum&sn=off&sn1=&ss=on

    이걸 찾으시는 건지요?


    >안녕하세요~
    >paradox를 네트워크 공유로 사용하는 프로그램을 하고 있습니다.
    >한 명이 그 레코드에 대해 수정 중일 때 다른 한 명이 그 데이터를 삭제를 못하게 하려고 DbiIsRecordLocked
    >함수를 이용하려고 합니다.
    >근데 결과값이 제가 원하는 데로 나오지가 않네요..
    >간단하게 다음과 같이만 했습니다.
    >DbiIsRecordLocked 함수에 대해 검색을 해도 별로 나오지가 않아서 컴파일은 됐는데 제대로 한 게 맞는지
    >잘 모르겠습니다.
    >
    >
    >procedure TForm1.sbt_delClick(Sender: TObject); //삭제버튼 클릭
    >// 수정중인 레코드에 대하여는 삭제 불가
    >var
    >    Locked, Result  : BOOL;
    >begin
    >  
    >    DbiIsRecordLocked(Query1.Handle, Locked);
    >    Result := Locked;
    >
    >    if (not Result) then
    >    begin
    >        showmessage('사용중아님');
    >    end
    >    else
    >        showmessage('사용중');
    >    end;
    >
    >-> 만약에 2번 레코드에 대해 a가 수정 edit모드라면, b가 2번 레코드를 삭제하려고 하면 '사용중'이라고
    >    나와야합니다.
    >    그러나 실제 실행하면 '사용중아님'이 나옵니다.
    >    그리고 또 이상한 점은. 2번이 아닌 5번 레코드를 삭제하려고 해도 '사용중아님'이 나옵니다.
    >    어떻게 수정을 해야할까요?
    >    도움 부탁드릴께요 ^^
  • Profile
    델피삼매경 2008.04.14 19:51
    우선 답변 감사해요. 저번에도 소울해커 님이 답변 남겨주셨었는데, 이번에도 남겨주셨네요^^
    근데 링크해주신 글은 저도 봤구요. 델파이 도움말에 예제로 나온거더라구요.
    보구 한다고 했는데 제가 지식이 짧아서인지 봐도 모르겠습니다.
    좀더 자세히 알려주시면 안될까요? ^^;;

  • Profile
    소울해커 2008.04.14 23:11
    저도 잘 몰라서 그다지 설명 드릴게 없습니다. ^^;

    코드는 테이블을 넘겨 받아서 현재 수정중이면 True를 아니면 False를 리턴하는 함수더군요.


    function fDbiIsRecordLocked(Table: TTable): Boolean;
    var Locked: BOOL;
        hCur: hDBICur;
        rslt: DBIResult;
        ByAnyone: boolean;
    begin
      Table.UpdateCursorPos;
      // Is the record locked by the current session...
      Check(DbiIsRecordLocked(Table.Handle, Locked));
      Result := Locked;
      // If the current session does not have a lock and the ByAnyone varable is
      // set to check all sessions, continue check...
      { Always do this, so works with all current calls. }
      ByAnyone := True;
      if (Result = False) and (ByAnyone = True) then begin
        // Get a new cursor to the same record...
        Check(DbiCloneCursor(Table.Handle, False, False, hCur));
        try
        // Try and get the record with a write lock...
          rslt := DbiGetRecord(hCur, dbiWRITELOCK, nil, nil);
          if rslt <> DBIERR_NONE then begin
          // if an error occured and it is a lock error, return true...
            if HiByte(rslt) = ERRCAT_LOCKCONFLICT then Result := True
              else
          // If some other error happened, throw an exception...
                Check(rslt);
          end else
          // Release the lock in this session if the function was successful...
            Check(DbiRelRecordLock(hCur, False));
        finally
          // Close the cloned cursor...
          Check(DbiCloseCursor(hCur));
        end;
      end;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      ShowMessage(BoolToStr(fDbiIsRecordLocked(Table1)));
      Table1.Edit;
      ShowMessage(BoolToStr(fDbiIsRecordLocked(Table1)));
      Table1.Post;
      ShowMessage(BoolToStr(fDbiIsRecordLocked(Table1)));
    end;


    파라독스는 아주 오래전에 프로그램에대해 쥐뿔도 모르던 시절 잠깐 연습용으로 봤던거라

    거의 지식이 전무합니다.

    이 함수는 테이블을 통째로 넘겨 받아서 처리하니

    어떻게 수정해보시면 쿼리를 넘겨줘서 처리하도록 변경도 되겠죠? ㅎ;