Primeros Pasos
¿Cómo hacer una consulta en histrix?
Que buena pregunta… 🤔🤔🤔
El primer paso es agregar un elemento al menú
¿Cual es el menú?. Este de la foto:
![]()
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: Es el numero que lo ordena dentro de los elementos que comparte el nivel en el menú.
Menú: es el elemento “padre”, esto lo copiamos de otro elemento que este en el mismo nivel y en el mismo submenu. Por ejemplo nosotros queremos agregar el elemento dentro de “Bancos” -> “Consultas”. Acá ya hay 3 elementos del menú, todos tienen el mismo atributo Menú y el mismo de estos 3 es el que tenemos que completar
Titulo: Obviamente es el titulo que aparece
Parámetros: son diferentes configuraciones, en este momento nos interesan dos:
xml= Este es el nombre del archivo que se va a “ejecutar” cuando elijamos el elemento en el menú.
Dir= La dirección donde esta este archivo.
¿Cómo se organizan los archivos y los directorios?
Histrix esta generalmente instalado en linux, simplificando y dejando de lado los links podemos decir que histrix se instala por cada cliente en:
Directoryusr/
Directoryshare/
Directoryhistrix/
Directorydatabase/
DirectoryElClienteX/
- …
/usr/share/histrix/database/<ElClienteX>/Dentro de esta carpeta se genera un árbol de directorios parecido a este:
DirectoryElClienteX/
Directoryayudas/
- …
Directorybancos/
Directorying/
- …
Directoryman/
- …
Directoryqry/
- …
Directorytest/
Directoryacceptance/
- …
Directory_support/
- …
Directorycaja/
Directorying/
Directoryaccesorios/
- …
Directoryclass/
- …
Directorypedidos/
- …
Directoryruta/
- …
Directoryman/
- …
Directoryproc/
Directorydel/
- …
Directoryqry/
- …
Directorytest/
Directoryacceptance/
- …
Directory_support/
- …
Directorycalidad/
Directoryambiente/
- …
Directorying/
- …
Directoryman/
- …
Directoryqry/
- …
Directoryclientes/
Directoryinputacion/
- …
Directorying/
Directorymos/
- …
Directoryobleas/
- …
Directorypre/
- …
Directoryman/
Directorytests/
- …
Directoryqry/
- …
Directorytests/
Directoryacceptance/
- …
Directory_support/
- …
Directorydasbuard/
- …
Cada directorio dentro de <ElClienteX> representa un módulo de histrix. Y dentro de cada modulo hay diferentes archivos algunos son los que llama cada elemento del menú.
En nuestro caso vamos a crear el archivo gastos_qry.xml dentro del directorio bancos. Y en nuestro edición de menú que vimos en el punto anterior vamos a asociar el elemento de menú “Consulta de gastos” al archivo xml gastos_qry.xml como se ve en esta imagen:

¿Y Qué hay adentro del archivo .xml?
En realidad el contenido archivo esta muy relacionado con una o varias tablas de una base de datos mysql. En nuestro caso, no es el ejemplo mas feliz, pero vamos a trabajar sobre una tabla que se llama REG_MOVIMIENTOS. Y tiene una lista de movimientos, de entre otro tipo, bancarios. Esta es una captura de una parte de la tabla REG_MOVIMIENTOS y con alguno de sus campos:

En base a esto vamos a empezar a redactar el contenido de un archivo xml del que ya tenemos un pequeño borrador en la imagen siguiente:
<?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 primer linea es obligatorio. La segunda también porque los tags xml e histrix son obligatorios. Dentro de la segunda linea tenemos los modificadores tipo y paginar.
Pero vamos a aclarar que el tipo consulta hace justamente una consulta y en este caso paginar hace que se vean solo 50 resultados por página. Después declaramos los tags obs y form que también son obligatorios. Dentro de form, table con el nombre de la table y dentro de table campos fields con los campos de la tabla correspondiente. Luego cerramos los tags abiertos. La consulta se ve, cuando apretamos el menú “Consulta de gastos” como muestra la imagen a continuación:

JOIN
Por lo general se dan situaciones en los que los datos que se quieren mostrar en una consulta, estan en mas de una tabla. En estos casos la técnica JOIN nos ayuda a unir datos necesarios que estan en mas de una tabla.
Nuestar tabla REG_MOVIMIENTOS tiene un campo que se llama cajmovimiento_id. Y existe una tabla que se llama CAJ_MOVIMIENTOS que tiene un campo que se llama id_cajmovimiento. Cada valor de cajmovimiento_id de la tabla REG_MOVIMIENTOS coincide con el valor id_cajmovimiento de una fila de la tabla CAJ_Movimientos.
Esto se da generalmente en cualquier sistema que este soportado por bases de datos relacionales. El codigo SQL para lograr esto es el siguiente:
SELECT * FROM REG_MOVIMIENTOS RM JOIN CAJ_MOVIMIENTOS CM ON RM.cajmovimiento_id = CM.id_cajmovimientoY nuestro equivalente el en xml gastos_qry.xml es el siguiente:
<?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 codigo que hace el “JOIN” se abre después del cierre del tag table y tiene otro tag table contenido.
A demás de agregar el JOIN modificamos un poco los campos. Agregamos los campos cajmovimiento_id y los campos cajconcepto_id y nro_movimiento. Estos campos son de la tabla CAJ_MOVIMIENTOS en lugar de REG_MOVIMIENTOS. Por lo que hace falta agregar en el tag “field”, el modificador “tabla” y especificar el nombre de la tabla.
Labels
A demás de eso, agregamos los tags <label> dentro del field, para que aparezca en este caso como titulo de la columna en la tabla. Con estas modificaciones nuestro listado de gastos queda como se muestra en la imagen a continuación:

Filtros
En este tipo de consultas es normal querer filtrar los resultados. En este caso uno de los requerimientos es poder filtrar por concepto. En nuestra base el concepto esta relaacionado al movimiento de caja a través del campo cajconcepto_id. En resumen tenemos que hacer un segundo JOIN para unir una tercer tabla. Y asi un registro movimiento se asocia a un movimiento de caja y este movimiento de caja se asocia a un concepto. Una vez hechos los dos joins:
<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>Podemos hacer uso de los campos de la tabla 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>Como el requerimiento es poder filtrar por concepto. Lo que vamos a hacer es definir la parte de filtros y dentro de filtros, agregar el campo por el cual queremos 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>Después de abrir el tag , se agrega el tag <filters>. Dentro se define un campo como se definimos en un principio, pero tambien definimos agregamos <operador> dentro del field. Esto hace que se compare en base a ese operador. Es decir, como esta ahí va a aparecer lo siguiente en la imagen:

La lista se va a filtrar dejando solo los registros en los que el campo descripción concepto, coincida con lo que nosotros completemos ahí. Poniendo “Depósitos” y apretando “Buscar” solo quedara la lista de Depósitos. Si hubiéramos usado el campo entero cajconcepto_id seria igual con los códigos de concepto. Por ejemplo sabiendo que el concepto 4 es pago a proveedores pondríamos el numero 4 y buscar. Claro que hay algo mas practico para el usuario y lo vamos a ver en el ejemplo siguiente..
Helper
Para el usuario lo mejor es seleccionar entre las opciones con una lista desplegable, así:

Para eso, la definición del filtro es la misma:
<filters> <field id="id_cajconcepto" deshabilitado="false"> <label>Concepto</label> <operador>=</operador> </field></filters>Pero, despues del cierre del filters y dentro del tag table, como el resto de los campos, el campo se define en este caso de la siguiente manera:
<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>Agregar el atributo noshow al tag field, es opcional. Esto hace que no se muestre en la lista.
Además de eso vemos el tag helper y vemos también que apunta a un archivo xml dentro del directorio ayudas.
Este xml lo que hace es traer las descripciones de los conceptos y los id para presentarlos en la lista desplegable o combo.
Cuando hicimos la consulta este archivo ya existía pero posiblemente sea necesario crear algo similar vamos a dejar el código de este archivo en la siguiente captura:
<?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>El primer campo (id_cajconcepto) es el valor por el cual se filtra.
El segundo (descripcion_concepto) es el que se muestra.