ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Como atualizar os preços com trigger? ***resolvido***

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Dom Dez 13, 2009 6:10 pm    Assunto: Como atualizar os preços com trigger? ***resolvido*** Responder com Citação

Pessoal, uso firebird 2.0, e gostaria de atualizar uma tabela que não possui referencia com outra, porém as duas tem o mesmo nome dos campos, então preciso atualizar a tabela "precserv" conforme a tabela "preco"

Tenho uma trigger que dispara no after da tabela "preco" toda vez que atualizo ela.
Código:
if (not temtrigger (pQuery, 'ATUALIZARPRECO')) then
      begin
        //fsplash.label1.caption:= 'Criando Trigger ATUALIZAR PREÇOS';
        application.processmessages;
        close;
        sql.clear;
        sql.add (' create or alter trigger ATUALIZARPRECO FOR PRECO ');
        sql.add (' active after insert or update position 0 ');
        sql.add (' as ');
        sql.add (' begin ');
        sql.add ('   update preserv ');
        sql.add ('   set descserv   = new.descserv,   ');
        sql.add ('       vlrserv    = new.vlrserv,    ');
        sql.add ('       vlrmotoboy = new.vlrmotoboy, ');
        sql.add ('       percserv   = new.percserv    ');
        sql.add ('   where idpreco  = new.idpreco;    ');
        sql.add (' end ');
        execsql;
      end;


Mais desta forma ai atualiza tudo na tabela "preserv", e surgiu a necessidade de fazer uma trigger que compare as duas tabelas e fazer uma pergunta para o cliente se ele deseja ou não atualizer a tabela "preserv"

Pensei em algo + ou - assim
Código:
procedure Tfrmcadclie.atualizapreco; //é uma procedure local
begin
  with qrylocal do
  begin
    close;
    sql.clear;
    sql.add (' select  * from preco O where exists ');
    sql.add(' (select * from preserv D             ');
    sql.add('   where D.descserv = O.descserv      ');
    sql.add('   and D.vlrserv    = O.vlrserv       ');
    sql.add('   and D.tiposerv   = O.tiposerv      ');
    sql.add('   and D.percserv   = O.percserv      ');
    sql.add('   and D.vlrmotoboy = O.vlrmotoboy    ');
    sql.add('   and D.idclientes = :pidclientes)   ');
    parambyname('pidclientes').asinteger := strtoint( edtgen.text ); //recebe o valor do edit IDcliente
    open;
    if isempty then
    begin
      if Pt_MessageDlg('Atenção! Existe atualizações na tabela de preço.'+#13+#10+
                       'Deseja atualizar a tabela de preços?',mtinformation,[mbyes,mbno],0) = mryes then
      begin
         {coloque aqui o codigo para atualizar a tabela de precos}
      end else
      begin
        exit;
      end; 
    end;
  end;
end;

Mais não veio nenhuma idéia de como faço esta atualização na linha aonde esta comentada
{coloque aqui o codigo para atualizar a tabela de precos}


Cheguei a criar algo assim:
Código:
procedure Tfrmcadclie.aplicaatualtbpreco;
begin
  with qrylocal do
  begin
    close;
    sql.clear;
    sql.add (' select * from preserv where idclientes = :cod ');
    parambyname ('cod').asinteger := strtoint( edtgen.text ); //recebe o valor do edit idcliente
    open;
    if not (isempty) then
    begin
      //--agora começa a fazer uma varredura atualizando a tabela destino cfe
      //--os dados da tabela origem
      dm.preco.active := true;
      dm.preco.disablecontrols;
      dm.preco.first;
      while (not dm.preco.eof) do
      begin
        {gravando da tabela origem para tabela destino}
        if dm.precoserv.locate('vlrserv; vlrmotoboy; percserv', vararrayof([dm.precovlrserv.value, dm.precovlrmotoboy.value, dm.precopercserv.value]), []) then
        begin
          dm.precoserv.next; //se tiver gravado na tabela destino passa pra frente
        end else
        begin
          dm.precoserv.edit; //se não grava na tabela destino
          {passa para tabela destino dos dados da tabela origem}
          dm.precoservdescserv.value   := dm.precodescserv.value;
          dm.precoservvlrserv.value    := dm.precovlrserv.value;
          dm.precoservvlrmotoboy.value := dm.precovlrmotoboy.value;
          dm.precoservpercserv.value   := dm.precopercserv.value;
          dm.precoserv.post; //gravando na tabela destino
          dm.connection.commit;
        end;
        dm.preco.next;
      end;
      dm.preco.enablecontrols;
    end;
  end;
end;
Mais não me traz bem os resultados satisfatórios, preciso de algo com mais agilidade e que funcione 100%
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree


Editado pela última vez por adriano_servitec em Ter Dez 15, 2009 6:42 pm, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
thomazs
Moderador
Moderador


Registrado: Segunda-Feira, 1 de Março de 2004
Mensagens: 2835

MensagemEnviada: Seg Dez 14, 2009 12:40 pm    Assunto: Responder com Citação

Bom Adriano,bastaria você seguir a idéia da trigger. Ou seja, bastaria da um update normal na tabela preserv. Só que, você teria que usar outra Qry, isso para não perder os dados da tabela preco, que deseja que seja usada como base para alteração.

Seria algo assim:

Código:
var i : integer;

qrylocal.first;
while not qrylocal.Eof do begin
  with Qry2 do begin
    SQL.Text := 'update preserv set descserv=:descserv,... where idpreco =:idpreco';
    for i := 0 to Params.Count-1 do
      Params[i].Value := QryLocal.FieldByName(Params[i].Name).Value;
    ExecSQL;
  end;
  qryloca.Next;
end;


Isso iria pegar todos os parâmetros que estivessem na Qry2, e pesquisar por campos do mesmo nome na QryLocal, em seguida, substituir os valores.

A única observação é que o nome dos parâmetros deve ter o mesmo nome dos campos. Mas se preferir, pode passar o nome dos campos manualmente, apesar de ser mais trabalhoso, visto que se a quantidade de campos aumentar, seriam mais linhas para se preocupar.
_________________
Suporte e Consultoria em Desenvolvimento de Sistemas
Bacharel em Sistemas de Informação
Especialista em Bancos de Dados
Desenvolvimento: Clipper, Delphi, PHP, Python/Django
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Ter Dez 15, 2009 6:41 pm    Assunto: Responder com Citação

Obrigado Thomazs, com sua ajuda consegui resolver....

Valeu amigo.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB