progress-4gl
HITTA uttalande
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.