progress-4gl
FIND 문
수색…
소개
FIND
문은 단일 테이블에서 단일 레코드를 검색하는 데 사용됩니다. FOR
또는 QUERY
와 비교할 때 몇 가지 제한 사항이 있지만 레코드에 빠르게 액세스하려면 간단하고 편리한 문이 필요합니다.
기본 예제 찾기
간단한 sports2000 예 :
FIND FIRST Customer NO-LOCK WHERE CustNum = 1 NO-ERROR.
IF AVAILABLE Customer THEN DO:
DISPLAY Customer.NAME.
END.
ELSE DO:
MESSAGE "No record available".
END.
FIRST - 쿼리와 일치하는 첫 번째 레코드 찾기
NO-LOCK - 레코드를 잠그지 마십시오. 즉, 레코드 만 변경하고 레코드는 변경하지 않습니다.
WHERE - 이것은 쿼리입니다.
NO-ERROR - 사용 가능한 레코드가 없으면 실패하지 않습니다.
(IF) AVAILABLE 고객 - 레코드를 찾았는지 확인하십시오
findLoop:
REPEAT :
FIND NEXT Customer NO-LOCK WHERE NAME BEGINS "N" NO-ERROR.
IF AVAILABLE customer THEN DO:
DISPLAY Customer.NAME.
END.
ELSE DO:
LEAVE findLoop.
END.
END.
가용성 및 범위
최신 찾기는 항상 가용성 확인이 작동 할 것입니다. AVAILABLE
찾기로 인해 AVAILABLE
false를 반환합니다.
DEFINE TEMP-TABLE tt NO-UNDO
FIELD nr AS INTEGER.
CREATE tt.
tt.nr = 1.
CREATE tt.
tt.nr = 2.
CREATE tt.
tt.nr = 3.
DISPLAY AVAILABL tt. // yes (tt with nr = 3 is still available)
FIND FIRST tt WHERE tt.nr = 1 NO-ERROR.
DISPLAY AVAILABLE tt. //yes
FIND FIRST tt WHERE tt.nr = 2 NO-ERROR.
DISPLAY AVAILABLE tt. //yes
FIND FIRST tt WHERE tt.nr = 3 NO-ERROR.
DISPLAY AVAILABLE tt. //yes
FIND FIRST tt WHERE tt.nr = 4 NO-ERROR.
DISPLAY AVAILABLE tt. //no
"main"에있는 레코드는 모든 절차에서 사용할 수 있습니다.
DEFINE TEMP-TABLE tt NO-UNDO
FIELD nr AS INTEGER.
PROCEDURE av:
DISPLAY AVAILABLE tt.
IF AVAILABLE tt THEN DO:
DISPLAY tt.nr.
END.
END PROCEDURE.
CREATE tt.
tt.nr = 1.
RUN av. // yes. tt.nr = 1
CREATE tt.
tt.nr = 2.
RUN av. // yes. tt.nr = 2
FIND FIRST tt WHERE tt.nr = 4 NO-ERROR.
RUN av. // no (and no tt.nr displayed)
또한 프로 시저에서 발견 된 레코드는 해당 프로 시저가 종료 된 후에도 사용할 수 있습니다.
DEFINE TEMP-TABLE tt NO-UNDO
FIELD nr AS INTEGER.
PROCEDURE av:
FIND FIRST tt WHERE tt.nr = 1.
END PROCEDURE.
CREATE tt.
tt.nr = 1.
CREATE tt.
tt.nr = 2.
DISPLAY AVAILABLE tt WITH FRAME x1. // yes.
IF AVAILABLE tt THEN DO:
DISPLAY tt.nr WITH FRAME x1. //tt.nr = 2
END.
PAUSE.
RUN av.
DISPLAY AVAILABLE tt WITH FRAME x2. // yes.
IF AVAILABLE tt THEN DO:
DISPLAY tt.nr WITH FRAME x2. //tt.nr = 1
END.
찾기 및 잠금
당신이 때마다 FIND
기록을 당신은 그것의 잠금을 aquire 수 있습니다.
NO-LOCK : 읽기 전용 작업에 사용됩니다. FIND <record> NO-LOCK
을 FIND <record> NO-LOCK
어떤 방식 으로든 레코드를 수정할 수 없습니다.
FIND FIRST Customer NO-LOCK NO-ERROR.
배타 잠금 (EXCLUSIVE-LOCK) : 업데이트 및 삭제에 사용됩니다. 이 작업을 수행하면 레코드를 "소유"하게되며 다른 사람이 작업을 완료 할 때까지 수정할 수 없으며 삭제할 수 없습니다. 당신이 그것을 지우지 않은 한 그들은 그것을 읽을 수있다.
FIND FIRST Customer EXCLUSIVE-LOCK NO-ERROR.
주식 결손 : 모든 비용을 들이지 마십시오. 이것은 미친 두통을 일으킬 것입니다.
FIND FIRST Customer EXCLUSIVE-LOCK NO-ERROR. //Do this instead.
NO-LOCK에서 EXCLUSIVE-LOCK으로 잠금 장치 업그레이드
레코드를 수정해야 할 필요가있는 경우 NO-LOCK
에서 EXCLUSIVE-LOCK
쉽게 이동할 수 있습니다.
FIND FIRST Customer NO-LOCK NO-ERROR.
// Some code goes here
// Now we shall modify
FIND CURRENT Customer EXCLUSIVE-LOCK NO-ERROR.
EXCLUSIVE-LOCK에서 NO-LOCK으로 이동할 수 있습니다.
잠금 기록
다른 사용자가 레코드를 잠글 때마다이 가능성이 고려됩니다. 충돌이 발생할 것입니다!
NO-WAIT
문을 사용하여 프로그래밍 방식으로 처리하는 것이 좋습니다. 이것은 누군가가 레코드를 잠근 경우에만 FIND를 전달하고이 문제를 처리하도록 AVM에 지시합니다.
FIND FIRST Customer EXCLUSIVE-LOCK NO-ERROR NO-WAIT.
/* Check for availability */
IF AVAILABLE Customer THEN DO:
/* Check that no lock (from somebody else) is present */
IF NOT LOCKED Customer THEN DO:
/* Do your stuff here */
END.
ELSE DO:
MESSAGE "I'm afraid somebody else has locked this record!" VIEW-AS ALERT-BOX ERROR.
END.
END.