progress-4gl
TROUVER une déclaration
Recherche…
Introduction
L'instruction FIND
est utilisée pour extraire un enregistrement unique d'une seule table. Il a quelques limitations par rapport à FOR
ou QUERY
, mais c'est une déclaration simple et pratique pour un accès rapide aux enregistrements.
Trouver des exemples de base
Un exemple simple de 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.
FIRST - trouver le premier enregistrement qui correspond à la requête
NO-LOCK - ne verrouille pas l'enregistrement - ce qui signifie que nous ne ferons que lire et non modifier l'enregistrement.
OERE - c'est la requête
NO-ERROR - n'échoue pas s'il n'y a aucun enregistrement disponible.
(IF) DISPONIBLE - vérifiez si nous avons trouvé un enregistrement ou non
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é et étendue
La dernière trouvaille est toujours celui de la vérification de la disponibilité fonctionnera contre - une découverte unsuccesful fera AVAILABLE
faux retour:
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 enregistrement trouvé dans "main" sera disponible dans toutes les procédures.
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 outre, un enregistrement trouvé dans une procédure sera toujours disponible après la fin de cette procédure.
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.
TROUVER et verrouiller
Chaque fois que vous FIND
un enregistrement que vous pouvez acheter un verrou de celui - ci.
NO-LOCK: Utilisé pour les opérations en lecture seule. Si vous faites un FIND <record> NO-LOCK
vous ne pouvez en aucun cas modifier l'enregistrement.
FIND FIRST Customer NO-LOCK NO-ERROR.
EXCLUSIVE-LOCK: Utilisé pour les mises à jour et les suppressions. Si vous faites cela, vous "posséderez" l'enregistrement et personne d'autre ne pourra le modifier ou le supprimer tant que vous n'en aurez pas terminé. Ils peuvent le lire (sans verrou) tant que vous ne l'avez pas supprimé.
FIND FIRST Customer EXCLUSIVE-LOCK NO-ERROR.
SHOCK-LOCK: Évitez à tout prix. Cela va causer des maux de tête.
FIND FIRST Customer EXCLUSIVE-LOCK NO-ERROR. //Do this instead.
MISE À NIVEAU de votre verrou de NO-LOCK à EXCLUSIVE-LOCK
Vous pouvez facilement passer d'un NO-LOCK
à un EXCLUSIVE-LOCK
si vous avez besoin de modifier un enregistrement:
FIND FIRST Customer NO-LOCK NO-ERROR.
// Some code goes here
// Now we shall modify
FIND CURRENT Customer EXCLUSIVE-LOCK NO-ERROR.
Vous pouvez également passer de EXCLUSIVE-LOCK à NO-LOCK.
REGISTRES VERROUILLÉS
Chaque fois que d'autres utilisateurs peuvent acquérir une serrure de disque, il vaut mieux prendre en compte cette possibilité. Des collisions se produiront!
Il est préférable de gérer cela par programmation en utilisant l'instruction NO-WAIT
. Cela dit à l'AVM de simplement passer le FIND si l'enregistrement est verrouillé par quelqu'un d'autre et de vous laisser gérer ce problème.
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.