Campo auto_inc (MySQL) com FireDAC + Datasnap

MySQL

Delphi

20/03/2017

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:

 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

Júlio Ferreira

Curtidas 0

Melhor post

Jones Granatyr

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
GOSTEI 1

Mais Respostas

Júlio Ferreira

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.
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

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.
GOSTEI 0
Júlio Ferreira

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
POSTAR