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?
![](http://www.fbsolutions.com.br/wp-content/uploads/2023/12/CAPACITAÇÃO-PROTHEUS.jpg)
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
#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.
Fernando Bueno
Atuando desde 2005 no mercado de tecnologia, desenvolvendo e implantando e sistemas gerenciais, sistemas e sites web e ecommerce.
Siga-me no Linked In