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