unit DataModuloRelatorio;
                                                    
interface                                                                                              

uses
  Dialogs,SysUtils, Classes, ppBands, ppCtrls, ppPrnabl, ppClass, ppProd,
  ppReport, DB, ppParameter,
  ppVar, raCodMod,Graphics, ppMemo,Forms,Windows, system.UItypes, IB_Access, ppTypes,Printers, 
  IB_Components, ppModule, ppStrtch, ppCache, ppComm, ppRelatv, ppDesignLayer,
  ppDB, ppDBPipe, Datasnap.DBClient;


type
  TDadosRelatorio = class(TDataModule)
    RelatModelo_A4_Retrato: TppReport;
    ppParameterList3: TppParameterList;
    ppParameterList4: TppParameterList;
    RelatModelo_A4_Paisagem: TppReport;
    ppHeaderBand6: TppHeaderBand;
    ppShape2: TppShape;
    lblSistemaVersao_A4_Paisagem: TppLabel;
    lblUsuario_A4_Paisagem: TppLabel;
    ppSystemVariable1: TppSystemVariable;
    ppSystemVariable2: TppSystemVariable;
    mmFiltro_A4_Paisagem: TppMemo;
    lblFilial_A4_Paisagem: TppLabel;
    ppSystemVariable4: TppSystemVariable;
    ppLine5: TppLine;
    ppDetailBand6: TppDetailBand;
    raCodeModule5: TraCodeModule;
    ppShapeZebrado2: TppShape;
    ppHeaderBand1: TppHeaderBand;
    ppShape1: TppShape;
    lblSistemaVersao_A4_Retrato: TppLabel;
    lblUsuario_A4_Retrato: TppLabel;
    lbltitulo: TppSystemVariable;
    mmFiltro_A4_Retrato: TppMemo;
    lblFilial_A4_Retrato: TppLabel;
    ppLine1: TppLine;
    ppSystemVariable3: TppSystemVariable;
    lblPagina: TppSystemVariable;
    ppDetailBand1: TppDetailBand;
    raCodeModule1: TraCodeModule;
    ppDesignLayers1: TppDesignLayers;
    ppDesignLayer1: TppDesignLayer;
    ppShapeZebrado: TppShape;
    cdsEtiqueta: TClientDataSet;
    dsrEtiqueta: TDataSource;
    rbEtiqueta: TppReport;
    ppColumnHeaderBand2: TppColumnHeaderBand;
    ppDetailBand3: TppDetailBand;
    ppDBText27: TppDBText;
    ppDBMemo1: TppDBMemo;
    ppColumnFooterBand2: TppColumnFooterBand;
    ppDesignLayers4: TppDesignLayers;
    ppDesignLayer4: TppDesignLayer;
    ppParameterList2: TppParameterList;
    pplEtiqueta: TppDBPipeline;
    procedure ImprimeDiferente(Sender: TObject ; ZebrarDetalhe : Boolean = False);
    procedure PreparaImpressaoBaseadaNoModelo(Relatorio :TppReport ; Colocar_Cabecalho :Boolean; TituloDoRelatorio,DescricaoFiltros : string;
                                              BotaoEmail, BotaoPdf : Boolean; ZebrarDetalhes : Boolean = False);
    procedure DataModuleDestroy(Sender: TObject);
  private
    procedure Zebra(Sender: TObject);




  public
    { Public declarations }
  end;

var
  DadosRelatorio: TDadosRelatorio;
  Gerar_Cabecalho     : Boolean = True;
  Mostrar_Botao_Email : Boolean = True;
  Mostrar_Botao_Pdf   : Boolean = True;

implementation

uses RelatorioVisualizar, Rotinas, DataModulo, TeladeEspera;

{$R *.dfm}

procedure TDadosRelatorio.ImprimeDiferente(Sender: TObject; ZebrarDetalhe : Boolean = False);
var i,j :Integer;
    TopoAntigo, novoTopo : Single;
    TotalOjetosDoHeader : Integer;
    totalObjetosDetalhe : Integer;
begin
   {============================================================================
        Ajusta o header do relatorio que esta sendo impresso com o
        Header do relaotorio padrao...
        Os objetos do relatorio padrao sao associaodos ao realtorio q esta sendo impresso
           RelatModelo.HeaderBand.Objects[0].Band := TppReport(Sender).HeaderBand;

        Qpos o relatorio ser utilizado o header volta para o relatorio padrao para ser usado novamente
           TppReport(Sender).HeaderBand.Objects[IndiceObjetos].Band := RelatModelo.HeaderBand;

       A visualizacao da impressao é mostrada em uma novo form
          frmVisualizarRelatorio
       Associando o relatorio impresso a variavel Relatorio do form frmVisualizarRelatorio
   ============================================================================}

//   if frmVisualizarRelatorio <> nil  then
//      Exit;

    //=============== Se nao for usar o cabecalho apenas imprime o relatorio ================
   if Gerar_Cabecalho = False then
   begin
///      TppReport(Sender).Print;
   ///   exit;

      //==================== Chama a nova tela de visualizacao de relatorio ============

      frmVisualizarRelatorio := TfrmVisualizarRelatorio.Create(self);
      frmVisualizarRelatorio.Visualizador.Visible := True;
      frmVisualizarRelatorio.btnEnviarEmail.Visible := Mostrar_Botao_Email;
      frmVisualizarRelatorio.btnGerarPdf.Visible    := Mostrar_Botao_Pdf;

      frmVisualizarRelatorio.Relatorio := TppReport(Sender);
      frmVisualizarRelatorio.Visualizador.Report := frmVisualizarRelatorio.Relatorio;
      frmVisualizarRelatorio.ShowModal;
      FreeAndNil(frmVisualizarRelatorio);
      exit;
   end;

   novoTopo := 0;

   {============================================================================
        ajusta o tamanho do header do relatorio posicionando os componentes
        para evitar sobrepor como os novos componentes do header do realtorio modelo
        A posicao dos compontes é seu topo atual mais o tamanho do HeaderBand do Relatorio Modelo
        ( NovoTopo)
   ============================================================================}

    //=============== Se o relatorio for no formato Retrato ================
   if TppReport(Sender).PrinterSetup.Orientation = poPortrait then
      novoTopo := RelatModelo_A4_Retrato.HeaderBand.Height;

   //=============== Se o relatorio for no formato paisagem ================
   if TppReport(Sender).PrinterSetup.Orientation = poLandscape then
      novoTopo := RelatModelo_A4_Paisagem.HeaderBand.Height;

   for i := 0 to TppReport(Sender).HeaderBand.ObjectCount -1 do
   begin
      TppReport(Sender).HeaderBand.Objects[i].Top := TppReport(Sender).HeaderBand.Objects[i].Top + novoTopo ;
   end;

    //==================== Pega o cabecalho do relatorio modelo  ============
   TopoAntigo :=TppReport(Sender).HeaderBand.Height;
   TppReport(Sender).HeaderBand.Height := novoTopo + TppReport(Sender).HeaderBand.Height;

   {============================================================================
          Salva a quantidade de componentes q existe no header antes de buscar do modelo
          Logo apos pega todos os componentes do header modelo e coloca no relatorio a ser impresso
   ============================================================================}
   TotalOjetosDoHeader := TppReport(Sender).HeaderBand.ObjectCount;
   totalObjetosDetalhe := TppReport(Sender).DetailBand.ObjectCount;

   //=============== Se o reltorio for em modo Retrato ================
   if TppReport(Sender).PrinterSetup.Orientation = poPortrait then
   begin
      for i := 0 to RelatModelo_A4_Retrato.HeaderBand.ObjectCount -1 do
      begin
         RelatModelo_A4_Retrato.HeaderBand.Objects[0].Band := TppReport(Sender).HeaderBand;
      end;

       //================ zebrar o relatorio ================
      if ZebrarDetalhe = True then
      begin
         if Assigned(TppReport(Sender).DetailBand.BeforePrint) then
         begin
            MessageDlg('Atenção programador'+#13+#10+#13+#10+
                       'você informou para classe de impressão para imprimir os detalhes do relatorio zebrado'+#13+#10+
                       'mas você esta usando o procedimento OnBeforePrint do detalhe do relatorio.' +#13+#10+
                       'Seus comandos do OnBeforePrint não irão ser executados', mtWarning, [mbOK], 0);
         end;


         for i := 0 to RelatModelo_A4_Retrato.DetailBand.ObjectCount -1 do
         begin
            RelatModelo_A4_Retrato.DetailBand.Objects[0].Band := TppReport(Sender).DetailBand;
            TppReport(Sender).DetailBand.ObjectByName(j,'ppShapeZebrado');
            TppReport(Sender).DetailBand.Objects[j].SendToBack;
         end;

         Tag := 0;
         TppReport(Sender).DetailBand.BeforePrint := Zebra;

      end

   end;

   //=============== Se o reltorio for em modo paisagem ================
   if TppReport(Sender).PrinterSetup.Orientation = poLandscape then
   begin
      for i := 0 to RelatModelo_A4_Paisagem.HeaderBand.ObjectCount -1 do
      begin
         RelatModelo_A4_Paisagem.HeaderBand.Objects[0].Band := TppReport(Sender).HeaderBand;
      end;

       //================ zebrar o relatorio ================
      if ZebrarDetalhe = True then
      begin
         if Assigned(TppReport(Sender).DetailBand.BeforePrint) then
         begin
            MessageDlg('Atenção programador'+#13+#10+#13+#10+
                       'você informou para classe de impressão para imprimir os detalhes do relatorio zebrado'+#13+#10+
                       'mas você esta usando o procedimento OnBeforePrint do detalhe do relatorio.' +#13+#10+
                       'Seus comandos do OnBeforePrint não irão ser executados', mtWarning, [mbOK], 0);
         end;


         for i := 0 to RelatModelo_A4_Paisagem.DetailBand.ObjectCount -1 do
         begin
            RelatModelo_A4_Paisagem.DetailBand.Objects[0].Band := TppReport(Sender).DetailBand;
            TppReport(Sender).DetailBand.ObjectByName(j,'ppShapeZebrado2');
            TppReport(Sender).DetailBand.Objects[j].SendToBack;
         end;

         Tag := 0;
         TppReport(Sender).DetailBand.BeforePrint := Zebra;

      end
   end;

   //==================== Chama a nova tela de visualizacao de relatorio ============

//   TppReport(Sender).Print;


   frmVisualizarRelatorio := TfrmVisualizarRelatorio.Create(self);
   frmVisualizarRelatorio.Visualizador.Visible := True;
   frmVisualizarRelatorio.Relatorio := TppReport(Sender);
   frmVisualizarRelatorio.Visualizador.Report := frmVisualizarRelatorio.Relatorio;
   frmVisualizarRelatorio.ShowModal;
   FreeAndNil(frmVisualizarRelatorio);

   {============================================================================
          Volta o cabecalho do relatorio modelo para ser usando novamente
   ============================================================================}
   for i := 0 to TppReport(Sender).HeaderBand.ObjectCount -1 do
   begin
      if TppReport(Sender).HeaderBand.ObjectCount = TotalOjetosDoHeader then
         Break;

      if TppReport(Sender).PrinterSetup.Orientation = poPortrait then
         TppReport(Sender).HeaderBand.Objects[TotalOjetosDoHeader].Band := RelatModelo_A4_Retrato.HeaderBand;

      if TppReport(Sender).PrinterSetup.Orientation = poLandscape then
         TppReport(Sender).HeaderBand.Objects[TotalOjetosDoHeader].Band := RelatModelo_A4_Paisagem.HeaderBand;
   end;

   for i := 0 to TppReport(Sender).HeaderBand.ObjectCount -1 do
   begin
      TppReport(Sender).HeaderBand.Objects[i].Top := TppReport(Sender).HeaderBand.Objects[i].Top - novoTopo ;
   end;

    //==================== Volta o tamanho do cabecalho do relatorio impressao ao tamanho original ============
   TppReport(Sender).HeaderBand.Height := TopoAntigo;

   if ZebrarDetalhe then
   begin
      for i := 0 to TppReport(Sender).DetailBand.ObjectCount -1 do
      begin
         if TppReport(Sender).DetailBand.ObjectCount = totalObjetosDetalhe then
            Break;

        //=============== Se o reltorio for em modo Retrato ================
        if TppReport(Sender).PrinterSetup.Orientation = poPortrait then
           TppReport(Sender).DetailBand.Objects[0].Band := RelatModelo_A4_Retrato.DetailBand;

         //=============== Se o reltorio for em modo paisagem ================
        if TppReport(Sender).PrinterSetup.Orientation = poLandscape then
           TppReport(Sender).DetailBand.Objects[0].Band := RelatModelo_A4_Paisagem.DetailBand;


      end;

      TppReport(Sender).DetailBand.BeforePrint := nil;
   end
end;

procedure TDadosRelatorio.PreparaImpressaoBaseadaNoModelo(Relatorio :TppReport ; Colocar_Cabecalho :Boolean; TituloDoRelatorio,DescricaoFiltros : string;
BotaoEmail, BotaoPdf : Boolean ; ZebrarDetalhes : Boolean = False);
begin

   Relatorio.ThumbnailSettings.Enabled       := False;
   Relatorio.ThumbnailSettings.Visible       := false;
   Relatorio.AllowPrintToFile                := True;
   Relatorio.PreviewFormSettings.WindowState := wsMaximized;
   Relatorio.OutlineSettings.Enabled         := False;
   Relatorio.PreviewFormSettings.ZoomSetting := zsPageWidth;

   if Trim(TituloDoRelatorio) <> '' then
      Relatorio.PrinterSetup.DocumentName := TituloDoRelatorio;

   Gerar_Cabecalho := Colocar_Cabecalho;
   Mostrar_Botao_Email := BotaoEmail;
   Mostrar_Botao_Pdf   := BotaoPdf;

   lblSistemaVersao_A4_Retrato.Caption  := ExtractFileName(Application.ExeName) + ' - ' +PegaVersao;
   lblSistemaVersao_A4_Paisagem.Caption := ExtractFileName(Application.ExeName) + ' - ' +PegaVersao;


   mmFiltro_A4_Retrato.Lines.Clear;
   mmFiltro_A4_Retrato.Lines.Add(DescricaoFiltros);

   mmFiltro_A4_Paisagem.Lines.Clear;
   mmFiltro_A4_Paisagem.Lines.Add(DescricaoFiltros);

   ImprimeDiferente(Relatorio,ZebrarDetalhes);

   Relatorio.AfterPrint       := nil;
   Relatorio.BeforePrint      := nil;
   Relatorio.OnStartFirstPass := nil;
   Relatorio.OnEndFirstPass   := nil;
end;


procedure TDadosRelatorio.DataModuleDestroy(Sender: TObject);
begin
   if frmTelaEspera <> nil then
      FreeAndNil(frmTelaEspera);
end;

procedure TDadosRelatorio.Zebra(Sender: TObject);
var i : Integer;
begin
   if Tag = 0 then
   begin
       Tag := 1;
       if TppDetailBand(Sender).ObjectByName(i,'ppShapeZebrado') then
          TppShape(TppDetailBand(Sender).Objects[i]).Brush.Color := $00EFEFEF;

       if TppDetailBand(Sender).ObjectByName(i,'ppShapeZebrado2') then
          TppShape(TppDetailBand(Sender).Objects[i]).Brush.Color := $00EFEFEF;
   end
   else
   if Tag = 1 then
   begin
      Tag := 0;
       if TppDetailBand(Sender).ObjectByName(i,'ppShapeZebrado') then
          TppShape(TppDetailBand(Sender).Objects[i]).Brush.Color := clWhite;

       if TppDetailBand(Sender).ObjectByName(i,'ppShapeZebrado2') then
          TppShape(TppDetailBand(Sender).Objects[i]).Brush.Color := clWhite;
   end;
end;

end.
