Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Trigger


fernandomilicia

Pergunta

Olá pessoal, eu sou um novato neste ramo da informática e estou tentando desenvolver uma ação para o meu Banco de dados, que para aqueles desenvolvedores deve ser bem simples, porém, para mim já deu a maior dor de cabeça. Por isso, vou postar a ddl das 3 tabelas que eu criei e em seguida eu digo o que eu quero fazer.

1º Tabela de Produtos

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sOF_ITENS_DA_NOTA_FIS_9113F0FA]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)

ALTER TABLE [dbo].[sOF_ITENS_DA_NOTA_FISCAL] DROP CONSTRAINT SOF_ITENS_DA_NOTA_FIS_9113F0FA

GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sOF_ITENS_DE_VENDA_FK_E3B8F218]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)

ALTER TABLE [dbo].[sOF_ITENS_DE_VENDA] DROP CONSTRAINT SOF_ITENS_DE_VENDA_FK_E3B8F218

GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sOF_CADASTRO_DE_PRODUTOS]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)

drop table [dbo].[sOF_CADASTRO_DE_PRODUTOS]

GO

CREATE TABLE [dbo].[sOF_CADASTRO_DE_PRODUTOS] (

[sOF_PRO_CODIGO] [int] IDENTITY (1, 1) NOT NULL ,

[sOF_CAD_NOME_DO_PRODUTO] [varchar] (60) COLLATE Latin1_General_CI_AS NULL ,

[sOF_CAD_CODIGO_DE_BARRAS] [varchar] (40) COLLATE Latin1_General_CI_AS NULL ,

[sOF_CAD_CODIGO_ALTERNATIVO] [varchar] (40) COLLATE Latin1_General_CI_AS NULL ,

[sOF_CAD_DATA_DO_CADASTRO] [datetime] NULL ,

[sOF_CAD_APLICACAO] [varchar] (60) COLLATE Latin1_General_CI_AS NULL ,

[sOF_CAD_UNIDADE_DE_COMPRA] [varchar] (3) COLLATE Latin1_General_CI_AS NULL ,

[sOF_CAD_ESTOQUE_ATUAL] [numeric](18, 0) NULL ,

[sOF_CAD_ESTOQUE_MINIMO] [numeric](18, 0) NULL ,

[sOF_CAD_PRECO_DE_COMPRA] [money] NULL ,

[sOF_CAD_PRECO_DE_VENDA] [numeric](19, 4) NULL ,

[sOF_CAD_DESCONTO_MAXIMO__] [numeric](18, 0) NULL ,

[sOF_CAD_SIM] [bit] NULL ,

[sOF_CAD_DESCONTO__] [numeric](18, 0) NULL ,

[sOF_MAR_CODIGO] [int] NULL ,

[sOF_GRU_CODIGO] [int] NULL ,

[sOF_SUB_CODIGO] [varchar] (10) COLLATE Latin1_General_CI_AS NULL ,

[sOF_FOR_CODIGO] [int] NULL

) ON [PRIMARY]

GO

2º Tabela de Nota Fiscal de entrada

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sOF_NOTA_FISCAL_DE_ENTRADA]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)

drop table [dbo].[sOF_NOTA_FISCAL_DE_ENTRADA]

GO

CREATE TABLE [dbo].[sOF_NOTA_FISCAL_DE_ENTRADA] (

[sOF_NOT_CODIGO] [int] IDENTITY (1, 1) NOT NULL ,

[sOF_NOT_N__NOTA_FISCAL] [varchar] (24) COLLATE Latin1_General_CI_AS NULL ,

[sOF_NOT_DATA_DE_EMISSAO] [varchar] (20) COLLATE Latin1_General_CI_AS NULL ,

[sOF_NOT_DATA_DE_CHEGADA] [varchar] (20) COLLATE Latin1_General_CI_AS NULL ,

[sOF_NOT_N__DO_PEDIDO] [varchar] (20) COLLATE Latin1_General_CI_AS NULL ,

[sOF_CAD_CODIGO] [int] NULL ,

[sOF_NOT_SERIE_NF] [varchar] (20) COLLATE Latin1_General_CI_AS NULL ,

[sOF_NOT_VALOR_TOTAL] [varchar] (20) COLLATE Latin1_General_CI_AS NULL ,

[sOF_NOT_TOTAL_NF] [varchar] (20) COLLATE Latin1_General_CI_AS NULL ,

[sOF_NOT_VALOR_DO_FRETE] [varchar] (20) COLLATE Latin1_General_CI_AS NULL ,

[sOF_NOT___FRETE] [varchar] (20) COLLATE Latin1_General_CI_AS NULL ,

[sOF_NOT_IPI__] [varchar] (20) COLLATE Latin1_General_CI_AS NULL ,

[sOF_NOT_DESCONTO__] [varchar] (20) COLLATE Latin1_General_CI_AS NULL ,

[sOF_NOT_DATA_DE_SAIDA] [datetime] NULL ,

[sOF_NOT_ITENS] [varchar] (20) COLLATE Latin1_General_CI_AS NULL ,

[sOF_NOT_BASE_CALCULO_CMS_SUBS] [numeric](9, 2) NULL ,

[sOF_NOT_VALOR_CMS_SUBS] [numeric](9, 2) NULL ,

[sOF_NOT_DESPESAS_ACESSORIOS] [numeric](9, 2) NULL ,

[sOF_NOT_DESPESAS_IMPOSTOS] [numeric](9, 2) NULL ,

[sOF_NOT_OBSERVACOES] [varchar] (70) COLLATE Latin1_General_CI_AS NULL ,

[sOF_FOR_CODIGO] [int] NULL ,

[sOF_NOT_PROCESSADO] [varchar] (1) COLLATE Latin1_General_CI_AS NULL

) ON [PRIMARY]

GO

3º Tabela Itens de Fota Fiscal

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sOF_ITENS_DA_NOTA_FISCAL]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)

drop table [dbo].[sOF_ITENS_DA_NOTA_FISCAL]

GO

CREATE TABLE [dbo].[sOF_ITENS_DA_NOTA_FISCAL] (

[sOF_ITE_ID] [int] IDENTITY (1, 1) NOT NULL ,

[sOF_PRO_CODIGO] [int] NOT NULL ,

[sOF_ITE_QUANTIDADE] [numeric](10, 0) NULL ,

[sOF_ITE_VALOR_UNITARIO] [money] NULL ,

[sOF_ITE_VALOR_TOTAL] [money] NULL ,

[sOF_NOT_CODIGO] [int] NULL

) ON [PRIMARY]

GO

Bom o que quero é fazer uma atualização do meu estoque. É como em qualquer sistema: Dá entrada na nota, seleciona os ítens e atualiza o estoque. Para isso acredito que uma trigger seria o melhor caminho, porém, eu não sei como se faz isso. Será que alguém poderia me ajudar? Obrigado a todos.

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Bom dia Fernando,

Dá uma lida nos conceitos de trigger, ok? Tenta fazer você mesmo. Após leitura, se não entender o funcionamento ou não conseguir fazer, posta aí q ajudaremos.

A trigger possui algumas particularidades q é importante saber.

você pode desenvolver também uma procedure para controle de estoque (vai depender de como será a implementação), por isso a leitura dos conceitos.... :.)

http://www.macoratti.net/sql_trig.htm

Link para o comentário
Compartilhar em outros sites

  • 0

Valeu fulvio, verifiquei o material que você me passou, que aliás é muito bom, porém, não consegui desenvolver a trigger porquê cada ítem de produto deve ser alterado de acordo com os ítens do meu cadastro de produtos e isso requer um pouco mais de conhecimento. Ainda estou precisando de ajuda, se puder me ajudar te agradeço muito! Grande abraço.

Link para o comentário
Compartilhar em outros sites

  • 0

Bom dia Fernando,

Então vamos lá...

você terá q criar uma trigger na tabela onde será realizada a manipulação.

PROBLEMA: em qual das tabelas será inserida a trigger? SOF_NOTA_FISCAL_DE_ENTRADA ou SOF_ITENS_DA_NOTA_FISCAL?

A NF provavelmente será a 1ª inserção dos dados, pois não há como existir itens de NF sem a NF já criada.

Coloquei a trigger então na SOF_ITENS_DA_NOTA_FISCAL.

PROBLEMA: a trigger só será ativada quando houver inserção na SOF_ITENS_DA_NOTA_FISCAL.

você terá q criar um campo de controle na tabela SOF_ITENS_DA_NOTA_FISCAL. Criei a coluna BAIXA para identificar se o produto já teve baixa ou não.

PROBLEMA: se não criar este controle, terá que passar este controle para dentro da trigger, utilizando temporárias para saber quais os itens foram baixados e quais ainda estão pendentes.

você terá q criar os relacionamentos entre as tabelas. No exemplo que postou acima, não possui nenhuma.

PROBLEMA: se não criar, 99% de chance de perder as integridades dos dados.

Qualquer erro na trigger, poderá "travar" a tabela SOF_ITENS_DA_NOTA_FISCAL (caso tenha um loop infinito por exemplo).

Em resumo, particularmente, preferiria criar uma Procedure para controlar o estoque e baixa de nota.

Mas como pediu trigger, segue um exemplo simples abaixo. O script está comentado. Vai rodando passo a passo.

Sempre dê o "select" pra ver os resultados.

OBS.: o exemplo é simples. você terá q implementar suas regras. É apenas uma idéia de como funciona. Entendendo este exemplo, aí é só fazer do seu jeito.

Espero q ajude. Qualquer dúvida, posta aí!!! :.)

-- Criação das tabelas create table dbo.SOF_CADASTRO_DE_PRODUTOS (CAD_CODIGO int IDENTITY (1, 1) NOT NULL, Nome varchar(80), ESTOQUE_ATUAL int)

create table dbo.SOF_NOTA_FISCAL_DE_ENTRADA (SOF_NOT_CODIGO int IDENTITY (1, 1) NOT NULL, NOT_ITENS varchar(80))

create table dbo.SOF_ITENS_DA_NOTA_FISCAL (SOF_ITE_ID int IDENTITY (1, 1) NOT NULL, SOF_NOT_CODIGO int, SOF_ITE_QUANTIDADE int, Baixa varchar(3))

-----------------------------------------------------------------------------------------------
-- Criação da Trigger
CREATE TRIGGER [TRG_Insere_Nota]ON dbo.SOF_ITENS_DA_NOTA_FISCAL
FOR Insert
AS -- Declaração de variáveis
Declare @Item int
Declare @NomeItem varchar(80)
Declare @ItemQuantidade int

-- Recupera o item a ser inserido
Set @Item = (select top 1 SOF_ITE_ID from SOF_ITENS_DA_NOTA_FISCAL where baixa='não')

-- loop até acabar os itens a serem baixados
While (@Item is not null)
Begin -- Produto não existe na tabela de cadastro de produto. Inserir.
  if (select top 1 1 from SOF_CADASTRO_DE_PRODUTOS where nome in (select NOT_ITENS 
  from SOF_NOTA_FISCAL_DE_ENTRADA E, SOF_ITENS_DA_NOTA_FISCAL I 
  where E.SOF_NOT_CODIGO=I.SOF_NOT_CODIGO and I.SOF_ITE_ID=@Item)) is null
  Begin Set @NomeItem = (select E.NOT_ITENS from SOF_NOTA_FISCAL_DE_ENTRADA E, SOF_ITENS_DA_NOTA_FISCAL I 
                     where E.SOF_NOT_CODIGO=I.SOF_NOT_CODIGO and I.SOF_ITE_ID=@Item)
    Set @ItemQuantidade = (select SOF_ITE_QUANTIDADE from SOF_ITENS_DA_NOTA_FISCAL where SOF_ITE_ID=@Item)
    insert into SOF_CADASTRO_DE_PRODUTOS values (@NomeItem, @ItemQuantidade)
    update SOF_ITENS_DA_NOTA_FISCAL set baixa = 'SIM' where SOF_ITE_ID=@Item
  End
  Else
  Begin -- Produto existe na tabela de cadastro de produto. Atualizar estoque.
    update SOF_CADASTRO_DE_PRODUTOS set ESTOQUE_ATUAL = (ESTOQUE_ATUAL + (select SOF_ITE_QUANTIDADE from SOF_ITENS_DA_NOTA_FISCAL where SOF_ITE_ID=@Item))
    update SOF_ITENS_DA_NOTA_FISCAL set baixa = 'SIM' where SOF_ITE_ID=@Item
  End
  Set @Item = (select top 1 SOF_ITE_ID from SOF_ITENS_DA_NOTA_FISCAL where baixa='não')
End

-----------------------------------------------------------------------------------------------

-- inserindo uma nota
insert into SOF_NOTA_FISCAL_DE_ENTRADA values ('Produto XXXX')

-- verifica os dados
select * from SOF_CADASTRO_DE_PRODUTOS select * from SOF_NOTA_FISCAL_DE_ENTRADA select * from SOF_ITENS_DA_NOTA_FISCAL

-- inserindo um item para a nota
insert into SOF_ITENS_DA_NOTA_FISCAL values (1, 32, 'não')

-- verifica os dados
-- o produto foi inserido no estoque.
select * from SOF_CADASTRO_DE_PRODUTOS select * from SOF_NOTA_FISCAL_DE_ENTRADA select * from SOF_ITENS_DA_NOTA_FISCAL

-- inserindo o mesmo item
insert into SOF_ITENS_DA_NOTA_FISCAL values (1, 32, 'não')

-- verifica os dados
-- o estoque foi atualizado, pois o item já existia.
select * from SOF_CADASTRO_DE_PRODUTOS select * from SOF_NOTA_FISCAL_DE_ENTRADA select * from SOF_ITENS_DA_NOTA_FISCAL

-- inserindo outra nota
insert into SOF_NOTA_FISCAL_DE_ENTRADA values ('Produto YYYY')

-- verifica os dados
-- Outro produto.
select * from SOF_CADASTRO_DE_PRODUTOS select * from SOF_NOTA_FISCAL_DE_ENTRADA select * from SOF_ITENS_DA_NOTA_FISCAL

-- inserindo um item para a nota
insert into SOF_ITENS_DA_NOTA_FISCAL values (2, 10,'não')

-- verifica os dados
-- Produto inserido...
select * from SOF_CADASTRO_DE_PRODUTOS select * from SOF_NOTA_FISCAL_DE_ENTRADA select * from SOF_ITENS_DA_NOTA_FISCAL

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...