progress-4gl
Declaración FIND
Buscar..
Introducción
La instrucción FIND
se usa para recuperar un solo registro de una sola tabla. Tiene algunas limitaciones en comparación con FOR
o QUERY
, pero es una declaración simple y práctica para acceder rápidamente a los registros.
Encontrar ejemplos básicos
Un ejemplo 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.
PRIMERO - encuentra el primer registro que coincida con la consulta
NO BLOQUEO - no bloquee el registro, lo que significa que solo leeremos y no cambiaremos el registro.
DONDE - esta es la consulta
NO-ERROR - no falle si no hay ningún registro disponible.
(SI) Cliente DISPONIBLE: verifique si encontramos un registro o no
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.
Disponibilidad y alcance
El último hallazgo es siempre aquel en el que funcionará la verificación de disponibilidad; un hallazgo fallido hará que el retorno AVAILABLE
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 registro que se encuentra en "principal" estará disponible en cualquier procedimiento.
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)
Además, un registro encontrado en un procedimiento todavía estará disponible después de que ese procedimiento haya terminado.
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.
ENCONTRAR y bloquear
Cada vez que FIND
un registro puede adquirir un bloqueo de él.
NO-LOCK: Se utiliza para operaciones de solo lectura. Si realiza un FIND <record> NO-LOCK
no podrá modificar el registro de ninguna manera.
FIND FIRST Customer NO-LOCK NO-ERROR.
BLOQUEO EXCLUSIVO: se utiliza para actualizaciones y eliminaciones. Si haces esto, serás "propietario" del registro y nadie más podrá modificarlo o eliminarlo hasta que hayas terminado. Pueden leerlo (sin bloqueo) siempre que no lo hayas eliminado.
FIND FIRST Customer EXCLUSIVE-LOCK NO-ERROR.
SHARE-LOCK: Evitar a toda costa. Esto causará dolor de cabeza loco.
FIND FIRST Customer EXCLUSIVE-LOCK NO-ERROR. //Do this instead.
ACTUALIZANDO su cerradura de NO-LOCK a EXCLUSIVE-LOCK
Puede pasar fácilmente de un NO-LOCK
a un EXCLUSIVE-LOCK
si ha surgido la necesidad de modificar un registro:
FIND FIRST Customer NO-LOCK NO-ERROR.
// Some code goes here
// Now we shall modify
FIND CURRENT Customer EXCLUSIVE-LOCK NO-ERROR.
También puede pasar de EXCLUSIVE-LOCK a NO-LOCK.
REGISTROS BLOQUEADOS
Siempre que otros usuarios puedan adquirir un bloqueo de un registro, es mejor que tenga en cuenta esta posibilidad. ¡Se producirán colisiones!
Es mejor manejar esto mediante programación utilizando la instrucción NO-WAIT
. Esto le indica a la AVM que solo pase el FIND si el registro está bloqueado por otra persona y le permite manejar este 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.