QuickQuery

El QuickQueryRunner del cliente cuenta, suma, lista valores, lee la primera fila, consulta y agrupa una sección con filtros tipados y el valor ya convertido.

QuickQuery responde en una línea cuántos hay, cuánto suman o cuáles son, con el valor ya convertido a su tipo. Es la propiedad QuickQuery del cliente (QuickQueryRunner) y cada llamada es una consulta IAQuery: hereda sus permisos, operadores, validaciones y el tope de 30.000 filas por página.

var desdeJulio = new[] { QuickQueryFilter.GreaterThanOrEqual(VentasIngresosD.VentasIngresosES.FechaOperacion, "2026-07-01") };

decimal facturado = await dinaupClient.QuickQuery.SumAsync(VentasIngresosD._SectionID, VentasIngresosD.VentasIngresosES.ImporteTotal, desdeJulio);
int cuantas = await dinaupClient.QuickQuery.CountAsync(VentasIngresosD._SectionID, desdeJulio);

Antes de empezar

  • Un DinaupClientC conectado. Ver Cliente Dinaup.
  • Permiso de consulta sobre la sección.

Seis métodos

MétodoResponde aDevuelve
CountAsync(sectionId, where = null)cuántas filas cumplenint
SumAsync(sectionId, field, where = null)cuánto suma un campodecimal
ValuesAsync(sectionId, field, where = null, orderBy = null, limit = 100)los valores de una columnaList<string>
FirstAsync(sectionId, fields, where = null, orderBy = null)la primera fila que cumpleDictionary<string, string> o null
QueryAsync(sectionId, fields, where = null, orderBy = null, limit = 100, page = 1)las filas completasQuickQueryResult
GroupByAsync(sectionId, groupByField, aggregations, where = null, orderBy = null, limit = 100)totales por grupoQuickQueryResult

where es un QuickQueryFilter[], fields un string[] y aggregations un QuickQueryAggField[]. orderBy es un texto como "campo desc": sin dirección, asc en consultas y desc en agrupadas, y solo con campos del SELECT. limit va de 1 a 30.000 y page empieza en 1. Los campos aceptan las rutas de secciones relacionadas de IAQuery.

QuickQuery no lanza excepciones por errores del servidor: el error llega en Ok y Error. CountAsync y SumAsync devuelven 0 también si la consulta falló; para distinguirlo, usa QueryAsync y comprueba Ok.

Filtros

QuickQueryFilter trae un constructor estático por operador, todos con la firma (field, value): Equal, NotEqual, GreaterThan, GreaterThanOrEqual, LessThan, LessThanOrEqual, Like e In. Un rango son dos filtros.

  • Los filtros se combinan con and; .Or() cambia el conector de ese filtro: QuickQueryFilter.Equal(campo, "1").Or().
  • Like no añade comodines (%texto%). In recibe los valores separados por comas ("a,b,c").
  • Para otro operador de IAQuery, construye el filtro a mano: new QuickQueryFilter { Field = campo, Op = "is null" } (propiedades Field, Op, Value y Logic).
  • Los valores viajan como texto: fechas en ISO, números con punto decimal, booleanos como 1 y 0, y una referencia vacía como "".

Agrupar con GroupByAsync

Agrupa por un campo y calcula una o varias agregaciones con QuickQueryAggField.Sum(field), Count, Avg, Max o Min:

// Diez clientes con más facturación
var res = await dinaupClient.QuickQuery.GroupByAsync(
    VentasIngresosD._SectionID,
    VentasIngresosD.VentasIngresosES.ReferenciaCliente,
    [QuickQueryAggField.Sum(VentasIngresosD.VentasIngresosES.ImporteTotal)],
    orderBy: VentasIngresosD.VentasIngresosES.ImporteTotal + " desc",
    limit: 10);

foreach (var fila in res.Rows)
    Console.WriteLine($"{fila[res.Columns[0]]}: {fila[res.Columns[1]]}");

La primera columna es el valor del grupo y después va una por agregación. QuickQuery agrupa solo por el valor directo del campo. Para agrupar por mes o trimestre, filtrar sobre agregados (AddHaving), usar count*, countdistinct o alias propios, usa IAQuery.

Leer el resultado

QueryAsync y GroupByAsync devuelven un QuickQueryResult. Los valores llegan como texto.

CampoContenido
Oktrue si la consulta se ejecutó
Errorel fallo cuando Ok es false
Rowsfilas como List<Dictionary<string, string>>
Columnsalias de las columnas, en el orden del SELECT
Totalfilas devueltas en la página
TimeMsmilisegundos de ejecución en el servidor

Las claves de Rows son el último tramo de la ruta de cada campo. Con claves internas (prefijo pr_) o rutas relacionadas, lee por posición con Columns.

En esta página