ISSN: 1139-8736
Depósito Legal: B-8714-2001

6.7.3 Funciones Monarias (Internas)

En el Dominio Conceptual de la aplicación que se ha implementado, existen las siguientes funciones monarias:

UNIDADES
CUENTA
PROMEDIO
SUPERLATIVO/SUPERLATIVO_FECHA

DIFERENCIA_FECHA

Todas ellas aparecen en la estructura de datos *.QRT generada por el Módulo de Control como:

[ Qi -> FINT ]
FINT
= función, params
CAMPO = CampoBD
;

Con esa notación, se indica que función es una función interna relacionada con la consulta Qi a través del campo de las Bases de Datos CampoBD, que se encuentra en el SELECT de la sentencia SQL resultado de la traducción a SQL de la consulta en LN.

En el caso de que no exista una función interna, en la estructura *.QRT aparecerá:

[ Qi -> FINT ]
;

Dependiendo de la función interna a aplicar, pueden existir parámetros adicionales separados por comas, cuyo objetivo es completar la información necesaria para el correcto procesamiento de la misma. Por ejemplo:

FINT = UNIDADES, PIES
FINT = SUPERLATIVO, MAXIMO, 3
FINT = CUENTA
FINT = PROMEDIO

No todas las funciones internas necesitan de parámetros adicionales. Estos parámetros son obtenidos a través del análisis del fragmento de LN asociado a la función interna, con tablas de traducción que mapean el contenido de los conceptos-función interna a parámetros de la función. Veamos algunos ejemplos.

Para la función interna UNIDADES:

año (T_Unid) PRM1=AÑO
horas (T_Unid) PRM1=HORA
toneladas (T_Unid) lineales (T_Unid_1)   PRM1=TNLIN

Para la función interna PROMEDIO:

Media (Media)

Para la función interna SUPERLATIVO (Superlativo y Supeerlativo_Fecha):

anterior (Comp) 
antes (Comp)
mAs (Comp)
(Num)
PRM1=MIN
PRM1=MIN
PRM1=MAX
PRM2=(Num)

Cuando el Módulo de Control se encuentra con [ Qi -> FINT ] en la estructura de datos *.QRT, llama al Procesador Funcional, enviándole toda la información sobre la función interna que ha encontrado. El Procesador Funcional se encarga de procesar la información recibida modificando como resultado la consulta SQL vinculada a la función interna que el Módulo de Control le encarga procesar. La transformación de la consulta SQL dependerá de la función interna, y se realizará antes de que el ejecutor del Módulo de Control envie la consulta SQL al SGBD para obtener el resultado solicitado.

Veamos algunos casos:

[ Qi -> FINT ]
FINT
= UNIDADES, PIES
CAMPO = BARCOS.Eslora
;

El Procesador Funcional busca en la claúsula SELECT de la consulta SQL el campo BARCOS.Eslora y lo sustituye por BARCOS.Eslora*factor, siendo factor el factor de conversión, de la unidad por defecto que utilicemos para la eslora, a PIES. Estos factores de conversión se calcularán en base a dos tablas, una que contiene todos los campos numéricos de las BD y la unidad por defecto de los mismos, y otra con los factores de conversión de una unidad a otra.

[Tabla de Campos Numéricos]

BARCOS.Eslora
BARCOS.Anchura  
BARCOS.Velocidad_Máxima
BARCOS.Combustible_Máximo
BARCOS.Profundidad_Prueba
BARCOS.Desplazamiento_Bruto  
MEDIDAS.Desplzamiento
MEDIDAS.Nivel_Combustible
MEDIDAS.Velocidad_Actual  
MEDIDAS.Velocidad_Económica  
MEDIDAS.Velocidad_Media  
RUTAS.Longitud_Ruta AMETRALLADORAS.Calibre  
CAÑONES.Calibre 
OBUSES.Calibre 
...
M
M
MS
L
M
KG
KG
L
KMS
KMS
KMS
KMS
MM
MM
MM

[Tabla de Conversión de Unidades]

M M   1
M KM 0.001
M CM 100
MM 1000
KM  M   1000
CM   M 0.01
MM M   0.001
...

El Procesador Funcional tiene que modificar la consulta añadiendo en el SELECT, justo antes del primer campo, TOP <número>, donde el número lo indicará la función interna, y poner al final del WHERE, ORDER BY <campo> ASC|DESC... donde <Campo> es el campo al que afecta el superlativo, y ASC o DESC se corresponderá a MAXIMO y MINIMO respectivamente. Veamos un ejemplo.

Consulta Original:

SELECT DISTINCT BARCOS.Nombre, BARCOS.Velocidad_Máxima
FROM BARCOS
WHERE BARCOS.Desplazamiento >3

Función interna:

FINT=SUPERLATIVO, MAX, 5
CAMPO=BARCOS.Velocidad_Máxima

Consulta Final:

SELECT DISTINCT TOP 5 BARCOS.Nombre, BARCOS.Velocidad_Máxima
FROM BARCOS
WHERE BARCOS.Desplazamiento >3
ORDER BY BARCOS.Velocidad_Máxima ASC

El Procesador Funcional elimina del SELECT todos los campos que no coincidan con el que se está especificado en la función interna, y sustituye el nombre de ese campo por AVG(campo).

Todo esto funciona bien si no se combinan las funciones internas. Es decir, por ejemplo, si no se pide la media de la velocidad de los tres barcos más rápidos... Además, todo esto está sujeto a que no se empleen algunas cláusulas SQL especiales en el traductor ya que algunas son incompatibles entre sí. De momento habría problemas para implementar la función COUNT y AVG (media) siguiendo este método de modificación directa. Los problemas vienen no de no poder ejecutar la consulta sino de que el resultado de la misma no sería correcto.

Anterior   I  Siguiente   I  Índice capítulo 6   I  Índice General


ISSN: 1139-8736
Depósito Legal: B-8714-2001