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

    LOAD SEM DUPLICAR CHAVE PRIMARIA

    Pedro Pazini

      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
              Pedro Pazini

              Boa tarde Luciano, e como eu faço pra carregar do mais atual pro mais antigo ? O qlik faz o load com meus arquivos que são: r*.csv

               

              r607371f612.201510.csv

              r607371f612.201511.csv
              r607371f612.201512.csv
              r607371f612.201603.csv

               

              Outra coisa, ao utilizar o Where not exists(tabela_compra_chave);
              ele não encontra esse campo tabela_compra_chave.

            • 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
                  Pedro Pazini

                  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
                          Pedro Pazini

                          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
                                  Pedro Pazini

                                  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
                                      Yuri Nicolett

                                      No exemplo que montei não vai excluir o histórico, pois estou criando um campo de FLAG para te orientar qual é o valor mais atual do produto. Como te falei, a chave, por ser um autonumber deve ser montada somente após o tratamento da informação que você precisa, pois o autonumber vai criar registros distintos, mesmo que tenha o valor de outras colunas iguais.

                                       

                                      Você consegue enviar um pouco mais de informações para que possa te montar um exemplo melhor?

                                  • 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
                                        Pedro Pazini

                                        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
                                  Pedro Pazini

                                  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!