Sök…


Introduktion

FIND uttalandet används för att hämta en enda post från en enda tabell. Det har vissa begränsningar jämfört med FOR eller QUERY , men det är ett enkelt och praktiskt uttalande för snabb åtkomst till poster.

HITTA grundläggande exempel

Ett enkelt sport2000 exempel:

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.

FÖRST - hitta den första posten som matchar frågan

NO-LOCK - lås inte posten - vilket betyder att vi bara kommer att läsa och inte ändra posten.

VAR - detta är frågan

NO-ERROR - misslyckas inte om det inte finns någon post tillgänglig.

(IF) TILLGÄNGLIG kund - kolla om vi hittade en post eller inte

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.

Tillgänglighet och omfattning

Det senaste fyndet är alltid det som tillgänglighetskontrollen fungerar mot - en AVAILABLE gör att AVAILABLE retur är falsk:

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

En post som finns i "main" kommer att finnas tillgänglig i alla procedurer.

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)

En post som hittas i en procedur kommer också att finnas tillgänglig efter att proceduren har avslutats.

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.

HITA och låsa

När du FIND en post kan du få ett lås av det.

NO-LOCK: Används för skrivskydd. Om du gör ett FIND <record> NO-LOCK du inte på något sätt ändra posten.

FIND FIRST Customer NO-LOCK NO-ERROR.

EXCLUSIVE LOCK: Används för uppdateringar och borttagningar. Om du gör detta kommer du "äga" posten och ingen annan kan ändra den eller ta bort den förrän du är klar. De kan läsa det (utan låsning) så länge du inte har tagit bort det.

FIND FIRST Customer EXCLUSIVE-LOCK NO-ERROR.

DEL-LOCK: Undvik till varje pris. Detta kommer att orsaka galna huvudvärk.

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

UPPgradera ditt lås från NO-LOCK till EXCLUSIVE-LOCK

Du kan enkelt flytta från NO-LOCK till EXCLUSIVE-LOCK om behovet av att ändra en post har uppstått:

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

Du kan också gå från EXCLUSIVE-LOCK till NO-LOCK.

LÅSTA INSPELNINGAR

Närhelst andra användare kan skaffa ett lås med en post, bör du beakta denna möjlighet. Kollisioner kommer att inträffa!

Det är bättre att hantera detta med hjälp av NO-WAIT uttalandet. Detta säger AVM att bara passera FIND om posten är låst av någon annan och låter dig hantera det här problemet.

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow