Erro no excauto do Pedido de Venda

Ola! Estou tentando executar uma rotina automática do pedido de venda (mata410) e está apresentando um comportamento muito estranho. a forma como eu estou fazendo é a seguinte: coloquei um botão dentro da alteração do pedido de venda; ao clicar no botão eu pego os dados do pedido aberto e recrio ele em outra filial, com os mesmos itens e cabeçalho. Em pedidos que eu tenho somente 1 item, ele funciona normalmente mas em pedidos que tem mais de 1 item, apresenta um erro no campo cliente, erro de type mismatch mas não é pois até ja testei colocando o cliente direto no fonte no modo caracter. Em anexo, está o print do erro em um pedido com 2 itens.

segue o fonte:

Static Function TESTEX()

local cC5num := SC5->C5_NUM local cC5cli := SC5->C5_CLIENTE local aLin := {} local aArea := GetArea() local cQuery := "" //Local nOpr := 3 // NÚMERO DA OPERAÇÃO (INCLUSÃO) Local aCabc := {} // INFORMAÇÕES DO CABEÇALHO Local aLine := {} // INFORMAÇÕES DA LINHA Local aItems := {} // CONJUNTO DE LINHAS local nXi := 1

Private lMsErroAuto := .F. Private lMsHelpAuto := .T.

cQuery += " SELECT C6_ITEM,C6_PRODUTO,C6_QTDVEN,C6_PRUNIT,C6_PRCVEN,C6_UM,C6_VALOR,C6_OPER,C6_TES,C6_LOCAL FROM "+RetSQLName("SC6")+" " cQuery += " WHERE C6_NUM = '"+cC5num+"' AND C6_CLI = '"+cC5cli+"' "

TCQUERY cQuery NEW ALIAS "QRY" dbSelectArea("QRY") while !QRY->(EoF())

aadd(aLin, {C6_ITEM,C6_PRODUTO,C6_QTDVEN, C6_PRUNIT, C6_PRCVEN,C6_UM, C6_VALOR, C6_OPER ,C6_TES,C6_LOCAL }) QRY->(DbSkip())

enddo QRY->(DbCloseArea())

alert("novo pedido sera incluido na filial 12 com:"+cValToChar(len(aLin))+" itens")

RPCSetEnv("01", "12", NIL, NIL, "FAT", NIL, {"SC5", "SC6"}) // ABERTURA DE AMBIENTE (REMOVER SE EXECUTADO VIA SMARTCLIENT) aArea := GetArea()

// cNum := GetSXENum("SC5", "C5_NUM") // REMOVER PARA GERAÇÃO DE NUMERAÇÃO AUTOMÁTICA PELA ROTINA

// DADOS DO CABEÇALHO // AAdd(aHeader, {"C5_NUM", cNum, NIL}) // REMOVER PARA GERAÇÃO DE NUMERAÇÃO AUTOMÁTICA PELA ROTINA AAdd(aCabc, {"C5_TIPO" , SC5->C5_TIPO , NIL}) AAdd(aCabc, {"C5_CLIENTE", "033439", NIL}) //AAdd(aCabc, {"C5_LOJACLI", SC5->C5_LOJACLI, NIL}) //AAdd(aCabc, {"C5_LOJAENT", SC5->C5_LOJAENT, NIL}) AAdd(aCabc, {"C5_LOJAENT", SC5->C5_LOJAENT, NIL}) AAdd(aCabc, {"C5_CONDPAG", SC5->C5_CONDPAG, NIL}) AAdd(aCabc, {"C5_VEND1" , SC5->C5_VEND1 , NIL}) AAdd(aCabc, {"C5_TRANSP" , SC5->C5_TRANSP , NIL}) //AAdd(aCabc, {"C5_TPFRETE", SC5->C5_TPFRETE, NIL}) AAdd(aCabc, {"C5_MENNOTA", SC5->C5_MENNOTA, NIL}) //AAdd(aCabc, {"C5_CGCINT" , SC5->C5_CGCINT , NIL})

// DADOS DOS ITENS For nXi := 1 to len(aLin) aLine := {} AAdd(aLine, {"C6_ITEM" , aLin[nXi][1], NIL}) AAdd(aLine, {"C6_PRODUTO", aLin[nXi][2], NIL}) AAdd(aLine, {"C6_QTDVEN" , aLin[nXi][3], NIL}) AAdd(aLine, {"C6_PRUNIT" , aLin[nXi][4], NIL}) AAdd(aLine, {"C6_PRCVEN" , aLin[nXi][5], NIL}) AAdd(aLine, {"C6_UM" , aLin[nXi][6], NIL}) AAdd(aLine, {"C6_VALOR" , aLin[nXi][7], NIL}) AAdd(aLine, {"C6_OPER" , "03" , NIL}) AAdd(aLine, {"C6_TES" , "531" , NIL}) AAdd(aLine, {"C6_LOCAL" , "13" , NIL})

AAdd(aItems, aLine)

next nXi

MsExecAuto({|x, y, z| MATA410(x, y, z)}, aCabc, aItems, 3)

// VALIDAÇÃO DE ERRO If (lMsErroAuto) MostraErro() // RollbackSX8() // REMOVER PARA GERAÇÃO DE NUMERAÇÃO AUTOMÁTICA PELA ROTINA

ConOut(Repl("-", 80)) ConOut(PadC("MATA410 automatic routine ended with error", 80)) ConOut(PadC("Ended at: " + Time(), 80)) ConOut(Repl("-", 80)) Else // ConfirmSX8() // REMOVER PARA GERAÇÃO DE NUMERAÇÃO AUTOMÁTICA PELA ROTINA

ConOut(Repl("-", 80)) ConOut(PadC("MATA410 automatic routine successfully ended", 80)) ConOut(PadC("Ended at: " + Time(), 80)) ConOut(Repl("-", 80)) alert("incluído com sucesso")

EndIf

RestArea(aArea) // RESTAURAÇÃO DA ÁREA ANTERIOR //RPCClearEnv() // FECHAMENTO DE AMBIENTE (REMOVER SE EXECUTADO VIA SMARTCLIENT) Return

:warning: Atenção: Esta publicação foi transferida automaticamente do fórum antigo, mas os anexos não foram incluídos.

Você faz esse MsExecAuto com RpcSetEnv na mesma thread?

Parece que a variável de leitura do grid que está gerando a exceção.

Pra isso voce vai ter que usar o StartJob.

https://tdn.totvs.com/display/tec/StartJob

Veja se isso aqui te ajuda:


Static Function TESTEX()

    local aItem := {}
    Local aArea := GetArea()
    local cQuery := ""
    // Local nOpr := 3 // NÚMERO DA OPERAÇÃO (INCLUSÃO) 
    Local aCabc := {} // INFORMAÇÕES DO CABEÇALHO 
    Local aItens := {} // CONJUNTO DE LINHAS 
    Local lRet := .F.

    Private lMsErroAuto := .F.
    Private lMsHelpAuto := .T.

    // ######################################################################################################
    // ########################################  DADOS DO CABEÇALHO #########################################
    // cNum := GetSXENum("SC5", "C5_NUM") // REMOVER PARA GERAÇÃO DE NUMERAÇÃO AUTOMÁTICA PELA ROTINA

    // DADOS DO CABEÇALHO 
    // AAdd(aHeader, {"C5_NUM", cNum, NIL}) // REMOVER PARA GERAÇÃO DE NUMERAÇÃO AUTOMÁTICA PELA ROTINA 
    AAdd(aCabc, {"C5_TIPO" , SC5->C5_TIPO , NIL})
    AAdd(aCabc, {"C5_CLIENTE", "033439", NIL})
    //AAdd(aCabc, {"C5_LOJACLI", SC5->C5_LOJACLI, NIL}) 
    //AAdd(aCabc, {"C5_LOJAENT", SC5->C5_LOJAENT, NIL}) 
    AAdd(aCabc, {"C5_LOJAENT", SC5->C5_LOJAENT, NIL})
    AAdd(aCabc, {"C5_CONDPAG", SC5->C5_CONDPAG, NIL})
    AAdd(aCabc, {"C5_VEND1" , SC5->C5_VEND1 , NIL})
    AAdd(aCabc, {"C5_TRANSP" , SC5->C5_TRANSP , NIL})
    //AAdd(aCabc, {"C5_TPFRETE", SC5->C5_TPFRETE, NIL}) 
    AAdd(aCabc, {"C5_MENNOTA", SC5->C5_MENNOTA, NIL})
    //AAdd(aCabc, {"C5_CGCINT" , SC5->C5_CGCINT , NIL})
    // ######################################################################################################


    // ######################################################################################################
    // ########################################  DADOS DOS ITENS ############################################
    cQuery += " SELECT "
    cQuery += " C6_ITEM,C6_PRODUTO,C6_QTDVEN,C6_PRUNIT,C6_PRCVEN,C6_UM,C6_VALOR,C6_OPER,C6_TES,C6_LOCAL "
    cQuery += " FROM " + RetSQLName("SC6")
    cQuery += " WHERE C6_FILIAL = " + ValToSQL(SC5->C5_FILIAL) + " AND C6_NUM = " + ValToSQL(SC5->C5_NUM)
    cQuery += " ORDER BY C6_ITEM"

    TCQUERY cQuery NEW ALIAS "QRY"

    dbSelectArea("QRY")

    While !QRY->(EoF())

        aItem := {}
        AAdd(aItem, {"C6_ITEM"   , C6_ITEM, NIL})
        AAdd(aItem, {"C6_PRODUTO", C6_PRODUTO, NIL})
        AAdd(aItem, {"C6_QTDVEN" , C6_QTDVEN, NIL})
        AAdd(aItem, {"C6_PRUNIT" , C6_PRUNIT, NIL})
        AAdd(aItem, {"C6_PRCVEN" , C6_PRCVEN, NIL})
        AAdd(aItem, {"C6_UM"     , C6_UM, NIL})
        AAdd(aItem, {"C6_VALOR"  , C6_VALOR, NIL})
        AAdd(aItem, {"C6_OPER"   , "03" , NIL})
        AAdd(aItem, {"C6_TES"    , "531" , NIL})
        AAdd(aItem, {"C6_LOCAL"  , "13" , NIL})

        AAdd(aItens, aItem)                

        QRY->(DbSkip())

    enddo

    QRY->(DbCloseArea())

    lRet := startjob("u_GeraPed",getenvserver(),.T.,aCabc,aItens)
    //lRet := startjob(cName,cEnv,lWait,parm1,parm2,...)

    RestArea(aArea)
Return


User Function GeraPed(aCab,aIts)

    If Select("SX2") == 0
        RpcClearEnv()
        RPCSetEnv("01", "12", NIL, NIL, "FAT", NIL, {"SC5", "SC6"}) 
    EndIf

    MsExecAuto({|x, y, z| MATA410(x, y, z)}, aCab, aIts, 3)

    // VALIDAÇÃO DE ERRO 
    If (lMsErroAuto)
        MostraErro()
        // RollbackSX8() // REMOVER PARA GERAÇÃO DE NUMERAÇÃO AUTOMÁTICA PELA ROTINA

        ConOut(Repl("-", 80))
        ConOut(PadC("MATA410 automatic routine ended with error", 80))
        ConOut(PadC("Ended at: " + Time(), 80))
        ConOut(Repl("-", 80))
    Else
        // ConfirmSX8() // REMOVER PARA GERAÇÃO DE NUMERAÇÃO AUTOMÁTICA PELA ROTINA

        ConOut(Repl("-", 80))
        ConOut(PadC("MATA410 automatic routine successfully ended", 80))
        ConOut(PadC("Ended at: " + Time(), 80))
        ConOut(Repl("-", 80))
        alert("incluído com sucesso")

    EndIf

    RpcClearEnv()

Return()

Dois ajustes que devem ajudar no seu fonte:

  1. Mude a linha abaixo:

aadd(aLin, {C6_ITEM,C6_PRODUTO,C6_QTDVEN, C6_PRUNIT, C6_PRCVEN,C6_UM, C6_VALOR, C6_OPER ,C6_TES,C6_LOCAL })

Para:


aadd(aLin, {QRY->C6_ITEM,QRY->C6_PRODUTO,QRY->C6_QTDVEN, QRY->C6_PRUNIT, QRY->C6_PRCVEN,QRY->C6_UM, QRY->C6_VALOR, QRY->C6_OPER ,QRY->C6_TES,QRY->C6_LOCAL })

Assim vai pegar os resultados da query QRY ao invés de repetir as linhas só com os valores da SC6 posicionada.

  1. Substitua a linha:

RPCSetEnv("01", "12", NIL, NIL, "FAT", NIL, {"SC5", "SC6"})

Por:


_cfilori := cfilant
cfilant := '12'

E substitua a linha:


RPCClearEnv()

Por:


cfilant := _cfilori

Assim você muda de filial de forma mais suave para criar o novo pedido e volta à filial original depois ao invés de fechar por completo ambiente com rpcclearenv.