Se llama “enmascarar” al hecho de llamar de una manera distinta a una función, rutina, clase o stored procedure. Las ventajas de enmascarar son que la llamada a la función, rutina, clase o stored procedure subyacente resulta más fácil para el programador, le permite escribir menos código fuente y además le asegura que siempre todo esté correcto.

Ejemplo:

Tenemos una tabla llamada MOVIMCAB (cabecera de movimientos) cuya estructura (resumida, por supuesto) es la siguiente:

ENMASCARAR2

Captura 1. Si haces clic en la imagen la verás más grande

y que tiene (entre otros) a estos datos:

ENMASCARAR1

Captura 2. Si haces clic en la imagen la verás más grande

Para saber si un determinado número de documento existe podríamos escribir un stored procedure similar al siguiente:

CREATE PROCEDURE EXISTE_NUMERO_DOCUMENTO(
   tnCodSuc TYPE OF COLUMN MOVIMCAB.MVC_CODSUC,
   tnTipDoc TYPE OF COLUMN MOVIMCAB.MVC_TIPDOC,
   tcNroDoc TYPE OF COLUMN MOVIMCAB.MVC_NRODOC)
RETURNS(
   ftcExisteDocumento D_BOOLEAN)
AS
  DECLARE VARIABLE lnIdenti TYPE OF COLUMN MOVIMCAB.MVC_IDENTI;
BEGIN

   lnIdenti = (SELECT
                  FIRST 1
                  MVC_IDENTI
               FROM
                  MOVIMCAB
               WHERE
                  MVC_CODSUC = :tnCodSuc AND
                  MVC_TIPDOC = :tnTipDoc AND
                  MVC_NRODOC = :tcNroDoc);

   ftcExisteDocumento = iif(lnIdenti > 0, 'T', 'F');

END;

Donde el dominio D_BOOLEAN está definido como:

CREATE DOMAIN D_BOOLEAN AS
   CHAR(1)
   CHECK (VALUE = 'F' OR VALUE = 'T');

Entonces, si desde nuestro programa escrito en Visual FoxPro queremos saber si un número de documento ya existe podríamos escribir algo así:

Local lcAlias, lcComando, llComandoOK, llExisteDocumento
Private pnCodSuc, pnTipDoc, pcNroDoc

   lcAlias = Alias()

   pnCodSuc = 0
   pnTipDoc = 1
   pcNroDoc = '001-001-0000001'

   lcComando = "EXECUTE PROCEDURE EXISTE_NUMERO_DOCUMENTO(?pnCodSuc, ?pnTipDoc, ?pcNroDoc)"

   llComandoOK = SQLEXEC(gnHandle, lcComando)

   llExisteDocumento = llComandoOK .and. ftcExisteDocumento = "T"

   if !Empty(lcAlias)
     select (lcAlias)
  endif

Ahora bien, supongamos que debemos averiguar si un número de documento existe no una vez sino varias veces. Escribir siempre los comandos mostrados arriba sería engorroso y una pérdida de tiempo y además propenso a errores. Mucho mejor sería enmascarar esos comandos con una función, tal como la siguiente:

FUNCTION ExisteDocumento
Parameters tnCodSuc, tnTipDoc, tcNroDoc
Local lcAlias, lcComando, llComandoOK, llExisteDocumento

   lcAlias = Alias()

   lcComando = "EXECUTE PROCEDURE EXISTE_NUMERO_DOCUMENTO(?tnCodSuc, ?tnTipDoc, ?tcNroDoc)"

   llComandoOK = SQLEXEC(gnHandle, lcComando)

   llExisteDocumento = llComandoOK .and. ftcExisteDocumento = "T"

   if !Empty(lcAlias)
      select (lcAlias)
   endif

Return(llExisteDocumento)

Y a la cual podríamos llamar así:

Local lnCodSuc, lnTipDoc, lcNroDoc, llDocumentoExiste

   lnCodSuc = 0
   lnTipDoc = 1
   lcNroDoc = '001-001-0000001'

   llDocumentoExiste = ExisteDocumento(lnCodSuc, lnTipDoc, lcNroDoc)

De esta manera, la función ExisteDocumento() de Visual FoxPro está “enmascarando” al stored procedure EXISTE_NUMERO_DOCUMENTO del Firebird.

Conclusión:

“Enmascarar” a los stored procedures nos permite escribir menos código fuente y además código fuente más seguro porque lo único que debemos verificar bien es que la función enmascaradora sea correcta. Si esa función está bien ya no deberemos preocuparnos por las llamadas al stored procedure correspondiente porque la función se encargará de todas las tareas.

Artículo relacionado:

El índice del blog Firebird21