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

NecesitasComponente
La tabla completa con buscador, filtros, paginación y CSVDnzReportView
Cargar el informe una vez y mostrarlo de varias formasDnzReportProvider
Las filas como tarjetas con imagen, título e importeDnzCardList
Una gráfica agrupada por categoríaDnzChartView
Una clasificación de las N filas de mayor valorDnzTopN
Totales de dinero, minutos y booleanos del informeDnzSummaryBar, en KPIs y métricas
Cuántas filas hay en cada estadoDnzStatusSummary, en Etiquetas y estados
Pedir al usuario las variables que faltan antes de ejecutarDnzResponseQuestions
Ver tiempos y metadatos de un informe cargadoDnzReportDebugDialog

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ámetroTipoPor defectoQué hace
ClientDinaupClientCObligatorio. Cliente del SDK que ejecuta el informe.
ReportIdstring""Obligatorio. GUID del informe a cargar.
VariablesValuesDictionary<string, string>nullValores de las variables del informe. Si faltan, DnzResponseQuestions las pide antes de mostrar el informe.
QuerySearchstring""Texto de búsqueda inicial. Cambiarlo en caliente recarga el informe.
AdvancedFilterList<FilterCondition>nullCondiciones de filtro en servidor aplicadas de entrada, además de las que ponga el usuario.
Limitint25Filas por página. El usuario elige entre 25, 50, 100, 250, 500, 1000 y 3000.
OrdenDictionary<string, bool>nullOrden inicial por columna (true = descendente, como en AddOrder).
ShowTitlebooltrueMuestra la cabecera con icono, título y selector de columnas visibles.
Titlestring""Sobrescribe el título; vacío usa el del informe.
ShowSearchbooltrueMuestra el buscador de la cabecera.
FiltrablebooltrueHabilita los filtros por columna en las cabeceras.
ShowAddbooltrueMuestra el botón de crear un registro de la sección del informe.
ShowLoadTimebooltrueMuestra el tiempo de carga; al pulsarlo abre DnzReportDebugDialog.
AdminModeboolfalseCarga el informe en modo administrador.
ToolBarTemplateRenderFragmentnullContenido extra en la barra de herramientas de la rejilla.
OnItemSelectEventCallback<DinaupDynamicRowDTO>Se dispara al pulsar una fila. Con delegado, sustituye la apertura automática de la ficha.
OnDataChangedEventCallbackSe dispara cada vez que el informe recarga sus datos.
AllowCellSelectionboolfalseDeja elegir celdas con Ctrl+clic (una) y Mayús+clic (un rango). Un clic sin teclas sigue abriendo la ficha.
SelectedCellsChangedEventCallback<DnzCellSelection>La selección de celdas cada vez que cambia.
FetchInterceptorFunc<string, bool, Func<Task<ReportResponse>>, Task<ReportResponse>>nullGancho 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 DnzInterceptorServiceCuándoDevuelve true para
OnOpenRecordAntes de abrir un registro existente (fila de informe, Acceder en un campo relación).Omitir la apertura por defecto.
OnOpenNewRecordAntes de crear un registro nuevo (botón de añadir).Omitir la apertura por defecto.
OnFormSavedTras guardar un formulario, antes de cerrarlo.Que el formulario no se cierre.
OnGetFormExtensionsAl montar el pie del formulario.Devuelve la lista de botones de extensión.
OnDocumentSendEmail, OnDocumentSendEmailWithAttachment, OnDocumentRequestSignAcciones 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.

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ámetroTipoPor defectoQué hace
ClientDinaupClientCObligatorio. Cliente del SDK que ejecuta el informe.
ReportIdstring""Obligatorio. GUID del informe a cargar.
VariablesValuesDictionary<string, string>nullValores de las variables del informe. Si faltan, se piden antes de mostrar los hijos.
QuerySearchstring""Búsqueda aplicada a la carga.
AdvancedFilterList<FilterCondition>nullCondiciones de filtro en servidor aplicadas a la carga.
Limiteint500Número de filas que trae para alimentar a los hijos.
OrdenDictionary<string, bool>nullOrden de las filas que se cargan.
AdminModeboolfalseCarga el informe en modo administrador.
ChildContentRenderFragmentnullLas vistas que consumen el contexto.
OnDataLoadedEventCallbackSe dispara cuando termina la carga del informe.

ReportContext

Lo que reciben los hijos por [CascadingParameter].

PropiedadTipoQué trae
ClientDinaupClientCEl cliente con el que se cargó.
ReportDinaupReportDTODefinición del informe.
DataListDinaupReportDataDTORespuesta completa de la API.
RowsList<DinaupDynamicRowDTO>Las filas cargadas.
TotalResultsintEl 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.
MappingReportColumnMappingQué 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.
IsLoadingboolCarga en curso.
ErrorMessagestringError de la carga, si lo hubo.
RefreshAsyncFunc<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ámetroTipoPor defectoQué hace
MaxFieldsint4Campos secundarios por tarjeta (sin contar el título ni el importe).
OnItemSelectEventCallback<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ámetroTipoPor defectoQué hace
ChartTypeChartTypeEColumnTipo de gráfica: Column, Bar, Line, Area o Pie.
ValueColumnstringnullClave de la métrica. Sin valor, usa la numérica principal del informe.
CategoryColumnstringnullClave de la categoría del eje X. Sin valor, usa la columna de estado o la primera de texto.
MaxItemsint20Má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ámetroTipoPor defectoQué hace
Nint10Filas de la clasificación.
ShowTitlebooltrueMuestra la cabecera Top N con el nombre de la columna.
ValueColumnstringnullClave de la columna a ordenar. Sin valor, usa la numérica principal.
Ascendingboolfalsetrue 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ámetroTipoPor defectoQué hace
VariablesDictionary<string, DinaupVariableDTO>new()Obligatorio. Variables que pide el servidor, indexadas por clave.
VariableValuesDictionary<string, string>new()Valores ya conocidos. Siembran el formulario y se rellenan al confirmar.
FixedKeysIReadOnlyCollection<string>nullClaves que no se preguntan. Una clave fija sin valor se pregunta igual.
ClientDinaupClientCnullSolo para las variables de relación (Guid).
StorageKeystring""Clave con la que recuerda las respuestas en el navegador. Vacío no recuerda nada.
OnConfirmEventCallback<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ámetroTipoPor defectoQué hace
ColumnDinaupFieldDTODefinición de la columna del informe (tipo, formato, valores predefinidos).
DataColumnRadzenDataGridColumn<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:

FiltroCuándo entra
DnzTextFilterTexto libre y cualquier otro formato (por defecto).
DnzIntegerFilterColumnas enteras.
DnzDecimalFilterColumnas decimales.
DnzDateFilter, DnzDateTimeFilter, DnzTimeFilterFecha, 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.
DnzBoolFilterBooleanos.
DnzBadgeFilterColumnas con estilo de etiqueta.
DnzPredefinedFilterColumnas 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

→ Componentes · DinaZen · SDK .NET

En esta página