![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#8
|
|||
|
|||
Hola a todos,
fusilando por ahí fusilando por allá, he tomado de base este hilo para hacer una nueva versión de un generador de reportes que tenía hecho en Ace report y que el Delphi 7 no funciona - o yo por lo menos no he conseguido instalar los componentes ACE -. Adjunto el código de llamada al form, que lo genera y prepara las propiedades de los objetos, que son los siguientes: - Query que quieres imprimir - DBGrid idem - Titulo, empresa y condiciones son strings que se escriben el la cabecera. - VisualizarTotales es un string con los nombres de los campos separados con comas - o sin separa, para que nos vamos a engañar - que queremos totalizar - GrupoTotales es un string con los nombres de los campos que si cambia alguno de ellos se imprime la banda de totales. Mi problema se plantea cuando ejecuto el informe. A veces se imprime OK, pero otras veces, en la banda de los totales no aparecen los mismos. Como podeis ver, hay cuatro bandas, Cabecera de reporte, cabecera de grupo, detalle, pie de grupo y pie de reporte. Si alguien me puede ayudar, pues lo agradecería mucho, ya que estoy pegándome un poquito con ello y ya me sale humo de la cabeza. ------------------------------------------------------------- :: Funcion de generar listados a partir de un Grid automáticamente :: :: Forma de llamarlo :: :: GenerarListado( Query que queremos imprimir ADO :: :: Grid asociado a la query :: :: Titulo del Listado :: :: empresa del listado :: :: Condiciones del listado ( literal) :: :: Campos que queremos sumar separados por comas :: :: Campos que cuando cambian se imprimen los totales:: :: separados por comas :: :: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: } unit mdrpt; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, QuickRpt, Qrctrls, Db, DBTables, ExtCtrls,Grids, DBGrids,ADODB,printers; type TFrmQuick = class(TForm) QuickRep1: TQuickRep; PageHeaderBand1: TQRBand; QRLTitulo: TQRLabel; QRLEmpresa: TQRLabel; QRLCondiciones: TQRLabel; QRSysData1: TQRSysData; QRShape1: TQRShape; QRGroup1: TQRGroup; DetailBand1: TQRSubDetail; GroupFooterBand1: TQRBand; QRBand1: TQRBand; QRLabelP: TQRLabel; QRSysData3: TQRSysData; QRShape2: TQRShape; QRLabel1: TQRLabel; QRLabel2: TQRLabel; QRShape3: TQRShape; procedure QuickRep1AfterPrint(Sender: TObject); private { Private declarations } procedure PrepararListado(Query:TADOQuery; DBGRid: TDBGrid; VisualizarTotales,GrupoTotales:string); public { Public declarations } Titulos: array of TQrLabel; Campos: array of TQRDBText; Totales: array of TQrExpr; function GenerarListado( Query:TADOQuery; DBGrid: TDBGrid; Titulo,empresa,Condiciones,VisualizarTotales,GrupoTotales: string): boolean; end; var FrmQuick: TFrmQuick; implementation {$R *.dfm} function TFrmQuick.GenerarListado( Query:TADOQuery; DBGrid: TDBGrid; Titulo,empresa,Condiciones,VisualizarTotales,GrupoTotales: string): boolean; var Mibookmark: string ; begin Try Application.CreateForm(TFrmQuick, FrmQuick); with FrmQuick do begin QRLEmpresa.Caption:= Empresa; QRLCondiciones.Caption:=condiciones; QRLTitulo.Caption:=Titulo; MiBookmark:=Query.Bookmark; QuickRep1.Dataset:= Query; DetailBand1.Dataset:= Query; PrepararListado (Query,DBGrid,VisualizarTotales,GrupoTotales); QuickRep1.PreviewModal; Query.Bookmark:= MiBookMark; end; finally FrmQuick.Free; end; GenerarListado:=True end; procedure TFrmQuick.PrepararListado(Query:TADOQuery;DBGRid: TDBGrid; VisualizarTotales,GrupoTotales:string); const Sep=2; var n, px:integer; begin px:=Sep; // definir tamaño del array SetLength(Titulos, DBGrid.Columns.Count); SetLength(Campos, DBGrid.Columns.Count); SetLength(Totales, DBGrid.Columns.Count); QRGroup1.Height:= 0; // para que no se visualice if VisualizarTotales='' then GroupFooterBand1.Height:= 0; for n:= 0 to DBGrid.Columns.count-1 do begin // titulos Titulos[n]:= TQRLabel.Create(PageHeaderBand1); with Titulos[n] do begin parent:= PageHeaderBand1; Top:= PageHeaderBand1.Height-25; Left:= px; AutoSize:= False; Width:= DBGrid.Columns.Items[n].Width; Alignment:=DBGrid.Columns.Items[n].Alignment; Caption:= DBGrid.Columns.Items[n].Title.Caption; Font.Size:= DBGrid.Font.Size; // Font.Style:=[fsBold]; end; // Grupo de ruptura para los totales if pos( DBGrid.Columns.Items[n].Title.Caption, GrupoTotales) > 0 then begin if QRGroup1.Expression='' then QRGroup1.Expression:=DBGrid.Columns.Items[n].fieldname else QRGroup1.Expression:=DBGrid.Columns.Items[n].fieldname; end; // Campos para visualizar Totales if pos( DBGrid.Columns.Items[n].Title.Caption, VisualizarTotales) > 0 then begin totales[n]:=TQRExpr.Create(GroupFooterBand1); with Totales[n] do begin parent:= GroupFooterBand1; Top:= 5; Left:= px; AutoSize:= False; Width:= DBGrid.Columns.Items[n].Width; Alignment:=DBGrid.Columns.Items[n].Alignment; Master:= DetailBand1; Mask:= '#,###,###'; Expression:= 'SUM('+DBGrid.Columns.Items[n].fieldname+')'; Font.Size:= DBGrid.Font.Size;ResetAfterPrint:= True; end; end; // Campos Campos[n]:= TQRDBText.Create(DetailBand1); with Campos[n] do begin parent:= DetailBand1; Top:= 0; Left:= px; AutoSize:= False; Width:= DBGrid.Columns.Items[n].Width; Alignment:=DBGrid.Columns.Items[n].Alignment; Dataset:= Query; Datafield:= DBGrid.Columns.Items[n].FieldName; WordWrap:= True; Autostretch:= True; Font.Size:= DBGrid.Font.Size; end; px:= px +DBGrid.Columns.Items[n].Width + sep; end; // Orientacion de la page dependiendo de los campos if px >= 695 then begin QuickRep1.Page.Orientation:= poLandscape; // apaisado QRShape1.Width:= 1027; QRShape2.Width:= 1027; QRShape3.Width:= 1027; QRLTitulo.Width:= 1027; QRSysData1.Left:= 1027 - QRSysData1.Width; QRLabelP.Left:= 450; QRSysData3.Left:= 500; end else QuickRep1.Page.Orientation:= poPortrait; end; procedure TFrmQuick.QuickRep1AfterPrint(Sender: TObject); var n:integer; begin for n:= sizeof(Titulos) downto 0 do Titulos[n].Free; for n:= sizeof(Campos) downto 0 do Campos[n].Free; for n:= sizeof(Campos) downto 0 do totales[n].Free; end; end. |
|
|
![]() |
|