Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Quick Report


Recife

Pergunta

Boa Tarde,

Estou precisando implementar uns relatórios com as seguintes caracteristicas:

* No momento em que ele apresenta o mesmo na tela(preview), os dados da banda detail devem estar zebrados.

* Na impressão deve apresentar os dados da banda detail sem estar zebrado.

Esta implementação será para ser usada nas versões do delphi 5 e 7, estou utiizando firebird 2.0

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0
Estou precisando implementar uns relatórios com as seguintes caracteristicas:

* No momento em que ele apresenta o mesmo na tela(preview), os dados da banda detail devem estar zebrados.

* Na impressão deve apresentar os dados da banda detail sem estar zebrado.

Recife, isto é relativamente fácil:

- declare uma variável booleana para controlar quando zebrar (no preview) e quando não (na impressão);

- inicialize ela com com false (antes de chamar o método Preview ou PreviewModal do quick);

- no evento BeforePrint você inverte seu conteúdo, utilizando um not;

- no evento AfterPrint você atribui a ela o valor True;

- no evento BeforePrint da banda detalhe (ou a que desejar), você deve testar se está zebrando antes de executar o teste que irá trocar a cor de fundo para obter este efeito.

O porque deste procedimento estranho: O evento BeforePrint ocorre antes da impressão na tela (Preview) e na impressora (Print). Então, quando você chama o Preview, a variável que está falsa é passada para true no evento BeforePrint e o relatório aparecerá zebrado na tela. Concluida a montagem do relatório pelo quick, o evento AfterPrint ocorre e a variável será marcada como true. Assim, quando é acionada a impressão, o evento BeforePrint ocorre e estando a variável com true, passará a ter o valor False, resultando que na impressão no papel não haja zebra. O fato de forçarmos a variável para True (e não not <variavel>) no AfterPrint deve-se ao fato de que o usuário pode resolver imprimir novamente o relatório, sem ter saido do preview e, assim, não term erro - a impressão continua não sendo zebrada.

Sugestão, no relatório:

type
  TForm1 = class(...)
    ...
  private
    Zebra :Boolean;
    ...
  public
    Zebrar :Boolean;
    ...
  end;

....

procedure TForm1.QRBand1BeforePrint(Sender: TQRCustomBand; var PrintBand: Boolean);
begin
  if Zebrar then
  begin
    if Zebra then
      Sender.Color := clRed
    else
      Sender.Color := clWhite;
    Zebra := not Zebra;
  end;
end;

procedure TForm1.QuickRep1BeforePrint(Sender: TCustomQuickRep;
  var PrintReport: Boolean);
begin
  Zebrar := not Zebrar;
end;

procedure TForm1.QuickRep1AfterPrint(Sender: TObject);
begin
  Zebrar := True;
end;
preparando para chamada do relatório:
...
  Form1 := TForm1.Create(Self);
  try
    ...
    Form1.Zebrar := False;
    Form1.QuickRep1.Preview;
  finally
    Form1.Release;
  end;
  ...
end;

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Micheus,

Mais uma vez muito obrigado por mais uma aula, gosto muito das suas explicações, pois são bastante claras e tenho certeza que irá servir para outros companheiros de profissão. Segunda-feira irei testar na empresa pois minha impressora (residencial) esta quebrada. Porém, irei passar este final de semana mais tranquilo.

Segunda dou resultado da implementação.

Obrigado. :lol:

Link para o comentário
Compartilhar em outros sites

  • 0
Segunda-feira irei testar na empresa pois minha impressora (residencial) esta quebrada.
Recife, fica uma dica: instale um destes drivers de impressão PDF gratuitos (eu gosto muito do doPDF, mas existem vários outros) - eles quebram o maior galho - é o que uso para não gastar tinta e papel quando estou testando resultados deste tipo.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Oi micheus,

Conforme havia dito, estou trazendo o resultado da implementação, ele executa o preview normal, porém na impressão esta saindo zebrado. É como se não tivesse respeitando o evento afterprint do quickreport.

Este é o form de chamada do relatório

unit RelExemplo;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons;

type
  TFImpressao = class(TForm)
    Label1: TLabel;
    BitBtn1: TBitBtn;
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FImpressao: TFImpressao;

implementation

uses RelExem;

{$R *.DFM}

procedure TFImpressao.BitBtn1Click(Sender: TObject);
begin
  FRelExem := TFRelExem.Create(application);
  try
    FRelExem.zebrar := False;
    FRelExem.QuickRep1.Preview;
  finally
    FreeAndNil(FRelExem);
  end;

end;

end.
Este é o codigo do relatório
unit RelExem;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, QuickRpt, Db, IBCustomDataSet, IBQuery, IBDatabase, Qrctrls,
  QRExport;

type
  TFRelExem = class(TForm)
    QuickRep1: TQuickRep;
    ColumnHeaderBand1: TQRBand;
    QRLabel1: TQRLabel;
    QRLabel2: TQRLabel;
    QRLabel3: TQRLabel;
    DetailBand1: TQRBand;
    QRDBText1: TQRDBText;
    QRDBText2: TQRDBText;
    QRDBText3: TQRDBText;
    IBDatabase1: TIBDatabase;
    IBTransaction1: TIBTransaction;
    IBQuery1: TIBQuery;
    TitleBand1: TQRBand;
    QRLabel4: TQRLabel;
    QRHTMLFilter1: TQRHTMLFilter;
    QRTextFilter1: TQRTextFilter;
    IBQuery1NOMEESTADO: TIBStringField;
    IBQuery1UF: TIBStringField;
    IBQuery1DATAULTATUALIZACAO: TDateTimeField;
    procedure DetailBand1BeforePrint(Sender: TQRCustomBand;
      var PrintBand: Boolean);
    procedure QuickRep1BeforePrint(Sender: TCustomQuickRep;
      var PrintReport: Boolean);
    procedure QuickRep1AfterPrint(Sender: TObject);
  private
    { Private declarations }
    zebra : boolean;
  public
    { Public declarations }
    zebrar : boolean;

  end;

var
  FRelExem: TFRelExem;

implementation

{$R *.DFM}

procedure TFRelExem.DetailBand1BeforePrint(Sender: TQRCustomBand;
  var PrintBand: Boolean);
begin
  if zebrar then
  begin
    if zebra then
    begin
      Sender.Color    := clMoneyGreen;
      QRDBText1.Color := clMoneyGreen;
      QRDBText2.Color := clMoneyGreen;
      QRDBText3.Color := clMoneyGreen;
    end
    else
    begin
      Sender.Color    := clWhite;
      QRDBText1.Color := clWhite;
      QRDBText2.Color := clWhite;
      QRDBText3.Color := clWhite;
    end; //fim if zebra then
    zebra := not zebra;
  end;//fim if zebrar then
end;

procedure TFRelExem.QuickRep1BeforePrint(Sender: TCustomQuickRep;
  var PrintReport: Boolean);
begin
  zebrar := not zebrar;
end;

procedure TFRelExem.QuickRep1AfterPrint(Sender: TObject);
begin
  zebrar := True;
end;

end.

Link para o comentário
Compartilhar em outros sites

  • 0

Recife, bem estranho isso.

Eu notei que você está utilizando um HTMLFiter. Por acaso você está testando este tipo saída ou impressora mesmo?

Veja este exemplo que preparei, testado e aprovado ;)Rel Zebrado so no preview.zip (também usa IB - já vai com banco e gds32.dll para o teste - é só descompactar)

Como você observará é muito similar ao seu, já que está de acordo com o exemplo que postei anteriormente. Assim, veja se você consegue identificar alguma diferença em relação ao seu (fora o questionamento que lhe fiz antes)

Abraços

Editado por Micheus
Link para o comentário
Compartilhar em outros sites

  • 0

Olá Micheus,

Peguei seu exemplo e verifiquei algumas diferenças que já consertei, quanto a impressão aqui em minha casa estou sem impressora ai estou visualizando em html e .txt a saída, porém lá na empresa estou imprimido. Amanhã irei testar e posto aqui o resultado.

Mais uma vez agradecido.

Link para o comentário
Compartilhar em outros sites

  • 0

Micheus,

Mais uma vez obrigado, neste segundo exemplo funcionou conforme a especificação a qual me foi passada. Vou estuda-lo com mais detalhe devido agora terei que implantar esta rotina em projeto em nossa empresa.

Com isto, tenho resolvido este problema e espero que serva para outros membros do forum.

Abraços.

Link para o comentário
Compartilhar em outros sites

  • 0

Recife, achei uma maneira mais segura e simples de saber quando estamos "imprimindo" o relatório para a tela (preview) ou para a impressora (print): usar a propriedade Destination do objeto QRPrinter do QuickRep:

qrdMetafile ==> gerando visualização

qrdPrinter ==> imprimindo

Infelizmente, não tenho referências de em qual unit encontramos a declaração destas constantes mas, como voce tem os código fonte, voce poderá encontrá-la facilmente.

A variável Zebrar nem seria necessária, podendo ser retirada sua declaração/manipulação e o BeforePrint da banda rbDetail passaria a ser:

procedure TForm1.QRBand1BeforePrint(Sender: TQRCustomBand; var PrintBand: Boolean);
begin
  if Sender.ParentReport.QRPrinter.Destination = qrdMetafile then  // gerando visualização
  begin
    if Zebra then
      Sender.Color := clRed
    else
      Sender.Color := clWhite;
    Zebra := not Zebra;
  end;
end;

Por gentileza teste e, funcionando, poste aqui o nome da unit onde as constantes estão declaradas.

Abraços

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,2k
×
×
  • Criar Novo...