Ir al contenido

Tutorial: primera consulta

Este tutorial construye una consulta desde cero: se da de alta el ítem en el menú, se escribe el XML, se agregan joins para traer datos de otras tablas y se termina con filtros y un desplegable de selección.

El menú del sistema es el de la imagen:

Tutorial1

La primera opción de la tuerquita(engranaje) que esta a la derecha de este menú es “Menus del sistema” cuando la abrimos aparece el árbol de menus:

Tutorial2

En esta parte del sistema se pueden ver editar y agregar nuevos elementos al menú. Lo más sencillo es ver como están ordenados, como están dados de alta y en nuestro caso, que vamos a hacer una consulta en la parte de bancos, copiar parte de lo que ya esta hecho.

El nuevo elemento ya está en la foto es “Consulta de gastos” vamos a ver como lo dimos de alta.

Tutorial3

Orden: número que ordena el ítem entre los que comparten el mismo nivel.

Menú: el ítem padre. Se copia de otro ítem que esté en el mismo nivel y submenú. Para agregar el nuevo ítem dentro de “Bancos” → “Consultas”, se usa el mismo valor que tienen los ítems que ya están ahí.

Título: el texto que se muestra en el menú.

Parámetros: configuraciones del ítem. Para una consulta interesan dos:

  • xml= nombre del archivo que se ejecuta al elegir el ítem.
  • dir= directorio donde está ese archivo.

Los archivos de cada cliente viven bajo el directorio de su base:

  • Directoriousr/
    • Directorioshare/
      • Directoriohistrix/
        • Directoriodatabase/
          • DirectorioElClienteX/
Ventana de terminal
/usr/share/histrix/database/<ElClienteX>/

Dentro de esta carpeta se genera un árbol de directorios parecido a este:

  • DirectorioElClienteX/
    • Directorioayudas/
    • Directoriobancos/
      • Directorioing/
      • Directorioman/
      • Directorioqry/
      • Directoriotest/
        • Directorioacceptance/
        • Directorio_support/
    • Directoriocaja/
      • Directorioing/
        • Directorioaccesorios/
        • Directorioclass/
        • Directoriopedidos/
        • Directorioruta/
      • Directorioman/
      • Directorioproc/
        • Directoriodel/
      • Directorioqry/
      • Directoriotest/
        • Directorioacceptance/
        • Directorio_support/
    • Directoriocalidad/
      • Directorioambiente/
      • Directorioing/
      • Directorioman/
      • Directorioqry/
    • Directorioclientes/
      • Directorioinputacion/
      • Directorioing/
        • Directoriomos/
        • Directorioobleas/
        • Directoriopre/
      • Directorioman/
        • Directoriotests/
      • Directorioqry/
      • Directoriotests/
        • Directorioacceptance/
        • Directorio_support/
    • Directoriodasbuard/

Cada directorio dentro de la base representa un módulo, y dentro de cada módulo están los archivos que invocan los ítems del menú.

Para este ejemplo se crea gastos_qry.xml en el directorio bancos y se asocia el ítem “Consulta de gastos” a ese archivo:

Tutorial5

El XML describe una o varias tablas de la base. Este ejemplo trabaja sobre REG_MOVIMIENTOS, que contiene los movimientos —entre ellos los bancarios. Estos son algunos de sus campos:

Tutorial6

Un primer borrador del archivo:

<?xml version="1.0" encoding="UTF-8"?>
<histrix tipo="consulta" paginar="50">
<title> Consulta de gastos </title>
<obs/>
<form>
<table id="REG_MOVIMIENTOS">
<field id="id_regmovim" />
<field id="sussistema_id" />
<field id="regcuenta_id" />
<field id="nombre_movimiento" />
</table>
</form>
</histrix>

La declaración XML y el tag <histrix> son obligatorios. En el <histrix> van los atributos del programa: tipo="consulta" define que es una consulta y paginar="50" que se muestren 50 filas por página. <obs> y <form> también son obligatorios; dentro de <form> va <table> con el nombre de la tabla base, y dentro de la tabla los <field> con los campos a mostrar.

Así se ve la consulta al abrir el ítem “Consulta de gastos”:

Tutorial8

Es habitual que los datos a mostrar estén repartidos en varias tablas. El join las une.

REG_MOVIMIENTOS tiene un campo cajmovimiento_id y existe la tabla CAJ_MOVIMIENTOS con el campo id_cajmovimiento: cada valor del primero se corresponde con una fila de la segunda. En SQL sería:

SELECT * FROM REG_MOVIMIENTOS RM JOIN CAJ_MOVIMIENTOS CM ON RM.cajmovimiento_id = CM.id_cajmovimiento

El equivalente en gastos_qry.xml:

<?xml version="1.0" encoding="UTF-8"?>
<histrix tipo="consulta" paginar="50">
<title> Consulta de gastos </title>
<obs/>
<form>
<table id="REG_MOVIMIENTOS">
<field id="id_regmovim">
<label>ID</label>
</field>
<field id="subsistema_id">
<label>Subsistema</label>
</field>
<field id="regcuenta_id">
<label>Cuenta</label>
</field>
<field id="cajmovimiento_id">
<label>Movimiento de caja</label>
</field>
<field id="cajconcepto_id" tabla="CAJ_MOVIMIENTOS">
<label>Concepto</label>
</field>
<field id="nro_movimiento" tabla="CAJ_MOVIMIENTOS">
<label>Numero de movimiento</label>
</field>
</table>
<join tipo="left">
<table id="CAJ_MOVIMIENTOS">
<field id="id_cajmovimiento">
<condicion operador="=">REG_MOVIMIENTOS.cajmovimiento_id</condicion>
</field>
</table>
</join>
</form>
</histrix>

El <join> se abre después de cerrar el <table> de la tabla base y contiene su propio <table>.

Además del join se agregaron los campos cajmovimiento_id, cajconcepto_id y nro_movimiento. Los dos últimos pertenecen a CAJ_MOVIMIENTOS, así que el <field> necesita el atributo tabla indicando de qué tabla se toman.

El tag <label> dentro de un <field> define el título de la columna. Con las etiquetas puestas, el listado queda así:

Tutorial11

Para poder filtrar por concepto hace falta un segundo join que traiga la tercera tabla: el movimiento se asocia a un movimiento de caja, y este a un concepto.

<join tipo="left">
<table id="CAJ_MOVIMIENTOS">
<field id="id_cajmovimiento">
<condicion operador="=">REG_MOVIMIENTOS.cajmovimiento_id</condicion>
</field>
</table>
</join>
<join tipo="left">
<table id="CAJ_CONCEPTOS">
<field id="id_cajconcepto">
<condicion operador="=">CAJ_MOVIMIENTOS.cajconcepto_id</condicion>
</field>
</table>
</join>

Con eso ya se pueden usar los campos de CAJ_CONCEPTOS:

<field id="cajconcepto_id" tabla="CAJ_MOVIMIENTOS" noshow="true">
<label>Concepto</label>
</field>
<field id="descripcion_concepto" tabla="CAJ_CONCEPTOS">
<label>Concepto</label>
</field>

El filtro se declara en un bloque <filters> con el campo por el que se quiere filtrar:

<form>
<table id="REG_MOVIMIENTOS">
<filters>
<field id="descripcion_concepto">
<label modpos="nobr">Concepto</label>
<operador>=</operador>
</field>
</filters>
<field id="id_regmovim">
<label>ID Movimiento</label>
</field>
<field id="subsistema_id" noshow="true">
<label>Subsistema</label>
</field>

El <filters> va dentro del <table>, antes de los campos. Cada campo del filtro se declara como cualquier otro, más un <operador> que define cómo se compara. El resultado es una barra de filtros:

Tutorial15

La lista queda restringida a los registros cuya descripción de concepto coincida con lo ingresado: escribiendo “Depósitos” y presionando “Buscar” se ven solo los depósitos. Con el campo numérico cajconcepto_id el comportamiento sería el mismo pero comparando códigos, lo que obliga al usuario a conocerlos de memoria.

Es preferible que el usuario elija de una lista desplegable:

Tutorial16

La definición del filtro no cambia:

<filters>
<field id="id_cajconcepto" deshabilitado="false">
<label>Concepto</label>
<operador>=</operador>
</field>
</filters>

Lo que cambia es la declaración del campo, después del cierre de <filters> y dentro del <table>:

<field id="id_cajconcepto" tabla="CAJ_CONCEPTOS" noshow="true">
<label>Concepto</label>
<helper type="combo" xml="cajconceptos_qry.xml" dir="/ayudas" empty="true" />
<detalle>id_cajconcepto</detalle>
</field>

El atributo noshow="true" es opcional: evita que el campo aparezca como columna del listado.

El <helper type="combo"> apunta a un XML del directorio ayudas, que es el que provee los id y las descripciones de los conceptos para armar el desplegable. Este es su contenido:

<?xml version="1.0" encoding="UTF-8"?>
<histrix tipo="consulta">
<title>Conceptos</title>
<obs></obs>
<form>
<table id="CAJ_CONCEPTOS" label="Conceptos">
<field id="id_cajconcepto" autoinc="true" noshow="true">
<label>Código</label>
</field>
<field id="descripcion_concepto">
<label>Descripcion</label>
</field>
</table>
</form>
</histrix>

En un combo el orden de los campos importa: el primero (id_cajconcepto) es el valor que se transfiere al formulario, y el segundo (descripcion_concepto) es el texto que ve el usuario.