progress-4gl
FIND-Anweisung
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.