Ricerca…


introduzione

L'istruzione FIND viene utilizzata per recuperare un singolo record da una singola tabella. Ha alcune limitazioni rispetto a FOR o QUERY , ma è una semplice e pratica istruzione per un rapido accesso ai record.

TROVA esempi di base

Un semplice esempio di sports2000:

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.

PRIMO - trova il primo record che corrisponde alla query

NO-LOCK: non bloccare il record, il che significa che solo leggere e non modificare il record.

DOVE: questa è la query

NO-ERROR: non fallire se non ci sono record disponibili.

(SE) DISPONIBILE Cliente - controlla se abbiamo trovato un record o meno

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.

Disponibilità e portata

L'ultimo ritrovamento è sempre quello contro cui funziona il controllo di disponibilità: una ricerca non riuscita renderà AVAILABLE restituito falso:

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

Un record trovato in "main" sarà disponibile in tutte le procedure.

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)

Inoltre, un record trovato in una procedura sarà ancora disponibile dopo che la procedura è stata chiusa.

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.

TROVA e bloccando

Ogni volta che si FIND un record è possibile acquisire un blocco di esso.

NO-LOCK: utilizzato per operazioni di sola lettura. Se fai un FIND <record> NO-LOCK non puoi in alcun modo modificare il record.

FIND FIRST Customer NO-LOCK NO-ERROR.

BLOCCO ESCLUSIVO: utilizzato per aggiornamenti ed eliminazioni. Se lo fai, "possiedi" il record e nessun altro può modificarlo o eliminarlo finché non hai finito. Possono leggerlo (senza blocco) finché non lo hai cancellato.

FIND FIRST Customer EXCLUSIVE-LOCK NO-ERROR.

SHARE-LOCK: Evitare a tutti i costi. Ciò causerà mal di testa pazzo.

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

AGGIORNAMENTO del blocco da NO-LOCK a EXCLUSIVE-LOCK

È possibile passare facilmente da NO-LOCK a EXCLUSIVE-LOCK se è sorta la necessità di modificare un record:

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

Puoi passare da EXCLUSIVE-LOCK a NO-LOCK.

REGISTRATI BLOCCATI

Ogni volta che altri utenti potrebbero acquisire un blocco di un record, è meglio tenere conto di questa possibilità. Si verificheranno collisioni!

È meglio gestirlo a livello di codice utilizzando l'istruzione NO-WAIT . Ciò indica all'AVM di passare semplicemente FIND se il record è bloccato da qualcun altro e consente di gestire questo problema.

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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow