Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Hellsius

Trigger para Locadora no SQL-Server

Recommended Posts

Boa noite. Tenho aula de DB na faculdade e estou sofrendo demais com trigger, até mesmo por que o professor só ensinou 2 trigger e não sei desenvolver uma sozinho, não é por falta de tentar, mas esta complicada a situação do grupo.
Tem uma trigger que precisamos colocar no trabalho que faça a soma de tudo que o cara pegar para alugar na locadora. Estava imaginando que o calculo seria este com base no banco abaixo:

Valor_Total_Locacao = (QTD_Locada*Valor_Normal+Valor_dia_multa)-Desconto;

Serio não sei fazer trigger, como poderia fazer essatrans.gif?cver=0%0D%0A dai??? Abraços, desde já agradeço!

 

Tabelas no Banco:
CREATE TABLE [dbo].[FORNECEDOR](
[iD_FORNECEDOR] [int] NOT NULL,
[RAZAOSOCIAL] [varchar](80) NULL,
[ENDERECO] [varchar](60) NULL,
[TELEFONE] [nchar](10) NULL,
[NOME_CONTATO] [varchar](60) NULL,
[CNPJ] [varchar](20) NULL,
CONSTRAINT [PK_FORNECEDOR] PRIMARY KEY CLUSTERED

 

CREATE TABLE [dbo].[CONFIGURACAO](
[iD_CONFIGURACAO] [int] NOT NULL,
[VALOR_DIA_MULTA] [money] NULL,
[CLASSIFICACAO] [varchar](1) NULL,
CONSTRAINT [PK_CONFIGURACAO] PRIMARY KEY CLUSTERED
(

 

CREATE TABLE [dbo].[CLIENTES](
[iD_CLIENTE] [int] IDENTITY(1,1) NOT NULL,
[NOME_CLIENTE] [varchar](50) NULL,
[RG] [varchar](12) NULL,
[ENDERECO] [varchar](50) NULL,
[bAIRRO] [varchar](30) NULL,
[CIDADE] [varchar](30) NULL,
[ESTADO] [char](2) NULL,
[TELEFONE] [varchar](15) NULL,
[varchar](30) NULL,
[DATANASCIMENTO] [datetime] NULL,
[sEXO] [char](1) NULL,
CONSTRAINT [PK__CLIENTES__8112345F7F60ED59] PRIMARY KEY CLUSTERED
(
[iD_CLIENTE] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

CREATE TABLE [dbo].[CATEGORIA](
[iD_CATEGORIA] [int] NOT NULL,
[TIPO_TITULO] [varchar](2) NULL,
[DESCRICAO] [text] NULL,
[CATEGORIA] [varchar](50) NULL,
CONSTRAINT [PK_CATEGORIA] PRIMARY KEY CLUSTERED
(
[iD_CATEGORIA] ASC
)

 

CREATE TABLE [dbo].[CABECALHO_LOCACAO](
[iD_CABECALHO_LOCACAO] [int] NOT NULL,
[iD_CLIENTE] [int] NULL,
[DATA_LOCACAO] [date] NULL,
[VALOR_TOTAL_LOCACAO] [money] NULL,
CONSTRAINT [PK_CABECALHO_LOCACAO] PRIMARY KEY CLUSTERED
(
[iD_CABECALHO_LOCACAO] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
)

 

CREATE TABLE [dbo].[TITULO](
[iD_TITULO] [int] NOT NULL,
[iD_CATEGORIA] [int] NULL,
[iD_GRUPO] [int] NULL,
[iD_CONFIGURACAO] [int] NULL,
[iD_FORNECEDOR] [int] NULL,
[NOME] [varchar](50) NULL,
[CLASSIFICACAO] [nchar](10) NULL,
[QTD_COPIA] [varchar](10) NULL,
[NUM_DIAS_RESERVA] [int] NULL,
[VALOR] [money] NULL,
[GRAVADORA] [varchar](50) NULL,
[DIRETOR] [varchar](80) NULL,
[AUTOR] [varchar](80) NULL,
[ATOR] [varchar](80) NULL,
[PRODUTORA] [varchar](50) NULL,
[CANTOR] [varchar](80) NULL,
CONSTRAINT [PK_TITULO] PRIMARY KEY CLUSTERED
(
[iD_TITULO] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
)

 

CREATE TABLE [dbo].[DETALHE_LOCACAO](
[iD_DETALHE_LOCACAO] [int] NOT NULL,
[iD_CABECALHO_LOCACAO] [int] NULL,
[iD_TITULO] [int] NULL,
[QTD_LOCADA] [varchar](50) NULL,
[VALOR_NORMAL] [money] NULL,
[DESCONTO] [money] NULL,
[DT_PREVISAO_DEVOLUCAO] [date] NULL,
[DT_REAL_DEVOLUCAO] [date] NULL,
[iD_CONFIGURACAO] [int] NULL,
CONSTRAINT [PK_DETALHE_LOCACAO] PRIMARY KEY CLUSTERED
(
[iD_DETALHE_LOCACAO] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
)

Compartilhar este post


Link para o post
Compartilhar em outros sites

O cabeçalho da locação teria de ser atualizado a cada mudança dos detalhes da locação.

Esta operação deveria ser feita após qq atualização na tabelas de detalhes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso.

 

Estava imaginando o seguinte, cada produto pego pelo cliente que tive-se seu código digitado sera feita uma soma, e depois quando digita-se outro produto a ser alugado pelo mesmo cliente a trigger somaria denovo para dar o valor total.

 

Mas ainda não sei como ela ficaria.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dica, pense o que fazer quando :

 

inserir um "detalhe"

alterar um "detalhe" (locacao,valor ou desconto)

deletar um "detalhe"

 

Aqui pelo que vi você tem um exemplo, veja se ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite Mestre! Muito obrigado pela ajuda.

 

Isso que esta complicado, eheh.

 

Poderia me mostrar, nem que fosse em portunhol?? Estou vendo que não vou conseguir fazer até quinta. =/

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mole que nem pudim:

"Toda trigger trata o comportamento da linha que esta sendo inserida."

Esta é uma definição básica da trigger.

Você pode ver a linha inserida deste modo:

Note que temos duas tabelas diferentes no FROM: INSERTED e DELETED
Seriam como as tabelas temporárias, porém utilizadas pelas triggers.
A partir deste exemplo, creio que você pode fazer os cálculos que precise.
IF EXISTS (SELECT 1 FROM sys.triggers WHERE name = 'trg_CATEGORIA')DROP TRIGGER trg_CATEGORIAGO CREATE TRIGGER trg_CATEGORIA on CATEGORIA-- WITH ENCRYPTIONAfter INSERT, DELETE, UPDATE AS declare ID_CATEGORIA int,declare TIPO_TITULO varchar(2),declare CATEGORIA varchar (50)  DECLARE @i INT, @d INT;SELECT @i = COUNT(*) FROM inserted;SELECT @d = COUNT(*) FROM deleted;IF @i + @d > 0BEGIN    IF @i > 0 AND @d = 0 begin select * from inserted end     IF @i = 0 AND @d > 0    begin select * FROM  deletedendEND  GO

 

Adorava dar este tipo de aula, por isso prefiro te mostrar um exemplo e deixar quebrar a cabeça do que te dar um código pronto, afinal, se copiar nunca vai entender o que fez.

 

Boa sorte e vai postando o que fez, o que deu de erro.

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Concordo com o relator A.Jr , quebrar um pouco a cabeça ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.