sábado, 21 de setembro de 2013

Delphi XE5 Android com DataSnap



Esta vídeo aula tem como objetivo ensinar como criar um projeto FireMonkey Android utilizando DataSnap para a comunicação entre o cliente e o servidor. 


Neste projeto ensino a chamar métodos do WS (DataSnap). Espero que gostem, qualquer dúvida, sugestão ou comentário basta comentar aqui ou no meu blog. Abraços e bons estudos.

Clique aqui para fazer o download do material discutido nesta vídeo aula.

Para acessar todo o repositório, clique aqui.

52 comentários:

  1. E ai amigo blz,legal seu video,me ajudo bastante na questao de aparencia no aplicativo,tenho uma duvida que nao sei se e o local adequado para postar,estou fazendo um aplicativo para pedidos da empresa,tenho o sqlite dentro do dispositivo e para sincronismo faço conexao com o banco oracle da empresa,ta funcionando tudo certinho mas a unica coisa que nao consegui fazer foi uma função ou algo parecido pra que verifique se existe conexao coma internet antes de tentar conectar ao servidor na empresa?
    Obrigado.

    ResponderExcluir
    Respostas
    1. Muito obrigado pelo comentário...

      Então, ainda não precisei usar isso mas vou precisar em breve, achei esse site, depois vou testar e ver se funciona:

      http://stackoverflow.com/questions/18888345/how-to-check-if-network-is-available-on-android-delphi-xe5

      Abraços e se conseguir resolver me avise...

      Excluir
    2. bom dia Anderson Jesu,consegui com as informações do site que voce passou acima,ja tinha encontrado ele antes,funciona perfeitamente.
      Obrigado.

      Excluir
    3. Blz. Vou implementar esse método. Estou precisando no meu projeto. Abraços e obrigado.

      Excluir
  2. Olá Anderson, legal mais essa video aula, estou colhendo informações referente de como utilizar essa ferramenta para Android e também estou pesquisando formas de exportar as informações salvas no mobile para uma banco de dados da empresa, e na sua opinião, utilizando DataSnap é a melhor solução para esse tipo de troca de informações?

    ResponderExcluir
    Respostas
    1. É lógico que existe várias formas de se trocar informações, SOAP, DataSnap entre outros menos utilizados...

      Esses dois métodos são mais utilizados, o SOAP já é velho de guerra, e funciona muito bem para Android e iOS.

      Porém na minha opinião, o DataSnap é muito melhor, mais rápido e mais fácil de ser implementado. Pode ser linkado de forma direta, sem ter que persisitir em nada.

      Se quer meu conselho, vai de DataSnap...

      Abraços.

      Excluir
    2. Bom dia,no meu primeiro projeto eu utilizei o datasnap,mas o problema ficar adicionando tabelas,sempre tinha que add no datasnap e depois no projeto,a solução que encontrei no meu caso que uso o banco oracle para fazer o sincronismo dos dados foi o unidac componente,faço conexão direta ai banco sem precisar de data snap,qual banco voce usa na sua empresa Cristiano David Butzke?

      Excluir
    3. Legal ter mais opiniões, utilizamos Firebird como principal, tenho muitas dúvidas ainda sobre como devemos proceder nessa criação e troca de informações. As dúvidas ficam de como iremos sincronizar, pensei em colocar um botão e disparar a troca, atualizando as duas bases simultaneas. Desculpe Anderson pelo uso do seu blog para expor minhas dúvidas.

      Excluir
    4. Essa é a idéia do blog, centralizar as coisas... Podem postar as dúvidas aqui e todos podem responder afim de achar a melhor solução para os problemas.

      Excluir
    5. Cristiano,com o firebird estou fazendo testes ainda,porque dentro do android ate agora so consegui conexao direta com o oracle,e interbase,para os demais bancos nao consegui ainda,ai somente com um datasnap que funciona perfeitamente,pode ver meu video que postei no Delphi XE5 ios com DataSnap,mas ja estou com um componente chamado IBDAC que faz a conexão com o firebird externo mas ate a gora nao tive sucesso,mas estou tentando,mas seu sincronismo sera muito grande,quantas tabelas mais o menos tem que sincronizar?
      a parte do sincronismo e tranquila de fazer,a hora que tiver conexao com o banco para o sincronismo te dou umas dicas.

      Excluir
    6. Rob_X8,acredito que precisarei sincronizar umas 7 tabelas, voce está querendo utilizar o firebird dentro do Android? Eu pensei em fazer assim, posso estar totalmente errado. Salvar as informações no SQLite no Android, assim que o vendedor desejar e estiver conectado a internet ou rede, acionar o sincronismo, ele passaria ao Webservice (DataSnap) com outro SQLite local rodando,que esse passaria para o Firebird. Bem, pensando agora, isso ficaria uma gabiarra horrível, hehe.

      Excluir
    7. Realmente isso é uma gambiarra kkkk...

      O Facebook é um aplicativo que faz isso, ele tem o SQLite local para armazerar as informações e exibir offline, porém, assim que você se conecta a uma rede de internet, ele sincroniza.

      A idéia do botão é muito boa, na verdade existe várias idéias, opções de sincronizar automaticamente quando conectado a uma rede Wifi e assim por diante.

      Porém, no lado servidor, ter um banco de dados SQLite é inviável e fica gambiarra.

      O mais legal é você montar pacotes JSON e mandar esses pacotes e então o servidor DataSnap converter isso e inserir na sua base (FireBird, Oracle, SQLServer...).

      Ao meu ver, essa é a melhor maneira de se fazer isso.

      Outras idéias podem postar....

      Excluir
    8. Bom vamos la hehe,na empresa hoje temos outra versão do aplicativo que estou fazendo mas e bem ruim,funciona assim:
      No android voce vai ter o sqlite para guardar as informações offline blz,eu nao faço sincronismo automatico,quando a pessoa quer ele conecta no wifi ou 3g e faz o sincronismo diretamente para o banco de dados,axo q o sqlite nao faz conexao externa,entao seria diretamente para o seu banco firebird,o video que fiz do ios e bem isso,os dados gravados no sqlite dentro do dispositivo vai diretamente por datasnap para o firebird,ja que o seu sao somente 7 tabeles com sqlite e firebird vai tranquilamente,pra voce ter uma ideia o meu vai ser sqlite no dispositivo e vai sincronizar umas 30 tabelas,entao com datasnap pra mim fica muito grande mas pra voce ai e tranquilo 7 tabelas e rapidao

      Excluir
    9. Olá Rob_X8, legal que vc tenha algo desenvolvido parecido com a minha idéia, onde encontro seu video para dar uma olhada?

      Excluir
    10. Cristiano David Butzke, segue o link da vídeo aula dele:
      http://forumdelphimobile.hol.es/viewtopic.php?f=6&t=2

      Abraços.

      Excluir
    11. Para montar o DataSnap de comunicação, como o caso acima citado, seria melhor criar DataSnap Server ou um DataSnap REST Application? Puxa, ja vi muitas video-aulas, hehe, mas as dúvidas persistem numa montagem eficiente para meu aplicativo. No video do Rob_X8, é enviado via JSON as informações?

      Excluir
  3. Anderson voce sabe como pegar um determinado registro do listbox,exemplo:
    tanho uma tabela de clientes,ai no listbox estou mostrando a razao social,cjnp e cod cliente,quando eu clicar na linha no listbox queria que uma variavel recebesse o cod cliente,sabe como fazer isso,pq gostei do listbox pq e bem rapido,hoje utilizo uma grid mas com o listbox e mais facil.
    Obrigado.

    ResponderExcluir
    Respostas
    1. É bem simples fazer isso, em uma dessas vídeo aulas eu mostro:

      http://unitechgy.blogspot.com.br/search/label/Delphi%20x%20iOS

      Aproveitando, em um dos seus comentários vc citou que vc utilizou o componente UniDac para comunicação direta do Android para o Oracle.
      Eu achei o componente em um site, e achei um comentário seu dizendo que conseguiu instalar, baixei o componente, porém quando fui compilar o último pacote antes do oracle provider, deu um milhão de erro, como vc conseguiu compilar?

      Abraços.

      Excluir
    2. opa valeu vou dar uma olhada,me add no face que ai e mais facil pra resolver esse esquema do unidac e meio chato pra instalar mesmo hehe.
      https://www.facebook.com/cuervo.robert

      Excluir
    3. Blz. Está adicionado. Abraços e vlw.

      Excluir
    4. Não apareceu pra aceitar,me passa o seu e te add,valeu.

      Excluir
    5. Estou vendo que voces conseguirao instalar o UNIDAC, eu baixei aqui mas não vai de geito nenhum, teria como me passar um passo a passo fazendo favor ? andreucella@bol.com.br

      Excluir
    6. Amigo, tenta baixar esse aqui: http://delphiers.blogspot.com.br/2014/01/devart-unidac-525-source-only.html

      Provavelmente tem um readme.txt aí.. Abraços

      Excluir
  4. bom dia chefe estou com um problema ao compilar, uso Win64, ao compilar o seguinte erro ocorre: [PAClient Error] Error: E0004 File does not exist: C:\Users\ESDRAS\Documents\RAD Studio\Projects\Project1._@emb_.tmp
    poderia me ajudar ?

    ResponderExcluir
    Respostas
    1. Bom dia Esdras,da uma olhada nesse link pra ver se te ajuda
      https://forums.embarcadero.com/thread.jspa?threadID=87561

      Excluir
    2. Bom dia Esdras, eu nunca vi esse erro, pelo que vi no forum que o Rob_X8 indicou, lá tem a solução. Boa sorte.

      Abraços.

      Excluir
    3. muito obrigado consegui resolver, só mudei a variável platform para Android e deu certo.

      Excluir
  5. Prezado Anderson Jesus,

    Recentemente criei um vídeo no youtube "Android with Delphi mORMot Login+Authentication". Aproveito a oportunidade para dar uma sugestão para o próximo vídeo: Login+Autenticação usando o DelphiXE4Android.

    Keep going,
    Warleyalex

    ResponderExcluir
  6. Voces possuem dicas e/ou video aulas de como posso fazer um servidor datasnap trocar informações com pacotes JSON, com Android e Delphi XE5. Fiz alguns testes e consegui fazer upload, mas não download. No Android utilizamos SQLITE e nossa aplicação Firebird.

    ResponderExcluir
    Respostas
    1. Se o cliente (Android) e o servidor datasnap forem feitos no Delphi, a comunicação fica muito fácil, o problema é quando o cliente (Android) é feito utlizando o eclipse. Para download, basta fazer uma função no servidor que retorne um TStream, assim o cliente (Delphi) vai resolver tudo pra vc, bastando executar o SaveToFile.

      Não precisa ficar montando pacotes Json, a não ser que queira enviar uma estrutura do dataset com muitos registros, para upload ou download pode-se utilizar parametros do tipo TStream.

      Está na minha lista de vídeo aulas, a próxima será exatamente isso, sincronização entre o Android e o DataSnap de várias formas diferentes.

      Abraços e boa sorte.

      Excluir
  7. Opa, legal, e quando voce irá disponibilizar a próxima video aula?

    ResponderExcluir
    Respostas
    1. Aí que está, assim que me sobrar tempo, o que é uma coisa muito difícil ultimamente rsrs...

      Excluir
  8. Boa Noite Anderson. Muito bom app
    Gostaria de fazer uma pergunta. para fazer a conexão com o oracle. No projeto servidor eu teria a conexão com o oracle com o componente de conexão. e criaria os métodos para consulta essas coisas ali e fazia a chamado no cliente ? seria isso ?
    Muito Obrigado

    ResponderExcluir
    Respostas
    1. Boa dia.

      Essa seria uma boa opção também.
      Uma segunda, você pode criar datasetprovider no servidor e fazer a conexão com clientdataset no cliente.

      Abraços e boa sorte.

      Excluir
  9. Boa Tarde, Estou com duvidas referente a servidorXcliente. Na criação do meu projeto do meu app tenho que criar tudo junto ? poderia me explicar muito obrigado

    ResponderExcluir
  10. Boa noite Anderson, gostaria que se possível me ajudasse a conectar o data explorer com o firebird. Sempre que tento conectar diz que falta um driver. Que driver seria esse? já procurei na net e nao encontrei como resolver. Aguardo retorno

    ResponderExcluir
    Respostas
    1. Infelizmente não sei como faz para conectar com firebird. Nunca conectei com esse banco.

      Abraços e boa sorte.

      Excluir
  11. Olá amigo, usando seus métodos de ensino montei uma aplicação com Android e IOS conectando no PC-Servidor.
    Agora surgiu uma duvida é que a conexão de rede tanto do cliente quanto do servidor se oscilar por qualquer motivo quando volta não conecta mais, tenho que fechar a aplicação e abrir novamente para reconectar.
    Você conhece algum método para reconectar sem ter que fechar o Android?

    ResponderExcluir
    Respostas
    1. Olá Ronaldo, realmente esse é um problema, porém um problema com sentido,
      imagina, você abriu conexão com o servidor (você tem um túnel com uma certa criptografia e ID de sessão) ativo.
      O servidor é fechado inesperadamente, ou seja, essa conexão foi quebrada, porém o lado cliente ainda não sabe que foi fechada. Quando você tenta fazer qualquer conexão com o servidor, vai dar problema, pois as chaves de acesso não existem mais no servidor.

      Existe como contornar esse "problema", é simples, você abre uma conexão, faz o que tem que fazer e depois fecha a conexão.
      Ou seja, você só vai ter conexão ativa quando realmente precisar e não o tempo todo.

      Como exemplo, peguei um trecho de código "corrigido", teste e coloca em todos os lugares que o sistema chama o servidor.

      dmClient.SQLConnection1.Open;
      try
      if dmClient.SMClient.SincronizarCompras(JSONCompra) then
      ShowMessage('Sincronização efetuada com sucesso.')
      else
      ShowMessage('Falha ao sincronizar, consulte o log de erros.');
      finally
      if dmClient.SQLConnection1.DBXConnection <> nil then
      dmClient.SQLConnection1.DBXConnection.Close;

      dmClient.SQLConnection1.Close;
      end;

      Abraços e boa sorte... Obrigado pelo elogio, é bom saber que estou ajudando...

      Excluir
  12. Bom dia você fez um comentário no vídeo sobre o efeito azul no clique nos componentes e disse que já mostrou como resolver isto em outro vídeo, poderia informar em qual vídeo ou explicar como tirar este efeito feio? No video: Delphi XE5 Android com DataSnap
    No tempo 35:15

    ResponderExcluir
    Respostas
    1. Bom dia, tem sim, desativa a propriedade "Selectable" do ListBoxItem1, ListBoxItem2..., tem que fazer pra todos os itens do listbox que vc inserir.

      Abraços.

      Excluir
  13. Como faço pra usar Generators do firebird, em datasnap?

    e porque quando faço uso do comando CommandText, insert.ele só salva de fato no banco quando eu fecho o app ou mudo de tab, tenho que dar open e close, na tabela que os dados fora adicionados sempre pra isso não acontecer?

    ResponderExcluir
    Respostas
    1. Generators??? Não entendi...

      Quando usa o clientdataset vc precisa rodar o comando "ds.ApllyUpdates(-1)" ou algo assim toda vez que faz um delete, update, insert. Aí ele salva imediatamente no banco de dados.

      Excluir
  14. Muito bom seus vídeos Anderson, é possível criar métodos no cliente android e executá-los pelo servidor?

    ResponderExcluir
    Respostas
    1. Muito obrigado...

      Não é possível, afinal o cliente é cliente e não um servidor.
      Abraços

      Excluir
  15. Anderson Boa Noite. Muito bom seu vídeo. seguinte fiz o mesmo processo que você e tudo ok. após isso coloquei meu exe do servidor datasnap para rodar em uma maquina aonde tem ip externo e liberei a porta 211. coloquei o meu ip externo como host e minha porta quando executado no emulador ok . mais quando coloquei no celular quando conecta no datasnap trava tudo. tem algum ideia do que pode ser ??

    ResponderExcluir
    Respostas
    1. Aparentemente esta tudo certo, não sei o que pode ser não, pode ser seu celular ou algo relacionado a versão do android... Se funcionou no emulador era para funcionar normalmente no celular... Não sei o que pode ser, se descobrir não deixe de me avisar.

      Excluir
  16. Boa tarde Anderson,
    Estou a tentar fazer um exemplo como o deu seu vídeo. XE5, SQLite para android. Funciona tudo bem, no target windows, no simulador nao corre, e no dispositivo android propriamente dito, funciona parcialmente. O apk que coloco no android, nao está a carregar a base de dados sqlite para local nenhum. Já experimentei .\assets\internal, assets\internal, .\assets\external, e no destino, a base de dados nao é colocada em lugar nenhum do android, ou estará escondida algures? Onde é suposta ser guardada uma base de dados sqlite no android? Na aplicação, supostamente cria um registo. Se sair da aplicação e voltar a entrar, é como se nao tivesse gravado nada, base de dados vazia. É pressuposto alguma configuração especial para gravar dados sqlite num dispositivo móvel? Há alguma extensão standard para um ficheiro sqlite? Estou a usar o ficheiro.s3db. Se me puder ajudar....Obrigada

    ResponderExcluir
  17. É possível utilizar Firemonkey com Banco de dados?

    ResponderExcluir
  18. Anderson esse metodo está no servermetodos do datasnap mas se o usuario fica um tempo sem usar o aplicativo da um erro de http (erro de conexao)

    Falta algo nesse código ?


    function TServerMethods1.insertQtl_Integer(qtl, moto, Userid, lat,long: string): Integer;
    begin

    Result := -1 ;
    with Fqry_QTL do
    begin
    close ;
    sql.Clear ;
    SQL.Add('insert into tb_QTL (Qtl, Nm_Login,userid,Ds_latitude,Ds_Longitude) values (:Qtl, :Nm_Login,:userid,:Ds_latitude,:Ds_Longitude)') ;
    ParamByName('qtl').AsString := Qtl ;
    ParamByName('nm_login').AsString := moto;
    ParamByName('userid').AsString := userid;
    ParamByName('ds_latitude').AsString := lat;
    ParamByName('ds_longitude').AsString := long;
    ExecSQL;
    Result := 0 ;
    end;



    end;

    ResponderExcluir
  19. Anderson esse metodo está no servermetodos do datasnap mas se o usuario fica um tempo sem usar o aplicativo da um erro de http (erro de conexao)

    Falta algo nesse código ?


    function TServerMethods1.insertQtl_Integer(qtl, moto, Userid, lat,long: string): Integer;
    begin

    Result := -1 ;
    with Fqry_QTL do
    begin
    close ;
    sql.Clear ;
    SQL.Add('insert into tb_QTL (Qtl, Nm_Login,userid,Ds_latitude,Ds_Longitude) values (:Qtl, :Nm_Login,:userid,:Ds_latitude,:Ds_Longitude)') ;
    ParamByName('qtl').AsString := Qtl ;
    ParamByName('nm_login').AsString := moto;
    ParamByName('userid').AsString := userid;
    ParamByName('ds_latitude').AsString := lat;
    ParamByName('ds_longitude').AsString := long;
    ExecSQL;
    Result := 0 ;
    end;



    end;

    ResponderExcluir