ApplyUpdate em consulta pelo dbexpress em campos virtuais
27/11/2009
0
bom dia colegas de códigos
!
Tenho lido algumas edições da ClubeDelphi,
acompanhado alguns vídeos relacionados a assuntos que envolvam as camadas de
programação com o dbexpress, porém como todos os vídeos abordam de modo dinâmico
como conectar a um banco (MySQL, FireBird, InterBase ...), eles não demonstram
como configurar alguns campos que são criados dentro de consultas
pré-elaboradas. Preciso muito de uma ajuda, pois o que encontrei na internet a
fora, não ajudou muito e mesmo depois de configurar os componentes do
ClientDataSet e do DataSetProvider de forma que eu considerei correta, no
momento do ApplyUpdate, é gera uma exceção informando que determinado campo não
faz parte da cláusula where, um pequeno exemplo:
SELECT f.fornecedor, concat(localidade, ' ',
logradouro, ', ', estado) e.endereco
FROM fornecedores f LEFT JOIN enderecos e ON
f.cepID = e.cepID
Esta seria uma consulta, que gostaria de
usar, porém, ao aplicar o applyupdate, a exceção é gerada no campo virtual
[endereco], que não faz parte das tabelas envolvidas.
Como faço para atualizar esta
tabela e não ter essa exceção ?
Espero ter sido bem claro em minha narrativa,
pois isto está me gerando alguns problemas no desenvolvimento das aplicações da
empresa.
Que a Força Esteja Com Vocês !
Que a Força Esteja Com Vocês !
Flavio Freitas
Curtir tópico
+ 0
Responder
Posts
27/11/2009
Guinther Pauli
Dr Flavio
Fácil, você vai ter que instruir o DataSetProvider como atualizar essa tabela, manualmente. Aqui tem um exemplo de uma dica que usei em um problema semelhante (no caso aqui para aplicar um único Delta em duas tabelas), vc resolve da mesma forma. Em suma, insira um manipulador para o evento BeforeUpdateRecord do DataSetProvider, pegue os valores dos campos e MANUALMENTE dispare o seu update / insert / delete.
procedure TForm1.DataSetProvider1BeforeUpdateRecord( Sender: TObject; SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; var Applied: Boolean);begin case UpdateKind of ukDelete: begin SQLConnection1.ExecuteDirect( 'DELETE FROM CLIENTES WHERE CODIGO=' + DeltaDS.fieldbyname('CODIGO').AsString); SQLConnection1.ExecuteDirect(' DELETE FROM PESSOAS WHERE CODIGO=' + DeltaDS.fieldbyname('CODIGO').AsString); end; ukModify: begin SQLConnection1.ExecuteDirect ('UPDATE CLIENTES SET NOME='+ quotedstr(DeltaDS.fieldbyname('NOME').AsString) + ' WHERE CODIGO=' + DeltaDS.fieldbyname('CODIGO').AsString);
SQLConnection1.ExecuteDirect ('UPDATE PESSOAS SET ENDERECO='+ quotedstr(DeltaDS.fieldbyname('ENDERECO').AsString)+ ' WHERE CODIGO='+ DeltaDS.fieldbyname('CODIGO').AsString); end; ukInsert: begin SQLConnection1.ExecuteDirect ('INSERT INTO CLIENTES (CODIGO,NOME) VALUES (' + DeltaDS.fieldbyname('CODIGO').AsString+',' + quotedstr(DeltaDS.fieldbyname('NOME').AsString)+')'); SQLConnection1.ExecuteDirect ('INSERT INTO PESSOAS (CODIGO,ENDERECO) VALUES (' + DeltaDS.fieldbyname('CODIGO').AsString+',' + quotedstr(DeltaDS.fieldbyname('ENDERECO').AsString)+')'); end; end; //Importante, diz ao DataSetProvider que já foi aplicada a cache, caso contrário ele vai tentar aplicar
Applied := true;end;
Abs,
Guinther Pauliguinther.pauli@gmail.com
guinther@devmedia.com.br
Editor Geral Revista ClubeDelphiEditor Geral Revista .net Magazine BrasilMicrosoft Certified: MCP,MCAD,MCSD.NET,MCPD,MCTSDelphi Certified: 3,5,6,7,2005,2006,Web,Kylixhttp://guintherpauli.blogspot.comhttp://twitter.com/guintherpauli
Fácil, você vai ter que instruir o DataSetProvider como atualizar essa tabela, manualmente. Aqui tem um exemplo de uma dica que usei em um problema semelhante (no caso aqui para aplicar um único Delta em duas tabelas), vc resolve da mesma forma. Em suma, insira um manipulador para o evento BeforeUpdateRecord do DataSetProvider, pegue os valores dos campos e MANUALMENTE dispare o seu update / insert / delete.
procedure TForm1.DataSetProvider1BeforeUpdateRecord( Sender: TObject; SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; var Applied: Boolean);begin case UpdateKind of ukDelete: begin SQLConnection1.ExecuteDirect( 'DELETE FROM CLIENTES WHERE CODIGO=' + DeltaDS.fieldbyname('CODIGO').AsString); SQLConnection1.ExecuteDirect(' DELETE FROM PESSOAS WHERE CODIGO=' + DeltaDS.fieldbyname('CODIGO').AsString); end; ukModify: begin SQLConnection1.ExecuteDirect ('UPDATE CLIENTES SET NOME='+ quotedstr(DeltaDS.fieldbyname('NOME').AsString) + ' WHERE CODIGO=' + DeltaDS.fieldbyname('CODIGO').AsString);
SQLConnection1.ExecuteDirect ('UPDATE PESSOAS SET ENDERECO='+ quotedstr(DeltaDS.fieldbyname('ENDERECO').AsString)+ ' WHERE CODIGO='+ DeltaDS.fieldbyname('CODIGO').AsString); end; ukInsert: begin SQLConnection1.ExecuteDirect ('INSERT INTO CLIENTES (CODIGO,NOME) VALUES (' + DeltaDS.fieldbyname('CODIGO').AsString+',' + quotedstr(DeltaDS.fieldbyname('NOME').AsString)+')'); SQLConnection1.ExecuteDirect ('INSERT INTO PESSOAS (CODIGO,ENDERECO) VALUES (' + DeltaDS.fieldbyname('CODIGO').AsString+',' + quotedstr(DeltaDS.fieldbyname('ENDERECO').AsString)+')'); end; end; //Importante, diz ao DataSetProvider que já foi aplicada a cache, caso contrário ele vai tentar aplicar
Applied := true;end;
Abs,
Guinther Pauliguinther.pauli@gmail.com
guinther@devmedia.com.br
Editor Geral Revista ClubeDelphiEditor Geral Revista .net Magazine BrasilMicrosoft Certified: MCP,MCAD,MCSD.NET,MCPD,MCTSDelphi Certified: 3,5,6,7,2005,2006,Web,Kylixhttp://guintherpauli.blogspot.comhttp://twitter.com/guintherpauli
Responder
Clique aqui para fazer login e interagir na Comunidade :)