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