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).
— Lucas Antunes de Souza 08 de Apr de 2024