Relatório em TReport não mostra os dados ADVPL

Olá pessoal, estou tentando montar Relatório que mostra as compras efetuadas pelos clientes.

Porém ele não está mostrando nada no relatório, já testei a consulta SQL e funciona, porém na execução do fonte não.

Na SX1 fiz uma pergunta (Filial?) Grupo-> "TRPT002"

Abaixo o fonte:


User Function Trpt002()

    Local oReport := Nil
    Local cPerg := Padr("TRPT002",10)

    Pergunte(cPerg,.T.) //SX1

    oReport := RptStruc(cPerg)
    oReport:PrintDialog()
Return

Static Function RPTPrint(oReport)
    Local oSection1 := oReport:Section(1)
    Local oSection2 := oReport:Section(2)
    Local cQuery := ""
    Local cNumCod := ""

    cQuery := " SELECT A1_COD,A1_NOME,C5_NUM,C6_QTDVEN,C6_PRCVEN,B1_DESC "
    cQuery += " FROM SA1990 SA1, SC5990 SC5, SC6990 SC6, SB1990 SB1 "
    cQuery += " WHERE SA1.D_E_L_E_T_ = '' AND "
    cQuery += " C5_FILIAL = '"+MV_PAR01+"' AND SC5.D_E_L_E_T_ = '' AND C5_CLIENTE = A1_COD AND "
    cQuery += " C6_FILIAL = '"+MV_PAR01+"' AND SC6.D_E_L_E_T_ = '' AND C6_NUM = C5_NUM AND "
    cQuery += " B1_FILIAL = '"+MV_PAR01+"' AND SB1.D_E_L_E_T_ = '' AND B1_COD = C6_PRODUTO "
    cQuery += " ORDER BY A1_FILIAL,A1_COD,C5_FILIAL,C5_NUM,C6_FILIAL,C6_ITEM "

    //Verifica se a tabela ja está aberta.
    If Select("TEMP") <> 0
        DbSelectArea("TEMP")
        DbCloseArea()
    EndIf

    TCQUERY cQuery NEW ALIAS "TEMP"

    DbSelectArea("TEMP")
    TEMP->(dbGoTop())

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

    While !EOF()
        If oReport:Cancel()
            Exit
        EndIf
        //Iniciando a primeira seção
        oSection1:Init()
        oReport:IncMeter()

        cNumCod := TEMP->A1_COD
        IncProc("Imprimindo Cliente "+ Alltrim(TEMP->A1_COD))

        //Imprimindo primeira seção:
        oSection1:Cell("A1_COD"):SetValue(TEMP->A1_COD)
        oSection1:Cell("A1_NOME"):SetValue(TEMP->A1_NOME)
        oSection1:Printline()


        //Iniciar a impressão da seção 2
        oSection2:Init()

        //verifica se o codigo do cliente é o mesmo, se sim, imprime os dados do pedido
        While TEMP->A1_COD == cNumCod
            oReport:IncMeter()

            IncProc("Imprimindo pedidos..."+ Alltrim(TEMP->C5_NUM))
            oSection2:Cell("C5_NUM"):SetValue(TEMP->C5_NUM)
            oSection2:Cell("B1_DESC"):SetValue(TEMP->B1_DESC)
            oSection2:Cell("C6_PRCVEN"):SetValue(TEMP->C6_PRCVEN)
            oSection2:Cell("C6_QTDVEN"):SetValue(TEMP->C6_QTDVEN)
            oSection2:Printline()

            TEMP->(dbSkip())

        EndDo
        oSection2:Finish()
        oReport:ThinLine()

        oSection1:Finish()

    EndDo

Return


Static Function RPTStruc(cNome)
    Local oReport := Nil
    Local oSection1:= Nil
    Local oSection2:= Nil

    oReport := TReport():New(cNome,"Relatório de pedidos por clientes",cNome,{|oRperot| RPTPRINT(oReport)},"Descricao do Help")

    oReport:SetPortrait() //Definindo a orientação como retrato

    oSection1 := TRSection():New(oReport, "Clientes",{"SA1"}, NIL,.F.,.T.)
    TRCell():New(oSection1,"A1_COD"        ,"TEMP","CODIGO"          ,"@!",40)
    TRCell():New(oSection1,"A1_NOME"  ,"TEMP","NOME"    ,"@!",200)

    oSection2 := TRSection():New(oReport, "Produtos",{"SB1"}, NIL,.F.,.T.)
    TRCell():New(oSection2,"C5_NUM"       ,"TEMP","Pedido"    ,"@!",30)
    TRCell():New(oSection2,"B1_DESC"      ,"TEMP","Descrição"    ,"@!",100)
    TRCell():New(oSection2,"C6_PRCVEN"    ,"TEMP","Prec. Vend"    ,"@E 999999.99",20)
    TRCell():New(oSection2,"C6_QTDVEN"    ,"TEMP","Quantidade"    ,"@E 999999.99",30)

    oSection1:SetPageBreak(.F.) //Quebra de seção


Return (oReport)

Fiz um teste utilizando o seu código e funcionou perfeitamente.

Verifique como está o compartilhamento das tabelas SC5, SC6 e SB1. Pode ser que a SB1 possua um compartilhamento diferente da SC5/SC6, e devido a isso o campo B1_FILIAL dessa tabela esteja em branco. Sendo assim, ao executar o código e filtrar por TRPT002, nenhum dado é retornado. Para ter certeza, depure o seu código e pegue a query gerada pelo mesmo e tente executar no seu banco.

Dica: Existem algumas otimizações a serem feitas no seu código, a principal delas seria utilizar o campo de Loja do Cliente tanto na query quanto no Loop do While. Como podem existir mais de um cliente com mesmo código mas lojas diferentes, isso pode causar alguma confusão para quem for ler o relatório.

Outra dica seria utilizar um alias dinâmico ao invés do alias TEMP fixo. Dessa forma você evitaria possíveis erros de concorrência entre processos tentando utilizar uma mesma área de trabalho. Segue artigo com mais informações sobre como usar um alias dinâmico: https://terminaldeinformacao.com/knowledgebase/getnextalias/.

Olá Giordano Obrigada pelas dicas vou melhorar esse fonte. e sobre a tabela minha filial da B1_FILIAL está em branco mesmo, esse é o problema nessa consulta SQL. Vou mudar essa consulta, Obrigada Desde já!