Usar função CalcEst para múltiplas filiais

Olá pessoal

Estou utilizando a função CalcEst junto com uma query para obter o custo médio e o valor em estoque dos produtos em uma data retroativa. Porém percebi que a função só retorna os dados para a filial atual logada. Mesmo eu especificando diferentes filiais nos argumentos da chamada da função. Segue um trecho de código de teste que faço a chamada da função para diferentes filiais conforme a query:

// Query


BeginSql Alias 'QRY'
        SELECT B2_FILIAL AS FILIAL, B2_COD AS PRODUTO, B2_LOCAL AS ARMAZEM, B1_DESC AS DESCRICAO, B1_TIPO AS TIPO, B1_GRUPO AS GRUPO, B1_UM AS UM, B2_QATU AS EST_ATUAL, B2_CM1 AS CUSTO_MEDIO, B2_VATU1 AS VALOR_EST
        FROM %table:SB2% SB2
        LEFT JOIN %table:SB1% SB1 ON SB1.%NotDel% AND B1_COD = B2_COD

        WHERE SB2.%NotDel%  
        AND B1_TIPO IN ('MP', 'PA', 'RV')
        AND B1_GRUPO = '0003'
        ORDER BY B2_COD, B2_LOCAL, B2_FILIAL
EndSql


// Insere as linhas na tabela Excel
    WHILE !QRY->(EOF())

        aSaldos := CalcEst(QRY->PRODUTO, QRY->ARMAZEM, CToD('01/07/2024') + 1, QRY->FILIAL)

        // Obtém os saldos e o custo somente de produtos com estoque positivo até a data informada
        if aSaldos[1] >= 0.1 
            nQtd := aSaldos[1]
            nValEst := aSaldos[2]
            nCustoMed := nValEst / nQtd

            oExcel:AddRow(cNomePlan, cNomeTab, {QRY->FILIAL, QRY->ARMAZEM, QRY->TIPO, QRY->GRUPO, QRY->PRODUTO, QRY->DESCRICAO, QRY->UM, nQtd, nCustoMed, nValEst})
        endif

        QRY->(DBSKIP())
    ENDDO

O resultado final traz as informações corretas, exceto quando os produtos possuem mais de uma filial. Quando possui mais de uma filial, as informações são duplicadas para as mesmas da filial logada (Ex: filial 01), dando a entender que a função CalcEst só retorna os resultados para a filial logada.

Alguma sugestão para isso? Como utilizar a CalcEst para obter as informações para diferentes filiais? O objetivo é reunir as informações dos saldos e custos por filial em uma planilha excel.

Acredito que você precisará posicionar no registro em questão, por exemplo:



DbSelectArea("SB1")
SB1->(DbSetOrder(1)) // B1_FILIAL + B1_COD

If SB1->(DbSeek(FWxFilial("SB1") + cProduto))
   aSaldos := CalcEst(cProduto, cArmazem, dDataFim)
EndIf

Grato pela resposta Diogo.
Fiz o teste da forma que voce sugeriu, porém não deu certo. A função só retorna os dados de saldo e custo referente a filial 01. Só da certo de obter os dados da outra filial quando logo na mesma e chamo a user function novamente pelo menu.

Olá Tiago, dessa forma ai não vai funcionar mesmo, acredito que vá precisar de rodar em outra thread preparada para filial que precisa do saldo, usando startjob

segue exemplo , o lWait precisa ser true nesse caso para aguardar o retorno.


lWait := .T.
aEmpDest := {"01","010102"}
cProduto := "000001"
cLocal   := "01"
aSaldo:= STARTJOB("u_pegaSaldo",getenvserver(),lWait ,aEmpDest,cProduto,cLocal)


/*/{Protheus.doc} pegaSaldo
(long_description)
@type user function
@author Leandro Lemos
@since 24/09/2024
@version P12
@param param_name, param_type, param_descr
@return return_var, return_type, return_description
@example
(examples)
@see (links_or_references)
/*/
User Function pegaSaldo(aEmpDest,cProduto,cLocal)
    Local aSaldo := {} as array

    RpcSetEnv(aEmpDest[1],aEmpDest[2])

    DBSelectArea("SB2")
    SB2->(DBSetOrder(1))
    if SB2->(DBSeek(xFilial("SB1")+cProduto+cLocal))
        aSaldo := CalcEst(cProduto, cLocal, CToD('01/07/2024') + 1, xFilial("SB2"))
    endif

Return aSaldo

Opa Leandro

Consegui uma solução aqui manipulando as variáveis públicas cEmpAnt, cFilAnt, cNumEmp e usando a função OpenFile para mudar de filial em tempo de execução. Vou dar uma olhada nessas funções STARTJOB e RpcSetEnv, pois também é uma opção interessante. Obrigado!

Até por que alterar a empresa no sistema não envolve só alterar essas variaveis, e pode acabar dando algum problema