Árvore de páginas


Exemplos:

Produto:

Protheus 

Ocorrência:

Como utilizar a rotina Empenhos Múltiplos (MATA381) via execução automática (MsExecAuto)?

Passo a passo:

Para realizar manutenção nos empenhos da ordem de produção, pode-se utilizar o programa MATA381. Através da execução automática do programa MATA381 é possível realizar a alteração de empenhos em lotes.

Cada execução do programa MATA381 irá permitir alterar os empenhos de determinada ordem de produção. A execução automática do programa MATA381 recebe 3 parâmetros.

  • Parâmetro 1 → Array com as informações do cabeçalho do programa de empenhos múltiplos (MATA381). Obrigatório enviar o número da ordem de produção. Pode ser enviado neste array o índice de busca dos dados na tabela SD4 e também o parâmetro AUTZERAEMP. Ambos serão citados nos exemplos.
  • Parâmetro 2 → Array com as informações dos empenhos que serão processados pelo programa. Para as operações de Exclusão de empenhos e Zerar empenhos, este parâmetro é opcional.
  • Parâmetro 3 → Operação que será executada pela rotina automática. Os valores aceitos são: 3 → Inclusão; 4 → Alteração; 5 → Exclusão.


1. Exemplo para inclusão de empenhos:

No array com as informações do cabeçalho, é necessário enviar apenas o número da ordem de produção.
No array de itens, é necessário informar todas as informações do empenho que será incluído. Informações de Endereços podem ser enviadas através da opção AUT_D4_END conforme exemplo.
Quando o empenho possui controle de lote e o lote é enviado para geração do empenho, não é necessário enviar a data de validade do lote. O programa MATA381 preenche a validade do lote automaticamente.
Para inclusão dos empenhos, enviar o 3° parâmetro do MATA381 com o valor 3.

Exemplo de inclusão de empenhos
User Function Inc381Auto()
	Local aCab       := {}
	Local aLine      := {}
	Local aItens     := {}
	Local aEnder     := {}
	Local aLineEnder := {}

	PRIVATE lMsErroAuto := .F.

	//Monta o cabeçalho com o número da OP que será utilizada para inclusão dos empenhos.
	aCab := {{"D4_OP","00130301001",NIL}}
	
	//Adiciona novo empenho	
	aLine := {}
	aAdd(aLine,{"D4_OP"     ,"00130301001"     ,NIL})
	aAdd(aLine,{"D4_COD"    ,"MP01"            ,NIL})
	aAdd(aLine,{"D4_LOCAL"  ,"01"              ,NIL})
	aAdd(aLine,{"D4_DATA"   ,CtoD("18/09/2018"),NIL})
	aAdd(aLine,{"D4_QTDEORI",10                ,NIL})
	aAdd(aLine,{"D4_QUANT"  ,10                ,NIL})
	aAdd(aLine,{"D4_TRT"    ,"001"             ,NIL})
	//Adiciona a linha do empenho no array de itens.
	aAdd(aItens,aLine)

	//Adiciona novo empenho	com utilização de Lote. 
	//A data de validade do lote é preenchida automaticamente pelo programa e não precisa ser enviada no array.
	aLine := {}
	aAdd(aLine,{"D4_OP"     ,"00130301001"     ,NIL})
	aAdd(aLine,{"D4_COD"    ,"MP02"            ,NIL})
	aAdd(aLine,{"D4_LOCAL"  ,"01"              ,NIL})
	aAdd(aLine,{"D4_DATA"   ,CtoD("18/09/2018"),NIL})
	aAdd(aLine,{"D4_QTDEORI",3                 ,NIL})
	aAdd(aLine,{"D4_QUANT"  ,3                 ,NIL})
	aAdd(aLine,{"D4_LOTECTL","L1"              ,NIL})
	aAdd(aLine,{"D4_TRT"    ,"002"             ,NIL})
	//Adiciona a linha do empenho no array de itens.
	aAdd(aItens,aLine)

	//Adiciona novo empenho com endereço e lote
	aLine := {}
	aAdd(aLine,{"D4_OP"     ,"00130301001"     ,NIL})
	aAdd(aLine,{"D4_COD"    ,"MP03"            ,NIL})
	aAdd(aLine,{"D4_LOCAL"  ,"01"              ,NIL})
	aAdd(aLine,{"D4_DATA"   ,CtoD("17/09/2018"),NIL})
	aAdd(aLine,{"D4_QTDEORI",10                ,NIL})
	aAdd(aLine,{"D4_QUANT"  ,10                ,NIL})
	aAdd(aLine,{"D4_LOTECTL","L1"              ,NIL})
	aAdd(aLine,{"D4_TRT"    ,"003"             ,NIL})
	aAdd(aLine,{"D4_ROTEIRO","01"              ,NIL})

	//Informações do endereço
	aEnder     := {}
	aLineEnder := {}
	aAdd(aLineEnder,{"DC_LOCALIZ","END01",Nil})
	aAdd(aLineEnder,{"DC_QUANT"  ,5      ,Nil})
	//Primeiro endereço que será utilizado
	aAdd(aEnder,aLineEnder)

	aLineEnder := {}
	aAdd(aLineEnder,{"DC_LOCALIZ","END02",Nil})
	aAdd(aLineEnder,{"DC_QUANT"  ,5      ,Nil})
	//Segundo endereço que será utilizado
	aAdd(aEnder,aLineEnder)

	//Adiciona os endereços na linha do empenho
	aAdd(aLine,{"AUT_D4_END",aEnder,Nil})
	//Adiciona a linha do empenho no array de itens.
	aAdd(aItens,aLine)

	//Executa o MATA381, com a operação de Inclusão.
	MSExecAuto({|x,y,z| mata381(x,y,z)}, aCab, aItens, 3)
	If lMsErroAuto
		//Se ocorrer erro.
		MostraErro()
	Else
		Alert("Incluído com sucesso.")
	EndIf
Return


2. Exemplo para Alteração de empenhos.

No array do cabeçalho, é necessário enviar o número da ordem de produção e a chave INDEX com o valor 2 para que o sistema altere a ordem de produção correta. Observação: a chave INDEX deve, obrigatoriamente, ser o último elemento do array.

No array de itens, pode-se enviar apenas as informações dos empenhos que estão sendo modificados. Empenhos que já estão cadastrados na tabela SD4 e não irão sofrer nenhuma alteração não precisam ser carregados no array. Informações de Endereços podem ser enviadas através da opção AUT_D4_END conforme exemplo.

Quando o empenho possui controle de lote e o lote é enviado para geração do empenho, não é necessário enviar a data de validade do lote. O programa MATA381 preenche a validade do lote automaticamente.

Para alterar um empenho que está cadastrado na SD4, é necessário utilizar o identificador LINPOS. A chave utilizada no LINPOS deverá ser a seguinte concatenação:

      • D4_COD+D4_TRT+D4_LOTECTL+D4_NUMLOTE+D4_LOCAL+D4_OPORIG+D4_SEQ. Verificar a utilização correta no exemplo.

Para excluir um empenho que está cadastrado na SD4, é necessário utilizar o identificador LINPOS em conjunto com a chave AUTDELETA. A chave utilizada no LINPOS deverá ser a seguinte concatenação:

      • D4_COD+D4_TRT+D4_LOTECTL+D4_NUMLOTE+D4_LOCAL+D4_OPORIG+D4_SEQ. Verificar a utilização correta no exemplo.


Para alteração das informações da tabela SDC que estão ligadas ao empenho, deve-se utilizar os identificadores LINPOS e AUTDELETA da mesma forma que é utilizado para os registros da tabela SD4.

Para adicionar um novo empenho, basta adicionar as informações deste novo empenho no array de itens.

Para alteração dos empenhos, enviar o 3° parâmetro do MATA381 com o valor 4.

Exemplo de alteração de empenhos
User Function Alt381Auto()
	Local nX         := 0
	Local aCab       := {}
	Local aLine      := {}
	Local aItens     := {}
	Local aLineEnder := {}
	Local aEnder     := {}

	PRIVATE lMsErroAuto := .F.

	//Monta o cabeçalho com o número da OP que será alterada. 
	//Necessário utilizar o índice 2 para efetuar a alteração.
	aCab := {{"D4_OP","00130301001",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("00130301001",Len(SD4->D4_OP))))

	While SD4->(!Eof()) .And. SD4->(D4_FILIAL+D4_OP) == xFilial("SD4")+PadR("00130301001",Len(SD4->D4_OP))
		//Adiciona as informações do empenho, conforme estão na tabela SD4.
		aLine := {}
		For nX := 1 To SD4->(FCount())
			aAdd(aLine,{SD4->(Field(nX)),SD4->(FieldGet(nX)),Nil})
		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})
		
		//Marca o empenho do produto "MP" como Excluído.
		If AllTrim(SD4->D4_COD) == "MP01"
			aAdd(aLine,{"AUTDELETA","S",Nil})
		ElseIf AllTrim(SD4->D4_COD) == "MP02" 
			//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_QTDEORI"})
			If nX > 0
				//Encontrou o valor da quantidade. Faz a alteração do valor.
				aLine[nX,2] := 10
			EndIf
			
			//Altera também o saldo do empenho
			nX := aScan(aLine,{|x| x[1] == "D4_QUANT"})
			If nX > 0
				//Encontrou o valor da quantidade. Faz a alteração do valor.
				aLine[nX,2] := 10
			EndIf
 			//Altera também o lote do empenho
			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] := "LOTE1"
			EndIf 

		ElseIf AllTrim(SD4->D4_COD) == "MP03" 
			//Altera os endereços utilizado no empenho do produto "9617-MP2"
			//Primeiro carrega os endereços utilizados.
			If SDC->(dbSeek(xFilial("SDC")+SD4->(D4_COD+D4_LOCAL+D4_OP+D4_TRT+D4_LOTECTL+D4_NUMLOTE)))
				//Inicializa o array aEnder
				aEnder     := {} 
				
				//Busca os registros da tabela SDC
				While SDC->(!Eof()) .And. ;
					xFilial("SDC")+SD4->(D4_COD+D4_LOCAL+D4_OP+D4_TRT+D4_LOTECTL+D4_NUMLOTE) == ;
					SDC->(DC_FILIAL+DC_PRODUTO+DC_LOCAL+DC_OP+DC_TRT+DC_LOTECTL+DC_NUMLOTE)
					
					//Inicializa o array aLineEnder
					aLineEnder := {}

					//Carrega as informações da tabela SDC no array aLineEnder
					For nX := 1 To SDC->(FCount())
						aAdd(aLineEnder,{SDC->(Field(nX)),SDC->(FieldGet(nX)),Nil})
					Next nX

					//Adiciona o identificador LINPOS para identificar que o registro já existe na tabela SDC
					aAdd(aLineEnder,{"LINPOS","DC_LOCALIZ+DC_NUMSERI",;
							SDC->DC_LOCALIZ,;
							SDC->DC_NUMSERI})

					//Verifica se é o endereço "END". Se for, marca a linha para exclusão.
					If AllTrim(SDC->DC_LOCALIZ) == "END01"
						aAdd(aLineEnder,{"AUTDELETA","S",NIL})
					ElseIf AllTrim(SDC->DC_LOCALIZ) == "END02"
						//Verifica se é o endereço "END02". Se for, altera a quantidade.
						//Busca a posição em que a quantidade está no array aLineEnder.
						nX := aScan(aLineEnder,{|x| x[1] == "DC_QUANT"})
						If nX > 0
							//Encontrou a quantidade no array aLineEnder. Faz a alteração da quantidade.
							aLineEnder[nX,2] := 8
						EndIf
					EndIf
					
					//Adiciona o endereço no array de endereços.
					aAdd(aEnder,aLineEnder)

					//Próximo registro da SDC
					SDC->(dbSkip())
				End
				//Adiciona um novo endereço para ser incluído na tabela SDC.
				//Inicializa o array aLineEnder
				aLineEnder := {}
				
				//Adiciona as informações do novo endereço.
				aAdd(aLineEnder,{"DC_LOCALIZ","END03",Nil})
				aAdd(aLineEnder,{"DC_QUANT"  ,2      ,Nil})
				
				//Adiciona o novo endereço no array de endereços.
				aAdd(aEnder,aLineEnder)

				//Adiciona as informações de alteração de endereço no array do Empenho.
				aAdd(aLine,{"AUT_D4_END",aEnder,Nil})
			EndIf
		EndIf

		//Adiciona as informações do empenho no array de itens.
		aAdd(aItens,aLine)

		//Próximo registro da SD4.
		SD4->(dbSkip())
	End
	
	//Adiciona um novo empenho	
	aLine := {}
	aAdd(aLine,{"D4_OP"     ,"00130301001"     ,NIL})
	aAdd(aLine,{"D4_COD"    ,"MP04"            ,NIL})
	aAdd(aLine,{"D4_LOCAL"  ,"01"              ,NIL})
	aAdd(aLine,{"D4_DATA"   ,CtoD("17/09/2018"),NIL})
	aAdd(aLine,{"D4_QTDEORI",5                 ,NIL})
	aAdd(aLine,{"D4_QUANT"  ,5                 ,NIL})
	aAdd(aLine,{"D4_LOTECTL","L1"              ,NIL})
	aAdd(aLine,{"D4_TRT"    ,"004"             ,NIL})
	aAdd(aLine,{"D4_ROTEIRO","01"              ,NIL})
	aAdd(aItens,aLine)

	//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
Return


3. Exemplo para zerar os empenhos de uma ordem de produção

No array do cabeçalho, é necessário enviar o número da ordem de produção e a chave INDEX com o valor 2 para que o sistema altere a ordem de produção correta. Observação: a chave INDEX deve, obrigatoriamente, ser o último elemento do array.
No array de itens não é necessário enviar nenhuma informação. Mesmo que sejam enviadas as informações dos empenhos no array de Itens, essas informações serão desconsideradas no processamento de zerar os empenhos.

A função de zerar os empenhos é feita da seguinte forma:

1 - Executar o ExecAuto do MATA381 utilizando a opção de Alteração (4);
2 - Nas informações do Cabeçalho, enviar o identificador AUTZERAEMP com o valor .T.

Não é possível zerar apenas um empenho da ordem de produção. Sempre que esta opção for executada, todos os empenhos da OP serão zerados.
Para zerar os empenhos, enviar o 3° parâmetro do MATA381 com o valor 4.

Exemplo para zerar os empenhos de uma ordem de produção
User Function Zera381Aut()
	Local aCab   := {}
	Local aItens := {}

	PRIVATE lMsErroAuto := .F.

	//Monta o cabeçalho com as informações da ordem de produção que terá os empenhos zerados. 
	//O parâmetro AUTZERAEMP identifica que será realizado o processo de zerar empenhos.
	aCab := {{"D4_OP","00130301001",NIL},;
			{"AUTZERAEMP",.T.,Nil},;
			{"INDEX",2,Nil}}

	//Executa o MATA381 com a operação 4, e o indicador para zerar os empenhos.
	MSExecAuto({|x,y,z| mata381(x,y,z)},aCab,aItens,4)
	If lMsErroAuto
		//Se ocorrer erro.
		MostraErro()
	Else
		//Processamento realizado com sucesso
		Alert("Empenhos zerados com sucesso.")
	EndIf
Return


4. Exemplo de exclusão de empenhos

No array do cabeçalho, é necessário enviar o número da ordem de produção e a chave INDEX com o valor 2 para que o sistema exclua os empenhos da ordem de produção correta. Observação: a chave INDEX deve, obrigatoriamente, ser o último elemento do array.
No array de itens não é necessário enviar nenhuma informação. Mesmo que sejam enviadas as informações dos empenhos no array de Itens, essas informações serão desconsideradas no processamento de exclusão dos empenhos.
Para exclusão, enviar o 3° parâmetro do MATA381 com o valor 5.

Se o empenho possuir relacionamento com a lista de compras vinda da integração com o PIMS (tabela NLI), o registro na tabela NLI será excluído juntamente com o empenho.

Sempre serão excluídos todos os empenhos da ordem. Se for necessário excluir apenas um empenho da ordem, deverá ser utilizada a operação de Alteração, junto com os identificadores AUTDELETA e LINPOS, conforme exemplo da operação de Alteração.

Exemplo de exclusão de empenhos
User Function Del381Auto()
	Local aCab   := {}
	Local aItens := {}

	PRIVATE lMsErroAuto := .F.

	//Monta o cabeçalho com a informação da Ordem de produção que terá os empenhos excluídos.
	aCab := {{"D4_OP","00130301001",NIL},;
			{"INDEX",2,Nil}}

	//Executa o MATA381 para exclusão dos empenhos.
	MSExecAuto({|x,y,z| mata381(x,y,z)},aCab,aItens,5)
	If lMsErroAuto
		//Se ocorrer erro.
		MostraErro()
	Else
		//Processamento realizado com sucesso
		Alert("Excluído com sucesso.")
	EndIf
Return


5 - Exemplo para inclusão de empenhos com integração com o PIMS:

No array com as informações do cabeçalho, é necessário enviar apenas o número da ordem de produção.
No array de itens, é necessário informar todas as informações do empenho que será incluído. Informações de Endereços podem ser enviadas através da opção AUT_D4_END conforme exemplo.

No array de itens, é necessário informar todas as informações do empenho que será incluído. Informações referente a integração com o PIMS podem ser enviadas através da opção AUT_D4_AGR conforme exemplo.

Quando o empenho possui controle de lote e o lote é enviado para geração do empenho, não é necessário enviar a data de validade do lote. O programa MATA381 preenche a validade do lote automaticamente.
Para inclusão dos empenhos, enviar o 3° parâmetro do MATA381 com o valor 3.


Exemplo de Inclusão de empenhos com integração com o PIMS
User Function Inc381Auto()
	Local aCab       := {}
	Local aLine      := {}
	Local aItens     := {}
	Local aEnder     := {}
	Local aLineEnder := {}

	PRIVATE lMsErroAuto := .F.

	//Monta o cabeçalho com o número da OP que será utilizada para inclusão dos empenhos.
	aCab := {{"D4_OP","00130301001",NIL}}
	
	//Adiciona novo empenho	
	aLine := {}
	aAdd(aLine,{"D4_OP"     ,"00130301001"     ,NIL})
	aAdd(aLine,{"D4_COD"    ,"MP01"            ,NIL})
	aAdd(aLine,{"D4_LOCAL"  ,"01"              ,NIL})
	aAdd(aLine,{"D4_DATA"   ,CtoD("18/09/2018"),NIL})
	aAdd(aLine,{"D4_QTDEORI",10                ,NIL})
	aAdd(aLine,{"D4_QUANT"  ,10                ,NIL})
	aAdd(aLine,{"D4_TRT"    ,"001"             ,NIL})



	//Adiciona informações referente a integração com o PIMS
	aLineNLI := {}
	aAdd( aLineNLI, { "NLI_CLVAL", "02", Nil } )
	aAdd( aLineNLI, { "NLI_FAZ", "001", NIL } )
	aAdd( aLineNLI, { "NLI_QTCOMP", 20, NIL } )
	aAdd( aLineNLI, { "NLI_PMSQTD", 15, NIL } )
	aAdd( aLineNLI, { "NLI_PGQTD", 25, NIL } )
	aAdd( aLineNLI, { "NLI_POPQTD", 35, NIL } )
	aAdd( aLineNLI, { "NLI_NUMPEN", 01, NIL } )
	aAdd( aLineNLI, { "NLI_QTDPAR", 5000, NIL } )
	aAdd( aLineNLI, { "NLI_CULTRA", "01", NIL } )
	aAdd( aLineNLI, { "NLI_CC", "0010" , NIL } )
	aAdd( aLineNLI, { "NLI_FITSSA", "10", NIL } )
	aAdd( aLineNLI, { "NLI_REQCOD", "admin", NIL } )
	aAdd( aLineNLI, { "NLI_REQNOM", "admin", NIL } )


    aAdd(aLine,{"AUT_D4_AGR",aLineNLI,NIL})


	//Adiciona a linha do empenho no array de itens.
	aAdd(aItens,aLine)


	//Adiciona novo empenho	com utilização de Lote. 
	//A data de validade do lote é preenchida automaticamente pelo programa e não precisa ser enviada no array.
	aLine := {}
	aAdd(aLine,{"D4_OP"     ,"00130301001"     ,NIL})
	aAdd(aLine,{"D4_COD"    ,"MP02"            ,NIL})
	aAdd(aLine,{"D4_LOCAL"  ,"01"              ,NIL})
	aAdd(aLine,{"D4_DATA"   ,CtoD("18/09/2018"),NIL})
	aAdd(aLine,{"D4_QTDEORI",3                 ,NIL})
	aAdd(aLine,{"D4_QUANT"  ,3                 ,NIL})
	aAdd(aLine,{"D4_LOTECTL","L1"              ,NIL})
	aAdd(aLine,{"D4_TRT"    ,"002"             ,NIL})


	//Adiciona informações referente a integração com o PIMS
	aLineNLI := {}
	aAdd( aLineNLI, { "NLI_CLVAL", "02", Nil } )
	aAdd( aLineNLI, { "NLI_FAZ", "001", NIL } )
	aAdd( aLineNLI, { "NLI_QTCOMP", 20, NIL } )
	aAdd( aLineNLI, { "NLI_PMSQTD", 15, NIL } )
	aAdd( aLineNLI, { "NLI_PGQTD", 41, NIL } )
	aAdd( aLineNLI, { "NLI_POPQTD", 60, NIL } )
	aAdd( aLineNLI, { "NLI_NUMPEN", 01, NIL } )
	aAdd( aLineNLI, { "NLI_QTDPAR", 7000, NIL } )
	aAdd( aLineNLI, { "NLI_CULTRA", "01", NIL } )
	aAdd( aLineNLI, { "NLI_CC", "0010" , NIL } )
	aAdd( aLineNLI, { "NLI_FITSSA", "10", NIL } )
	aAdd( aLineNLI, { "NLI_REQCOD", "admin", NIL } )
	aAdd( aLineNLI, { "NLI_REQNOM", "admin", NIL } )


    aAdd(aLine,{"AUT_D4_AGR",aLineNLI,NIL})
	//Adiciona a linha do empenho no array de itens.
	aAdd(aItens,aLine)

	//Adiciona novo empenho com endereço e lote
	aLine := {}
	aAdd(aLine,{"D4_OP"     ,"00130301001"     ,NIL})
	aAdd(aLine,{"D4_COD"    ,"MP03"            ,NIL})
	aAdd(aLine,{"D4_LOCAL"  ,"01"              ,NIL})
	aAdd(aLine,{"D4_DATA"   ,CtoD("17/09/2018"),NIL})
	aAdd(aLine,{"D4_QTDEORI",10                ,NIL})
	aAdd(aLine,{"D4_QUANT"  ,10                ,NIL})
	aAdd(aLine,{"D4_LOTECTL","L1"              ,NIL})
	aAdd(aLine,{"D4_TRT"    ,"003"             ,NIL})
	aAdd(aLine,{"D4_ROTEIRO","01"              ,NIL})

	//Informações do endereço
	aEnder     := {}
	aLineEnder := {}
	aAdd(aLineEnder,{"DC_LOCALIZ","END01",Nil})
	aAdd(aLineEnder,{"DC_QUANT"  ,5      ,Nil})
	//Primeiro endereço que será utilizado
	aAdd(aEnder,aLineEnder)

	aLineEnder := {}
	aAdd(aLineEnder,{"DC_LOCALIZ","END02",Nil})
	aAdd(aLineEnder,{"DC_QUANT"  ,5      ,Nil})
	//Segundo endereço que será utilizado
	aAdd(aEnder,aLineEnder)

	//Adiciona os endereços na linha do empenho
	aAdd(aLine,{"AUT_D4_END",aEnder,Nil})


	//Adiciona informações referente a integração com o PIMS
	aLineNLI := {}
	aAdd( aLineNLI, { "NLI_CLVAL", "02", Nil } )
	aAdd( aLineNLI, { "NLI_FAZ", "001", NIL } )
	aAdd( aLineNLI, { "NLI_QTCOMP", 20, NIL } )
	aAdd( aLineNLI, { "NLI_PMSQTD", 15, NIL } )
	aAdd( aLineNLI, { "NLI_PGQTD", 25, NIL } )
	aAdd( aLineNLI, { "NLI_POPQTD", 40, NIL } )
	aAdd( aLineNLI, { "NLI_NUMPEN", 01, NIL } )
	aAdd( aLineNLI, { "NLI_QTDPAR", 900, NIL } )
	aAdd( aLineNLI, { "NLI_CULTRA", "01", NIL } )
	aAdd( aLineNLI, { "NLI_CC", "0010" , NIL } )
	aAdd( aLineNLI, { "NLI_FITSSA", "10", NIL } )
	aAdd( aLineNLI, { "NLI_REQCOD", "admin", NIL } )
	aAdd( aLineNLI, { "NLI_REQNOM", "admin", NIL } )
    aAdd(aLine,{"AUT_D4_AGR",aLineNLI,NIL})
	//Adiciona a linha do empenho no array de itens.
	aAdd(aItens,aLine)


	//Executa o MATA381, com a operação de Inclusão.
	MSExecAuto({|x,y,z| mata381(x,y,z)},aCab,aItens,3)
	If lMsErroAuto
		//Se ocorrer erro.
		MostraErro()
	Else
		Alert("Incluído com sucesso.")
	EndIf
Return


6. Exemplo para Alteração de empenhos.

No array do cabeçalho, é necessário enviar o número da ordem de produção e a chave INDEX com o valor 2, como ultimo item do array, para que o sistema altere a ordem de produção correta.

No array de itens, pode-se enviar apenas as informações dos empenhos que estão sendo modificados. Empenhos que já estão cadastrados na tabela SD4 e não irão sofrer nenhuma alteração não precisam ser carregados no array. Informações de Endereços podem ser enviadas através da opção AUT_D4_END conforme exemplo.

Quando o empenho possui controle de lote e o lote é enviado para geração do empenho, não é necessário enviar a data de validade do lote. O programa MATA381 preenche a validade do lote automaticamente.

Para alterar um empenho que está cadastrado na SD4, é necessário utilizar o identificador LINPOS. A chave utilizada no LINPOS deverá ser a seguinte concatenação:

      • D4_COD+D4_TRT+D4_LOTECTL+D4_NUMLOTE+D4_LOCAL+D4_OPORIG+D4_SEQ. Verificar a utilização correta no exemplo.

Para excluir um empenho que está cadastrado na SD4, é necessário utilizar o identificador LINPOS em conjunto com a chave AUTDELETA. A chave utilizada no LINPOS deverá ser a seguinte concatenação:

      • D4_COD+D4_TRT+D4_LOTECTL+D4_NUMLOTE+D4_LOCAL+D4_OPORIG+D4_SEQ. Verificar a utilização correta no exemplo.


Para alteração das informações da tabela SDC que estão ligadas ao empenho, deve-se utilizar os identificadores LINPOS e AUTDELETA da mesma forma que é utilizado para os registros da tabela SD4.

Para alteração das informações da tabela NLI que estão ligadas ao empenho, deve-se utilizar os identificadores LINPOS e AUTDELETA da mesma forma que é utilizado para os registros da tabela SD4.

Para adicionar um novo empenho, basta adicionar as informações deste novo empenho no array de itens.

Para alteração dos empenhos, enviar o 3° parâmetro do MATA381 com o valor 4.


Exemplo de alteração com integração com o PIMS
User Function Alt381Auto()
	Local nX         := 0
	Local aCab       := {}
	Local aLine      := {}
	Local aItens     := {}
	Local aLineEnder := {}
	Local aEnder     := {}

	PRIVATE lMsErroAuto := .F.

	//Monta o cabeçalho com o número da OP que será alterada. 
	//Necessário utilizar o índice 2 para efetuar a alteração.
	aCab := {{"D4_OP","00130301001",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("00130301001",Len(SD4->D4_OP))))

	While SD4->(!Eof()) .And. SD4->(D4_FILIAL+D4_OP) == xFilial("SD4")+PadR("00130301001",Len(SD4->D4_OP))
		//Adiciona as informações do empenho, conforme estão na tabela SD4.
		aLine := {}
		For nX := 1 To SD4->(FCount())
			aAdd(aLine,{SD4->(Field(nX)),SD4->(FieldGet(nX)),Nil})
		Next nX


		//Adiciona as informações da lista de compras (NLI)do empenho, conforme estão na tabela SD4.
		aLineNLI := {}
		For nX := 1 To SD4->(FCount())
			aAdd(aLineNLI,{SD4->(Field(nX)),SD4->(FieldGet(nX)),Nil})
		Next nX
		
		If len(aLineNLI) > 0
            aAdd(aLine,{"AUT_D4_AGR",aLineNLI,NIL})
        Endif 
		
		

		//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})
		
		//Marca o empenho do produto "MP" como Excluído.
		If AllTrim(SD4->D4_COD) == "MP01"
			aAdd(aLine,{"AUTDELETA","S",Nil})
		ElseIf AllTrim(SD4->D4_COD) == "MP02" 
			//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_QTDEORI"})
			If nX > 0
				//Encontrou o valor da quantidade. Faz a alteração do valor.
				aLine[nX,2] := 10
			EndIf
			
			//Altera também o saldo do empenho
			nX := aScan(aLine,{|x| x[1] == "D4_QUANT"})
			If nX > 0
				//Encontrou o valor da quantidade. Faz a alteração do valor.
				aLine[nX,2] := 10
			EndIf
		ElseIf AllTrim(SD4->D4_COD) == "MP03" 
			//Altera os endereços utilizado no empenho do produto "9617-MP2"
			//Primeiro carrega os endereços utilizados.
			If SDC->(dbSeek(xFilial("SDC")+SD4->(D4_COD+D4_LOCAL+D4_OP+D4_TRT+D4_LOTECTL+D4_NUMLOTE)))
				//Inicializa o array aEnder
				aEnder     := {} 
				
				//Busca os registros da tabela SDC
				While SDC->(!Eof()) .And. ;
					xFilial("SDC")+SD4->(D4_COD+D4_LOCAL+D4_OP+D4_TRT+D4_LOTECTL+D4_NUMLOTE) == ;
					SDC->(DC_FILIAL+DC_PRODUTO+DC_LOCAL+DC_OP+DC_TRT+DC_LOTECTL+DC_NUMLOTE)
					
					//Inicializa o array aLineEnder
					aLineEnder := {}

					//Carrega as informações da tabela SDC no array aLineEnder
					For nX := 1 To SDC->(FCount())
						aAdd(aLineEnder,{SDC->(Field(nX)),SDC->(FieldGet(nX)),Nil})
					Next nX

					//Adiciona o identificador LINPOS para identificar que o registro já existe na tabela SDC
					aAdd(aLineEnder,{"LINPOS","DC_LOCALIZ+DC_NUMSERI",;
							SDC->DC_LOCALIZ,;
							SDC->DC_NUMSERI})

					//Verifica se é o endereço "END". Se for, marca a linha para exclusão.
					If AllTrim(SDC->DC_LOCALIZ) == "END01"
						aAdd(aLineEnder,{"AUTDELETA","S",NIL})
					ElseIf AllTrim(SDC->DC_LOCALIZ) == "END02"
						//Verifica se é o endereço "END02". Se for, altera a quantidade.
						//Busca a posição em que a quantidade está no array aLineEnder.
						nX := aScan(aLineEnder,{|x| x[1] == "DC_QUANT"})
						If nX > 0
							//Encontrou a quantidade no array aLineEnder. Faz a alteração da quantidade.
							aLineEnder[nX,2] := 8
						EndIf
					EndIf
					
					//Adiciona o endereço no array de endereços.
					aAdd(aEnder,aLineEnder)

					//Próximo registro da SDC
					SDC->(dbSkip())
				End
				//Adiciona um novo endereço para ser incluído na tabela SDC.
				//Inicializa o array aLineEnder
				aLineEnder := {}
				
				//Adiciona as informações do novo endereço.
				aAdd(aLineEnder,{"DC_LOCALIZ","END03",Nil})
				aAdd(aLineEnder,{"DC_QUANT"  ,2      ,Nil})
				
				//Adiciona o novo endereço no array de endereços.
				aAdd(aEnder,aLineEnder)

				//Adiciona as informações de alteração de endereço no array do Empenho.
				aAdd(aLine,{"AUT_D4_END",aEnder,Nil})
			EndIf
		EndIf

		//Adiciona as informações do empenho no array de itens.
		aAdd(aItens,aLine)

		//Próximo registro da SD4.
		SD4->(dbSkip())
	End
	
	//Adiciona um novo empenho	
	aLine := {}
	aAdd(aLine,{"D4_OP"     ,"00130301001"     ,NIL})
	aAdd(aLine,{"D4_COD"    ,"MP04"            ,NIL})
	aAdd(aLine,{"D4_LOCAL"  ,"01"              ,NIL})
	aAdd(aLine,{"D4_DATA"   ,CtoD("17/09/2018"),NIL})
	aAdd(aLine,{"D4_QTDEORI",5                 ,NIL})
	aAdd(aLine,{"D4_QUANT"  ,5                 ,NIL})
	aAdd(aLine,{"D4_LOTECTL","L1"              ,NIL})
	aAdd(aLine,{"D4_TRT"    ,"004"             ,NIL})
	aAdd(aLine,{"D4_ROTEIRO","01"              ,NIL})
	
	//Adiciona informações referente a integração com o PIMS
	aLineNLI := {}
	aAdd( aLineNLI, { "NLI_CLVAL", "02", Nil } )
	aAdd( aLineNLI, { "NLI_FAZ", "001", NIL } )
	aAdd( aLineNLI, { "NLI_QTCOMP", 20, NIL } )
	aAdd( aLineNLI, { "NLI_PMSQTD", 15, NIL } )
	aAdd( aLineNLI, { "NLI_PGQTD", 25, NIL } )
	aAdd( aLineNLI, { "NLI_POPQTD", 35, NIL } )
	aAdd( aLineNLI, { "NLI_NUMPEN", 01, NIL } )
	aAdd( aLineNLI, { "NLI_QTDPAR", 5000, NIL } )
	aAdd( aLineNLI, { "NLI_CULTRA", "01", NIL } )
	aAdd( aLineNLI, { "NLI_CC", "0010" , NIL } )
	aAdd( aLineNLI, { "NLI_FITSSA", "10", NIL } )
	aAdd( aLineNLI, { "NLI_REQCOD", "admin", NIL } )
	aAdd( aLineNLI, { "NLI_REQNOM", "admin", NIL } )

    aAdd(aLine,{"AUT_D4_AGR",aLineNLI,NIL})

	aAdd(aItens,aLine)
	//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
Return



Observações:

Para o correto funcionamento, a versão do fonte MATA381 deve ser igual ou superior a data de