15 Replies Latest reply: Apr 15, 2016 2:56 PM by Luciano Vasconcelos RSS

    LOAD SEM DUPLICAR CHAVE PRIMARIA

      Boa tarde pessoal, sou novo aqui na comunidade e gostaria de tirar uma dúvida.

       

      Tenho uma aplicação ao qual preciso fazer um LOAD de vários arquivos .csv
      Cada um desses arquivos contém linhas com informações sobre produtos, como por exemplo preço e data de vigencia.

       

      EXEMPLO:
      PRODUTO | DATA_INICIAL | DATA_FINAL | PRECO

       

       

      A dúvida é, como tenho vários desses arquivos, um para cada mês com a seguinte situação, quando o preço de determinado permanece dentro da vigencia para o mês seguinte, o arquivo .csv do mês seguinte vem novamente com o registro de vigencia. Criando assim a chave duplicada.

       

      EXEMPLO de um arquivo do mês de março:

       

      PRODUTO 1, 01/03/2016, "" , 20,00

      PRODUTO 2, 01/03/2016, 15/03/2016 , 25,00

      PRODUTO 2, 16/03/2016, "", 26,00

       

      Onde "" é quando ainda não tem data de vigencia final.

       

      EXEMPLO de um arquivo do mês de abril:

       

      PRODUTO 1, 01/03/2016, "" , 20,00

      PRODUTO 2, 01/03/2016, 15/03/2016 , 25,00

      PRODUTO 2, 16/03/2016, 10/04/2016, 26,00

      PRODUTO 2, 11/04/2016, "", 27,00


      Viram como no arquivo do mês de abril, o meu LOAD vai carregar novamente o registro do produto lá do arquivo de março, PRODUTO 2, 16/03/2016, "", 26,00 - sendo que ele é o mesmo registro que está em abril porém agora encerrou a vigência, e já apareceu uma nova.


      É possível resolver isso de alguma forma e fazer com que meu LOAD carregue apena o ultimo registro primário, ignorando assim o que ficou desatualizado na virada do mês quando ocorreu a troca do arquivo?


      Não sei se me expressei de forma que fique fácil o entendimento, qualquer dúvida me perguntem. Desde já agradeço!

        • Re: LOAD SEM DUPLICAR CHAVE PRIMARIA
          Luciano Vasconcelos

          Se entendi direito, você teria que carregar antes o mês mais atual e criar uma chave com PRODUTO | DATA_INICIAL.

          Depois você carrega os mais antigos utilizando

          Where not exists(Chave)

           

          Dessa forma vai carregar todos os atuais e somente os que não existirem dos mais antigos.

          • Re: LOAD SEM DUPLICAR CHAVE PRIMARIA
            Yuri Nicolett

            Veja esse exemplo:

            No caso eu carregaria todas as planilhas e faria um distinct para remover as linhas duplicadas, depois é só usar o ORDER BY para selecionar o último preço do produto.

              • Re: LOAD SEM DUPLICAR CHAVE PRIMARIA

                Fala Yuri, não consegui baixar o arquivo consegue me copiar o código por aqui?

                 

                Tentei fazer o distinct e order by mas da erro. Talvez não esteja fazendo do jeito correto.

                  • Re: LOAD SEM DUPLICAR CHAVE PRIMARIA
                    Yuri Nicolett

                    Tabela:

                    LOAD * INLINE [

                    PRODUTO, DATA_INICIO, DATA_FIM, VALOR

                    PRODUTO 1, 01/03/2016, "" , 20,00

                    PRODUTO 2, 01/03/2016, 15/03/2016 , 25,00

                    PRODUTO 2, 16/03/2016, "", 26,00

                    PRODUTO 1, 01/03/2016, "" , 20,00

                    PRODUTO 2, 01/03/2016, 15/03/2016 , 25,00

                    PRODUTO 2, 16/03/2016, 10/04/2016, 26,00

                    PRODUTO 2, 11/04/2016, "", 27,00

                    ];

                     

                     

                    ProdutoValor:

                    NoConcatenate

                    LOAD

                      DISTINCT

                      PRODUTO,

                      DATA_INICIO,

                      DATA_FIM,

                      VALOR,

                      if( PRODUTO <> Previous(PRODUTO), 'Ultimo Valor') as FLAG_ULTIMO_VALOR

                    RESIDENT Tabela

                    ORDER BY

                      PRODUTO asc,

                      DATA_INICIO desc;

                     

                     

                    DROP TABLE Tabela;

                      • Re: LOAD SEM DUPLICAR CHAVE PRIMARIA

                        Yuri, fiz aqui com esse script, executou, só que não resolveu o problema, apliquei o if na minha chave que é um autonumber do produto & data inicial, que gera um numero que vai aumentando, gerando a chave primaria sequencial e essa está se repetindo no caso do exemplo, e ainda importa a chave duplicada.

                         

                        Nesse exemplo que passei o registro que tem que ficar é:

                         

                        PRODUTO 2, 16/03/2016, 10/04/2016, 26,00

                         

                        A antiga que não tinha a data final de vigencia digitada deve ser excluida : PRODUTO 2, 16/03/2016, "", 26,00 porém vai ter uma nova linha com esse produto só que como a vigencia é nova, e a construção da chave que é com base na data inicial, já descarta a possibilidade de duplicar os proximos registros.

                         

                        Ah outra coisa que esqueci de mencionar, esse registro que vai ser atualizado pode se manter dentro de vários arquivo até chegar uma tabela com vigência nova que vai encerrar a antiga.

                          • Re: LOAD SEM DUPLICAR CHAVE PRIMARIA
                            Yuri Nicolett

                            Pedro, você não deve criar a chave, com autonumber, antes de aplicar a lógica que te passei, caso contrário não vai funcionar mesmo.

                              • Re: LOAD SEM DUPLICAR CHAVE PRIMARIA

                                Entao Yuri, sou bem iniciante mesmo no Qlik. Consegui desenvolver algumas coisas bem legais ja. mas dei uma empacada nesse esquema que perguntei.

                                 

                                A aplicacao possui bem mais registro e produtos duplicados, imagina assim. Cada arquivo o produto se repete.Com alguns criterio que serao utilizados para comparacao com notas fiscais por exemplo. Entao eu possivelmente vou precisar de uma key para relacionar com as nfs.

                                 

                                A aplicacao final e ler uma nota fiscal e cruzar com a tabela de preco para ver se o preco esta correto.

                                Sendo assim preciso comparar campos coincidentes das duas tabelas para formar a chave e poder mostrar o resultado do valor da nf x o valor da tabela.

                                 

                                Nao sei se estou no caminho certo, mas se for possivel consegue me detalhar melhor como seguir o melhor caminho, alguns macetes que eu tenho que seguir?

                                 

                                Pelo que entendi na sua logica, se eu aplicar no produto e funcionar, vai me trazer apenas um produto, mas eu preciso que todos fiquem registrados porem o que eh igual precisa preencher o campo de vigencia final com base no registro que o load estiver lendo no momento. O que acontece aqui eh que ele simplesmente inclui uma nova linha e isso gera duplicidade de valor na hora de somar o valor da tabela, conforme os campos forem coincidentes com a nota.

                                 

                                Desculpa se nao me fiz entender, mas obrigado mesmo por tentar me ajudar. Se conseguir sera de grande proveito e aprendizado pra mim.

                              • Re: LOAD SEM DUPLICAR CHAVE PRIMARIA
                                Fernando Tonial

                                Olá Pedro,

                                 

                                Utiliza a função not Exists()

                                Veja exemplo:

                                 

                                Dados:
                                LOAD
                                  AutoNumber(PRODUTO&'|'&DATA_INICIO, 'Chave') AS CHAVE,
                                  PRODUTO,
                                  DATA_INICIO,
                                  DATA_FIM,
                                  VALOR
                                FROM
                                [Dados*.txt]
                                (txt, codepage is 1252, embedded labels, delimiter is ',', msq)
                                Where Not Exists(CHAVE, AutoNumber(PRODUTO&'|'&DATA_INICIO, 'Chave'));
                                

                                 

                                Anexo os dados que testei.

                                 

                                Don't worry, be Qlik.

                                Tonial.

                                  • Re: LOAD SEM DUPLICAR CHAVE PRIMARIA

                                    Boa noite Fernando, quase foi... agora importou apenas as keys unicas.

                                     

                                    Porem como o primeiro registro que ele importa vem do arquivo antigo, ele esta mantendo o registro mais antigo em vez de gravar o mais atual que ja contem a data de vigencia final.

                                     

                                    Pelo jeito estamos no caminho certo.

                                     

                                    Sera que agora tem jeito de carregar o registro mais atual de cada chave?

                                      • Re: LOAD SEM DUPLICAR CHAVE PRIMARIA
                                        Luciano Vasconcelos

                                        Tive outra ideia.

                                        Você disse que têm um autonumber certo?

                                        Cada linha PRODUTO,  DATA_INICIO tem uma chave com autonumber.


                                        Passo 1: Gerar a tabela Base lendo todos os arquivos concatenados.

                                        Passo 2: Gerar a tabela Atuais lendo do resident Base os campos PRODUTO,  DATA_INICIO e max(autonumber) as chave

                                        group by PRODUTO,  DATA_INICIO;

                                        Passo 3: Inner Join(Base)

                                        load *

                                        resident(Atuais);

                                        Passo 4: Drop table Atuais;


                                        O max(autonumber) tem que ter o nome do campo de autonumber original na tabela Base.

                            • Re: LOAD SEM DUPLICAR CHAVE PRIMARIA

                              Fala pessoal, seguindo os exemplo do Fernando e do Yuri, e um pouco de cada ideia que o pessoal foi deixando, consegui importar os registros na ordem decrescente e utilizando o exists resolvi o problema de chave duplicada.

                               

                              Agora é partir para o próximo desafio que surgiu quando passei desse, pode ser que em breve eu precise abrir mais alguma dúvida, e valeu mesmo pessoal pelo tempo e apoios dedicados em ajudar o próximo.

                               

                              A dúvida agora é a seguinte, nesse caso que foi um pouco de cada qual resposta eu marco como correta? Não queria que ninguém se sentisse prejudicado. Abraço!