サーチ…


前書き

FINDステートメントは、1つのテーブルから1つのレコードを取得するために使用されます。 FORまたはQUERY比べていくつかの制限があり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.

可用性と有効範囲

最新のfindは、常に可用性チェックがうまくいくものです - 不成功のfindは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