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.

compartilhar
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do TOTVS DevForum!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags fwtemporarytable escopo ou faça a sua própria pergunta.