18 Replies Latest reply: Jul 6, 2017 3:38 PM by Marcel Vinicius de Oliveira RSS

    Load Incremental para atualizar somente

    Marcel Vinicius de Oliveira

      Bom dia Pessoal, como vão?

       

      Estou com uma dúvida/problema: tenho um Load incremental que esta rodando certinho. Porém se eu rodo a mesma data de consulta ele só soma arquivos ao invés de só atualiza-los. Eu não sei como fazer para ele excluir e atualizar.

      Obs.: Retorno dados de uma procedure e a mesma não tem chave primária.

       

      LET vrDataIni  = Date(MonthStart(Today()),'YYYY/MM/DD'); //Primeiro dia do mes

      LET vrDataFim  = Date(MonthEnd(Today()),'YYYY/MM/DD'); //Ultimo dia do mes

      LET vrMes = Date(MonthStart(Today()), 'DD/MM/YYYY'); //Mes ativo

      LET vrAnoQvd = Date(MonthStart(Today()), 'YYYY'); //Ano ativo

       

      Consumo Itens:

      //*EXECUTE dbo.GetItemConsumo @Empresa, @Estabelecimento, @DtInicio, @DtFim*/

      SQl Execute dbo.GetItemConsumo '1', '1', '$(vrDataIni)','$(vrDataFim)';

       

      Consumo Anterior:

      LOAD * FROM [lib://itens/consumoitens_$(vrAnoQvd).qvd] (qvd);

       

      Concatenate

      Get Consumo Itens:

      SQL SELECT * FROM ##GetItemConsumo;

       

      Store Get Consumo Itens into [lib://itens/consumoitens_$(vrAnoQvd).qvd] (qvd);

        • Re: Load Incremental para atualizar somente
          Marcel Vinicius de Oliveira

          Obs. 2: Verifiquei o retorno direto da procedure e a mesma traz esses campos:

          Código, Descricao, Identificaçao, DataMovimento - consigo concatena-los para ser chave primária?

          Exemplo: não posso passar somente um deles pois pode ter mais consumos do mesmo tipo de item em datas diferentes:

          1AA  BUCHA  CA001  27/01/2017 00:00:00

          1AA  BUCHA  CC191  18/01/2017 00:00:00

          1AA  BUCHA  CC171  07/01/2017 00:00:00

          1AA  BUCHA  CA010  26/01/2017 00:00:00

          1AA  BUCHA  CC194  22/01/2017 00:00:00

          1AA  BUCHA  CC196  04/01/2017 00:00:00

            • Re: Load Incremental para atualizar somente
              MARIO SOARES

              Amigo, segue exemplo para gerar chave exclusiva:

               

              Hash128( Código, Descricao, Identificaçao, DataMovimento) As 'SK_TAB1',
              

               

              A função Hash128() gera 22 caracteres e o resultado é persistente, já em seu conjunto... Se optar em utilizar &' '& para concatenar os campos, parece que o resultado poderá ser superior a 22 caracteres.

                • Re: Load Incremental para atualizar somente
                  MARIO SOARES

                  Sobre performance,

                  Lembrando que a representação do hash ficará na tabela de símbolos, porém a tratativa interna para possíveis associações no modelo de dados será com a tabela de dados que é a representado por binários (que são como ponteiros para as tabelas de símbolos).

                  • Re: Load Incremental para atualizar somente
                    Marcel Vinicius de Oliveira

                    Boa tarde Mario,

                    Obrigado pela dica. Essa função concatena essas colunas? Eu coloco no Load ou no Select?

                    Ao rodar no meu Select:

                    Ocorreram os seguintes erros:

                     

                    ErrorSource: Microsoft OLE DB Provider for SQL Server, ErrorMsg: 'Hash128' is not a recognized built-in function name.

                     

                    O erro ocorreu aqui:

                     

                    SQL SELECT Hash128(Código, Descricao, Identificaçao, DataMovimento) As 'SK_TAB1' FROM ##GetItemConsumo

                      • Re: Load Incremental para atualizar somente
                        MARIO SOARES

                        Amigo, é no Load mesmo;

                         

                        Utiliza a declaração Load antes do SQL;

                        Exemplo:

                         

                        Load
                            Hash128(Código, Descricao, Identificaçao, DataMovimento) As 'SK_TAB1',
                            *;
                        SQL 
                             SELECT 
                                  *
                             FROM ##GetItemConsumo;
                        
                          • Re: Load Incremental para atualizar somente
                            Marcel Vinicius de Oliveira

                            Muito obrigado Mario,

                            Ta funcionando, estou com outros problemas mas posto ajuda depois.

                             

                            Atenciosamente.

                            • Re: Load Incremental para atualizar somente
                              Marcel Vinicius de Oliveira

                              A unica coisa é que ele esta substituindo todas as informações, saberia me dizer por que?

                               

                              Exemplo:

                              Tenho esse retorno no mês de JAN:

                              4410 TRAVA  CC297 20/01/2017 00:00:00

                              4410 TRAVA  CC170 12/01/2017 00:00:00

                              4410 TRAVA  CC194 03/01/2017 00:00:00

                              E esse retorno em FEV:

                              4410 TRAVA  CC193 13/02/2017 00:00:00

                              4410 TRAVA CC171 22/02/2017 00:00:00

                              Estou recuperando as datas e salvando, deveria retornar os 5, mas só retorna os últimos 2 (FEV);

                                • Re: Load Incremental para atualizar somente
                                  MARIO SOARES

                                  Amigo, acho que você não entendeu completamente o seu script;

                                   

                                  Observe o que está fazendo as funções:

                                  Today() = Retorna a data atual do relógio do sistema.

                                  MonthStart() = Retorna à data/hora do primeiro dia do mês.

                                  MonthEnd() = Retorna à data/hora do último dia do mês.

                                  Date() =  Define o formato da data, no seu caso o parâmetro de mascara fornecido 'YYYY/MM/DD'.


                                  Observe que as variáveis vrDataIni e vrDataFim estão sendo utilizados na expressão SQL conforme abaixo em vermelho.

                                  Está sendo gravando nas variáveis o primeiro dia do mês corrente (vrDataIni) e do ultimo dia do mês corrente (vrDataFim).

                                  Logo, o que a tabela [Consumo Itens] irá retornar? Entendeu?


                                  LET vrDataIni = Date(MonthStart(Today()),'YYYY/MM/DD'); //Primeiro dia do mes

                                  LET vrDataFim = Date(MonthEnd(Today()),'YYYY/MM/DD'); //Ultimo dia do mes

                                  LET vrMes = Date(MonthStart(Today()), 'DD/MM/YYYY'); //Mes ativo

                                  LET vrAnoQvd = Date(MonthStart(Today()), 'YYYY'); //Ano ativo

                                   

                                  [Consumo Itens]:

                                  //*EXECUTE dbo.GetItemConsumo @Empresa, @Estabelecimento, @DtInicio, @DtFim*/

                                  SQL Execute dbo.GetItemConsumo '1', '1', '$(vrDataIni)','$(vrDataFim)';

                                   

                                  Tem outros pontos que não fazem muito sentido para mim, veja:

                                   

                                  Consumo Itens:

                                  //*EXECUTE dbo.GetItemConsumo @Empresa, @Estabelecimento, @DtInicio, @DtFim*/

                                  SQl Execute dbo.GetItemConsumo '1', '1', '$(vrDataIni)','$(vrDataFim)';

                                   

                                  Consumo Anterior:

                                  LOAD * FROM [lib://itens/consumoitens_$(vrAnoQvd).qvd] (qvd);

                                   

                                  Concatenate

                                  Get Consumo Itens:

                                  SQL SELECT * FROM ##GetItemConsumo;

                                   

                                  Store Get Consumo Itens into [lib://itens/consumoitens_$(vrAnoQvd).qvd] (qvd); //Store Get Consumo Itens? Mas não realizou uma concatenação forçada com Consumo Anterior? Mas se a tabela concatenada Consumo Anterior estiver os mesmos campos de Consumo Itens, isso também significa que ocorrerá uma concatenação automática com Consumo Itens, logo a função Store não deveria estar com a tabela Consumo Itens para gravar o conjunto então?


                                  Existem muitas formas de fazer o que deseja, mas é necessário ter o domínio dos detalhes e os requisitos, informações que não aparentam estar explícitos na questão.

                                  Ex.:

                                  • Período de carga inicial (A partir de quando?)
                                  • Período de carga para atualização (Ex.: >= a 3 meses anteriores a partir do Today() e <= 1 mês anterior a partir do Today())
                                  • Atualização em quais campos  e onde gravar as alterações dos campos e flags para gerar os históricos se for o caso
                                  • Período de carga para inclusão (Ex.: mês corrente)
                                  • Ciclo de carga (Ex.: mensal, semanal...)
                                  • ...


                                  Script para atualização e inclusão de dados, dependendo das regras dos processos de negócio, as vezes não poderá recuperar o histórico por conta de um detalhe não bem definido no script.

                                  Ex.: Uma tabela de banco de dados que com o tempo o sistema substitui um campo de status (pendente, aprovado, cancelado) de um pedido, e simplesmente não registra o histórico com o tempo para estas ocorrências, então uma vez perdido o histórico no QVD, já era.

                                   

                                  Veja amigo:

                                  Concatenando tabelas ‒ QlikView


                                  Acho que a sua resposta está neste link:

                                  Carregando registros novos e atualizados com carregamento incremental ‒ Qlik Sense

                                  Rotina de Carga Incremental Simples - Qknow

                                   

                                  Grande abraço.

                        • Re: Load Incremental para atualizar somente
                          Marcel Vinicius de Oliveira

                          Bom dia, alguém pode me ajudar?

                          Sabe como concatenar informações na hora do select?