Suche…


Einführung

Die Anweisung FIND wird verwendet, um einen einzelnen Datensatz aus einer einzelnen Tabelle abzurufen. Verglichen mit FOR oder QUERY gibt es einige Einschränkungen, aber es ist eine einfache und praktische Anweisung für den schnellen Zugriff auf Datensätze.

Finden Sie grundlegende Beispiele

Ein einfaches sports2000-Beispiel:

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 - sucht den ersten Datensatz, der der Abfrage entspricht

NO-LOCK - sperren Sie den Datensatz nicht - das heißt, wir werden den Datensatz nur lesen und nicht ändern

WO - das ist die Abfrage

NO-ERROR - versagen Sie nicht, wenn kein Datensatz verfügbar ist.

(WENN) VERFÜGBAR Kunde - prüfen Sie, ob wir einen Datensatz gefunden haben oder nicht

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.

Verfügbarkeit und Umfang

Der letzte Fund ist immer derjenige, für den die Verfügbarkeitsprüfung funktioniert - ein nicht erfolgreicher Fund macht AVAILABLE false zurück:

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

Ein in "main" gefundener Datensatz wird in allen Verfahren verfügbar sein.

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)

Ein in einer Prozedur gefundener Datensatz ist auch weiterhin verfügbar, nachdem diese Prozedur beendet wurde.

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.

FINDEN und abschließen

Jedes Mal , wenn Sie FIND eine Aufzeichnung können Sie eine Sperre davon erwerben.

NO-LOCK: Wird für schreibgeschützte Vorgänge verwendet. Wenn Sie FIND <record> NO-LOCK , können Sie den Datensatz in keiner Weise ändern.

FIND FIRST Customer NO-LOCK NO-ERROR.

EXCLUSIVE-LOCK: Wird für Updates und Löschvorgänge verwendet. Wenn Sie dies tun, werden Sie den Datensatz "besitzen" und niemand kann ihn ändern oder löschen, bis Sie fertig sind. Sie können es lesen (ohne Sperren), solange Sie es nicht gelöscht haben.

FIND FIRST Customer EXCLUSIVE-LOCK NO-ERROR.

SHARE-LOCK: Um jeden Preis vermeiden. Dies wird Kopfschmerzen verursachen.

FIND FIRST Customer EXCLUSIVE-LOCK NO-ERROR. //Do this instead.

AKTUALISIEREN Sie Ihr Schloss von NO-LOCK auf EXCLUSIVE-LOCK

Sie können leicht von einem NO-LOCK zu einem EXCLUSIVE-LOCK wechseln, wenn sich ein Datensatz ändern muss:

FIND FIRST Customer NO-LOCK NO-ERROR. 
// Some code goes here
// Now we shall modify
FIND CURRENT Customer EXCLUSIVE-LOCK NO-ERROR.

Sie können auch von EXCLUSIVE-LOCK zu NO-LOCK wechseln.

GESPERRTE AUFZEICHNUNGEN

Wenn andere Benutzer eine Sperrung eines Datensatzes erhalten, sollten Sie diese Möglichkeit besser berücksichtigen. Kollisionen werden auftreten!

Es ist besser, dies programmgesteuert mit der NO-WAIT Anweisung zu behandeln. Dadurch wird AVM angewiesen, einfach FIND zu übergeben, wenn der Datensatz von jemand anderem gesperrt ist, und Sie können dieses Problem lösen.

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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow