Olá pessoal,
Segue uma rotina muito simples, mas que pode ser uma mão na roda na hora de cadastrar as distâncias entre regiões no TMS.
Você pode colocá-la em um menu, em um ponto de entrada ou em um gatilho até.
O que ela faz?
Ela pega, baseado em uma origem x destino, passados via texto, a distância entre 2 pontos, utilizando a API do Google Maps.
Você pode adaptá-la onde quiser e utilizar até em alguma rotina que utilize a tabela CC2.
No entanto, é necessário salientar que o Google tem um limite diário de requisições, por ser grátis (existem planos pagos, que eu me lembre).
Mas, a partir do momento que você já tem a distância cadastrada, você pode passar direto.
Então, segue o código:
#INCLUDE 'protheus.ch'
#INCLUDE "XMLXFUN.CH"
#INCLUDE "RWMAKE.CH"
/*/{Protheus.doc} GMapsDist
//TODO Retorna distância entre 2 pontos através da APi Google Maps
@author Fernando Bueno
@since 27/06/2017
@version 1.0
@param cOrigem, characters, descricao
@param cDestino, characters, descricao
@type function
/*/
User Function GMapsDist(cOrigem, cDestino)
Local cError := ""
Local cWarning := ""
Local oScript
Local nRet
cEnd := "http://maps.googleapis.com/maps/api/directions/xml?origin=" + cOrigem + "&destination=" + cDestino
cEnd := strtran(cEnd, " ", "%20")
retXML := HTTPGET(cEnd)
//Gera o Objeto XML ref. ao script
oScript := XmlParser( retXML, "_", @cError, @cWarning )
//Caso não retornar valor, o usuário informará manualmente através do setKM()
If oScript:_DirectionsResponse:_status:TEXT == "ZERO_RESULTS" .OR. oScript:_DirectionsResponse:_status:TEXT <> "OK"
nRet := 0
setKM()
nRet := nGetKM
//Do contrário, pode pegar o valor e gravar em sua tabela
Else
nRet := oScript:_DirectionsResponse:_route:_leg:_distance:_value:TEXT
nRet := Round((Val(nRet)/1000),1)
EndIf
SAVE oScript XMLFILE "C:\Temp\dist.xml"
Return nRet
/*/{Protheus.doc} setKM
//TODO Função utilizada para gravar manualmente a distância
@author Fernando
@since 27/06/2017
@version undefined
@type function
/*/
Static Function setKM()
Static oDlgKM
Static oButtonKM
Static oGetKM
Static nGetKM := 0
Static oSayKM1
Static oSayKM2
DEFINE MSDIALOG oDlgKM TITLE "Informe o KM" FROM 000, 000 TO 150, 400 COLORS 0, 16777215 PIXEL
@ 009, 010 SAY oSayKM1 PROMPT "A distância entre Mun Origem e Mun Destino não foi encontrada" SIZE 192, 011 OF oDlgKM COLORS 0, 16777215 PIXEL
@ 035, 010 SAY oSayKM2 PROMPT "Informe o KM manualmente:" SIZE 073, 009 OF oDlgKM COLORS 0, 16777215 PIXEL
@ 033, 083 MSGET oGetKM VAR nGetKM SIZE 071, 010 OF oDlgKM COLORS 0, 16777215 PIXEL VALID nGetKM > 0 PICTURE "@E 9999.9"
@ 054, 136 BUTTON oButtonKM PROMPT "Confirma" SIZE 052, 014 OF oDlgKM PIXEL ACTION Close(oDlgKM)
ACTIVATE MSDIALOG oDlgKM
Return
Esta rotina já tem muito tempo que escrevi. Portanto se tiver algum problema, poste no comentário.
Se você quiser, veja também a primeira aula do nosso Treinamento TMS Protheus:
Abs.
