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.
Alta del ítem en el menú
Sección titulada «Alta del ítem en el menú»El menú del sistema es el de la imagen:
![]()
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:

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.

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.
Organización de archivos y directorios
Sección titulada «Organización de archivos y directorios»Los archivos de cada cliente viven bajo el directorio de su base:
Directoriousr/
Directorioshare/
Directoriohistrix/
Directoriodatabase/
DirectorioElClienteX/
- …
/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:

Contenido del archivo XML
Sección titulada «Contenido del archivo XML»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:

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”:

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_cajmovimientoEl 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.
Etiquetas
Sección titulada «Etiquetas»El tag <label> dentro de un <field> define el título de la columna. Con las etiquetas
puestas, el listado queda así:

Filtros
Sección titulada «Filtros»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:

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.
Helpers
Sección titulada «Helpers»Es preferible que el usuario elija de una lista desplegable:

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.