Array
(
)

ApplyUpdate em consulta pelo dbexpress em campos virtuais

Flavio Freitas
   - 27 nov 2009

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 !

Guinther
|
MVP
Pontos: 5
    27 nov 2009

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