Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   reportes dinamicos..... (https://www.clubdelphi.com/foros/showthread.php?t=98035)

oscarac 31-05-2026 21:27:43

reportes dinamicos.....
 
estoy probando delphi MVC sin librerias y tengo un problema con un reporte
genero el query de manera dinamica y en el reporte "seteo" los campos
Código Delphi [-]
procedure TrepListadoMensualCuentaNormal.MapearCamposReporte(ADataSet: TDataSet);
begin
  if ADataSet = nil then Exit;

  
  qrepListadoMensualCuentaNormal.DataSet := ADataSet;
  qrb_GrupoCuenta.Master                 := qrepListadoMensualCuentaNormal;
  qrb_GrupoCuenta.Expression             := 'Cuenta'; // Limpio, sin prefijos


  qrdbtxtLibro.DataSet            := ADataSet;
  qrdbtxtLibro.DataField          := 'Libro';

  qrdbtxtVoucher.DataSet          := ADataSet;
  qrdbtxtVoucher.DataField        := 'Voucher';

  qrdbtxtRgt.DataSet              := ADataSet;
  qrdbtxtRgt.DataField            := 'RGT';

  qrdbtxtDocumento.DataSet        := ADataSet;
  qrdbtxtDocumento.DataField      := 'Documento';

  qrdbtxtFechaDoc.DataSet         := ADataSet;
  qrdbtxtFechaDoc.DataField       := 'FechaDocumento';

  qrdbtxtFechaVencimiento.DataSet := ADataSet;
  qrdbtxtFechaVencimiento.DataField := 'FechaVencimiento';

  qrdbtxtRazonSocial.DataSet      := ADataSet;
  qrdbtxtRazonSocial.DataField    := 'RazonSocial';

  qrdbtxtGlosa.DataSet            := ADataSet;
  qrdbtxtGlosa.DataField          := 'glosa';

  qrdbtxtmnd.DataSet              := ADataSet;
  qrdbtxtmnd.DataField            := 'Mnd';

  qrdbtxtCCosto.DataSet           := ADataSet;
  qrdbtxtCCosto.DataField         := 'CCosto';

  // Asignación de importes con limpieza de propiedad previa
  qrdbtxtDEBE.DataSet             := ADataSet;
  qrdbtxtDEBE.DataField           := 'DEBE';
  qrdbtxtDEBE.Mask                := '#,##0.00;-#,##0.00;0.00';

  qrdbtxthaber.DataSet            := ADataSet;
  qrdbtxthaber.DataField          := 'HABER';
  qrdbtxthaber.Mask               := '#,##0.00;-#,##0.00;0.00';


  qrexSumaDebe.Master  := qrepListadoMensualCuentaNormal;
  qrexSumaHaber.Master := qrepListadoMensualCuentaNormal;
  QRExpr6.Master       := qrepListadoMensualCuentaNormal;

  qrexSumaDebe.ResetAfterPrint  := False;
  qrexSumaHaber.ResetAfterPrint := False;
  QRExpr6.ResetAfterPrint       := False;

  qrexSumaDebe.Expression  := 'SUM(DEBE)';
  qrexSumaHaber.Expression := 'SUM(HABER)';
  QRExpr6.Expression       := 'SUM(DEBE) - SUM(HABER)';


  qrexSumaDebe.Mask  := '#,##0.00;-#,##0.00;0.00';
  qrexSumaHaber.Mask := '#,##0.00;-#,##0.00;0.00';
  QRExpr6.Mask       := '#,##0.00;-#,##0.00;0.00';
end;


me muestra el detalle, perfecto, pero los totales no es decir SUM(DEBE) o SUM(HABER) o la diferencia entre ellos no las muestra, no se si me estoy haciendo entender

Casimiro Noteví 01-06-2026 15:47:38

Yo no tengo ni idea, aunque te pego lo que dice el primo chatgpt:
Ufff... se ha descuadrado la respuesta.

Cita:

En este tipo de casos en QuickReport (o componentes similares en Delphi), cuando el detalle se muestra bien pero los SUM no aparecen, el problema casi nunca está en la expresión SUM(DEBE), sino en el contexto de evaluación del QRExpr dentro del ciclo de impresión del reporte. Lo primero importante es entender que los agregados como SUM dependen de que el reporte esté realmente recorriendo el dataset durante el proceso de impresión; no basta con asignar el DataSet al reporte o al Master, sino que el motor del reporte tiene que estar en ejecución con el dataset activo y completamente preparado antes de imprimir. En tu caso, al generar el query de forma dinámica y luego mapear los campos, es muy probable que el reporte ya haya sido preparado internamente antes de que el dataset esté completamente estable o antes de que los enlaces estén bien establecidos, y eso hace que las expresiones de agregación no se inicialicen correctamente. Otro punto clave es la ubicación de los QRExpr: SUM solo funciona correctamente si los QRExpr están dentro de una banda que participe en el recorrido del dataset, normalmente un SummaryBand o un GroupFooterBand que dependa del mismo dataset maestro; si están en un band que no se recorre o no está correctamente enlazado al flujo del reporte, el valor nunca se acumula. También es importante que el dataset esté activo en el momento exacto en que el reporte se prepara, porque si el dataset se asigna pero todavía no está abierto o se abre después de configurar el reporte, los cálculos agregados pueden quedar vacíos. En muchos casos con QuickReport dinámico, cuando se cambian campos o dataset en tiempo de ejecución, es necesario forzar una nueva preparación del reporte después del mapeo, porque si no el motor mantiene una estructura interna anterior y no recalcula expresiones como SUM o diferencias. Además, debes confirmar que los campos DEBE y HABER son realmente numéricos (por ejemplo Float o Currency) y no strings, porque si vienen como texto desde una consulta dinámica, SUM no va a funcionar correctamente aunque el detalle sí se muestre. Finalmente, el hecho de que tengas ResetAfterPrint := False indica que quieres acumulación global, lo cual está bien, pero si el ciclo de impresión no se está ejecutando correctamente o el dataset no está siendo iterado por el reporte, ese acumulador nunca llega a activarse. En resumen, lo más probable en tu caso es una combinación de que el reporte se está preparando antes de que el dataset dinámico esté completamente listo, o que los QRExpr no estén dentro de una banda que realmente recorra el dataset durante la impresión, o que el dataset no esté activo en el momento de calcular las expresiones. Si quieres afinarlo al 100%, habría que ver en qué banda están esos QRExpr y en qué momento exacto abres el dataset respecto a este método de mapeo, porque ahí normalmente está la clave del fallo.


La franja horaria es GMT +2. Ahora son las 01:51:13.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi