Na seção de inicialização dos relatórios personalizáveis, função CustomizableReport() , deve-se verificar se o relatório possui o tipo personalizável disponível e fazemos as chamadas apropriadas conforme o caso.

Na seção de definição do relatório, função ReportDef(), devem ser criados os componentes de impressão, as seções e as células, os totalizadores e demais componentes que o usuário poderá personalizar no relatório.

Os dados fornecidos nesta seção são utilizados para montagem da interface padrão do relatório, linha do exemplo.

Na seção de impressão, função ReportPrint(), deve-se controlar o fluxo do relatório, executar as query´s, filtros e a ordenação definido pelos parâmetros do relatório.

Os parâmetros do relatório devem ser criados utilizando-se o Cadastro de Perguntas do dicionário de dados da Linha Microsiga Protheus (SX1). O não uso do dicionário pode criar problemas em agendamentos do relatório, bem como outras características do produto.

 

// CustomizableReport.prw

#INCLUDE "TOTVS.CH"

 

Function CustomizableReport()

       Local oReport     := Nil

       If FindFunction("TRepInUse") .And. TRepInUse()

             // Interface de impressao

             oReport := ReportDef()

             oReport:PrintDialog()

       Else

             R3()

       EndIf

Return

 

Static Function ReportDef()

       Local oReport

       //---------------------------------------

       // Criação do componente de impressão

       //---------------------------------------

       // TReport():New

       // ExpC1 : Nome do relatorio

       // ExpC2 : Titulo

       // ExpC3 : Pergunte

       // ExpB4 : Bloco de codigo que sera executado na confirmacao da impressao

       // ExpC5 : Descricao

       //---------------------------------------

       oReport := TReport():New(     /*Nome do Relatório*/          , /*Titulo do Relatório*/, /*Pergunte*/, {|oReport| ReportPrint(oReport)}, /*Descricao do relatório*/ )

       oReport:SetTotalInLine(.F.)

       Pergunte(oReport:uParam, .F.)

      

       //---------------------------------------

       // Criação da seção utilizada pelo relatório

       //

       // TRSection():New

       // ExpO1 : Objeto TReport que a seção pertence

       // ExpC2 : Descrição da seçao

       // ExpA3 : Array com as tabelas utilizadas pela seção. A primeira tabela será considerada como principal para a seção.

       // ExpA4 : Array com as ordens do relatório

       // ExpL5 : Carrega campos do SX3 como celulas

       // Default : False

       // ExpL6 : Carrega ordens do Sindex

       // Default : False

       //---------------------------------------

      

       //---------------------------------------

       // Criação da celulas da seção do relatório

       //

       // TRCell():New

       // ExpO1 : Objeto TSection que a secao pertence

       // ExpC2 : Nome da celula do relatório. O SX3 será consultado

       // ExpC3 : Nome da tabela de referencia da celula

       // ExpC4 : Titulo da celula

       // Default : X3Titulo()

       // ExpC5 : Picture

       // Default : X3_PICTURE

       // ExpC6 : Tamanho

       // Default : X3_TAMANHO

       // ExpL7 : Informe se o tamanho esta em pixel

       // Default : False

       // ExpB8 : Bloco de código para impressao.

       // Default : ExpC2

       //---------------------------------------

      

       oSection := TRSection():New(/*oReport*/, /*Nome da secao*/, /*{Tabelas da secao}*/, /*{Array com as ordens do relatório}*/, /*Campos do SX3*/, /*Campos do SIX*/)

       oSection:SetTotalInLine(.F.)

      

       TRCell():New(/*oSection*/, /*X3_CAMPO*/, /*Tabela*/, /*Titulo*/, /*Picture*/, /*Tamanho*/, /*lPixel*/, /*{|| code-block de impressao }*/)

       TRFunction():New(oSection:Cell(/*X3_CAMPO*/), /*cID*/, "SUM", /*oBreak*/, /*cTitle*/, /*cPicture*/, /*uFormula*/, /*lEndSection*/, .F./*lEndReport*/, /*lEndPage*/)

      

       oSection2 := TRSection():New(oSection, /*Nome da secao*/, /*{Tabelas da secao}*/, /*{Array com as ordens do relatório}*/, /*Campos do SX3*/, /*Campos do SIX*/)

       oSection2:SetTotalInLine(.F.)

      

       TRCell():New(/*oSection2*/, /*X3_CAMPO*/, /*Tabela*/, /*Titulo*/, /*Picture*/, /*Tamanho*/, /*lPixel*/, /*{|| code-block de impressao }*/)

       TRFunction():New(oSection2:Cell(/*X3_CAMPO*/) ,/* cID */, "SUM", /*oBreak*/, /*cTitle*/, /*cPicture*/, /*uFormula*/, /*lEndSection*/, .F./*lEndReport*/, /*lEndPage*/)

Return oReport

 

Static Function ReportPrint(oReport)

       Local cAliasQry   := ""

       Local lQuery             := .F.

       #IFNDEF TOP

             Local cCondicao := ""

       #ENDIF

       //---------------------------------------

       // Transforma parametros Range em expressao SQL

       //---------------------------------------

       MakeSQLExpr(oReport:uParam)

       //---------------------------------------

       // Filtragem do relatório

       //---------------------------------------

       #IFDEF TOP

             //---------------------------------------

             // Query do relatório da secao 1

             //---------------------------------------

             lQuery := .T.

             oReport:Section(1):BeginQuery()

             BeginSQL Alias cAliasQry

                    SELECT *

                           FROM %Table:% XXX,%Table:% YYY

                           WHERE XXX_FILIAL = %XFilial:XXX%    AND

                                  XXX.%NotDel%                   AND

                                  YYY_FILIAL = %XFilial:XXX%    AND

                                  YYY.%NotDel%

                           ORDER BY DAK_COD,DAK_SEQCAR,DAI_SEQUEN,DAI_PEDIDO

             EndSQL

             //---------------------------------------

             // Metodo EndQuery ( Classe TRSection )

             // Prepara o relatório para executar o Embedded SQL.

             // ExpA1 : Array com os parametros do tipo Range

             //---------------------------------------

             oReport:Section(1):EndQuery(/*Array com os parametros do tipo Range*/)

       #ELSE

             DbSelectArea(cAliasQry)

             DbSetOrder(1)

             cCondicao := "XXX_FILIAL == '" + XFilial("XXX") + "' "

             oReport:Section(1):SetFilter(cCondicao,IndexKey())

             oReport:Section(1):Section(1):SetRelation(/*{|| cExpSeek }*/,/*cAlias*/,/*Order*/,/*lSeek*/)

             oReport:Section(1):Section(1):SetParentFilter(/*{|| lQuery}*/)

       #ENDIF

       //---------------------------------------

       // Metodo TrPosition()

       // Posiciona em um registro de uma outra tabela. O posicionamento será

       // realizado antes da impressao de cada linha do relatório.

       // ExpO1 : Objeto Report da Secao

       // ExpC2 : Alias da Tabela

       // ExpX3 : Ordem ou NickName de pesquisa

       // ExpX4 : String ou Bloco de código para pesquisa. A string será macroexe-

       // cutada.

       //---------------------------------------

       TRPosition():New(oReport:Section(1), /*cAlias*/, /*nOrder*/, /*{|| cSeek }*/)

       //---------------------------------------

       // Inicio da impressao do fluxo do relatório

       //---------------------------------------

       oReport:SetMeter(cAliasQry->(LastRec()))

       If Mod1

             oReport:Section(1):Print()

       Else

             DbSelectArea(cAliasQry)

             While !oReport:Cancel() .And. !(cAliasQry)->(Eof())

                    oReport:Section(1):Section(1):Init()

                    oReport:Section(1):Section(1):PrintLine()

                    oReport:Section(1):Section(1):Finish()

                    DbSelectArea(cAliasDAI)

                    DbSkip()

                    oReport:IncMeter()

             EndDo

             oReport:Section(1):Finish()

             oReport:Section(1):SetPageBreak(.T.)

       EndIf

Return

Para mais detalhes e exemplos de como construir uma rotina em MVC, consulte a documentação existente no TDN (busque por “TReport”).

 

  • Sem rótulos