Q&A

  • LAN간의 같은테이블의 같은 레코드에서 락....
안녕하세요 언제나 질문만 하게됨니다...

다름이 아니라 LAN 에서 2개의 컴이 같은테이블을 띄워사용함니다..

A컴 에서는 새로은 레코드를 추가 하고 B컴에서는 그 추가한 레코드에 자료를 입력하는 작업입니다..

그런데 A컴에서 추가한 자료에 포커스가 있는상태에서 B컴에서 추가한자료를 수정 저장하니까 에러가 나더군요....

레코드 락이 걸렸다나????

B컴에서 수정 저장하게전에 그 테이블의 레코드가 락인지 아닌지 알수있는 함수가 있나요?

아니면 저장해야 하는데 다른 대처방법은 없나요?

그러니까 테이블의 전체가아닌 하나의 레코드가 락인지 아닌지를 알수있는방법좀 갈켜 주세요....

제발.........



2  COMMENTS
  • Profile
    김영대 1999.08.30 19:09
    "Search the Borland Web Site"

    http://www.borland.com/searchsite/

    에서 "record lock" 으로 검색해 보시면 참고가 되실겁니다



    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;





  • Profile
    장철진 1999.08.31 04:12
    김영대 께서 말씀하시기를...

    > "Search the Borland Web Site"

    > http://www.borland.com/searchsite/

    > 에서 "record lock" 으로 검색해 보시면 참고가 되실겁니다

    >

    > 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;

    >

    >



    김영대님 답변 감사합니다..

    그런데 3행에서 에러가 나는데....... hCur: hDBICur; 에서 error!

    전 델파이 3를쓰구요. dbase를 사용하는데 에러나는이유와 관계있나요?....

    아직 초짜라.....죄송합니다...실행안되는 이유가?????