No vídeo de hoje, vamos verificar uma forma de adicionar uma condição em um TRFunction.
A dúvida de hoje foi feita pela grande Adriana, onde ela perguntou se em um TRFunction dava para adicionar condições, como por exemplo, só totalizar se determinado campo tiver um conteúdo.
Com isso em mente, montamos esse exemplo, onde fazemos um bloco de código com a condição de totalizar.
E abaixo o código fonte desenvolvido para exemplificar:
//Bibliotecas #Include "Totvs.ch" /*/{Protheus.doc} User Function zVid0062 Itens de PV @author Atilio @since 30/08/2022 @version 1.0 @type function @obs Codigo gerado automaticamente pelo Autumn Code Maker @see http://autumncodemaker.com /*/ User Function zVid0062() Local aArea := FWGetArea() Local oReport Local aPergs := {} Local cPedDe := Space(TamSX3('C6_NUM')[1]) Local cPedAt := StrTran(cPedDe, ' ', 'Z') Local nTotaliz := 1 //Adicionando os parametros do ParamBox aAdd(aPergs, {1, "Pedido De", cPedDe, "", ".T.", "SC5", ".T.", 80, .F.}) aAdd(aPergs, {1, "Pedido Até", cPedAt, "", ".T.", "SC5", ".T.", 80, .T.}) aAdd(aPergs, {2, "Totalizar", nTotaliz, {"1=Tudo", "2=Apenas com Documento emitido", "3=Apenas sem Documento emitido"}, 105, ".T.", .F.}) //Se a pergunta for confirma, cria as definicoes do relatorio If ParamBox(aPergs, "Informe os parametros", , , , , , , , , .F., .F.) MV_PAR03 := Val(cValToChar(MV_PAR03)) oReport := fReportDef() oReport:PrintDialog() EndIf FWRestArea(aArea) Return /*/{Protheus.doc} fReportDef Definicoes do relatorio zVid0062 @author Atilio @since 30/08/2022 @version 1.0 @type function @obs Codigo gerado automaticamente pelo Autumn Code Maker @see http://autumncodemaker.com /*/ Static Function fReportDef() Local oReport Local oSection := Nil //Criacao do componente de impressao oReport := TReport():New( "zVid0062",; "Itens de Ped. Venda",; ,; {|oReport| fRepPrint(oReport),}; ) oReport:SetTotalInLine(.F.) oReport:lParamPage := .F. oReport:oPage:SetPaperSize(9) //Orientacao do Relatorio oReport:SetPortrait() //Criando a secao de dados oSection := TRSection():New( oReport,; "Dados",; {"QRY_REP"}) oSection:SetTotalInLine(.F.) //Colunas do relatorio TRCell():New(oSection, "C6_NUM", "QRY_REP", "Pedido", /*cPicture*/, 6, /*lPixel*/, /*{|| code-block de impressao }*/, "LEFT", /*lLineBreak*/, "LEFT", /*lCellBreak*/, /*nColSpace*/, /*lAutoSize*/, /*nClrBack*/, /*nClrFore*/, .F.) TRCell():New(oSection, "C6_ITEM", "QRY_REP", "Item", /*cPicture*/, 2, /*lPixel*/, /*{|| code-block de impressao }*/, "LEFT", /*lLineBreak*/, "LEFT", /*lCellBreak*/, /*nColSpace*/, /*lAutoSize*/, /*nClrBack*/, /*nClrFore*/, .F.) TRCell():New(oSection, "C6_PRODUTO", "QRY_REP", "Produto", /*cPicture*/, 15, /*lPixel*/, /*{|| code-block de impressao }*/, "LEFT", /*lLineBreak*/, "LEFT", /*lCellBreak*/, /*nColSpace*/, /*lAutoSize*/, /*nClrBack*/, /*nClrFore*/, .F.) TRCell():New(oSection, "B1_DESC", "QRY_REP", "Descrição", /*cPicture*/, 30, /*lPixel*/, /*{|| code-block de impressao }*/, "LEFT", /*lLineBreak*/, "LEFT", /*lCellBreak*/, /*nColSpace*/, /*lAutoSize*/, /*nClrBack*/, /*nClrFore*/, .F.) TRCell():New(oSection, "C6_NOTA", "QRY_REP", "Documento", /*cPicture*/, 9, /*lPixel*/, /*{|| code-block de impressao }*/, "LEFT", /*lLineBreak*/, "LEFT", /*lCellBreak*/, /*nColSpace*/, /*lAutoSize*/, /*nClrBack*/, /*nClrFore*/, .F.) TRCell():New(oSection, "C6_VALOR", "QRY_REP", "Valor", "@E 999,999,999.99 ", 12, /*lPixel*/, /*{|| code-block de impressao }*/, "RIGHT", /*lLineBreak*/, "RIGHT", /*lCellBreak*/, /*nColSpace*/, /*lAutoSize*/, /*nClrBack*/, /*nClrFore*/, .F.) //Totalizadores If MV_PAR03 == 1 TRFunction():New(oSection:Cell("C6_VALOR"), /*cName*/, "SUM", /*oBreak*/, /*cTitle*/, "@E 999,999,999.99", /*uFormula*/, .F.) ElseIf MV_PAR03 == 2 TRFunction():New(oSection:Cell("C6_VALOR"), /*cName*/, "SUM", /*oBreak*/, /*cTitle*/, "@E 999,999,999.99", /*uFormula*/, .F., /*lEndReport*/, /*lEndPage*/, /*oParent*/, {|| ! Empty(QRY_REP->C6_NOTA) }) ElseIf MV_PAR03 == 3 TRFunction():New(oSection:Cell("C6_VALOR"), /*cName*/, "SUM", /*oBreak*/, /*cTitle*/, "@E 999,999,999.99", /*uFormula*/, .F., /*lEndReport*/, /*lEndPage*/, /*oParent*/, {|| Empty(QRY_REP->C6_NOTA) }) EndIf Return oReport /*/{Protheus.doc} fRepPrint Impressao do relatorio zVid0062 @author Atilio @since 30/08/2022 @version 1.0 @type function @obs Codigo gerado automaticamente pelo Autumn Code Maker @see http://autumncodemaker.com /*/ Static Function fRepPrint(oReport) Local aArea := FWGetArea() Local cQryReport := "" Local oSectDad := Nil Local nAtual := 0 Local nTotal := 0 //Pegando as secoes do relatorio oSectDad := oReport:Section(1) //Montando consulta de dados cQryReport += "SELECT " + CRLF cQryReport += " C6_NUM, " + CRLF cQryReport += " C6_ITEM, " + CRLF cQryReport += " C6_PRODUTO, " + CRLF cQryReport += " B1_DESC, " + CRLF cQryReport += " C6_VALOR, " + CRLF cQryReport += " C6_NOTA " + CRLF cQryReport += "FROM " + CRLF cQryReport += " " + RetSQLName("SC6") + " SC6 " + CRLF cQryReport += " INNER JOIN " + RetSQLName("SB1") + " SB1 ON ( " + CRLF cQryReport += " B1_FILIAL = '" + FWxFilial('SB1') + "' " + CRLF cQryReport += " AND B1_COD = C6_PRODUTO " + CRLF cQryReport += " AND SB1.D_E_L_E_T_ = ' ' " + CRLF cQryReport += " ) " + CRLF cQryReport += "WHERE " + CRLF cQryReport += " C6_FILIAL = '" + FWxFilial('SC6') + "' " + CRLF cQryReport += " AND C6_NUM >= '" + MV_PAR01 + "' " + CRLF cQryReport += " AND C6_NUM <= '" + MV_PAR02 + "' " + CRLF cQryReport += " AND SC6.D_E_L_E_T_ = ' ' " + CRLF cQryReport += "ORDER BY " + CRLF cQryReport += " C6_NUM, C6_ITEM" + CRLF //Executando consulta e setando o total da regua PlsQuery(cQryReport, "QRY_REP") DbSelectArea("QRY_REP") Count to nTotal oReport:SetMeter(nTotal) //Enquanto houver dados oSectDad:Init() QRY_REP->(DbGoTop()) While ! QRY_REP->(Eof()) //Incrementando a regua nAtual++ oReport:SetMsgPrint("Imprimindo registro " + cValToChar(nAtual) + " de " + cValToChar(nTotal) + "...") oReport:IncMeter() //Imprimindo a linha atual oSectDad:PrintLine() QRY_REP->(DbSkip()) EndDo oSectDad:Finish() QRY_REP->(DbCloseArea()) FWRestArea(aArea) Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Bom Dia Daniel,
Estou com uma duvida aqui e vendo este seu video eu pensei que poderia ajudar a resolver meu problema. no resultada da minha query eu tenho um linha que ela não aprece no relatorio porem eu preciso mostrar o valor dela no totalizado, como devo proceder. Eu fiz da seguinte maneira porem sem sucesso.
oBreak1 := TRBreak():New(oSection,{|| QRY_REP->FILORI ==’X’ },{|| “Totais ” })
oSection:SetHeaderBreak(.T.)
// aqui ele deve trazer somente o valor da linha acima ou seja QRY_REP ==’X’
TRFunction():New(oSection:Cell(“QRY_REP->MARGEM”) , “TOTALIZADOR” , “SUM”, oBreak1 , “TOTALIZADOR” , /*Picture*/,, .F., .F., .F.,,)
Voce pode me direcionar.
Obrigado
Bom dia Wanderson, tudo joia?
Eu acho que para sua situação, no TRFunction não funcionaria, pois ele exige que a linha seja exibida.
O que você pode fazer, é manualmente ter uma variável, tipo nValorTot, e ir incrementando ela. Depois de acabar a Section, ai você imprime o valor.
Abraços.