Vez ou outra recebo uns pedidos um tanto quanto inusitados. Este queria imprimir o CTBR040 (Balancete) por filial, NÃO considerando o parâmetro "Seleciona Filiais" (que não atendia às expectativas do cliente). Mas selecionando todas as filiais e totalizando-as no mesmo relatório. Eu disse.... Deixe-me pensar...... E, a resposta, acredito que já sabem qual foi: Sim. É possível. Mas terei que usar algumas funções de minha biblioteca. Quer experimentar? Lá vai o código:
#include "totvs.ch"
procedure u_CTBR040BlackTDN(wnRel)
local aFiliais:=AdmGetFil() as array
local cSVFilAnt:=cFilAnt as character
local cSpaceQuadro as character
local oReport as object
//Todas as Privates definidas em CTBR040 devem ser inicializada aqui.
private aSelFil:=Array(0) as array
private aQuadro:=array(8) as array
cSpaceQuadro:=Space(Len(CriaVar("CT1_CONTA")))
aFill(aQuadro,cSpaceQuadro)
dfv():Default(@wnRel,ProcName())
//Obtem a Definição do Relatorio a partir da CTBR040
oReport:=ExecIn():CallProc("ULTRA_SECRET","CTBR040","REPORTDEF",@wNRel)
//Obtem o Action do Realatorio
bAction:=oReport:GetAction()
//Redefine o Action do Relatorio
oReport:SetAction({|oReport|PrintReport(@oReport,@wNRel,@aFiliais,@bAction)})
//Chama PrintDialog
oReport:PrintDialog()
//Restaura a Filial de Entrada
SetFilAnt(cSVFilAnt)
return
static function SetFilAnt(cFil)
cFilAnt:=cFil
return(FWSM0Util():setSM0PositionBycFilAnt())
static function PrintReport(oReport,wNRel,aFiliais,bAction)
local nFilial as numeric
local nFiliais as numeric
local oCell as object
local oSection:=oReport:Section(1) as object
nFiliais:=Len(aFiliais)
for nFilial:=1 to nFiliais
cFil:=aFiliais[nFilial]
//Seta a Filial Corrente
SetFilAnt(cFil)
//CTBR040 Inicia TRFunction no Corpo do Programa (Q M... Isso complica tudo.)
//Os Breaks e as Functions Precisam ser "Zerados(as)" para não dar erro e Totalizar corretamente
//Remove Os Breaks de TReport
aEval(oReport:aBreak,{|e|aSize(e:aFunction,0)})
aSize(oReport:aBreak,0)
//Remove As Functions de TReport
aSize(oReport:aFunction,0)
//Remove Os Breaks de TRSection
aEval(oSection:aBreak,{|e|aSize(e:aFunction,0)})
aSize(oSection:aBreak,0)
//Remove As Functions de TRSection
aSize(oSection:aFunction,0)
//Remove As Functions de TRCell
oCell:=oSection:Cell("SALDODEB")
aSize(oCell:aFunction,0)
//Remove As Functions de TRCell
oCell:=oSection:Cell("SALDOCRD")
aSize(oCell:aFunction,0)
//Remove As Functions de TRCell
oCell:=oSection:Cell("MOVIMENTO")
aSize(oCell:aFunction,0)
//Seta Pagina Inicial
oReport:oPage:lFirstPage:=.T.
//Imprime o Relatório Padrao
Eval(bAction,oReport)
//Armazena a Ultima Pagina que será utilizada no PE MVCHANGE
CacheData():Set("u_CTBR040BlackTDN","MV_PAR09",(oReport:oPage:nPage+1))
//Quebra de Pagina a Cada nova Filial
oReport:EndPage()
next nfilial
return
Vai precisar do Ponto de Entrada U_MVCHANGE para Controlar a Paginação.
#include "totvs.ch"
procedure U_MVCHANGE()
local cPergunta:=ParamIXB[1]
if (("CTR040"$cPergunta).and.IsInCallStack("u_CTBR040BlackTDN"))
MV_PAR09:=CacheData():Get("u_CTBR040BlackTDN","MV_PAR09",MV_PAR09)
endif
return
Ninja nível 10
ResponderExcluir