none
SCD está sempre zerando o campo de controle de registro ativo/inativo RRS feed

  • Pergunta

  • Boa tarde!

    Configurei um SCD na minha task com todos os atributos configurados como históricos (Tipo 2) e utilizei uma única coluna para controle de registros atuais e expirados.

    Acontece que sempre que executo o pacote pela primeira vez, os registros são inseridos na dimensão com o valor desse campo em True, ou seja, como atual. Ao executar o package pela segunda vez, o valor desse campo em todos os registros são passados para False.

    Nota: Para que sejam inseridos somente novos registros, inseri no pacote um lookup antes do último passo.

    Alguém saberia o motivo disso e como resolver?

    Obrigado!

    quinta-feira, 20 de junho de 2013 16:18

Respostas

  • Samir,

    Ai esta seu problema, os novos atributos serão inseridos a partir do proprio SCD, veja o meu print como ficou para gerar o resultado esperado:

    Apenas coloquei o Slowly Changing Dimension, ele faz todo o resto automaticamente, inclusive o controle dos atributos e linhas.


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Email: fabrizzio.antoniaci@gmail.com

    quinta-feira, 20 de junho de 2013 18:26
    Moderador
  • Olá Fabrizzio!

    Consegui resolver meu problema.

    Problema: O SCD estava sempre interpretando que o registro vindo da origem havia sido alterado em relação ao registro na dimensão (destino). Por isso, sempre era inserido um novo registro marcado como atual na dimensão e os registros já existentes eram marcados como expirados.

    Solução: O tipo de dado utilizado nos campos texto da dimensão eram char e, por algum motivo, o SCD não consegue trabalhar bem com comparações neste tipo de dados. Alterei o tipo de dados para varchar e então o SCD passou a trabalhar corretamente.

    Muitíssimo obrigado pela sua ajuda, pois foi de extrema importância para que eu verificasse que não preciso acrescentar um Lookup à minha task, pois o SCD já faz o trabalho para mim, e também para que eu conseguisse perceber onde estava o problema.

    Abraços!

    • Marcado como Resposta Samir Lima sexta-feira, 21 de junho de 2013 14:11
    sexta-feira, 21 de junho de 2013 14:10

Todas as Respostas

  • Samir,

    Não sei exatamente como voce fez o seu SCD, mas fiz um aqui e esta certinho, veja:

    IF(OBJECT_ID('Original') IS NOT NULL) DROP TABLE Original IF(OBJECT_ID('Destino') IS NOT NULL) DROP TABLE Destino CREATE TABLE Original ( Id INT IDENTITY(1,1), Loja VARCHAR(100), Endereco VARCHAR(100) ) CREATE TABLE Destino ( Id INT IDENTITY(1,1), Loja VARCHAR(100), Endereco VARCHAR(100), Ativo BIT ) INSERT INTO Original(Loja, Endereco) VALUES ('Loja 1', 'Endereco a') SELECT * FROM Destino --1 Loja 1 Endereco a 1

    UPDATE Original SET Endereco = 'Endereco b' WHERE Loja LIKE 'Loja 1'

    --Execução do SCD

    SELECT * FROM Destino /* 1 Loja 1 Endereco a 0 2 Loja 1 Endereco b 1 */


    Coloquei loja como bussiness Key e endereço como historical value, e setei que o true or false caia para o campo ativo (Que é um bit). Poste um print de como esta ficando seus dados e do projeto para que possamos ajuda-lo melhor.


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Email: fabrizzio.antoniaci@gmail.com

    quinta-feira, 20 de junho de 2013 17:08
    Moderador
  • Olá, Fabrizzio!

    Obrigado pela resposta. Resolvi colocar aqui as imagens de como fiz a configuração do meu SCD para ver se ajuda.

    

    Demais imagens no próximo post...

    quinta-feira, 20 de junho de 2013 18:22
  • Lembrando que depois dessa configuração, inseri um Lookup para controlar a inserção apenas de novos registros (não sei se isso é correto).

    Obrigado.

    quinta-feira, 20 de junho de 2013 18:23
  • Samir,

    Ai esta seu problema, os novos atributos serão inseridos a partir do proprio SCD, veja o meu print como ficou para gerar o resultado esperado:

    Apenas coloquei o Slowly Changing Dimension, ele faz todo o resto automaticamente, inclusive o controle dos atributos e linhas.


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Email: fabrizzio.antoniaci@gmail.com

    quinta-feira, 20 de junho de 2013 18:26
    Moderador
  • Fabrizzio, no meu está faltando um OLE DB Command. Veja:

    O que fiz de diferente do seu que não gerou este comando?

    Obrigado.

    quinta-feira, 20 de junho de 2013 18:31
  • Samir,

    Estranho pois ele criou sózinho, ja tentou recriar este componente? OBS: Não fiz nada diferente de voce


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Email: fabrizzio.antoniaci@gmail.com

    quinta-feira, 20 de junho de 2013 18:34
    Moderador
  • Bom, recriei dessa vez habilitando a opção de inferred members e então o OLE DB Commando foi criado, mas parece que não mudou o funcionamento. Eu retirei o Lookup que havia mencionado e sempre que eu executo a task, os registros que já existem são marcados como expirados (campo status em false) e são inseridos novos campos marcados como atuais (campo status em True).

    Para mim, isso não é o correto, pois nada foi alterado e portanto o registro existente continua atual.

    quinta-feira, 20 de junho de 2013 18:46
  • Samir,

    Ele vai bater seu campo chave (ConvID) e caso um join entre a tabela origem e destino por este campo resulte em qualquer campo diferente ele vai criar uma nova linha. Poste um print de seus dados exibindo este erro por favor.


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Email: fabrizzio.antoniaci@gmail.com

    quinta-feira, 20 de junho de 2013 18:48
    Moderador
  • Resultado de um select feito após a primeira execução:

    Resultado de um select feito após a segunda execução da task:

    Coloquei os dados ordenados pelo nome para tornar mais fácil a comparação entre os registros. Perceba que absolutamente tudo é igual.

    quinta-feira, 20 de junho de 2013 19:05
  • Fabrizzio, como o SCD verifica se houve alguma mudança nos valores para então inserir ou não um novo registro na dimensão?

    Att.

    Samir.

    quinta-feira, 20 de junho de 2013 19:55
  • Pelo que entendi, o SCD está identificando mudanças no registro (que não existem) e está atualizando o registro atual na dimensão. Em seguida ele está inserindo um novo registro.

    Neste caso, a dúvida é: O que está fazendo com que o SCD "pense" que ocorreu uma alteração no registro quando não ocorreu?

    quinta-feira, 20 de junho de 2013 20:18
  • Olá Fabrizzio!

    Consegui resolver meu problema.

    Problema: O SCD estava sempre interpretando que o registro vindo da origem havia sido alterado em relação ao registro na dimensão (destino). Por isso, sempre era inserido um novo registro marcado como atual na dimensão e os registros já existentes eram marcados como expirados.

    Solução: O tipo de dado utilizado nos campos texto da dimensão eram char e, por algum motivo, o SCD não consegue trabalhar bem com comparações neste tipo de dados. Alterei o tipo de dados para varchar e então o SCD passou a trabalhar corretamente.

    Muitíssimo obrigado pela sua ajuda, pois foi de extrema importância para que eu verificasse que não preciso acrescentar um Lookup à minha task, pois o SCD já faz o trabalho para mim, e também para que eu conseguisse perceber onde estava o problema.

    Abraços!

    • Marcado como Resposta Samir Lima sexta-feira, 21 de junho de 2013 14:11
    sexta-feira, 21 de junho de 2013 14:10
  • Legal Samir,

    Estava fazendo alguns testes e tentando simular este ambiente, vou testar aqui com o CHAR, acho estranho o erro mas fico feliz que tenha resolvido.


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Email: fabrizzio.antoniaci@gmail.com

    sexta-feira, 21 de junho de 2013 14:13
    Moderador