Erro MsExecAuto MATA381 na alteração

Olá, boa noite!

Estou tentando fazer um teste com o MsExecAuto da rotina MATA38, mas está apresentando a mensagem abaixo:

Tabela SD4 05/04/2024 18:51:34

Ord Producao - D4_OP := 00157101004

Tabela SD4 05/04/2024 18:51:34

Erro no Item 0

Armazem - D4_LOCAL := 64 Ord Producao - D4_OP := 00157101004Lote - D4_LOTECTL := - LINPOS := D4_COD+D4_TRT+D4_LOTECTL+D4_NUMLOTE+D4_LOCAL+D4_OPORIG+D4_SEQ - P703GR-AARHF-0S < -- Invalido

Erro --> LINPOS - Parametro #2 invalido

Já olhei diversos exemplos de fontes da TOTVS, mas nenhum parece que funciona para o meu caso.

Conseguem me ajudar?

Segue fonte abaixo:



#INCLUDE "TOTVS.CH"
#include "protheus.ch"
#include "topconn.ch"

User Function Alt381Auto()
    Local nX         := 0
    Local aCab       := {}
    Local aLine      := {}
    Local aItens     := {}
    // Local aLineEnder := {}
    // Local aEnder     := {}
    Local QRYSD4    := GetNextAlias()
    Local aArea      := GetArea()

    PRIVATE lMsErroAuto := .F.

    //Monta o cabeçalho com o número da OP que será alterada.
    aCab := {{"D4_OP","00157101004",NIL},;
            {"INDEX",2,Nil}}

    //Seta o índice da SDC
    SDC->(dbSetOrder(2))

    //Busca os empenhos da SD4 para alterar/excluir.
    SD4->(dbSetOrder(2))
    // SD4->(dbSeek(xFilial("SD4")+PadR("00157101004",Len(SD4->D4_OP))))

    BeginSql Alias "QRYSD4"
        SELECT 
            R_E_C_N_O_ RECSD4,
            D4_COD,
            D4_TRT,
            D4_LOTECTL,
            D4_NUMLOTE,
            D4_QUANT,
            D4_QTDEORI,
            D4_LOCAL,
            D4_OPORIG,
            D4_ROTEIRO,
            D4_SEQ
        FROM %table:SD4% SD4 where D4_OP = '00157101004'
    EndSql

    While !QRYSD4->(EoF())
        SD4->(DbGoTo(QRYSD4->RECSD4))

        aLine := {}
        // For nX := 1 To SD4->(FCount())
        //     aAdd(aLine,{SD4->(Field(nX)),SD4->(FieldGet(nX)),Nil})
        // Next nX

        For nX := 1 To SD4->(FCount())     // Precisa da OP, e os campos que serão manipulados
          if RTrim(SD4->(Field(nX))) $ "D4_OP|D4_LOCAL|D4_LOTECTL|"
            aAdd(aLine,{SD4->(Field(nX)),SD4->(FieldGet(nX)),Nil})
          endif
        Next nX

        //Adiciona o identificador LINPOS para identificar que o registro já existe na SD4
        aAdd(aLine,{"LINPOS","D4_COD+D4_TRT+D4_LOTECTL+D4_NUMLOTE+D4_LOCAL+D4_OPORIG+D4_SEQ",;
                            SD4->D4_COD,;
                            SD4->D4_TRT,;
                            SD4->D4_LOTECTL,;
                            SD4->D4_NUMLOTE,;
                            SD4->D4_LOCAL,;
                            SD4->D4_OPORIG,;
                            SD4->D4_SEQ})

        //Altera a quantidade do empenho do produto "9617-MP1"
        //Busca a informação da quantidade (D4_QTDEORI) no array aLine.
        nX := aScan(aLine,{|x| x[1] == "D4_LOCAL"})
        If nX > 0
            //Encontrou o valor da quantidade. Faz a alteração do valor.
            aLine[nX,2] := "64"
        EndIf

        nX := aScan(aLine,{|x| x[1] == "D4_LOTECTL"})
        If nX > 0
            //Encontrou o valor da quantidade. Faz a alteração do valor.
            aLine[nX,2] := ""
        EndIf

        aAdd(aItens,aLine)

        QRYSD4->(DbSkip())
    End
    (QRYSD4)->(dbCloseArea())

    //Executa o MATA381, com a operação de Alteração.
    MSExecAuto({|x,y,z| mata381(x,y,z)},aCab,aItens,4)
    If lMsErroAuto
        //Se ocorrer erro.
        MostraErro()
    Else
        Alert("Alterado com sucesso.")
    EndIf

    RestArea(aArea)

Return

Sempre que eu precisei fazer execuato para ajuste de empenho, sem excluo o empenho e existente e incluo um novo.

O processo é o mesmo só que ao inves de usar opção 4 , vc vai copiar as informações, deletar o registro (5) e incluir (3).