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”).