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 DinaupClientC conectado. 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.

NecesidadHerramienta
Listado estable y reutilizableInforme de Flex
Agregado o consulta puntual definida en códigoIAQuery
Contar, sumar o agrupar en una líneaQuickQuery
Volcar un informe enteroLoadAllRowsAsync
Leer datos desde otro lenguajeInformes por API

Construir la consulta

new IAQueryRequestParameters(sectionId) o new IAQueryRequestParameters(sectionId, limite), completado con métodos encadenables:

MétodoQué 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ónDevuelve
sumSuma (0 si no hay filas)
countCuenta de valores del campo
count*Cuenta de filas
countdistinctCuenta de valores distintos
avgMedia (0 si no hay filas)
min / maxMínimo y máximo
Fecha (a texto, para agrupar)Ejemplo de salida
date2026-07-09
month07
year2026
monthyear07/2026
quarter3T
quarteryear3T - 2026
dayofweek1 a 7 (1 = lunes)
dayofmonth09
hour00 a 23

Filtros

Operadores de AddWhere y AddHaving, en minúsculas:

OperadorNota
= <> > < >= <=Comparación directa
like / not likeLos comodines van en el valor: %texto%
in / not inValores separados por comas: "a,b,c"
is null / is not nullSin 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

  • AddOrderBy solo 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.
  • Limite va de 1 a 30.000 filas por página (LimiteMaximo), 100 por defecto. Pagina empieza en 1.
  • El Total de la respuesta son las filas de esa página, no las de la sección.

El SDK valida la petición antes de enviarla:

ErrorExcepción
Limite fuera de 1..30.000, o Pagina menor que 1ArgumentOutOfRangeException
Sección, campo u operador vacíos; logico distinto de and/or; dirección distinta de asc/desc; campo repetido en el ordenArgumentException
Más de 5 criterios de orden, ninguna AddField u orden por un campo fuera del SELECTInvalidOperationException

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.campo

Así agrupas ventas por nombre de cliente sin resolver GUIDs a mano.

La respuesta

IAQuery_GetAsync devuelve un IAQueryResponse. Todos los valores llegan como texto.

CampoContenido
Oktrue si la consulta se ejecutó
SectionId / SectionNameLa sección consultada
ColumnsAlias de las columnas, en el orden del SELECT
DataFilas como List<Dictionary<string, string>>, por alias
TotalFilas devueltas en la página
Page / LimitPágina y límite aplicados
TimeMsMilisegundos de ejecución en el servidor
ErrorNotices / DescriptionEl 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.

En esta página