Tablas e informes
Componentes que ejecutan un informe de Dinaup Flex por su GUID y muestran sus filas como tabla, tarjetas, gráfica o clasificación, con filtros por columna.
Un informe de Dinaup Flex se define en el servidor: se pide por su ReportId con el SDK .NET y devuelve filas tipadas con sus columnas, formatos y totales. Esta familia toma ese resultado y lo muestra (tabla, tarjetas, gráfica o clasificación) con el mismo aspecto que Play y sin escribir ninguna RadzenDataGridColumn.
La decisión es una sola: una rejilla completa o varias vistas del mismo informe a la vez. Para lo primero, DnzReportView. Para lo segundo, DnzReportProvider como contenedor que carga el informe una vez y lo reparte por cascada a sus hijos.
El ReportId es el GUID del informe definido en Flex / Informes. Lo mismo que alimenta los listados de Play alimenta estos componentes.
Qué componente uso
| Necesitas | Componente |
|---|---|
| La tabla completa con buscador, filtros, paginación y CSV | DnzReportView |
| Cargar el informe una vez y mostrarlo de varias formas | DnzReportProvider |
| Las filas como tarjetas con imagen, título e importe | DnzCardList |
| Una gráfica agrupada por categoría | DnzChartView |
| Una clasificación de las N filas de mayor valor | DnzTopN |
| Totales de dinero, minutos y booleanos del informe | DnzSummaryBar, en KPIs y métricas |
| Cuántas filas hay en cada estado | DnzStatusSummary, en Etiquetas y estados |
| Pedir al usuario las variables que faltan antes de ejecutar | DnzResponseQuestions |
| Ver tiempos y metadatos de un informe cargado | DnzReportDebugDialog |
Tabla suelta o cuadro de mando
DnzReportView resuelve el caso completo: cabecera, buscador, exportar CSV, paginación en servidor y filtros por columna.
<DnzReportView Client=@Client ReportId="3f2a9c10-8b4e-4d21-9f77-1a2b3c4d5e6f" />DnzReportProvider carga el informe una vez y lo expone como cascada (ReportContext). Dentro van las vistas que necesites, todas leyendo de la misma carga: una llamada al servidor, varias representaciones.
<DnzReportProvider Client=@Client ReportId="7c1d4e90-2f5a-41b8-bc63-9e0a1b2c3d4f">
<DnzChartView ChartType="DnzChartView.ChartTypeE.Column" />
<DnzTopN N="5" />
</DnzReportProvider>DnzReportView con OnItemSelect devuelve la fila pulsada como DinaupDynamicRowDTO. Es la base de los selectores de relación y de los diálogos de selección de Play; consulta Selectores si tu caso es "elige una ficha".
DnzReportView muestra una tabla por sí solo. DnzReportProvider no muestra nada: es la fuente de datos de DnzCardList, DnzChartView, DnzTopN, DnzSummaryBar y DnzStatusSummary.
DnzReportView
La tabla completa de Play a partir de un ReportId: columnas tipadas, orden, filtros por columna, paginación en servidor, exportación a CSV y apertura de la ficha al pulsar una fila.
<DnzCard>
<DnzCardTitle Title="Facturas emitidas" Icon="receipt_long" />
<DnzReportView Client=@Client ReportId="3f2a9c10-8b4e-4d21-9f77-1a2b3c4d5e6f" OnItemSelect=@AbrirFactura />
</DnzCard>
@code {
private async Task AbrirFactura(DinaupDynamicRowDTO fila)
{
await DnzFormView.OpenAsync(DialogService, Client, fila.SectionId, fila.ID);
}
}Para embeberlo dentro de otra ficha sin barra de título ni botón de añadir:
<DnzReportView Client=@Client ReportId="3f2a9c10-8b4e-4d21-9f77-1a2b3c4d5e6f" ShowTitle=false ShowAdd=false />Parámetros
| Parámetro | Tipo | Por defecto | Qué hace |
|---|---|---|---|
Client | DinaupClientC | Obligatorio. Cliente del SDK que ejecuta el informe. | |
ReportId | string | "" | Obligatorio. GUID del informe a cargar. |
VariablesValues | Dictionary<string, string> | null | Valores de las variables del informe. Si faltan, DnzResponseQuestions las pide antes de mostrar el informe. |
QuerySearch | string | "" | Texto de búsqueda inicial. Cambiarlo en caliente recarga el informe. |
AdvancedFilter | List<FilterCondition> | null | Condiciones de filtro en servidor aplicadas de entrada, además de las que ponga el usuario. |
Limit | int | 25 | Filas por página. El usuario elige entre 25, 50, 100, 250, 500, 1000 y 3000. |
Orden | Dictionary<string, bool> | null | Orden inicial por columna (true = descendente, como en AddOrder). |
ShowTitle | bool | true | Muestra la cabecera con icono, título y selector de columnas visibles. |
Title | string | "" | Sobrescribe el título; vacío usa el del informe. |
ShowSearch | bool | true | Muestra el buscador de la cabecera. |
Filtrable | bool | true | Habilita los filtros por columna en las cabeceras. |
ShowAdd | bool | true | Muestra el botón de crear un registro de la sección del informe. |
ShowLoadTime | bool | true | Muestra el tiempo de carga; al pulsarlo abre DnzReportDebugDialog. |
AdminMode | bool | false | Carga el informe en modo administrador. |
ToolBarTemplate | RenderFragment | null | Contenido extra en la barra de herramientas de la rejilla. |
OnItemSelect | EventCallback<DinaupDynamicRowDTO> | Se dispara al pulsar una fila. Con delegado, sustituye la apertura automática de la ficha. | |
OnDataChanged | EventCallback | Se dispara cada vez que el informe recarga sus datos. | |
AllowCellSelection | bool | false | Deja elegir celdas con Ctrl+clic (una) y Mayús+clic (un rango). Un clic sin teclas sigue abriendo la ficha. |
SelectedCellsChanged | EventCallback<DnzCellSelection> | La selección de celdas cada vez que cambia. | |
FetchInterceptor | Func<string, bool, Func<Task<ReportResponse>>, Task<ReportResponse>> | null | Gancho de caché: recibe la clave de la petición, si es refresco forzado y la función de carga real, y decide si sirve de caché o va al servidor. |
Métodos públicos por @ref: UpdateAsync() recarga el informe, UpdateSearchAsync(string query) cambia la búsqueda y ClearCellSelectionAsync() vacía la selección de celdas. GenerateCsvAsync() devuelve el CSV, su nombre de fichero y el número de filas, sin descargarlo. LoadedReportId dice qué informe se cargó de verdad. Si en ReportId pasas el GUID de una sección, el servidor carga su informe principal (el del rol, si lo tiene). Vale "" hasta la primera carga.
La paginación no usa el recuento del servidor. Siguiente se activa cuando la página vuelve llena, y la navegación para en la fila 50.000: más allá, filtra.
El botón de exportar recorre el informe en páginas de 5.000 filas hasta 50.000 y separa con ;. Escribe las fechas con hora en la hora de la empresa (ICultureService), como las muestra la tabla. ReportCsvExporter.Build(rows, columns, title, regionService) hace la misma serialización para integraciones y pide el ICultureService como cuarto parámetro.
Columnas automáticas
No declaras columnas. DnzReportView lee el formato de cada campo del informe y elige la plantilla: importes con DnzSpanMoney y suma en el pie, decimales y enteros con suma, fechas en formato local, booleanos como etiqueta, estados con color. Tú indicas el ReportId; el formato lo decide el informe.
Lo único que personalizas por plantilla es la barra de herramientas, con ToolBarTemplate:
<DnzReportView Client=@Client ReportId="3f2a9c10-8b4e-4d21-9f77-1a2b3c4d5e6f">
<ToolBarTemplate>
<RadzenButton Text="Acción" Icon="bolt" Size="ButtonSize.Small" Click=@HacerAlgoAsync IsBusy=@_busy />
</ToolBarTemplate>
</DnzReportView>Las columnas visibles y el orden se guardan en localStorage por ruta y ReportId, pero la persistencia está desactivada por defecto: el campo estático DnzReportView.DisableLocalStorageSettings vale true. Ponlo a false en el arranque de tu app para activarla.
Selección de celdas
Con AllowCellSelection=true, Ctrl+clic suma o quita una celda y Mayús+clic marca el rectángulo que va desde la última celda elegida. Un clic sin teclas abre la ficha, como sin selección, y vacía lo elegido. SelectedCellsChanged entrega un DnzCellSelection con tres lecturas de la misma selección: Cells (fila y campo de cada celda, como DnzSelectedCell(RowId, Keyword)), RowIds (sobre qué registros se va a escribir) y Keywords (qué campos tienen algo elegido). Sirve de base para una edición masiva o para copiar.
Qué pasa al pulsar una fila
Sin OnItemSelect, el componente pregunta primero al DnzInterceptorService registrado por AddDinaZen (OnOpenRecord) y, si nadie intercepta, abre la ficha con DnzFormView.OpenAsync. El botón de añadir hace lo mismo con OnOpenNewRecord. Así la app anfitriona decide cómo se abren las fichas sin cambiar cada tabla.
@inject DnzInterceptorService Interceptor
@code {
protected override void OnInitialized()
{
Interceptor.OnOpenRecord = async req =>
{
DnzFormView.OpenAsWindow(WindowManager, req.Client, req.SectionId, req.RowId, title: req.Title);
return true;
};
}
}Gancho de DnzInterceptorService | Cuándo | Devuelve true para |
|---|---|---|
OnOpenRecord | Antes de abrir un registro existente (fila de informe, Acceder en un campo relación). | Omitir la apertura por defecto. |
OnOpenNewRecord | Antes de crear un registro nuevo (botón de añadir). | Omitir la apertura por defecto. |
OnFormSaved | Tras guardar un formulario, antes de cerrarlo. | Que el formulario no se cierre. |
OnGetFormExtensions | Al montar el pie del formulario. | Devuelve la lista de botones de extensión. |
OnDocumentSendEmail, OnDocumentSendEmailWithAttachment, OnDocumentRequestSign | Acciones de un documento dinámico. Sin delegado, el botón no aparece. |
Abrirlo sin colocarlo en el marcado
DnzReportView expone dos métodos estáticos para abrirlo bajo demanda como diálogo o ventana flotante.
await DnzReportView.OpenAsync(DialogService, Client, "3f2a9c10-8b4e-4d21-9f77-1a2b3c4d5e6f", title: "Facturas");Firma:
public static Task OpenAsync(DialogService ds, DinaupClientC client, string reportId, Dictionary<string, string> vars = null, string title = "Informe", string width = "90%", string height = "80%", List<FilterCondition> filter = null)DnzReportView.OpenAsWindow(WindowManager, Client, "3f2a9c10-8b4e-4d21-9f77-1a2b3c4d5e6f", title: "Facturas", icon: "receipt_long");Firma:
public static string OpenAsWindow(DnzWindowManagerService wm, DinaupClientC client, string reportId, Dictionary<string, string> vars = null, string title = "Informe", string icon = "analytics")DnzReportProvider
Contenedor sin tabla: carga el informe una vez y lo reparte por cascada a sus hijos como ReportContext. Es la fuente de datos para cuadros de mando con varias vistas del mismo informe.
<DnzReportProvider Client=@Client ReportId="7c1d4e90-2f5a-41b8-bc63-9e0a1b2c3d4f">
<div class="d-flex flex-column gap-3">
<DnzSummaryBar />
<DnzChartView ChartType="DnzChartView.ChartTypeE.Bar" />
<DnzTopN N="5" />
<DnzCardList MaxFields="3" />
</div>
</DnzReportProvider>Parámetros
| Parámetro | Tipo | Por defecto | Qué hace |
|---|---|---|---|
Client | DinaupClientC | Obligatorio. Cliente del SDK que ejecuta el informe. | |
ReportId | string | "" | Obligatorio. GUID del informe a cargar. |
VariablesValues | Dictionary<string, string> | null | Valores de las variables del informe. Si faltan, se piden antes de mostrar los hijos. |
QuerySearch | string | "" | Búsqueda aplicada a la carga. |
AdvancedFilter | List<FilterCondition> | null | Condiciones de filtro en servidor aplicadas a la carga. |
Limite | int | 500 | Número de filas que trae para alimentar a los hijos. |
Orden | Dictionary<string, bool> | null | Orden de las filas que se cargan. |
AdminMode | bool | false | Carga el informe en modo administrador. |
ChildContent | RenderFragment | null | Las vistas que consumen el contexto. |
OnDataLoaded | EventCallback | Se dispara cuando termina la carga del informe. |
ReportContext
Lo que reciben los hijos por [CascadingParameter].
| Propiedad | Tipo | Qué trae |
|---|---|---|
Client | DinaupClientC | El cliente con el que se cargó. |
Report | DinaupReportDTO | Definición del informe. |
DataList | DinaupReportDataDTO | Respuesta completa de la API. |
Rows | List<DinaupDynamicRowDTO> | Las filas cargadas. |
TotalResults | int | El recuento del servidor (DataList.TotalResults, obsoleto en el SDK). No es fiable: si el recuento no cabe en su tiempo, trae solo las filas de esta carga. |
Mapping | ReportColumnMapping | Qué columna es la numérica principal (PrimaryNumeric), la de dinero (MoneyColumn), la de minutos (MinutesColumn), la de estado (StatusColumn), las fechas (PrimaryDate, SecondaryDate) y las listas AllNumeric, AllDates, AllStrings, AllBools. |
IsLoading | bool | Carga en curso. |
ErrorMessage | string | Error de la carga, si lo hubo. |
RefreshAsync | Func<Task> | Recarga el informe desde un hijo. |
Por el Mapping, DnzChartView, DnzTopN y DnzCardList funcionan sin indicarles qué columna mostrar. Si no eligen la adecuada, fíjala con ValueColumn y CategoryColumn.
DnzCardList
Muestra las filas del informe como tarjetas en vez de rejilla: título, imagen de vista previa si la fila la trae, unos pocos campos y el importe destacado. Va dentro de un DnzReportProvider.
<DnzReportProvider Client=@Client ReportId="7c1d4e90-2f5a-41b8-bc63-9e0a1b2c3d4f">
<DnzCardList MaxFields="4" OnItemSelect=@AbrirFicha />
</DnzReportProvider>
@code {
private async Task AbrirFicha(DinaupDynamicRowDTO fila)
{
await DnzFormView.OpenAsync(DialogService, Client, fila.SectionId, fila.ID);
}
}Parámetros
| Parámetro | Tipo | Por defecto | Qué hace |
|---|---|---|---|
MaxFields | int | 4 | Campos secundarios por tarjeta (sin contar el título ni el importe). |
OnItemSelect | EventCallback<DinaupDynamicRowDTO> | Se dispara al pulsar una tarjeta. Con delegado, sustituye la apertura automática de la ficha. |
Acepta atributos extra (class, style, data-*) que se aplican al div raíz de la lista.
DnzChartView
Gráfica del informe (columnas, barras, líneas, área o tarta) agrupando por una categoría y sumando una métrica. Va dentro de DnzReportProvider.
<DnzReportProvider Client=@Client ReportId="7c1d4e90-2f5a-41b8-bc63-9e0a1b2c3d4f">
<DnzChartView ChartType="DnzChartView.ChartTypeE.Column" CategoryColumn="cliente" ValueColumn="total_facturado" MaxItems="12" />
</DnzReportProvider>Parámetros
| Parámetro | Tipo | Por defecto | Qué hace |
|---|---|---|---|
ChartType | ChartTypeE | Column | Tipo de gráfica: Column, Bar, Line, Area o Pie. |
ValueColumn | string | null | Clave de la métrica. Sin valor, usa la numérica principal del informe. |
CategoryColumn | string | null | Clave de la categoría del eje X. Sin valor, usa la columna de estado o la primera de texto. |
MaxItems | int | 20 | Máximo de categorías (las de mayor valor); el resto se descarta. |
Acepta atributos extra que se aplican al div raíz.
ChartTypeE es un enum anidado en el componente, por eso en el marcado va como DnzChartView.ChartTypeE.Column. Las filas se agrupan por CategoryColumn y se suma ValueColumn por grupo: un informe de líneas de factura se convierte en "total por cliente".
DnzTopN
Clasificación en barras horizontales con las N filas de mayor (o menor) valor del informe. Va dentro de DnzReportProvider.
<DnzReportProvider Client=@Client ReportId="7c1d4e90-2f5a-41b8-bc63-9e0a1b2c3d4f">
<DnzTopN N="5" ValueColumn="total_facturado" />
</DnzReportProvider>Parámetros
| Parámetro | Tipo | Por defecto | Qué hace |
|---|---|---|---|
N | int | 10 | Filas de la clasificación. |
ShowTitle | bool | true | Muestra la cabecera Top N con el nombre de la columna. |
ValueColumn | string | null | Clave de la columna a ordenar. Sin valor, usa la numérica principal. |
Ascending | bool | false | true muestra los valores más bajos primero. |
Si la columna es de dinero o de minutos, el valor se muestra con DnzSpanMoney o DnzSpanMinutes. Sin columna numérica representable, DnzTopN no muestra nada.
DnzResponseQuestions
Formulario que pide al usuario las variables que el informe o el documento necesita antes de ejecutarse. DnzReportView y DnzReportProvider lo montan solos cuando VariablesValues no cubre todas las variables; lo instancias tú solo si construyes la petición a mano.
<DnzResponseQuestions Variables=@_report.VariableList.Variables VariableValues=@_valores Client=@Client StorageKey=@reportId OnConfirm=@Ejecutar />Parámetros
| Parámetro | Tipo | Por defecto | Qué hace |
|---|---|---|---|
Variables | Dictionary<string, DinaupVariableDTO> | new() | Obligatorio. Variables que pide el servidor, indexadas por clave. |
VariableValues | Dictionary<string, string> | new() | Valores ya conocidos. Siembran el formulario y se rellenan al confirmar. |
FixedKeys | IReadOnlyCollection<string> | null | Claves que no se preguntan. Una clave fija sin valor se pregunta igual. |
Client | DinaupClientC | null | Solo para las variables de relación (Guid). |
StorageKey | string | "" | Clave con la que recuerda las respuestas en el navegador. Vacío no recuerda nada. |
OnConfirm | EventCallback<Dictionary<string, string>> | Se dispara con todas las respuestas al pulsar confirmar. |
DnzFilter
El filtro por columna de DnzReportView. No lo colocas tú: la tabla lo inserta en la cabecera de cada columna y elige el filtro adecuado según el tipo del campo.
Parámetros
| Parámetro | Tipo | Por defecto | Qué hace |
|---|---|---|---|
Column | DinaupFieldDTO | Definición de la columna del informe (tipo, formato, valores predefinidos). | |
DataColumn | RadzenDataGridColumn<DinaupDynamicRowDTO> | La columna de la rejilla a la que se vincula el filtro. |
DnzFilter delega en el filtro especializado según el formato de la columna:
| Filtro | Cuándo entra |
|---|---|
DnzTextFilter | Texto libre y cualquier otro formato (por defecto). |
DnzIntegerFilter | Columnas enteras. |
DnzDecimalFilter | Columnas decimales. |
DnzDateFilter, DnzDateTimeFilter, DnzTimeFilter | Fecha, fecha y hora, hora. Los atajos de la pestaña Predefinido (Hoy, Ayer, Mes Actual, Mes Anterior) toman el día de la empresa (ICultureService), no el del servidor. |
DnzBoolFilter | Booleanos. |
DnzBadgeFilter | Columnas con estilo de etiqueta. |
DnzPredefinedFilter | Columnas con lista de valores predefinidos. |
DnzReportDebugDialog
Diálogo con el desglose de tiempos (cliente y servidor) y los metadatos de un informe ya cargado. DnzReportView lo abre al pulsar el tiempo de carga (ShowLoadTime).
Task DnzReportDebugDialog.OpenAsync(DialogService ds, DinaupReportDataDTO data, long clientMs, string reportId)Leer una fila
Las filas que reparten estos componentes son DinaupDynamicRowDTO. Para el texto de una columna usa GetLegible("keyword"); ID y SectionId vienen rellenos (como string) para abrir la ficha.
@code {
private async Task AbrirFila(DinaupDynamicRowDTO fila)
{
var nombre = fila.GetLegible("cliente");
await DnzFormView.OpenAsync(DialogService, Client, fila.SectionId, fila.ID);
}
}Relacionado
- Selectores: cuando el caso es "elige una ficha" a partir de un informe.
- KPIs y métricas: cifras y comparativas para completar el cuadro de mando.
- Datos tipados (Spans):
DnzSpanMoney,DnzSpanMinutesy el resto, lo que estas vistas usan por dentro. - Patrones de uso: ejemplos completos que combinan estos componentes con el SDK.
- Informes de Dinaup Flex: qué es un informe, su
ReportId, variables y filtros. - Cliente Dinaup: cómo ejecutar el informe con
Report_GetAsync.
→ Componentes · DinaZen · SDK .NET