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.


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow