progress-4gl
FIND-verklaring
Zoeken…
Invoering
De instructie FIND
wordt gebruikt om een enkel record uit een enkele tabel op te halen. Het heeft enkele beperkingen in vergelijking met FOR
of QUERY
, maar het is een eenvoudige en handige verklaring voor snelle toegang tot records.
VIND basisvoorbeelden
Een eenvoudig sport2000-voorbeeld:
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.
EERSTE - zoek het eerste record dat overeenkomt met de zoekopdracht
NO-LOCK - vergrendel het record niet - wat betekent dat we alleen het record zullen lezen en niet wijzigen.
WAAR - dit is de vraag
GEEN FOUT - faal niet als er geen record beschikbaar is.
(ALS) BESCHIKBARE klant - controleer of we een record hebben gevonden of niet
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.
Beschikbaarheid en reikwijdte
De laatste vondst is altijd degene waar de beschikbaarheidscontrole tegen zal werken - een mislukte zoekopdracht zal AVAILABLE
rendement onwaar maken:
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
Een record gevonden in "main" zal beschikbaar zijn in alle procedures.
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)
Ook zal een record gevonden in een procedure nog steeds beschikbaar zijn nadat die procedure is afgesloten.
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.
VINDEN en vergrendelen
Wanneer u een record FIND
kunt u een slot ervan verkrijgen.
NO-LOCK: Wordt gebruikt voor alleen-lezen-bewerkingen. Als u een FIND <record> NO-LOCK
kunt u het record op geen enkele manier wijzigen.
FIND FIRST Customer NO-LOCK NO-ERROR.
EXCLUSIEF SLOT: wordt gebruikt voor updates en verwijderingen. Als u dit doet, "bezit" u het record en kan niemand anders het wijzigen of verwijderen totdat u klaar bent. Ze kunnen het lezen (zonder slot) zolang je het niet hebt verwijderd.
FIND FIRST Customer EXCLUSIVE-LOCK NO-ERROR.
SHARE-LOCK: vermijd koste wat het kost. Dit zal gekke hoofdpijn veroorzaken.
FIND FIRST Customer EXCLUSIVE-LOCK NO-ERROR. //Do this instead.
UPGRADING van uw slot van NO-LOCK naar EXCLUSIVE-LOCK
U kunt eenvoudig van een NO-LOCK
naar een EXCLUSIVE-LOCK
als de noodzaak om een record te wijzigen is ontstaan:
FIND FIRST Customer NO-LOCK NO-ERROR.
// Some code goes here
// Now we shall modify
FIND CURRENT Customer EXCLUSIVE-LOCK NO-ERROR.
Je kunt ook van EXCLUSIVE-LOCK naar NO-LOCK gaan.
VERGRENDELDE RECORDS
Wanneer andere gebruikers een slot van een record kunnen verwerven, kunt u beter met deze mogelijkheid rekening houden. Botsingen zullen optreden!
Het is beter om dit programmatisch af te handelen met de NO-WAIT
instructie. Dit geeft de AVM de opdracht FIND gewoon door te geven als het record door iemand anders is vergrendeld en laat u dit probleem oplossen.
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.