Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

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.

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.

Bloco de código
languagecpp
firstline1
titleExemplo de inclusão de empenhos
linenumberstrue
collapsetrue
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


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.
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.

Bloco de código
languagecpp
firstline1
titleExemplo de alteração de empenhos
linenumberstrue
collapsetrue
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
		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


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.
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.

Bloco de código
languagecpp
firstline1
titleExemplo para zerar os empenhos de uma ordem de produção
linenumberstrue
collapsetrue
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

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 altere a ordem de produção correta.
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.

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.

Bloco de código
languagecpp
firstline1
titleExemplo de exclusão de empenhos
linenumberstrue
collapsetrue
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

Observações: