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
compartilhar
  • 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).

    Lucas Antunes de Souza   3 weeks ago
  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!

0 resposta

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