CRUD em AdvPL – Parte 11

Introdução

Gostou de localizar o endereço do contato da Agenda com o Google Maps ? Você usa G-Mail? Que tal apertar mais um botão na agenda, e o programa abrir o seu navegador de internet para você enviar um e-mail para um contato?

Mais um Botão

Na mesma linha do post anterior, apenas mais um botão, que somente estará ativo na tela caso o campo e-Mail do contato esteja preenchido.

@ 110,05 BUTTON oBtnMail PROMPT "G-Mail" SIZE 60,15 ;
   WHEN !empty(cEMAIL) ; 
   ACTION SendMail(cEMAIL) OF oPanelNav PIXEL
aadd(aBtns,oBtnMap) // [14] e-Mail

Agora, vamos criar a função que abre o Browse. Para este truque funcionar, você deve ser um usuário do G-Mail, e estar autenticado com a sua conta do Google no Browse. A URL não poderia ser mais simples:

STATIC Function SendMail(cEMAIL)
Local cMailURL := 'https://mail.google.com/mail/?view=cm&fs=1&tf=1&to='
shellExecute("Open", cMailURL+lower(cEMAIL), "", "", 1 )
Return

Agora, após abrir a consulta da agenda, e encontrar o contato para o qual você deseja enviar o e-mail, basta acionar o botão “G-Mail”:

GRud - Mail 1

Ao acionar o botão “G-Mail”, o seu navegador de internet padrão deve ser aberto, com a interface de envio de uma nova mensagem do G-Mail, já com o e-mail do destinatário preenchido. Basta colocar o assunto, preencher o corpo do e-Mail e enviar 😀

Crud - Mail 2

Outas formas de envio

Agradecendo a dica do Izac Ciszevski, por que não abrir uma janela de diálogo usando um componente de Browser do próprio SmartClient, como por exemplo o TIBrowser() ou o TWebEngine()? Claro, apenas trocamos a função SendMail(), vamos ver como fica:

STATIC Function SendMail(cEMAIL)
Local cMailURL := 'https://mail.google.com/mail/?view=cm&fs=1&tf=1&to='
Local oDlgMail
Local oWebBrowse
Local cTitle := "Enviar eMail ("+Alltrim(Lower(cEMAIL))+")"

DEFINE DIALOG oDlgMail TITLE (cTitle) ;
   FROM 0,0 TO 600,800 PIXEL

oWebBrowse := TWebEngine():New(oDlgMail, 0, 0, 100, 100)
oWebBrowse:Align := CONTROL_ALIGN_ALLCLIENT
oWebBrowse:Navigate(cMailURL+Alltrim(lower(cEMAIL)))

ACTIVATE DIALOG oDlgMail CENTER

Return

Resolvi montar o exemplo sobre a TWEBEngine() mesmo, pois inclusive ela não exige nenhuma configuração adicional no SmartClient, o que não é o caso da TIBrowser(). No primeiro acesso, tive que me autenticar no GMAIL, e uma vez autenticado, o recurso funcionou como o esperado.

Para ver maiores detalhes sobre a documentação das classes acima, consulte os links de referência no final do post, inclusive verifique que a classe TWebEngine() é mais recente, mas apenas está disponível a partir do APPServer Build 7.00.170117A.

Conclusão

As vezes os recursos mais legais e úteis de um programa são os mais simples. Com apenas meia dúzia de linhas, um botão e uma STATIC Function, e está feita mais uma integração usando um serviço do Google !!!

Desejo novamente a todos TERABYTES de SUCESSO !!!

Referências

 

CRUD em AdvPL – Parte 10

Introdução

No último post, acrescentamos um botão de pesquisa de CEP. Agora, que tal mostrarmos o endereço do contato em foco no Google Maps? Vai ser mais rápido e fácil do que você imagina!

Crud - Mapa

Acrescentando mais um botão

No menu de ações do lado direito da tela, vamos acrescentar um botão chamado “Mapa”:

@ 95,05 BUTTON oBtnMap PROMPT "Mapa" SIZE 60,15 ;
   ACTION ShowMap(oDlg,aBtns,aGets) OF oPanelNav PIXEL
aadd(aBtns,oBtnMap) // [13] Mapa

Agora, vamos criar a função que vai fazer a mágica. É mais simples do que parece.

STATIC Function ShowMap(oDlg,aBtns,aGets)
Local nPos
Local cEndereco
Local cCidade
Local cUF
Local cCEP
Local cMapsURL := 'https://www.google.com/maps/search/?api=1&query='
Local cUrlQry := ''

// Busca nos GETS os campos para montar uma Query de busca
// de endereço para o Google Maps

nPos := ascan(aGets , {|x| x[1] == "ENDER" } )
cEndereco := alltrim(Eval( aGets[nPos][2]:bSetGet ))
If !empty(cEndereco)
   cUrlQry += UrlEscape(cEndereco+',')
Endif

nPos := ascan(aGets , {|x| x[1] == "CIDADE" } )
cCidade := alltrim(Eval( aGets[nPos][2]:bSetGet ))
If !empty(cCidade)
   cUrlQry += UrlEscape(cCidade+',')
Endif

nPos := ascan(aGets , {|x| x[1] == "UF" } )
cUF := Eval( aGets[nPos][2]:bSetGet )
If !empty(cUF)
   cUrlQry += UrlEscape(cUF+',')
Endif

nPos := ascan(aGets , {|x| x[1] == "CEP" } )
cCep := alltrim(Eval( aGets[nPos][2]:bSetGet ))
If !empty(cCidade)
   cUrlQry += UrlEscape(cCEP)
Endif

If Empty(cUrlQry)
  MsgStop("Nao há dados preenchidos suficientes para a busca.")
  Return
Endif

// Ao sumbeter uma URL, o sistema operacional abre o navegador 
// padrão com o endereço fornecido
shellExecute("Open", cMapsURL+cUrlQry, "", "", 1 )

Return

Simples assim, ao estar posicionado em um contato da agenda, você clica no botão “Mapa”, e caso pelo menos alguma informação do endereço esteja preenchida, ela será usada para montar uma URL abrindo o Google Maps, para fazer a busca do endereço fornecido.  E, como os dados do formulário podem conter caracteres especiais que devem entrar como informações dentro da URL, usamos a função URLEscape(), também acrescentada no código, vide fonte abaixo:

STATIC Function UrlEscape(cInfo)
cInfo := strtran(cInfo,'%',"%25")
cInfo := strtran(cInfo,'&',"%26")
cInfo := strtran(cInfo," ","+")
cInfo := strtran(cInfo,'"',"%22")
cInfo := strtran(cInfo,'#',"%23")
cInfo := strtran(cInfo,",","%2C")
cInfo := strtran(cInfo,'<',"%3C")
cInfo := strtran(cInfo,'>',"%3E")
cInfo := strtran(cInfo,"|","%7C")
Return cInfo

Existem mais caracteres que poderiam ser tratados, mas para uma versão inicial, um tratamento básico é suficiente.

Conclusão

Não é legal apertar um botão em uma agenda e abrir um mapa mostrando onde fica o endereço ? Antes da Internet, você teria que fazer — ou comprar feito — algum software especifico — e provavelmente caro — para fazer algo assim. Hoje, a sua aplicação não precisa fazer tudo por ela mesma, usar APIs prontas e outros recursos — a maioria deles gratuito (desde que não utilizados para fins comerciais) — torna uma aplicação mais completa, amigável, agrega valor, atrai usuários, enfim…. 🙂

Novamente desejo a todos TERABYTES DE SUCESSO !!

Referências

TDN – ShellExecute