Ajuda com Stored Procedure/Trigger

Firebird

09/01/2007

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


Facc

Facc

Curtidas 0

Respostas

Sremulador

Sremulador

09/01/2007

bem amigo, uma trigger resolve o caso

if (NEW.Vendido=´S´) THEN
  Gravaosdados ...



GOSTEI 0
Facc

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

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...

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

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.
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

Facc

09/01/2007

sobe


GOSTEI 0
Sremulador

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

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?


GOSTEI 0
Facc

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

Facc

09/01/2007

sobe


GOSTEI 0
Facc

Facc

09/01/2007

alguem???


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

09/01/2007

tente como foi exemplificado pelo sremulator...

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

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

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

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

Facc

09/01/2007

alguém??


GOSTEI 0
Emerson Nascimento

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.


GOSTEI 0
Facc

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

Emerson Nascimento

09/01/2007

publique-as...


GOSTEI 0
Facc

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

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

Facc

09/01/2007

Valeu!!

Funcionou

Muito Obrigado!


GOSTEI 0
POSTAR