Campo auto_inc (MySQL) com FireDAC + Datasnap
Olá, boa tarde!
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:
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.
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
Curtidas 0
Melhor post
Jones Granatyr
20/03/2017
Olá Júlio!
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
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
GOSTEI 1
Mais Respostas
Júlio Ferreira
20/03/2017
Olá Júlio!
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
Muito bom Jones! Existe data para isso? Estou empacado nisso.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.
GOSTEI 0
Júlio Ferreira
20/03/2017
Olá pessoal, bom dia!
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.
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.
GOSTEI 0
Júlio Ferreira
20/03/2017
É galera... tá difícil de conseguir conteúdo de qualidade sobre Delphi e FireDAC. O jeito é partir para outra solução/plataforma. O pessoal do fórum da ActiveDelphi tem mais disposição para responder... Esse, mesmo pagando mensal, tá ruim. Uma pena.
GOSTEI 0