Ayuda sobre productos BOLD:

Uso de variables de sesión y tablas externas

Página:
< Volver

Cuando dentro de una fórmula (de contadores por ejemplo) es necesario recuperar algún valor de una tabla externa a la aplicación la solución puede ser efectuar un comando SQL SELECT contra la tabla en cuestión (utilizando la función SQLCount, cuando se trata del valor a extraer de una única columna cualquiera, por ejemplo).

Sin embargo, este procedimiento deja de ser ágil cuando el nº de consultas que se han de lanzar empieza a ser elevado (varios miles). Para solucionar el problema anterior se puede utilizar la siguiente técnica que consiste en precargar los datos en una tabla en memoria, guardar la tabla en una variable y luego acceder a ella mediante otra función. Los pasos son los siguientes:

Precargar los datos en la tabla ad-hoc: un script

Programar un script externo que efectúe la carga de los datos en una tabla auxiliar de la base de datos de BOLD, creada para este fin.

A modo de ejemplo consultar alguno de los scripts de la interfases de ejemplo existentes. Por ejemplo:

95 Sincro_DatosComedor.bat / Sincro_DatosComedor.wsf / Sincro_DatosComedor.js

El script anterior crea la tabla dadesmenjador, que contiene datos de fichajes de comedor que luego serán utilizados en las fórmulas de contadores de nómina para determinar si a cada empleado le corresponde o no un descuento en su nómina para cada uno de los días en que haya utilizados los servicios de comedor. Para ello, las fórmulas de cálculo correspondientes se apoyan en las siguientes funciones dinámicas adicionales:

Precarga de la tabla: DictionarySQL

DictionarySQL La función dinámica que se ocupa cargar tablas en memoria a partir de un comando SQL genérico, donde se definen los campos clave de búsqueda.

Esta función debe tener siempre 5 parámetros (SQL, filtro1, filtro2,filtro3, filtro4). En caso de no ser necesarios alguno de los filtros, se debe especificar “”.

Búsqueda rápida en memoria de un registro: DictionaryLookup

DictionaryLookup Función dinámica para la búsqueda rápida de datos en las tablas en memoria.

Gestión de la tabla precargada en caché: variables de sesión

SetSessionVar Función para almacenamiento temporal de variables en sesion, que serán habitualmente variables tipo tabla retornadas por DictionarySQL.

GetSessionVar Función de recuperacion de variables de la sesión.

DelSessionVar Función de eliminación de variables de la sesión.

NOTA: Si la variable de sesión se utiliza en un informe que a su vez tiene definidas variables calculadas a traves del método CustomWorkerCounter, es IMPERATIVO que el nombre de dicha variable de sesión lleve como prefijo la palabra CustomWorkerCounter. El motivo es que usar CustomWorkerCounter implica recursividad, lo cual conlleva pasar más de una vez por el mismo SetSessionVar, y ello da lugar a errores diversos.

Ejemplo de uso combinado

Por ejemplo en el informe de contadores, donde se necesita un acceso eficaz a estos datos se configura de la siguiente forma en la sección de inicialización (BeforeExpression) y finalización (AfterExpresion) del informe correspondiente (ExtAttributes, nodo <Class>):

<BeforeExpression>
  <Expression>
    <![CDATA[
      SetSessionVar("var_datos_comedor", DictionarySQL(
        "select max(id_persona) as id_persona, max(id_empresa) as id_empresa, max(data) as fecha, count(*) as repeticiones, max(tipus) as tipo_comida 
         from dadesmenjador group by id_persona, id_empresa, tipus",
        "id_persona", "id_empresa", "fecha", "tipo_comida"))
    ]]>
 </Expression>
</BeforeExpression>
<AfterExpression>
  <Expression>
    <![CDATA[
      DelSessionVar("var_datos_comedor")
    ]]>
 </Expression>
</AfterExpression>


Y dentro de la configuración de los datos del informe aparecerá una definición similar a esta para obtener el nº de usos del pase de comedor realizadas de tipo 1 (comidas), para un empleado X, de la empresa Y, en la fecha Z:

<ExtAttribute Name="Dieta_comidas" Type="int" Default="0">
<Expression>
  <![CDATA[
    DictionaryLookup(GetSessionVar("var_datos_comedor"), IdCW.Worker.ExtCode, IdCW.Company.ExtCode, StartDate, 1).repeticiones
 ]]>
</Expression>
</ExtAttribute>


Nótese como se accede al valor del registro extraido, usando el nombre de la columna del resultado de la consulta: DictionaryLookup(…).repeticiones como si se tratara de una propiedad estándar de un objeto del sistema. Esto es así porque la función DictionaryLookup retorna un Objeto automático.

Por supuesto, también se podría almacenar el valor así extraído en otra variable (del informe o de la sesión) para evitar efectuar más búsquedas de las estrictamente necesarias.

Was this article helpful?
0 out Of 5 Stars
5 Estrellas 0%
4 Estrellas 0%
3 Estrellas 0%
2 Estrellas 0%
1 Estrellas 0%
5
How can we improve this article?
How Can We Improve This Article?
Tags:

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Contenido