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.