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 !
Flavio Freitas

Flavio Freitas

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
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar