Fazer uma condição em um TRFunction | Ti Responde 062

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.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

2 Responses

  1. Wanderson Fernandes de Souza disse:

    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.

Deixe uma resposta

Terminal de Informação