Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

MT640VLD - Obriga Preenchimento do Recurso no Cadastro de Exceções ao Calendário

Linha de Produto:

Protheus

Segmento:

Manufatura

Módulo:

SIGAPCP - Planejamento e Controle da Produção

Parâmetro(s):


Nome
Tipo
Descrição
Default
Obrigatório
Referência

PARAMIXB[1]
Numérico
(nOpc): Opção Selecionada

Opção Selecionada - nOpc (vide Observação)







PARAMIXB[2]
Caracter
Conteúdo do Campo Recurso - c640Rec







PARAMIXB[3]
Caracter
Conteúdo do Campo Centro de Custo - c640CCusto






Ponto de Entrada:

MT640VLD - Obriga Preenchimento do Recurso no Cadastro de Exceção de Calendário

País(es):

Todos

Idioma:Português(Brasil)

Banco(s) de Dados:

Todos

Tabelas utilizadas:


Sistema(s) operacional(is):

Todos

Versões/Release:

Microsiga_Protheus 12.1.21

Descrição:

Permite obrigar a informação o recurso no cadastro de exceção de calendário.

Localização:

MATA640 - Exceções ao Calendário

Programa Fonte:MATA640.prw
Retorno:Lógico (.F. - Retorna indicando que não passou das validações e não finaliza efetiva o cadastro / .T. - Retorna indicando que passou das validações e finaliza efetiva o cadastro.)
Observações:

Este ponto de entrada permite que as informações que foram recebidas no XML de apontamento de produção sejam modificadas, antes da realização do processamento da mensagem.Somente serão consideradas as informações que forem alteradas, das tags inferiores ao nível BusinessContent.
As informações das tags MessageInformation e BusinessEvent, mesmo que alteradas, não serão utilizadas no processamento da rotina padrão.
Para acessar o valor do XML, deverá ser utilizado a nomenclatura completa do XML até a TAG que se deseja o valor. O nome de cada TAG, sempre será precedido pelo caractere "_", e o seu valor é recuperado por meio do atributo Text.
Exemplo:Acessar o valor da ordem de produção. Tag: ProductionOrderNumber.
oXmlRcv:_TotvsMessage:_BusinessMessage:_BusinessContent:_ProductionOrderNumber:Text
Uma boa prática para evitar erros de execução, é sempre antes de acessar o valor da TAG, verificar se as propriedades referentes à tag desejada existem no objeto. Para fazer essa verificação, utiliza-se a função Type.
Exemplo: Type("oXmlRcv:_TotvsMessage:_BusinessMessage:_BusinessContent:_ProductionOrderNumber:Text") != "U"
Se o retorno da função Type for diferente de U (Undefined), significa que o atributo existe no objeto, e pode ser acessado.sejam realizadas consistências antes da efetivação do cadastro de exceção ao calendário.

Foram disponibilizados os campos de recurso e centro de custo que não são obrigatório no cadastro padrão, e estes podem ser consistidos no ponto de entrada.

O campo nOpc disponibilizado como parâmetro pode possuir seguintes valores: 3 - Incluir, 4 - Alterar, 5 - Excluir, 2 - Visualizar.

Code Block
themeConfluence
titleExemplo:
linenumberstrue
 #Include 'Protheus.ch'
 
User Function MT681ALXMLMT640VLD()
	Local aAreaB1 := SB1->(GetArea()) //Área da tabela SB1 para restaurar no fim do processamento.
	Local cProd   := "" //Variável para armazenar o código do produto.
	Local lLoteLocal lRet       := .FT. //Variável parado identificartipo selógico opara produtoretorno possui controle de Lote.
	Local nX      := 0 //Indicador para percorrer as listas de componentes e de refugos.
	Local lRastro := SuperGetMV("MV_RASTRO",.F.,"N") == "S" //Identifica se o parâmetro MV_RASTRO está ativado.


	Private oXmlRcv   := PARAMIXB //Referência do objeto contendo as informações que foram recebidas no XML.
	Private aXmlWst   := {} //Array para manipular as informações de lista de refugos.
	Private aCmpBaixa := {} //Array para manipular as informações da lista de componentes.
	
	/*
		Somente serão consideradas as informações que forem alteradas, das tags inferiores ao nível BusinessContent.
		As informações das tags MessageInformation e BusinessEvent, mesmo que alteradas, não serão utilizadas
		no processamento da rotina padrão.
		
		Para acessar o valor do XML, deverá ser utilizado a nomenclatura completa do XML até a TAG que
		se deseja o valor. O nome de cada TAG, sempre será precedido pelo caractere "_", e o seu valor
		é recuperado por meio do atributo Text.
		
		Exemplo:
			Acessar o valor da ordem de produção. Tag: ProductionOrderNumber.
			oXmlRcv:_TotvsMessage:_BusinessMessage:_BusinessContent:_ProductionOrderNumber:Text
			
			Uma boa prática para evitar erros de execução, é sempre antes de acessar o valor da TAG, 
			verificar se as propriedades referentes à tag desejada existem no objeto. 
			Para fazer essa verificação, utiliza-se a função Type.
			Exemplo: Type("oXmlRcv:_TotvsMessage:_BusinessMessage:_BusinessContent:_ProductionOrderNumber:Text") != "U"
			Se o retorno da função Type for diferente de U (Undefined), significa que o atributo existe no objeto,
			e pode ser acessado.
	*/
	
	
	//Ajusta o índice da tabela SB1
	SB1->(dbSetOrder(1))

	//Verifica se o produto do apontamento foi informado, e se o produto possui controle de lote.
	If Type("oXmlRcv:_TotvsMessage:_BusinessMessage:_BusinessContent:_ItemCode:Text") != "U" .And. ;
		!Empty(oXmlRcv:_TotvsMessage:_BusinessMessage:_BusinessContent:_ItemCode:Text) .And. lRastro
		cProd := oXmlRcv:_TotvsMessage:_BusinessMessage:_BusinessContent:_ItemCode:Text
		//Se o parâmetro MV_RASTRO está como S, verifica se o produto possui controle de Lote.
		If SB1->(dbSeek(xFilial("SB1")+cProd))
			If SB1->B1_RASTRO == "S" .Or. SB1->B1_RASTRO == "L"
				lLote := .T.
			EndIf
		EndIf
	EndIf

	//Verifica se o lote do apontamento foi informado, e se é necessário remover.
	If Type("oXmlRcv:_TotvsMessage:_BusinessMessage:_BusinessContent:_LotCode:Text") != "U" .And. ;
		!Empty(oXmlRcv:_TotvsMessage:_BusinessMessage:_BusinessContent:_LotCode:Text) .And. ;
		(lLote == .F. .Or. lRastro == .F.)
		//Se o produto não possui controle de LOTE, 
		//ou se o parâmetro MV_RASTRO estiver desativado, retira a informação do lote do XML.
		oXmlRcv:_TotvsMessage:_BusinessMessage:_BusinessContent:_LotCode:Text := ""
	EndIf
	
	//Recupera as informações da lista de refugos.
	If Type("oXmlRcv:_TotvsMessage:_BusinessMessage:_BusinessContent:_ListOfWasteAppointments") != "U" .And. ;
		Type("oXmlRcv:_TotvsMessage:_BusinessMessage:_BusinessContent:_ListOfWasteAppointments:_WasteAppointment") != "U"
		If Type("oXmlRcv:_TotvsMessage:_BusinessMessage:_BusinessContent:_ListOfWasteAppointments:_WasteAppointment") == "A"
			aXmlWst := oXmlRcv:_TotvsMessage:_BusinessMessage:_BusinessContent:_ListOfWasteAppointments:_WasteAppointment
		ElseIf Type("oXmlRcv:_TotvsMessage:_BusinessMessage:_BusinessContent:_ListOfWasteAppointments:_WasteAppointment") == "O"
			aXmlWst := {oXmlRcv:_TotvsMessage:_BusinessMessage:_BusinessContent:_ListOfWasteAppointments:_WasteAppointment}
		EndIf
	EndIf
	
	//Percorre a lista de refugos
	For nX := 1 To Len(aXmlWst)
		If Type("aXmlWst["+cValToChar(nX)+"]:_LotCode:Text") != "U" .And. ;
			!Empty(aXmlWst[nX]:_LotCode:Text)
			//Se o lote estiver preenchido, verifica a necessidade de retirar a informação do XML.
			lLote := .F.
			
			If Type("aXmlWst["+cValToChar(nX)+"]:_ScrapProduct:Text") != "U" .And. ;
				!Empty(aXmlWst[nX]:_ScrapProduct:Text) .And. lRastro
				//Se o parâmetro MV_RASTRO estiver ativado, verifica se o produto possui controle de Lote.
				cProd := aXmlWst[nX]:_ScrapProduct:Text
				If SB1->(dbSeek(xFilial("SB1")+cProd))
					If SB1->B1_RASTRO == "S" .Or. SB1->B1_RASTRO == "L"
						lLote := .T.
					EndIf
				EndIf
			EndIf
			//Se o produto não possuir controle de lote, 
			//ou se o parâmetro MV_RASTRO estiver desabilitado, retira a informação do lote do XML
			If lLote == .F. .Or. lRastro == .F.
				aXmlWst[nX]:_LotCode:Text := ""
			EndIf
		EndIf
	Next nX
	
	//Recupera as informações dos componentes consumidos.
	If Type("oXmlRcv:_TotvsMessage:_BusinessMessage:_BusinessContent:_ListOfSupplyOrders") != "U" .And. ;
		Type("oXmlRcv:_TotvsMessage:_BusinessMessage:_BusinessContent:_ListOfSupplyOrders:_SupplyOrder") != "U"
		If Type("oXmlRcv:_TotvsMessage:_BusinessMessage:_BusinessContent:_ListOfSupplyOrders:_SupplyOrder") == "A"
			aCmpBaixa := oXmlRcv:_TotvsMessage:_BusinessMessage:_BusinessContent:_ListOfSupplyOrders:_SupplyOrder
		ElseIf Type("oXmlRcv:_TotvsMessage:_BusinessMessage:_BusinessContent:_ListOfSupplyOrders:_SupplyOrder") == "O"
			aCmpBaixa := {oXmlRcv:_TotvsMessage:_BusinessMessage:_BusinessContent:_ListOfSupplyOrders:_SupplyOrder}
		EndIf
	EndIf


	//Percorre a lista de componentes
	For nX := 1 To Len(aCmpBaixa)
		If Type("aCmpBaixa["+cValToChar(nX)+"]:_LotCode:Text") != "U" .And. ;
			!Empty(aCmpBaixa[nX]:_LotCode:Text)
			//Verifica a necessidade de limpar o campo do Lote.
			
			lLote := .F.
			
			If Type("aCmpBaixa["+cValToChar(nX)+"]:_MaterialCode:Text") != "U" .And. ;
				!Empty(aCmpBaixa[nX]:_MaterialCode:Text) .And. lRastro
				//Se MV_RASTRO = S, verifica se o produto possui controle de lote.
				cProd := aCmpBaixa[nX]:_MaterialCode:Text
				If SB1->(dbSeek(xFilial("SB1")+cProd))
					If SB1->B1_RASTRO == "S" .Or. SB1->B1_RASTRO == "L"
						lLote := .T.
					EndIf
				EndIf
			EndIf
			//Se o produto não possuir controle de lote, 
			//ou se o parâmetro MV_RASTRO estiver desabilitado, retira a informação do lote do XML 
			If lLote == .F. .Or. lRastro == .F.
				aCmpBaixa[nX]:_LotCode:Text := ""
			EndIf
		EndIf
	Next nX
	
	//Restaura o posicionamento da tabela SB1.
	SB1->(RestArea(aAreaB1))
Return Nil

da função.
    Local nOpc       := PARAMIXB[1] // Variável para receber o parâmetro de opção selecionada.
    Local c640Rec    := PARAMIXB[2] // Variável para receber o parâmetro com o valor do recurso.
    Local c640CCusto := PARAMIXB[3] // Variável para receber o parâmetro com o valor do centro de custo.

    If Empty(c640Rec) // Se o recurso não estiver preenchido.
        Help( ,, 'Help',, "O Campo Recurso deve ser informado!", 1, 0 ) //Apresenta mensagem de ajuda informando o usuário.
        lRet := .F. //Passa a variável de retorno para falso.
    EndIf

Return lRet