none
A instrução INSERT conflitou com a restrição do FOREIGN KEY RRS feed

  • Pergunta

  • Boa Tarde,

    Estou realizando um projeto de dataware house, onde ao criar um procedura e executá-la gera o seguinte erro :

    A instrução INSERT conflitou com a restrição do FOREIGN KEY "FK__Venda__Produto_i__239E4DCF". O conflito ocorreu no banco de dados "PROJETOFINAL", tabela "dbo.Produto", column 'idProduto'.

    Segue abaixo script da procedure criada:

         

    USE PROJETOFINAL
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET NOCOUNT ON
    GO
    -- Bloco utilizado para verificar se a SP já existe. Se SIM, o banco fará um DROP da SP e irá recriar.
    IF EXISTS (
      SELECT * 
        FROM INFORMATION_SCHEMA.ROUTINES 
       WHERE 1=1 
         AND SPECIFIC_NAME = N'PROC_FATO_VENDA' 
    )
       DROP PROCEDURE PROC_FATO_VENDA
    GO

    -- CREATE THE STORE PROCEDURE 
    CREATE PROCEDURE DBO.PROC_FATO_VENDA
    AS
    -- DECLARACAO DAS VARIAVEIS DE LOG E CONTROLE
    DECLARE
      --VARIAVEIS DE TABELA
      @TEMPO_idTEMPO              int,

      @COD_ORIGEM_LOCALIDADE      INT,
      @Localidade_idLocalidade    INT, -- VARIAVEL DA ORIGEM

      @COD_ORIGEM_PRODUTO  INT,
      @Produto_idProduto          INT ,

      @COD_ORIGEM_FUNCIONARIO     INT,
      @Funcionario_idFuncionario  INT, 

      @COD_ORIGEM_CLIENTE  INT,
      @Cliente_CPF                VARCHAR(20), -- VARIAVEL DA ORIGEM

      @Valor_Venda                numeric (10, 2),
      @Data_Venda                 datetime,

      --@Atendimentos_Funcionario   INT, 

      --VARIÁVEIS DE CONTROLE DE DADOS PROCESSADOS
      @V_DSC_DADOS_PROCESSAMENTO    VARCHAR(2000)

      -- DECLARACAO DO CURSOR
      DECLARE CUR_GET_VENDAS CURSOR FOR 
        select 

     v.tb002_cod_cidade        as "Localidade_idLocalidade",
     p.tb012_cod_produto       as "Produto_idProduto" ,
     f.tb005_matricula         as "Funcionario_idFuncionario",
     c.tb010_cpf               as "Cliente_CPF",
     sum (it.tb018_valor_item_venda) as "Valor_Venda",
     iv.tb010_012_data         as "Data_Venda"

    from 
     ADS.dbo.tb010_012_vendas iv,
     ADS.dbo.tb002_cidades v,
     ADS.dbo.tb012_produtos p ,
     ADS.dbo.tb005_funcionarios f,
     ADS.dbo.tb010_clientes c,
     ADS.dbo.tb018_itens_vendas it

    where 1=1
     and it.tb010_012_cod_venda = iv.tb010_012_cod_venda
     and c.tb010_cpf = iv.tb010_cpf
     and f.tb005_matricula = iv.tb005_matricula
     and v.tb002_cod_cidade = iv.tb010_012_cod_venda



    group by --colunas sem função de soma 

     v.tb002_cod_cidade, 
     p.tb012_cod_produto, 
     f.tb005_matricula,
     c.tb010_cpf,
     iv.tb010_012_data


      -- Limpeza da tabela FATO
      BEGIN TRANSACTION
        delete from PROJETOFINAL.dbo.Venda
      COMMIT

      --ABRE CURSOR PARA EXECUÇÃO
      OPEN CUR_GET_VENDAS

      --CAPTURA PRIMEIRO REGISTRO PARA INICIAR O LOOP
      FETCH NEXT FROM CUR_GET_VENDAS
      INTO

      @Localidade_idLocalidade, 
      @Produto_idProduto,
      @Funcionario_idFuncionario, 
      @Cliente_CPF, 
      @Valor_Venda,
      @Data_Venda

      --LOOP QUE IRÁ EXECUTAR ENQUANTO HOUVER LINHAS NO CURSOR PARA SEREM PROCESSADAS
      WHILE (@@FETCH_STATUS = 0)
      BEGIN

        --TROCA DE PK OLTP para MOLAP
    select
    @COD_ORIGEM_LOCALIDADE = L.idLocalidade,
    @COD_ORIGEM_PRODUTO = P.idProduto,
    @COD_ORIGEM_FUNCIONARIO = F.idFuncionario,
    @COD_ORIGEM_CLIENTE = C.CPF
    from PROJETOFINAL.dbo.Localidade L, PROJETOFINAL.dbo.Produto P, PROJETOFINAL.dbo.Funcionario F, PROJETOFINAL.dbo.Cliente C
    where L.Cod_Fonte = @Localidade_idLocalidade
    AND P.idProduto = @Produto_idProduto
    AND F.Matricula = @Funcionario_idFuncionario
    AND C.Nome = @Cliente_CPF

    --EXECUTA PROCEDURE QUE TRATA OS DADOS DE "TEMPO"
        BEGIN TRANSACTION
          EXECUTE PROJETOFINAL.dbo.PROC_TD001_TEMPO @Data_Venda, @TEMPO_idTEMPO OUTPUT
        COMMIT

    -- ATRIBUI VALORES PROCESSADOS
        SET @V_DSC_DADOS_PROCESSAMENTO = 

    '@Localidade_idLocalidade         '  + CAST(@Localidade_idLocalidade     AS VARCHAR)+CHAR(13)+CHAR(10)+
                                         '@Produto_idProduto     '  + -- CAST(@Produto_idProduto  AS VARCHAR)+CHAR(13)+CHAR(10)+
    '@Funcionario_idFuncionario   '  + CAST(@Funcionario_idFuncionario  AS VARCHAR)+CHAR(13)+CHAR(10)+
                                         '@Cliente_CPF                 '  + CAST(@Cliente_CPF               AS VARCHAR)+CHAR(13)+CHAR(10)+
                                         '@Valor_Venda                      '  +-- CAST(@Valor_Venda                   AS VARCHAR)
    '@Data_Venda' + CAST(@Data_Venda AS VARCHAR)

        BEGIN TRANSACTION  
             insert into PROJETOFINAL.DBO.Venda 
    (TEMPO_idTEMPO, Localidade_idLocalidade, Produto_idProduto, Funcionario_idFuncionario, Cliente_CPF, Valor_Venda)
    values
    (@TEMPO_idTEMPO, @Localidade_idLocalidade, @Produto_idProduto, @Funcionario_idFuncionario, @Cliente_CPF, @Valor_Venda)

             -- TRATAMENTO DE ERRO
             IF @@ERROR <> 0
             BEGIN
                ROLLBACK
                -- EXIBE QUAL FOI O ÚLTIMO REGISTRO A SER PROCESSADO
                SELECT @V_DSC_DADOS_PROCESSAMENTO
                --FECHA CURSOR E LIBERA RECURSO DE MEMÓRIA
                CLOSE CUR_GET_VENDAS
                DEALLOCATE CUR_GET_VENDAS
                -- SAI DA SP
                RETURN
             END -- IF
        COMMIT

        --CAPTURA PRÓXIMA LINHA DE REGISTROS PARA CONTINUAR O PROCESSAMENTO SE A REGRA DO LOOP AINDA ESTIVER VALENDO
        FETCH NEXT FROM CUR_GET_VENDAS
        INTO
        @Localidade_idLocalidade, @Produto_idProduto, @Funcionario_idFuncionario, @Cliente_CPF, @Valor_Venda, @Data_Venda

      END -- WHILE

    --FECHA CURSOR E LIBERA RECURSO DE MEMÓRIA
    CLOSE CUR_GET_VENDAS
    DEALLOCATE CUR_GET_VENDAS

    Poderiam me ajudar por gentileza a solucionar esta questão?

    Fico no Aguardo.


    quarta-feira, 3 de dezembro de 2014 22:05

Respostas

Todas as Respostas