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.
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?
ResponderExcluirObrigado.
Muito obrigado pelo comentário...
ExcluirEntã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...
bom dia Anderson Jesu,consegui com as informações do site que voce passou acima,ja tinha encontrado ele antes,funciona perfeitamente.
ExcluirObrigado.
Blz. Vou implementar esse método. Estou precisando no meu projeto. Abraços e obrigado.
ExcluirOlá 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É lógico que existe várias formas de se trocar informações, SOAP, DataSnap entre outros menos utilizados...
ExcluirEsses 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.
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?
ExcluirLegal 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.
ExcluirEssa é 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.
ExcluirCristiano,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?
Excluira parte do sincronismo e tranquila de fazer,a hora que tiver conexao com o banco para o sincronismo te dou umas dicas.
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.
ExcluirRealmente isso é uma gambiarra kkkk...
ExcluirO 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....
Bom vamos la hehe,na empresa hoje temos outra versão do aplicativo que estou fazendo mas e bem ruim,funciona assim:
ExcluirNo 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
Olá Rob_X8, legal que vc tenha algo desenvolvido parecido com a minha idéia, onde encontro seu video para dar uma olhada?
ExcluirCristiano David Butzke, segue o link da vídeo aula dele:
Excluirhttp://forumdelphimobile.hol.es/viewtopic.php?f=6&t=2
Abraços.
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?
ExcluirAnderson voce sabe como pegar um determinado registro do listbox,exemplo:
ResponderExcluirtanho 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.
É bem simples fazer isso, em uma dessas vídeo aulas eu mostro:
Excluirhttp://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.
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.
Excluirhttps://www.facebook.com/cuervo.robert
Blz. Está adicionado. Abraços e vlw.
ExcluirNão apareceu pra aceitar,me passa o seu e te add,valeu.
ExcluirEstou 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
ExcluirAmigo, tenta baixar esse aqui: http://delphiers.blogspot.com.br/2014/01/devart-unidac-525-source-only.html
ExcluirProvavelmente tem um readme.txt aí.. Abraços
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
ResponderExcluirpoderia me ajudar ?
Bom dia Esdras,da uma olhada nesse link pra ver se te ajuda
Excluirhttps://forums.embarcadero.com/thread.jspa?threadID=87561
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.
ExcluirAbraços.
muito obrigado consegui resolver, só mudei a variável platform para Android e deu certo.
ExcluirKibom... Abraços.
ExcluirPrezado Anderson Jesus,
ResponderExcluirRecentemente 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
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.
ResponderExcluirSe 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.
ExcluirNã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.
Opa, legal, e quando voce irá disponibilizar a próxima video aula?
ResponderExcluirAí que está, assim que me sobrar tempo, o que é uma coisa muito difícil ultimamente rsrs...
ExcluirBoa Noite Anderson. Muito bom app
ResponderExcluirGostaria 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
Boa dia.
ExcluirEssa 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.
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
ResponderExcluirBoa 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
ResponderExcluirInfelizmente não sei como faz para conectar com firebird. Nunca conectei com esse banco.
ExcluirAbraços e boa sorte.
Olá amigo, usando seus métodos de ensino montei uma aplicação com Android e IOS conectando no PC-Servidor.
ResponderExcluirAgora 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?
Olá Ronaldo, realmente esse é um problema, porém um problema com sentido,
Excluirimagina, 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...
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
ResponderExcluirNo tempo 35:15
Bom dia, tem sim, desativa a propriedade "Selectable" do ListBoxItem1, ListBoxItem2..., tem que fazer pra todos os itens do listbox que vc inserir.
ExcluirAbraços.
Como faço pra usar Generators do firebird, em datasnap?
ResponderExcluire 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?
Generators??? Não entendi...
ExcluirQuando 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.
Muito bom seus vídeos Anderson, é possível criar métodos no cliente android e executá-los pelo servidor?
ResponderExcluirMuito obrigado...
ExcluirNão é possível, afinal o cliente é cliente e não um servidor.
Abraços
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 ??
ResponderExcluirAparentemente 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.
ExcluirBoa tarde Anderson,
ResponderExcluirEstou 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
É possível utilizar Firemonkey com Banco de dados?
ResponderExcluirAnderson 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)
ResponderExcluirFalta 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;
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)
ResponderExcluirFalta 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;