Trigger Insert - De uma tabela para muitas

Firebird

04/10/2013

Tenho as tabelas Boleto, clientes, cont_receber, empresa.
Preciso que seja inserido um registro na tabela cont_receber, seja inserido na tabela Boleto alguns dados da tabela empresa (Nome, conta_bancaria, cnpj...), alguns dados da tabela Clientes (Nome_cedente, endereco_cedente, cpf....) e também dados da propria tabela cont_receber(Valor_boleto, documento ....), para assim ter os dados de um boleto.

Estou com dificuldades para gerar essa trigger, desde já agradeço a todos que ajudarem!
Lg Embarcadero

Lg Embarcadero

Curtidas 0

Respostas

Lg Embarcadero

Lg Embarcadero

04/10/2013

Melhorando a pergunta:

Tenho as tabelas Boleto, clientes, cont_receber, empresa.
Preciso que quando seja inserido um registro na tabela "cont_receber", seja inserido também na tabela "Boleto" alguns dados da tabela "empresa" (Nome, conta_bancaria, cnpj...), alguns dados da tabela "Clientes" (Nome_cedente, endereco_cedente, cpf....) e também dados da propria tabela "cont_receber"(Valor_boleto, documento ....), para assim ter os dados de um boleto.
GOSTEI 0
Deivison Melo

Deivison Melo

04/10/2013

Seria algo do tipo:

CREATE trigger teste_bi for country /*O pós fixo bi significa: Before Insert*/
active before insert position 0
AS
begin
  /* Insert na tabela desejada, coloquei os valores fixos apenas como exemplo*/
  insert into TABELAX (CODIGO, NOME)
        values (1, 'EMANOEL DEIVISON');
end


Abração e bons códigos!!
GOSTEI 0
Lg Embarcadero

Lg Embarcadero

04/10/2013

Oi Deivison, Boa tarde!

Essa seria uma simples, mas preciso de uma que insira dados mais ou menos assim:

CREATE trigger teste_bi for country /*O pós fixo bi significa: Before Insert*/
active before insert position 0
AS
begin
  /* Insert na tabela desejada, coloquei o nome dos campos apenas como exemplo*/
  insert into TABELAX 
        values (1, tabelaX.nome, tabelaY.valor, tabelaZ.data);
end


Ou seja, inserir dados de varias tabelas em uma só, isso quando for inserido algum dado na tabela X.
Coloquei os campos como exemplo mas assim não funciona. Saberia me falar se isso é possível e se sim, como funciona a sintaxe?
GOSTEI 0
Deivison Melo

Deivison Melo

04/10/2013

Código de uma trigger simples:

SET TERM ^;
CREATE TRIGGER BI_ATABLE FOR ATABLE
ACTIVE BEFORE INSERT POSITION 1
AS
BEGIN
IF (NEW.CAPTURE_DATE IS NOT NULL) THEN
BEGIN
NEW.CAPTURE_TIME =
CAST(EXTRACT (HOUR FROM NEW.CAPTURE_DATE) AS CHAR(2))|| ':' ||
CAST(EXTRACT (MINUTE FROM NEW.CAPTURE_DATE) AS CHAR(2))|| ':' ||
CAST(EXTRACT (SECOND FROM NEW.CAPTURE_DATE) AS CHAR(7));
END
END ^
SET TERM ;^


Outra:

SET TERM ^;
RECREATE TRIGGER BI_ATABLE FOR ATABLE
ACTIVE BEFORE INSERT POSITION 1
AS
BEGIN
/* do nothing */
END ^
SET TERM ;^
COMMIT;


outra:

SET TERM ^;
RECREATE TRIGGER BI_ATABLE FOR ATABLE
ACTIVE BEFORE INSERT POSITION 1
AS
BEGIN
IF (NEW.CAPTURE_DATE IS NOT NULL) THEN
BEGIN
NEW.CAPTURE_TIME = CAST(NEW.CAPTURE.DATE AS TIME);
END
END ^
SET TERM ;^
COMMIT;


Essa é a sintaxe correta!

Qual sua dúvida?

Está usando qual o editor de SQL que você está usando?
GOSTEI 0
Lg Embarcadero

Lg Embarcadero

04/10/2013

Certo, vou falar o problema real para melhor entendimento.
Preciso que a tabela "contas_receber" gere boletos para a tabela "boletos".
Para isso, toda vez que for inserida uma conta, quero uma trigger que dispare valores desta tabela para a tabela "boletos", so que os dados necessários para os boletos não estão somente na tabela "contas_receber", mas tem também nas tabelas "empresa" e "clientes".
Então a tabela boletos vai receber dados das tabelas "contas_receber" (que teria os valores), "clientes" (que seria os dados do sacado) e "empresa" (que seria os dados do cedente do boleto). Tudo atravez de uma trigger da tabela "contas_receber" toda vez que um registro for inserido.
Imagino que esta seria a melhor solução para o meu caso.
Isso seria possível?
GOSTEI 0
Deivison Melo

Deivison Melo

04/10/2013

Sim!

Na trigger podemos utilizar várias tabelas com a utilização de joins e até mesmo union´s, e etc caso necessário!

Aqui na empresa temos trigger enormes!

Trigger´s com mais de 1.000 linhas de código!

Recomendo que confeccione uma procedure que será populada através dessa trigger e com isso irá gerar o boleto!





GOSTEI 0
Lg Embarcadero

Lg Embarcadero

04/10/2013

Oi Deivison!
Consegui resolver de uma outra maneira, com a mesma sintaxe mas fazendo de outra forma.
Postando aqui so pra conhecimento da turma:
Insert into tabela (campo_1,campo_n)
Select tabela1.campo_a, tabela2.campo_b from tabela1, tabela2;

Muito obrigado pela prontidão em ajudar.
Té+
GOSTEI 0
POSTAR