Ajuda com Stored Procedure/Trigger
Boa noite...
Como faço para gravar todos os dados de uma tabela, alterando apenas um campo em outra?
Exemplo, tenho uma tabela de Orçamento e Itens de Orçamento, gostaria que eu alterando um campo (Vendido=´S´), todos os dados, inclusive os itens fossem para a tabela de Vendas os campos são os mesmo, a única diferença é por conta dos campos TotalOrcamento e TotalPedido e nos items os campos CodigoOrcamento e CodigoVenda.
coloquei no forum de IB/FB pq eu gostaria que o BD se encarregasse de fazer isso.
Uso D7 com FB e ClientDataSet
Como faço para gravar todos os dados de uma tabela, alterando apenas um campo em outra?
Exemplo, tenho uma tabela de Orçamento e Itens de Orçamento, gostaria que eu alterando um campo (Vendido=´S´), todos os dados, inclusive os itens fossem para a tabela de Vendas os campos são os mesmo, a única diferença é por conta dos campos TotalOrcamento e TotalPedido e nos items os campos CodigoOrcamento e CodigoVenda.
coloquei no forum de IB/FB pq eu gostaria que o BD se encarregasse de fazer isso.
Uso D7 com FB e ClientDataSet
Facc
Curtidas 0
Respostas
Sremulador
09/01/2007
bem amigo, uma trigger resolve o caso
if (NEW.Vendido=´S´) THEN Gravaosdados ...
GOSTEI 0
Facc
09/01/2007
bem amigo, uma trigger resolve o caso
if (NEW.Vendido=´S´) THEN Gravaosdados ...
então eu crio uma Trigger after update CadOrcamento
e vou ´jogando´ os dados dessa forma?
totaPedido := Total Orcamento
...
Seria isso?
Ou tem uma forma mais facil?
GOSTEI 0
Sremulador
09/01/2007
Bem amigo acho que e assim
quando você alterar a tabela o sistema vai verificar qual a situação, no caso de ser S então ele vai executar a segunda parte, aonde voc^?e tem que colocar o código para inserir na outra tabela os dados...
;
quando você alterar a tabela o sistema vai verificar qual a situação, no caso de ser S então ele vai executar a segunda parte, aonde voc^?e tem que colocar o código para inserir na outra tabela os dados...
CREATE TRIGGER TSUATABELA FOR SUATABELA ACTIVE BEFORE INSERT POSITION 0 AS begin if (NEW.Vendido=´S´) THEN then begin insert na outra tabelas os dados end end
GOSTEI 0
Facc
09/01/2007
Consegui fazer a trigger, porém apenas para o cabeçalho do orçamento, como faço para gravar os itens do orçamento tbm?
essa é a trigger que grava o cabeçalho.
essa é a trigger que grava o cabeçalho.
CREATE TRIGGER CADORCAMENTOPEDIDO_BU0 FOR CADORCAMENTO ACTIVE BEFORE UPDATE POSITION 0 AS begin if (New.BAIXADO = ´V´) then BEGIN insert into CADPEDIDO ( CodCli, DataEmissao, TotalPedido, TotalPecas, PorcDesc, VlrDesc, PorcAcre, VlrAcre ) Values ( Old.CODCLI, Old.DATAEMISSAO, Old.TOTALORCAMENTO, Old.TOTALPECAS, Old.PORCDESC, Old.VLRDESC, Old.PORCACRE, Old.VLRACRE); END end
GOSTEI 0
Facc
09/01/2007
sobe
GOSTEI 0
Sremulador
09/01/2007
você pode fazer um FOR na tabela filha e transportar para a 2º tabela
if (New.BAIXADO = ´V´) then BEGIN insert into CADPEDIDO ( CodCli, DataEmissao, TotalPedido, TotalPecas, PorcDesc, VlrDesc, PorcAcre, VlrAcre ) Values ( Old.CODCLI, Old.DATAEMISSAO, Old.TOTALORCAMENTO, Old.TOTALPECAS, Old.PORCDESC, Old.VLRDESC, Old.PORCACRE, Old.VLRACRE); for tabelafilhatemporaria .... insert into tabelafilhadefinitiva valores da tabela tabelafilhatemporaria END
GOSTEI 0
Facc
09/01/2007
[b:d8855b2d9e]sremulador[/b:d8855b2d9e] Valeu pela ajuda que vc está me dando...
Mas como eu faria esse [b:d8855b2d9e]For[/b:d8855b2d9e]?
Poderia me mandar um exemplo básico?
Mas como eu faria esse [b:d8855b2d9e]For[/b:d8855b2d9e]?
Poderia me mandar um exemplo básico?
GOSTEI 0
Facc
09/01/2007
[b:c4849feaeb]sremulador[/b:c4849feaeb] Valeu pela ajuda que vc está me dando...
Mas como eu faria esse [b:c4849feaeb]For[/b:c4849feaeb]?
Poderia me mandar um exemplo básico?
esqueci de comentar... o Codigo do orçamento/pedido é autoincremento (pelo Generator)
GOSTEI 0
Facc
09/01/2007
sobe
GOSTEI 0
Facc
09/01/2007
alguem???
GOSTEI 0
Emerson Nascimento
09/01/2007
tente como foi exemplificado pelo sremulator...
se você publicasse a estrutura das tabelas envolvidas (ao menos os campos pertinentes) poderímos ajudar de forma mais precisa...
CREATE TRIGGER CADORCAMENTOPEDIDO_BU0 FOR CADORCAMENTO ACTIVE BEFORE UPDATE POSITION 0 AS [declare as variáveis em função dos campos que serão preenchidos] begin if (New.BAIXADO = ´V´) then begin -- pego o próximo ID para o pedido pedido = GEN_ID( SEU_GENERATOR, 1); -- **** insere o cabeçalho **** -- insert into CADPEDIDO ( idpedido, CodCli, DataEmissao, TotalPedido, TotalPecas, PorcDesc, VlrDesc, PorcAcre, VlrAcre ) Values ( :pedido, Old.CODCLI, Old.DATAEMISSAO, Old.TOTALORCAMENTO, Old.TOTALPECAS, Old.PORCDESC, Old.VLRDESC, Old.PORCACRE, Old.VLRACRE); -- **** insere os itens **** -- for select lista_de_campos from CADORCAMENTOITEM where IDOrcamento = OLD.IDOrcamento into lista_de_variaveis do insert into CADPEDIDOITEM (IDPedido, lista_de_campos) values (:Pedido, lista_de_variaveis) end end
se você publicasse a estrutura das tabelas envolvidas (ao menos os campos pertinentes) poderímos ajudar de forma mais precisa...
GOSTEI 0
Facc
09/01/2007
Estrutura do CadOrcamento CODIGO INTEGER NOT NULL, CODCLI VARCHAR(10) NOT NULL, DATAEMISSAO DATE, TOTALORCAMENTO NUMERIC(15,2), TOTALPECAS NUMERIC(15,2), PORCDESC NUMERIC(3,2), VLRDESC NUMERIC(15,2), PORCACRE NUMERIC(3,2), VLRACRE NUMERIC(15,2), BAIXADO CHAR(1)
Estrutura do CadOrcamento2 CODIGO INTEGER NOT NULL, CODORCAMENTO INTEGER NOT NULL, CODRPDUTO VARCHAR(5) NOT NULL, REFPROD VARCHAR(5), MERCADORIA VARCHAR(50), CODBARRA VARCHAR(13), QTDE NUMERIC(15,3), PRECOVENDA NUMERIC(15,2), VLRTOTAL NUMERIC(15,2)
Estrutura do CadPedido CODIGO INTEGER NOT NULL, CODCLI VARCHAR(10) NOT NULL, DATAEMISSAO DATE, TOTALPEDIDO NUMERIC(15,2), TOTALPECAS NUMERIC(15,2), PORCDESC NUMERIC(3,2), VLRDESC NUMERIC(15,2), PORCACRE NUMERIC(3,2), VLRACRE NUMERIC(15,2), BAIXADO CHAR(1)
Estrutura do CadPedido2 CODIGO INTEGER NOT NULL, CODPEDIDO INTEGER NOT NULL, CODPRODUTO VARCHAR(5) NOT NULL, REFPROD VARCHAR(5), MERCADORIA VARCHAR(50), CODBARRA VARCHAR(13), QTDE NUMERIC(15,3), PRECOVENDA NUMERIC(15,2), VLRTOTAL NUMERIC(15,2)
GOSTEI 0
Emerson Nascimento
09/01/2007
seguindo a estrutura passada, deverá ser algo assim:
CREATE TRIGGER CADORCAMENTOPEDIDO_BU0 FOR CADORCAMENTO ACTIVE BEFORE UPDATE POSITION 0 AS // variaveis de trabalho declare variable CODRPDUTO VARCHAR(5); declare variable REFPROD VARCHAR(5); declare variable MERCADORIA VARCHAR(50); declare variable CODBARRA VARCHAR(13); declare variable QTDE NUMERIC(15,3); declare variable PRECOVENDA NUMERIC(15,2); declare variable VLRTOTAL NUMERIC(15,2); begin if (New.BAIXADO = ´V´) then begin -- pego o próximo ID para o pedido pedido = GEN_ID( SEU_GENERATOR, 1); -- **** insere o cabeçalho **** -- insert into CADPEDIDO (Codigo, CodCli, DataEmissao, TotalPedido, TotalPecas, PorcDesc, VlrDesc, PorcAcre, VlrAcre) values (:pedido, Old.CODCLI, Old.DATAEMISSAO, Old.TOTALORCAMENTO, Old.TOTALPECAS, Old.PORCDESC, Old.VLRDESC, Old.PORCACRE, Old.VLRACRE); -- **** insere os itens **** -- for select CODRPDUTO, REFPROD, MERCADORIA, CODBARRA, QTDE, PRECOVENDA, VLRTOTAL from CADORCAMENTO2 where Codigo = OLD.Codigo into :CODRPDUTO, :REFPROD, MERCADORIA, :CODBARRA, :QTDE, :PRECOVENDA, :VLRTOTAL do insert into CADPEDIDO2 (CODPEDIDO, CODPRODUTO, REFPROD, MERCADORIA, CODBARRA, QTDE, PRECOVENDA, VLRTOTAL) values (:Pedido, :CODRPDUTO, :REFPROD, :MERCADORIA, :CODBARRA, :QTDE, :PRECOVENDA, :VLRTOTAL) end end
GOSTEI 0
Facc
09/01/2007
seguindo a estrutura passada, deverá ser algo assim:
CREATE TRIGGER CADORCAMENTOPEDIDO_BU0 FOR CADORCAMENTO ACTIVE BEFORE UPDATE POSITION 0 AS // variaveis de trabalho declare variable CODRPDUTO VARCHAR(5); declare variable REFPROD VARCHAR(5); declare variable MERCADORIA VARCHAR(50); declare variable CODBARRA VARCHAR(13); declare variable QTDE NUMERIC(15,3); declare variable PRECOVENDA NUMERIC(15,2); declare variable VLRTOTAL NUMERIC(15,2); begin if (New.BAIXADO = ´V´) then begin -- pego o próximo ID para o pedido pedido = GEN_ID( SEU_GENERATOR, 1); -- **** insere o cabeçalho **** -- insert into CADPEDIDO (Codigo, CodCli, DataEmissao, TotalPedido, TotalPecas, PorcDesc, VlrDesc, PorcAcre, VlrAcre) values (:pedido, Old.CODCLI, Old.DATAEMISSAO, Old.TOTALORCAMENTO, Old.TOTALPECAS, Old.PORCDESC, Old.VLRDESC, Old.PORCACRE, Old.VLRACRE); -- **** insere os itens **** -- for select CODRPDUTO, REFPROD, MERCADORIA, CODBARRA, QTDE, PRECOVENDA, VLRTOTAL from CADORCAMENTO2 where Codigo = OLD.Codigo into :CODRPDUTO, :REFPROD, MERCADORIA, :CODBARRA, :QTDE, :PRECOVENDA, :VLRTOTAL do insert into CADPEDIDO2 (CODPEDIDO, CODPRODUTO, REFPROD, MERCADORIA, CODBARRA, QTDE, PRECOVENDA, VLRTOTAL) values (:Pedido, :CODRPDUTO, :REFPROD, :MERCADORIA, :CODBARRA, :QTDE, :PRECOVENDA, :VLRTOTAL) end end
Fiz isso que vc me passou, porém só está gravando apenas 1 registro na tabela itenspedido
GOSTEI 0
Facc
09/01/2007
alguém??
GOSTEI 0
Emerson Nascimento
09/01/2007
você tem triggers para essas tabelas? se tiver, publique-as.
assim posso criar um banco com essas quatro tabelas para simular o caso.
assim posso criar um banco com essas quatro tabelas para simular o caso.
GOSTEI 0
Facc
09/01/2007
você tem triggers para essas tabelas? se tiver, publique-as.
assim posso criar um banco com essas quatro tabelas para simular o caso.
tenho pra gerar o autoincremento apenas
GOSTEI 0
Emerson Nascimento
09/01/2007
publique-as...
GOSTEI 0
Facc
09/01/2007
publique-as...
Trigger para CadOrcamento
CREATE TRIGGER TRIG_ORCAMENTO_BI FOR CADORCAMENTO ACTIVE BEFORE INSERT POSITION 0 AS BEGIN IF (NEW.CODIGO IS NULL) THEN NEW.CODIGO = GEN_ID(GEN_ORCAMENTO_CODIGO, 1); END
Trigger para CadOrcamento2
CREATE TRIGGER TRIG_ORCAMENTO2_BI FOR CADORCAMENTO2 ACTIVE BEFORE INSERT POSITION 0 AS BEGIN IF (NEW.CODIGO IS NULL) THEN NEW.CODIGO = GEN_ID(GEN_ORCAMENTO2_CODIGO, 1); END
Trigger para CadPedido
CREATE TRIGGER TRIG_PEDIDO_BI FOR CADPEDIDO ACTIVE BEFORE INSERT POSITION 0 AS BEGIN IF (NEW.CODIGO IS NULL) THEN NEW.CODIGO = GEN_ID(GEN_PEDIDO_CODIGO, 1); END
Trigger para CadPedido2
CREATE TRIGGER TRIG_PEDIDO2_BI FOR CADPEDIDO2 ACTIVE BEFORE INSERT POSITION 0 AS BEGIN IF (NEW.CODIGO IS NULL) THEN NEW.CODIGO = GEN_ID(GEN_PEDIDO2_CODIGO, 1); END
GOSTEI 0
Emerson Nascimento
09/01/2007
CREATE TRIGGER CADORCAMENTOPEDIDO_BU0 FOR CADORCAMENTO ACTIVE AFTER UPDATE POSITION 0 AS -- variaveis de trabalho declare variable PEDIDO INTEGER; declare variable CODRPDUTO VARCHAR(5); declare variable REFPROD VARCHAR(5); declare variable MERCADORIA VARCHAR(50); declare variable CODBARRA VARCHAR(13); declare variable QTDE NUMERIC(15,3); declare variable PRECOVENDA NUMERIC(15,2); declare variable VLRTOTAL NUMERIC(15,2); begin if (new.BAIXADO = ´V´) then begin -- pego o próximo ID para o pedido pedido = GEN_ID(GEN_PEDIDO_CODIGO, 1); -- **** insere o cabeçalho **** -- insert into CADPEDIDO (Codigo, CodCli, DataEmissao, TotalPedido, TotalPecas, PorcDesc, VlrDesc, PorcAcre, VlrAcre) values (:pedido, Old.CODCLI, Old.DATAEMISSAO, Old.TOTALORCAMENTO, Old.TOTALPECAS, Old.PORCDESC, Old.VLRDESC, Old.PORCACRE, Old.VLRACRE); -- **** insere os itens **** -- for select CODRPDUTO, REFPROD, MERCADORIA, CODBARRA, QTDE, PRECOVENDA, VLRTOTAL from CADORCAMENTO2 where CodOrcamento = OLD.Codigo -- acima, ao invés de Codigo, era CodOrcamento into :CODRPDUTO, :REFPROD, MERCADORIA, :CODBARRA, :QTDE, :PRECOVENDA, :VLRTOTAL do insert into CADPEDIDO2 (CODPEDIDO, CODPRODUTO, REFPROD, MERCADORIA, CODBARRA, QTDE, PRECOVENDA, VLRTOTAL) values (:Pedido, :CODRPDUTO, :REFPROD, :MERCADORIA, :CODBARRA, :QTDE, :PRECOVENDA, :VLRTOTAL); end end
GOSTEI 0
Facc
09/01/2007
Valeu!!
Funcionou
Muito Obrigado!
Funcionou
Muito Obrigado!
GOSTEI 0