Using the CAN-FIND function
A menudo es necesario verificar la existencia de un registro sin recuperarlo para mostrarlo o actualizarlo. Por ejemplo, su lógica podría necesitar identificar a cada Cliente que tenga al menos un Pedido, pero es posible que no le importe recuperar ningún Pedido real. Para hacer esto, puede usar una alternativa a la declaración FIND que sea más eficiente porque solo verifica las entradas del índice siempre que sea posible para determinar si existe un registro, sin recurrir al trabajo adicional de recuperar el registro en sí. Esta alternativa es la función incorporada CAN-FIND. CAN-FIND toma un solo parámetro, que puede ser cualquier frase de selección de registro. La función CAN-FIND devuelve TRUE or FALSE dependiendo de si la frase de selección de registro identifica exactamente un registro en la base de datos.
Por ejemplo, imagine que desea identificar a todos los Clientes que hicieron pedidos desde 1997. No necesita recuperar o mostrar los Pedidos, solo necesita saber qué Clientes satisfacen este criterio de selección. El siguiente procedimiento simple logra esto:
FOR EACH Customer NO-LOCK WHERE Customer.Country = «USA»:
IF CAN-FIND(FIRST Order OF Customer WHERE Order.OrderDate < 1/1/98) THEN
DISPLAY Customer.CustNum Customer.Name.
ELSE
DISPLAY Customer.CustNum «No 1997 Orders» @ Customer.Name.
END.
FOR EACH Customer NO-LOCK WHERE Customer.Country = «USA»:
FIND FIRST Order OF Customer NO-LOCK WHERE OrderDate < 1/1/98 NO-ERROR.
IF AVAILABLE Order THEN
DISPLAY Customer.CustNum Customer.Name Order.OrderDate.
ELSE
DISPLAY «No 1997 Orders» @ Customer.Name.
END.
Este procedimiento utiliza un pequeño truco de pantalla que no has visto antes. Si el cliente tiene pedidos para 1997, el procedimiento muestra el Customer name. De lo contrario, muestra la frase de texto No 1997Orders. Si incluye ese valor literal en la sentencia DISPLAY, se muestra en su propia columna como si fuera un campo o una variable. Para mostrarlo en lugar del campo Name, use el símbolo at-sign (@). La siguiente figura muestra el resultado.