Campo auto_inc (MySQL) com FireDAC + Datasnap
20/03/2017
0
Tenho uma aplicação cliente - servidor, utilizando o dbExpress em 100%. Até então, a divisão ficava da seguinte forma:
1. App Servidor: TSQLConnection + TSQLQuery + TDataSetProvider
2. App Cliente: TSQLConnection + TDSProviderConnection + TClientDataSet
Na aplicação servidor, era realizada a configuração do ProviderFlags no componente TDataSetProvider. Existia a implementação do método OnAfterUpdateRecord que definia o ID inserido do registro da seguinte forma:
DataSet.FieldByName( mPrimaryKey ).NewValue := ServerConnection.Resources.LastId;
Aonde, a função ServerConnection.Resources.LastId retorna o valor da chamada "select last_id_insert()" do MySQL.
Essa implementação acima permitia que, ao se realizar um ApplyUpdates na aplicação cliente, o ID do registro inserido fosse "automaticamente" recuperado.
Atualmente, já consegui migrar todo o lado servidor para utilizar o FireDAC e os componentes ficaram e o lado cliente continuou com o de antes:
1. Aoo Servidor: TFDConnection + TFDQuery + TDataSetProvider
2. App Cliente: TSQLConnection + TDSProviderConnection + TClientDataSet
O problema é que não consigo recuperar o ID do registro inserido de forma transparente para o cliente. Antes, após o ApplyUpdates, já era possível acessar o campo com um AsInteger e lá estava o valor correto. Hoje, com FireDAC, ainda não é possível.
Tenho duas dúvidas básicas:
1º É possível utilizar 100% FireDAC cliente + servidor e ainda ter essa gama de recursos que o dbExpress permitia?
2º Caso contrário, como é possível conseguir recuperar o ID auto_increment de um registro inserido?
Agradeço antecipadamente pela ajuda!
Obrigado à todos.
Júlio Ferreira
Post mais votado
20/03/2017
Sim, com o FireDAC você já tem todo o gerenciamento dos campos autoincremento, independente da base de dados (não precisa codificar funções adicionais). Sairá um artigo justamente sobre isso em breve na Clube Delphi
Jones
Jones Granatyr
Mais Posts
21/03/2017
Júlio Ferreira
Sim, com o FireDAC você já tem todo o gerenciamento dos campos autoincremento, independente da base de dados (não precisa codificar funções adicionais). Sairá um artigo justamente sobre isso em breve na Clube Delphi
Jones
Na verdade, já consegui fazer de três formas diferentes, mas todas elas requer grande modificação na estrutura atual do sistema.
Uma, e confesso que foi a que mais gostei, é utilizando o FireDACJSONReflection. Tudo via stream e extremamente rápido. Passa a utilizar apenas componentes FireDAC, tanto no servidor como no cliente.
17/04/2017
Júlio Ferreira
Sei que vai sair um post sobre esse assunto conforme dito pelo Jones. Mas gostaria de saber se alguém já passou por isso ou tem alguma dica para dar.
Temporariamente (talvez definitivamente), resolvi o problema usando reflections com TFDJSONDataSetsWriter. Não sei se é a melhor implementação para ser usada, uma vez que não é mais necessário usar o trio dbExpress no lado client. Ficam trafegando streams de um lado para outro dessa forma.
Bom, se alguém puder dar alguma dica, agradeço.
Obrigado.
06/06/2017
Júlio Ferreira
Clique aqui para fazer login e interagir na Comunidade :)