IAQuery
IAQueryRequestParameters define campos, filtros, agrupación y orden en la llamada; el servidor genera el SQL y devuelve un IAQueryResponse con las filas.
IAQuery ejecuta una consulta definida en la propia llamada, sin crear un informe en Flex: eliges campos, filtros, agrupación y orden, y el servidor la ejecuta en la base de datos. Sumar 800.000 facturas devuelve una fila.
var req = new IAQueryRequestParameters(VentasIngresosD._SectionID, 1);
req.AddField(VentasIngresosD.VentasIngresosES.ImporteTotal, "sum", "total");
req.AddWhere(VentasIngresosD.VentasIngresosES.FechaOperacion, ">=", "2026-01-01");
var res = await dinaupClient.IAQuery_GetAsync(req);
var total = res.Data[0]["total"];Antes de empezar
- Un
DinaupClientCconectado. Ver Cliente Dinaup. - Permiso de consulta sobre la sección: la llamada hereda los permisos del usuario de la sesión, validados contra el informe principal de la sección.
- Las constantes de sección y campo salen de tu MyDinaup; también valen el GUID de la sección y las claves internas de campo.
IAQuery no está en la API REST pública. En Play, Desarrollo → Herramientas → Consulta con IA monta la misma consulta en un editor visual. Para mostrar el resultado en Blazor, DnzDynamicStat de DinaZen elige KPI, gráfico o tabla según la forma del dato.
| Necesidad | Herramienta |
|---|---|
| Listado estable y reutilizable | Informe de Flex |
| Agregado o consulta puntual definida en código | IAQuery |
| Contar, sumar o agrupar en una línea | QuickQuery |
| Volcar un informe entero | LoadAllRowsAsync |
| Leer datos desde otro lenguaje | Informes por API |
Construir la consulta
new IAQueryRequestParameters(sectionId) o new IAQueryRequestParameters(sectionId, limite), completado con métodos encadenables:
| Método | Qué añade |
|---|---|
AddField(campo, funcion = "", alias = "") | Columna del SELECT, con función y alias opcionales. |
AddWhere(campo, op, valor, logico = "and") | Condición de filtro. logico: and u or. |
AddGroupBy(campo, funcion = "") | Agrupación, con función de fecha opcional. |
AddOrderBy(campo, direction = "asc") | Orden asc o desc. |
AddHaving(campo, op, valor, logico = "and") | Filtro sobre los agregados, con la sintaxis del WHERE. |
Limite y Pagina completan la petición; SectionId, Campos, Where, GroupBy, OrderBy y Having exponen lo acumulado. Ventas de 2026 por mes:
var req = new IAQueryRequestParameters(VentasIngresosD._SectionID, 12);
req.AddField(VentasIngresosD.VentasIngresosES.FechaOperacion, "monthyear", "mes");
req.AddField(VentasIngresosD.VentasIngresosES.ImporteTotal, "sum", "total");
req.AddGroupBy(VentasIngresosD.VentasIngresosES.FechaOperacion, "monthyear");
req.AddWhere(VentasIngresosD.VentasIngresosES.FechaOperacion, ">=", "2026-01-01");
req.AddWhere(VentasIngresosD.VentasIngresosES.FechaOperacion, "<=", "2026-12-31");
req.AddOrderBy(VentasIngresosD.VentasIngresosES.FechaOperacion, "asc");
var res = await dinaupClient.IAQuery_GetAsync(req);
foreach (var fila in res.Data)
Console.WriteLine($"{fila["mes"]}: {fila["total"]}");El alias por defecto de un campo es el último tramo de su ruta. Para claves internas (prefijo pr_), declara un alias legible.
Funciones de campo
Se aplican en AddField y, las de fecha, también en AddGroupBy. Cualquier otra se rechaza con un error que lista las admitidas.
| Agregación | Devuelve |
|---|---|
sum | Suma (0 si no hay filas) |
count | Cuenta de valores del campo |
count* | Cuenta de filas |
countdistinct | Cuenta de valores distintos |
avg | Media (0 si no hay filas) |
min / max | Mínimo y máximo |
| Fecha (a texto, para agrupar) | Ejemplo de salida |
|---|---|
date | 2026-07-09 |
month | 07 |
year | 2026 |
monthyear | 07/2026 |
quarter | 3T |
quarteryear | 3T - 2026 |
dayofweek | 1 a 7 (1 = lunes) |
dayofmonth | 09 |
hour | 00 a 23 |
Filtros
Operadores de AddWhere y AddHaving, en minúsculas:
| Operador | Nota |
|---|---|
= <> > < >= <= | Comparación directa |
like / not like | Los comodines van en el valor: %texto% |
in / not in | Valores separados por comas: "a,b,c" |
is null / is not null | Sin valor |
Los valores viajan como texto: fechas en ISO (2026-01-31), números con punto decimal y booleanos como 1 y 0. Los registros eliminados quedan fuera; para verlos, añade tu propia condición sobre el campo eliminado.
Ordenar y paginar
AddOrderBysolo acepta campos del SELECT, hasta 5 criterios (MaximoCriteriosOrden), sin repetir campo.- Sin
AddOrderBy, las consultas no agregadas llegan por fecha descendente y las agregadas sin orden garantizado. Limiteva de 1 a 30.000 filas por página (LimiteMaximo), 100 por defecto.Paginaempieza en 1.- El
Totalde la respuesta son las filas de esa página, no las de la sección.
El SDK valida la petición antes de enviarla:
| Error | Excepción |
|---|---|
Limite fuera de 1..30.000, o Pagina menor que 1 | ArgumentOutOfRangeException |
Sección, campo u operador vacíos; logico distinto de and/or; dirección distinta de asc/desc; campo repetido en el orden | ArgumentException |
Más de 5 criterios de orden, ninguna AddField u orden por un campo fuera del SELECT | InvalidOperationException |
Campos de secciones relacionadas
Para leer un campo de la sección relacionada (el nombre del cliente de una venta, por ejemplo), usa una ruta de cuatro tramos:
seccionID.campoReferencia.seccionRelacionadaID.campoAsí agrupas ventas por nombre de cliente sin resolver GUIDs a mano.
La respuesta
IAQuery_GetAsync devuelve un IAQueryResponse. Todos los valores llegan como texto.
| Campo | Contenido |
|---|---|
Ok | true si la consulta se ejecutó |
SectionId / SectionName | La sección consultada |
Columns | Alias de las columnas, en el orden del SELECT |
Data | Filas como List<Dictionary<string, string>>, por alias |
Total | Filas devueltas en la página |
Page / Limit | Página y límite aplicados |
TimeMs | Milisegundos de ejecución en el servidor |
ErrorNotices / Description | El error cuando Ok es false |
Las secciones base no se consultan directamente: consulta la sección concreta. Toda sección tiene los campos nativos id, nombre, fecha, eliminado y posicion.