Dinaup 2027 ya está llegando: agentes de IA, stock por almacén y todo más rápido. Descubre las novedades →
DinaupBlog
← Volver al blog

IAQuery: consulta y agrega tus datos sin crear un informe

Cómo funciona IAQuery, la consulta dinámica del SDK .NET de Dinaup: campos, filtros y agregación definidos en la llamada y ejecutados en el servidor.

Equipo Dinaup9 de julio de 20265 min de lectura

¿Cuánto llevas facturado este año? ¿Cuántos empleados siguen sin nómina este mes? ¿Qué diez productos venden más? Son preguntas de una cifra, pero hasta ahora tenían dos respuestas posibles: crear un informe en Flex (perfecto si la consulta se repite cada semana) o traerte las filas al cliente y calcular allí (caro, lento y con tope de memoria).

IAQuery es el tercer camino del SDK .NET: defines la consulta entera en la propia llamada (campos, filtros, agrupación, orden) y el servidor genera el SQL, lo ejecuta en la base de datos y te devuelve solo el resultado.

La consulta viaja, los datos no

Este es el modelo completo en cuatro líneas:

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);
// res.Data[0]["total"] → la suma, en una sola fila

Sumar 800.000 facturas devuelve una fila, no 800.000. La agregación ocurre en la base de datos, donde es barata; tu aplicación recibe el número ya calculado. Las constantes tipadas (VentasIngresosD) salen de tu paquete MyDinaup, aunque también puedes pasar los identificadores en crudo.

Además de sum tienes count, count*, countdistinct, avg, min y max. Y los filtros admiten los operadores de comparación habituales, like, in y is null.

Nació para que una IA consulte con seguridad

El nombre no es casual: IAQuery se diseñó para que un agente de IA pudiera pedir datos sin escribir SQL libre contra tu base de datos. La IA (o tu código) declara campos y condiciones; el servidor valida cada campo contra el esquema, acepta los operadores de una lista blanca y escapa todos los valores.

Esa misma seguridad te protege a ti: una consulta mal construida devuelve un error claro, no un riesgo. Y la consulta hereda los permisos del usuario de la sesión, así que nadie lee por IAQuery lo que no vería en pantalla.

Ventas por mes en una llamada

Las funciones de fecha transforman un campo al agrupar: month, year, monthyear, quarter, dayofweek u hour, entre otras. Con ellas, la pregunta "¿cómo fue el año, mes a mes?" es una única petición:

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"]}");

Doce filas, una por mes, calculadas donde viven los datos. Este patrón (agrupar por una función de fecha y sumar) cubre la mayoría de los paneles de KPIs que antes pedían un informe por métrica.

Aún más corto: QuickQuery

El constructor da control total, pero las preguntas de siempre (¿cuántos hay?, ¿cuánto suman?) no piden tanto. El SDK trae QuickQuery, un atajo sobre el cliente que deja esos casos en una línea:

// ¿Cuánto he facturado este mes?
var facturado = await dinaupClient.QuickQuery.SumAsync(
    VentasIngresosD._SectionID,
    VentasIngresosD.VentasIngresosES.ImporteTotal,
    [QuickQueryFilter.GreaterThanOrEqual(VentasIngresosD.VentasIngresosES.FechaOperacion, "2026-07-01")]);

// ¿Cuántas facturas llevo este mes?
var cuantas = await dinaupClient.QuickQuery.CountAsync(
    VentasIngresosD._SectionID,
    [QuickQueryFilter.GreaterThanOrEqual(VentasIngresosD.VentasIngresosES.FechaOperacion, "2026-07-01")]);

SumAsync devuelve un decimal y CountAsync un int: sin Data, sin diccionarios, sin conversión a mano. Para agrupar está GroupByAsync, y los filtros se leen como frases: QuickQueryFilter.Equal, .GreaterThanOrEqual, .Like, .In. Le hemos dedicado un post entero.

Del número a la gráfica, sin pintarla

IAQuery calcula; DinaZen dibuja. El componente DnzDynamicStat recibe el resultado y elige el formato según su forma: un número suelto sale como tarjeta KPI, una serie por mes como gráfico, una lista como tabla. No eliges el tipo de visual, lo decide el dato.

Junta las dos piezas y el "ventas por mes" de arriba es un panel que agrega en el servidor y se pinta solo, sin una línea de código de dibujo.

El SQL, a la vista

En play tienes un playground visual de IAQuery: app Desarrolladores, herramienta Consulta con IA. Eliges la sección, marcas campos (incluidos los de secciones relacionadas, como el nombre del cliente de una venta), añades filtros y agrupaciones, y ejecutas.

El resultado llega con las filas, el tiempo de ejecución y el SQL exacto que corrió el servidor. Es la forma más rápida de prototipar: montas la consulta en el editor visual, compruebas el SQL y la traduces a código, método a método.

Cuándo usar cada herramienta

NecesidadHerramienta
Listado estable, reutilizable, con columnas cuidadasInforme de Flex
Agregado o consulta puntual definida en códigoIAQuery
Volcar un informe entero para exportar o sincronizarLoadAllRowsAsync
Leer datos desde otro lenguaje, por RESTInforme ejecutado por API

IAQuery no sustituye a los informes. Un informe es un activo: columnas cuidadas, permisos propios, reutilizable en pantallas y por API. IAQuery es para la pregunta que no merece ese ceremonial.

Los límites, claros

  • Cada página devuelve como máximo 10.000 filas; el límite por defecto es 100.
  • El orden solo puede usar campos presentes en el SELECT, con un máximo de 5 criterios.
  • Los registros eliminados quedan fuera salvo que añadas tu propia condición sobre eliminado.
  • Las secciones base no se consultan directamente: consulta la sección concreta.
  • Todos los valores llegan como texto; conviértelos al leer.
  • Hoy IAQuery no está en la API REST pública: vive en el SDK .NET y en el playground de play.

Siguiente paso

Sigue leyendo