Hoje vou mostrar como fazer a integração do Protheus com Transportadoras.
Algumas vezes, precisamos consultar rastreios de pacotes e produtos, e algumas transportadoras disponibilizam recursos para isso.
A maioria delas, não conta com API, então como realizar a consulta?
Nesse exemplo abaixo, o que fizemos foi pegar a página da transportadora, e ao carregar a página, executar comandos em javascript para preencher automaticamente os campos.
Então, o usuário ele vai ver uma tela de parâmetros com o número do pedido, e ao informar, automaticamente será carregado a página da transportadora com os dados preenchidos via javascript.
Segue o código abaixo:
//Bibliotecas #Include "Totvs.ch" #Include "TopConn.ch" /*/{Protheus.doc} zTransp Função para consultar pedidos em transportadoras @type Function @author Atilio @since 25/11/2019 @version 1.0 /*/ User Function zTransp() Local aArea := GetArea() Local cPedido := SC5->C5_NUM Local aPergs := {} //Adiciona os parametros para a pergunta aAdd(aPergs, {1, "Pedido", cPedido, "", ".T.", "SC5", ".T.", 80, .T.}) //Mostra uma pergunta com parambox para filtrar o subgrupo If ParamBox(aPergs, "Informe os parametros", , , , , , , , , .F., .F.) fMontaBusca() EndIf RestArea(aArea) Return Static Function fMontaBusca() Local cUrl := "" Local cQry := "" Local cEmissao := "" //Tamanho da janela Private aTamanho := MsAdvSize() Private nJanLarg := aTamanho[5] Private nJanAltu := aTamanho[6] //Navegador Internet Private oWebChannel Private nPort Private oWebEngine Private aComandos := {} //Faz a consulta do pedido e da transportadora cQry := " SELECT " + CRLF cQry += " C5_NUM, " + CRLF cQry += " C5_TRANSP, " + CRLF cQry += " C5_NOTA, " + CRLF cQry += " C5_EMISSAO, " + CRLF cQry += " A1_CGC, " + CRLF cQry += " F2_CHVNFE " + CRLF cQry += " FROM " + CRLF cQry += " " + RetSQLName('SC5') + " SC5 " + CRLF cQry += " INNER JOIN " + RetSQLName('SA1') + " SA1 ON ( " + CRLF cQry += " A1_FILIAL = '" + FWxFilial('SA1') + "' " + CRLF cQry += " AND A1_COD = C5_CLIENTE " + CRLF cQry += " AND A1_LOJA = C5_LOJACLI " + CRLF cQry += " AND SA1.D_E_L_E_T_ = ' ' " + CRLF cQry += " ) " + CRLF cQry += " INNER JOIN " + RetSQLName('SF2') + " SF2 ON ( " + CRLF cQry += " F2_FILIAL = '" + FWxFilial('SF2') + "' " + CRLF cQry += " AND F2_DOC = C5_NOTA " + CRLF cQry += " AND F2_SERIE = C5_SERIE " + CRLF cQry += " AND SF2.D_E_L_E_T_ = ' ' " + CRLF cQry += " ) " + CRLF cQry += " WHERE " + CRLF cQry += " C5_FILIAL = '" + FWxFilial('SC5') + "' " + CRLF cQry += " AND C5_NUM = '" + MV_PAR01 + "' " + CRLF cQry += " AND SC5.D_E_L_E_T_ = ' ' " + CRLF TCQuery cQry New Alias "QRY_PED" //Se houver dados If ! QRY_PED->(EoF()) // - Rodonaves If QRY_PED->C5_TRANSP == "000512" cUrl := "https://cliente.rte.com.br/Tracking/" aAdd(aComandos, 'document.getElementById("cpfcnpj").value = "' + QRY_PED->A1_CGC + '"; ') aAdd(aComandos, 'document.getElementById("documentNumber").value = "' + QRY_PED->C5_NOTA + '"; ') // - Transportadora Americana ElseIf QRY_PED->C5_TRANSP == "000520" cEmissao := SubStr(QRY_PED->C5_EMISSAO, 7, 2) + "/" + SubStr(QRY_PED->C5_EMISSAO, 5, 2) + "/" + SubStr(QRY_PED->C5_EMISSAO, 1, 4) cUrl := "https://www.tanet.com.br/rastrear-encomenda/5/" aAdd(aComandos, 'document.getElementById("cpf_cnpj").value = "' + QRY_PED->A1_CGC + '"; ') aAdd(aComandos, 'document.getElementById("nota_fiscal").value = "' + QRY_PED->C5_NOTA + '"; ') aAdd(aComandos, 'document.getElementById("data_emissao").value = "' + cEmissao + '"; ') // - Braspress ElseIf QRY_PED->C5_TRANSP == "000670" cUrl := "https://www.braspress.com/acesso-rapido/rastreie-sua-encomenda/" u_MsgLog("Atenção", "Preencha CNPJ [" + QRY_PED->A1_CGC + "] e NF [" + cValToChar(Val(QRY_PED->C5_NOTA)) + "]") // - Setex do Brasil ElseIf QRY_PED->C5_TRANSP == "001569" cUrl := "http://www.setexdobrasil.com.br/#track" aAdd(aComandos, 'document.getElementById("accessKey").value = "' + QRY_PED->F2_CHVNFE + '";') aAdd(aComandos, 'document.getElementById("sendAcessKeyButton").click();') EndIf //Se tiver a URL preenchida If ! Empty(cUrl) DEFINE DIALOG oDlg TITLE "Pesquisa de Transportadora" FROM 000,000 TO nJanAltu,nJanLarg PIXEL // Prepara o conector WebSocket oWebChannel := TWebChannel():New() nPort := oWebChannel::connect() // Cria componente oWebEngine := TWebEngine():New(oDlg, 0, 0, 100, 100,, nPort) oWebEngine:bLoadFinished := {|self,url| fRodaScript(url) } oWebEngine:navigate(cUrl) oWebEngine:Align := CONTROL_ALIGN_ALLCLIENT ACTIVATE DIALOG oDlg CENTERED Else MsgStop("URL da Transportadora nao encontrada!" + CRLF + "Disponivel apenas para Rodonaves, Americana, Braspress e Setex!", "Atencao") EndIf Else MsgStop("Dados do pedido nao encontrados!", "Atencao") EndIf QRY_PED->(DbCloseArea()) Return Static Function fRodaScript(cUrl) Local nAtual := 0 //Percorre os comandos For nAtual := 1 To Len(aComandos) oWebEngine:runJavaScript(aComandos[nAtual]) Next Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Boa Tarde, no meu caso, eu precisaria pegar a informação de uma página: document.getElementById(‘main’).getAttribute(‘src’).
Utilizando oWebEngine:runJavaScript(“alert(document.getElementById(‘main’).getAttribute(‘src’));”), retorna o que preciso, mas é somente um alert, no caso, eu precisa passar esse retorno para uma variável.
É possível utilizando o TWebEngine?
Obrigado
Bom dia.
Depende, em Javascript, você pode criar variáveis e armazenar, por exemplo, var = document.geEle….
Porém, conforme a documentação oficial das classes, você “não tem acesso” a pegar essas variáveis em Javascript e voltar elas para o AdvPL.
Pode ser que tenha algum método, ai seria interessante abrir um chamado na TOTVS questionando, ou se você quiser ver alguma outra alternativa, uma ideia seria, você criar a variável em Javascript, e ver se é possível gravar isso em algum arquivo txt no S.O., ai via AdvPL, você iria ler esse arquivo txt, é uma gambiarra, mas pode dar certo.
Boa Tarde Daniel tudo bem, voce tem algum exemplo desta conexão twebchannel usando paginas html com conexão no banco de dados?
Bom dia Wanderson, tudo joia graças a Deus e você?
Infelizmente não temos um exemplo pronto de TWebChannel consumindo uma página WEB com conexão com banco de dados.
Vamos adicionar aqui na nossa lista de sugestões.
Um grande abraço.
Bom dia Daniel!! Meus parabens por todo o conteúdo, estou iniciando na area do advpl e voce tem muita informação, tudo de qualidade!!
Bom dia xará, tudo joia?
Opa bem vindo ao mundo Protheus.
Obrigado pelo comentário e feedback, é muita generosidade e bondade sua.
Um grande abraço.