 |
ActiveDelphi .: O site do programador Delphi! :.
|
| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Dom Dez 13, 2009 6:10 pm Assunto: Como atualizar os preços com trigger? ***resolvido*** |
|
|
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 |
|
 |
thomazs Moderador


Registrado: Segunda-Feira, 1 de Março de 2004 Mensagens: 2835
|
Enviada: Seg Dez 14, 2009 12:40 pm Assunto: |
|
|
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 |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
|
| Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|