Árvore de páginas

Versões comparadas

Chave

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

...

Este Ponto de Entrada permite a manipulação das tabelas responsáveis por armazenar a viagem recebida pelo Cockpit Logístico, possibilitando pelo TOTVS Otimização Logística, possibilitando assim a gravação de outras informações presentes no XML.

Exemplo

Acessar a informação de data de início da viagem no XML, tag startServiceTime e gravar em um campo customizado na tabela da Viagem CPL (DK0).

Informações
titleIMPORTANTE!
  • Os códigos armazenados nos campos DK0_VEIC2 e DK0_VEIC3 deverão estar previamente  devem ser previamente cadastrados na tabela DA3 (Veículos).
  • O código armazenado no campo DK0_MOTORI deverá estar deve ser previamente cadastrado na tabela DA4 (Motoristas).
  • Os códigos armazenados nos campos DK0_AJUDA1, DK0_AJUDA2 e DK0_AJUDA3 deverão estar devem ser previamente cadastrados na tabela DAU (Ajudantes).
  • Portanto, a partir do dado recebido (placa para veículos, CPF para Motoristas ou Ajudantes) deverá ser será efetuada a busca do código relacionado na respectiva tabela mencionada.
  • Caso algum dos códigos mencionados acima não esteja cadastrado conforme indicado, ao gerar a carga o código em questão será descartado e não será replicado para a Carga (tabela DAK).

03. LOCALIZAÇÃO

Localizado na função ProcViagem da rotina OMSXCPLA, logo após a gravação das tabelas de Viagem (DK0  e DK1).

...

Nome

Tipo

Descrição

oViagem

Objeto

Objeto contendo todos os atributos do XML referentes ao cabeçalho da viagem CPLTOL.

aStops

 Array de Objetos

 Array de objetos contendo todos os atributos do XML referentes às paradas da viagem CPLTOL, mais especificamente os atributos da tag stops.

aSubStopsArray de ObjetosArray de objetos contendo todos os atributos do XML referentes as subparadas da viagem CPLTOL, mais especificamente os atributos da tag subStop.
cConteudoStringString contendo todo o conteúdo do XML recebido, permitindo assim acessar qualquer tag da Viagem recebida.
cNameSpaceStringString contendo a namespace existente no XML recebido.

05. RETORNO

Este Ponto de Entrada não possui retornoNão se aplica.

06. VERSÕES

Protheus 12.1.17 ou superiores.

07. OBSERVAÇÃO

Todos os parâmetros são recebidos na User Function via PARAMIXB, conforme consta em Execblock / Customização.

08. EXEMPLO

Caso encontre o elemento do XML desejado na tabela abaixo, o Exemplo 1 pode ser utilizado. Caso contrário, é necessário realizar o parser do XML conforme o Exemplo 2.

ElementoTipoTamanhoDecimal
oViagem:carrierIdC30
oViagem:freightValueN154
oViagem:identifierC50
oViagem:regionSourceIdC70
oViagem:vehicleDescriptionC140
oViagem:vehicleId C60
oViagem:loads[1]:distanceC90
oViagem:loads[1]:freightC30
oViagem:loads[1]:loadModeC10
oViagem:loads[1]:modalC10
oViagem:loads[1]:serviceDescriptionTypeC150
oViagem:loads[1]:serviceTypeIdC10
oViagem:loads[1]:stops[1][1]:identifierC40
oViagem:loads[1]:stops[1][1]:localitySourceIdC90
oViagem:loads[1]:stops[1][1]:sequenceOnLoadC10
oViagem:loads[1]:stops[1][1]:transportZoneDescriptionC190
oViagem:loads[1]:stops[1][1]:transportZoneIdC190
oViagem:loads[1]:stops[1][1]:SUBstops[1]:arrivalTimeC290
oViagem:loads[1]:stops[1][1]:SUBstops[1]:departureTimeC290
oViagem:loads[1]:stops[1][1]:SUBstops[1]:endServiceTimeC290
oViagem:loads[1]:stops[1][1]:SUBstops[1]:identifierC40
oViagem:loads[1]:stops[1][1]:SUBstops[1]:startServiceTimeC290

08. EXEMPLO 1

true
Bloco de código
Bloco de código
languagecpp
titleExemplo
linenumberstrue
collapse
#INCLUDE "PROTHEUS.CH"

User Function OMSCPLAV()
	Local oSubStop   := Nil
Local oViagem    := PARAMIXB[1] //Objeto com todos os atributos da viagem
	Local aStops     := PARAMIXB[2] //Array com os objetos de todas as paradas, tag "stop"
	Local aSubStops  := PARAMIXB[3] //Array com os objetos de todas as sub-paradas, tag "subStop"
	Local cConteudo  := PARAMIXB[4] //String com todo o conteúdo do XML
	Local cNameSpace := PARAMIXB[5] //String com a namespace do arquivo XML

	Local cRegional  := Padr(oViagem:regionSourceId,TamSx3("DK0_REGID")[1])
	Local cViagem    := Padr(oViagem:identifier,TamSx3("DK0_VIAGID")[1])

	Local cDateStartcDesVei := Padr(oViagem:vehicleDescription,TamSx3("DK0_DESVEI")[1])

	//primeiro subStop
	oSubStop	Local nKmVei := 0

	Local cError := aSubStops[1]""
	
	cDateStartLocal cWarning := SubStr(oSubStop:startServiceTime,9,2)+'/'+;
				  SubStr(oSubStop:startServiceTime,6,2)+'/'+;
				  SubStr(oSubStop:startServiceTime,1,4)
	
    ""

	If !Empty(oViagem:loads[1]:distance)
		nKmVei := Val(oViagem:loads[1]:distance)
	EndIf

	DK0->(DbSetOrder(1))
    	If DK0->(DbSeek(xFilial('DK0')+cRegional+cViagem))
        		RecLock('DK0',.F.)
		DK0->DK0_DESVEI := cDesVei
		DK0->DK0_KMVEI := nKmVei
		DK0->(MsUnlock())
	EndIf

	TmsLogMsg("INFO","[" + cValToChar(ThreadId()) + DK0->DK0_XCPO"-OMSCPLAV] PE OMSCPLAV Executado.")

Return

09. EXEMPLO 2

Bloco de código
#include "protheus.ch"
#include "parmtype.ch"
#INCLUDE "TOTVS.CH"

User Function OMSCPLAV()
	Local oViagem   := cDateStartPARAMIXB[1] //Campo customizado
 Objeto com todos os atributos da viagem
	Local aStops    := PARAMIXB[2]  DK0->(MsUnlock())
    EndIf

    //A função TmsLogMsg exibe mensagens no corpo do arquivo console.log
    If Empty(cConteudo)
       TmsLogMsg("WARN","[" + cValToChar(ThreadId())  + "-OMSCPLAV] Variável 'cConteudo' está vazia.")
    else
       TmsLogMsg("WARN","[" + cValToChar(ThreadId())  + "-OMSCPLAV] Variável 'cConteudo' está preenchida com " + cValToChar(Len(cConteudo)) + " bytes.")   

	   oXml    := XmlParser(cConteudo, "NS1", @cError,  @cWarning )
   	   cViagem := oXml//Array com os objetos de todas as paradas, tag "stop"
	Local aSubStops := PARAMIXB[3] //Array com os objetos de todas as sub-paradas, tag "subStop"
	Local cConteudo := PARAMIXB[4] //String com todo o conteúdo do XML
	Local cNameSpace := PARAMIXB[5] //String com a namespace do arquivo XML
	Local cRegional := AvKey(oViagem:regionSourceId, "DK0_REGID")
    Local cViagem   := AvKey(oViagem:identifier, "DK0_VIAGID")
	Local nVlrFret  := 0
	Local cTrsHub   := ""
	Local cTrsNme   := ""
	Local cTrnPrim  := ""
	Local cTpVcPrm  := ""
	Local oSubStop
	Local cError    := ""
	Local cWarning  := ""
	Local oXml      := NIL

	nVlrFret :=	oViagem:freightValue
	cTrnPrim := oViagem:carrierId
	cTpVcPrm := oViagem:vehicleId

	oXml := XmlParser( cConteudo, "_", @cError, @cWarning )
	If (oXml != NIL )
		IF ValType(XmlChildEx(&("OXML:_SOAP_ENVELOPE:_SOAP_BODY:_" + cNameSpace + "_PUBLISHRELEASEDTRIP:_TRIPRELEASEREQUESTS:_TRIPRELEASEREQUEST[1]:_LOADS:_LOAD:_STOPS:_STOP[1]:_SUBSTOPS:_SUBSTOP:_LOADEDSHIPMENTUNITS:_SHIPMENTUNIT:_DELIVERYUNITLIST:_DELIVERYUNIT","_ATTRIBUTES"))) <> "U" 
			cTrsNme := &("OXML:_SOAP_ENVELOPE:_SOAP_BODY:_NS2" + cNameSpace + "_PUBLISHRELEASEDTRIP:_TRIPRELEASEREQUESTS:_TRIPRELEASEREQUEST:_IDENTIFIER:TEXT
       TmsLogMsg("WARN","[" + cValToChar(ThreadId())  + "-OMSCPLAV] Viagem " + cViagem + " recebida com sucesso.")      
    Endif

Return[1]:_LOADS:_LOAD:_STOPS:_STOP[1]:_SUBSTOPS:_SUBSTOP:_LOADEDSHIPMENTUNITS:_SHIPMENTUNIT:_DELIVERYUNITLIST:_DELIVERYUNIT:_ATTRIBUTES:_ATTRIBUTE:_NAME:TEXT")
			cTrsHub := &("OXML:_SOAP_ENVELOPE:_SOAP_BODY:_" + cNameSpace + "_PUBLISHRELEASEDTRIP:_TRIPRELEASEREQUESTS:_TRIPRELEASEREQUEST[1]:_LOADS:_LOAD:_STOPS:_STOP[1]:_SUBSTOPS:_SUBSTOP:_LOADEDSHIPMENTUNITS:_SHIPMENTUNIT:_DELIVERYUNITLIST:_DELIVERYUNIT:_ATTRIBUTES:_ATTRIBUTE:_VALUE:TEXT")
		EndIF	
	else
		OsLogCpl("PE OMSCPLAV -> Falha ao gerar Objeto XML : "+cError+" / "+cWarning,"INFO")
	EndIF

	DK0->(DbSetOrder(1))
	If DK0->(DbSeek(FwXFilial("DK0") + cRegional + cViagem))
		RecLock("DK0", .F.)
		DK0->DK0_XFRETE	:= nVlrFret
		DK0->DK0_XTRHB	:= cTrsHub
		DK0->(MsUnlock())
	EndIf

Return Nil


Templatedocumentos


HTML
<style>
div.theme-default .ia-splitter #main {
    margin-left: 0px;
}
.ia-fixed-sidebar, .ia-splitter-left {
    display: none;
}
#main {
    padding-left: 10px;
    padding-right: 10px;
    overflow-x: hidden;
}

.aui-header-primary .aui-nav,  .aui-page-panel {
    margin-left: 0px !important;
}
.aui-header-primary .aui-nav {
    margin-left: 0px !important;
}

.aui-tabs.horizontal-tabs>.tabs-menu>.menu-item.active-tab a::after { 
	background: #FF9900; !important 
}

.menu-item.active-tab { 
	border-bottom: none !important; 
}

</style>