Versão atual:

ADVPL - Escopo do FWTemporaryTable com tReport

Bom dia, pessoal.

Estou ajustando um fonte pra gerar um arquivo CSV e um relatório em tReport com as informações de movimentação de estoque de produtos fitossanitários. Por conta das especificações (a relação do código fitossanitário na tabela Z27 com o cadastro de produtos é 1:N), preciso criar uma tabela com os saldos e quantidade de movimentações (seria o cabeçalho do CSV e a Section1 do relatório) e outra tabela com as informações das notas fiscais (seria o corpo do CSV e a Section2 do relatório).

Minha ideia foi criar uma função para criar as tabelas e, dentro dessa função, chamar as outras funções que vão buscar os dados na SD1/SD2/SD3. Após rodar a query, tentei appendar os dados na tabela de movimentações, conforme exemplo abaixo, mas o sistema sempre retorna que o alias é inexistente.

Já mudei o escopo das variáveis que guardam as informações das tabelas e passá-las como argumento na função que busca os itens dos docs de entrada, sem sucesso. Nos exemplos que encontrei, a FWTemporaryTable sempre foi criada com escopo local, só que, nesse caso, preciso chamar a tabela temporária em outras funções.

#include "totvs.ch"
#include "protheus.ch"
#include "topconn.ch"

User Function CAESR002()
    Local oReport := nil
    Local cPerg:= Padr("CAESR002",10)

    Pergunte(cPerg,.T.)  

    fTabela()

    //oReport := RptDef(cPerg)
    //oReport:PrintDialog()
Return


Static Function fTabela()

    Local aColsSld := {}
    Local aColsMov := {}
    Private cAliasSld := GetNextAlias()
    Private cAliasMov := GetNextAlias()
    Private oTmpSld
    Private oTmpMov

    //-------------------
    //Criação do objeto
    //-------------------
    oTmpSld := FWTemporaryTable():New(cAliasSld)

    //--------------------------
    //Monta os campos da tabela
    //--------------------------
    aadd(aColsSld,{"MAPA"    ,"C",30,0})
    aadd(aColsSld,{"VOL"     ,"N",7,3})
    aadd(aColsSld,{"UN"      ,"C",4,0})
    aadd(aColsSld,{"CONV"    ,"N",7,3})
    aadd(aColsSld,{"QTD"     ,"N",3,0})

    oTmpSld:SetFields( aColsSld )
    oTmpSld:AddIndex("indice1", {"MAPA", "VOL", "UN"} )
    //------------------
    //Criação da tabela
    //------------------
    oTmpSld:Create()

    //---------------------------------
    //Exclui a tabela 
    //---------------------------------
    //oTmpSld:Delete() 

        //-------------------
    //Criação do objeto
    //-------------------
    oTmpMov := FWTemporaryTable():New(cAliasMov)

    //--------------------------
    //Monta os campos da tabela
    //--------------------------
    aadd(aColsMov,{"MAPA"      ,"C",30,0})
    aadd(aColsMov,{"VOL"       ,"N",3,1})
    aadd(aColsMov,{"UN"        ,"C",4,0})
    aadd(aColsMov,{"CONV"      ,"N",7,3})
    aadd(aColsMov,{"NF"        ,"C",9,0})
    aadd(aColsMov,{"COD"       ,"C",15,0})
    aadd(aColsMov,{"CLIENTE"   ,"C",06,0})
    aadd(aColsMov,{"RECEITU"   ,"C",15,0})


    oTmpMov:SetFields( aColsMov )
    oTmpMov:AddIndex("indice1", {"MAPA", "VOL", "UN", "NF", "COD"} )
    //------------------
    //Criação da tabela
    //------------------
    oTmpMov:Create()

    //---------------------------------
    //Exclui a tabela 
    //---------------------------------
    //oTmpMov:Delete() 

    fMovEnt(cAliasSld, cAliasMov)
    //fMovSai()
    //fMovInt()

return



Static Function fMovEnt(cAliasSld, cAliasMov)
    Local cQuery := ""

    cQuery += "     SELECT  "
    cQuery += "         Z27010.Z27_IDMAPA,  "
    cQuery += "         Z27010.Z27_VOLUME,  "
    cQuery += "         Z27010.Z27_UN,  "
    cQuery += "         Z27010.Z27_PRODUT,  "
    cQuery += "         SD1010.D1_SERIE,    "
    cQuery += "         SD1010.D1_DOC,  "
    cQuery += "         SD1010.D1_QUANT,    "
    cQuery += "         SD1010.D1_TIPO, "
    cQuery += "         SD1010.D1_FORNECE,  "
    cQuery += "         SD1010.D1_LOJA  "
    cQuery += "     FROM    "
    cQuery += "         Z27010  "
    cQuery += "         INNER JOIN SD1010 ON D1_FILIAL = Z27_FILIAL "
    cQuery += "                              AND D1_COD = Z27_PRODUT    "
    cQuery += "         INNER JOIN SF4010 ON D1_FILIAL = F4_FILIAL  "
    cQuery += "                              AND SD1010.D1_TES = F4_CODIGO  "
    cQuery += "     WHERE   "
    cQuery += "         SD1010.D1_DTDIGIT BETWEEN '20201123' AND '20201129' "
    cQuery += "         AND SD1010.D_E_L_E_T_ = ' ' "
    cQuery += "         AND SF4010.F4_ESTOQUE = 'S' "

    dbUseArea( .t., 'TOPCONN', TCGenQry(,,cQuery), 'TRBE', .f., .t. )

    DBSELECTAREA("TRBE")
    DBGOTOP()

    DBSELECTAREA(cAliasMov)
    DBGOTOP()
    While TRBE->(!Eof())
        cAliasMov->(dbAppend())
        cAliasMov->MAPA := TRBE->Z27_IDMAPA
        cAliasMov->VOL  := TRBE->Z27_VOLUME
        cAliasMov->UN   := TRBE->Z27_UN
        cAliasMov->NF   := TRBE->D1_DOC
        cAliasMov->COD  := TRBE->Z27_PRODUT
        cAliasMov->(DBCommit())

        TRBE->(DbSkip())
    EndDo

    while cAliasMov->(!Eof())
        Alert(cAliasMov->NF)
        Alert(cAliasMov->COD)
        cAliasMov->(DbSkip())
    end

    oTmpSld:Delete() 
    oTmpMov:Delete()
Return

Quando usava o CriaTrab, o arquivo de trabalho ficava disponível em todas as funções, mas acho que com o FwTemporaryTable deva haver alguma mudança na questão de escopo.

Desde já, agradeço caso alguém tenha uma ideia de como solucionar essa questão.

Versão (1):

Ver a versão formatada

ADVPL - Escopo do FWTemporaryTable com tReport

Comentário

new question