Árvore de páginas

Versões comparadas

Chave

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

MT681ALXML - Alterar informações do XML da mensagem ProductionAppointment

Ponto de Entrada

Linha de Produto:

Protheus

Segmento:

Manufatura

Módulo:

SIGAPCP

Parâmetro(s):

PARAMIXB (Objeto) -> Referência do objeto com as informações recebidas no XML da mensagem ProductionAppointment

Ponto de Entrada:

MT681ALXML - Alterar informações do XML da mensagem ProductionAppointment

País(es):

Todos

Banco(s) de Dados:

Todos

Tabelas utilizadas:


Sistema(s) operacional(is):

Todos

Versões/Release:

Microsiga_Protheus 12.1.19

Descrição:

Permite alterar as informações recebidas no XML da mensagem ProductionAppointment, antes de efetuar o processamento da mensagem.

Localização:

Function MATI681 -> Adapter de apontamento de produção

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.

Exemplos:

#Include 'Protheus.ch' User Function MT681ALXML() 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 lLote := .F. //Variável para identificar se o produto 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

Programa Fonte:

MATI681.prw

Idioma:Português(Brasil)

Retorno:

Nil
#Include 'Protheus.ch'
User Function MT681ALXML()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 lLote   := .F. //Variável para identificar se o produto 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 utilizadasno processamento da rotina padrão.Para acessar o valor do XML, deverá ser utilizado a nomenclatura completa do XML até a TAG quese 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:TextUma 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 SB1SB1->(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. lRastrocProd := 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.EndIfEndIfEndIf
//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:_WasteAppointmentElseIf Type("oXmlRcv:_TotvsMessage:_BusinessMessage:_BusinessContent:_ListOfWasteAppointments:_WasteAppointment") == "O"aXmlWst := {oXmlRcv:_TotvsMessage:_BusinessMessage:_BusinessContent:_ListOfWasteAppointments:_WasteAppointment}EndIfEndIf//Percorre a lista de refugosFor 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:TextIf SB1->(dbSeek(xFilial("SB1")+cProd))If SB1->B1_RASTRO == "S" .Or. SB1->B1_RASTRO == "L"lLote := .T.EndIfEndIfEndIf//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 XMLIf lLote == .F. .Or. lRastro == .F.aXmlWst[nX]:_LotCode:Text := ""EndIfEndIfNext 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:_SupplyOrderElseIf Type("oXmlRcv:_TotvsMessage:_BusinessMessage:_BusinessContent:_ListOfSupplyOrders:_SupplyOrder") == "O"aCmpBaixa := {oXmlRcv:_TotvsMessage:_BusinessMessage:_BusinessContent:_ListOfSupplyOrders:_SupplyOrder}EndIfEndIf//Percorre a lista de componentesFor 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:TextIf SB1->(dbSeek(xFilial("SB1")+cProd))If SB1->B1_RASTRO == "S" .Or. SB1->B1_RASTRO == "L"lLote := .T.EndIfEndIfEndIf//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 := ""EndIfEndIfNext nX//Restaura o posicionamento da tabela SB1.SB1->(RestArea(aAreaB1))Return Nil