수색…


소개

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-LOCKFIND <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.


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow