13 Replies Latest reply: Mar 9, 2017 8:18 AM by Clever Anjos RSS

    Script Incremental

    Valerio Moreira dos Santos

      Boa tarde!

      Tenho um qvd que carrega arquivos de um diretório. O arquivo é acrescido dia após dia de informações. Preciso de um script que faça o carregamento apenas das informações do dia. Alguma ajuda? No aguardo, obrigado.

          • Re: Script Incremental
            Valerio Moreira dos Santos

            Sim. É o seguinte, tenho um diretório com os seguintes arquivos:

            XPTO_201701, XPTO_201702 e XPTO_201703. Este último refere-se ao mês de Março e todo dia é incrementado. Preciso criar um script que faça a leitura de todos os arquivos e depois passe a fazer apenas do último ou seja, Março.

              • Re: Script Incremental
                Clever Anjos

                Incrementado você diz é um novo arquivo na pasta com a data no nome do arquivo ou novas linhas são adicionadas a um arquivo?

                  • Re: Script Incremental
                    Valerio Moreira dos Santos

                    Novas linhas são adicionadas a um arquivo.

                      • Re: Script Incremental
                        Clever Anjos

                        No arquivo, tem algum pedaço de cada linha que identifica a data?

                          • Re: Script Incremental
                            Clever Anjos

                            Para fazer um incremental precisamos sempre de uma chave para identificar o que já foi lido e o que não foi

                              • Re: Script Incremental
                                Valerio Moreira dos Santos

                                Bom dia Clever!

                                Não há nenhum pedaço que identifique uma data que possa ser usada. Vamos fazer o seguinte, preciso que leia apenas o arquivo do mês vigente. Lógico que na primeira carga vai ler todos do diretório mas posteriormente apenas o do mês vigente.

                                  • Re: Script Incremental
                                    Clever Anjos

                                    Acredito que deva servir

                                     

                                    SET PATHCSV=D:\tmp; // Onde estao os arquivos
                                    SET QVDIncremental=D:\tmp\QvdIncremental.qvd; // QVD
                                    LET MesCorrente=Date(Today(),'YYYYMM');
                                    For each file in FileList('$(PATHCSV)\Bilhete*.csv') // Verifica todos os arquivos texto
                                      Let Arq = SubField(SubField(file,'\',-1),'.',1);
                                      If file like '*$(MesCorrente)*' then // Mes corrente é sempre lido
                                      Tab:load *,FileBaseName() as Arquivo FROM [$(file)](txt, utf8, embedded labels, delimiter is ',', msq);
                                      If not isnull(QvdNoOfRecords('$(QVDIncremental)')) then // Existe o QVD?
                                      concatenate(Tab) load * from [$(QVDIncremental)](qvd) where Arquivo <> '$(Arq)';
                                      Endif 
                                      Store Tab into [$(QVDIncremental)](qvd);
                                      else  // Meses anteriores somente são lidos se não existirem
                                      If isnull(QvdNoOfRecords('$(QVDIncremental)')) then // Não existe o QVD, então lê o arquivo
                                      Tab:LOAD *,FileBaseName() as Arquivo FROM [$(file)](txt, utf8, embedded labels, delimiter is ',', msq);
                                      else // Verificar se o mes processado esta no qvd
                                      c: noconcatenate first 1 load * from [$(QVDIncremental)](qvd) where Arquivo = '$(Arq)';
                                      If NoOfRows('c') = 0  Then // Não estava então precisa ler
                                      Tab:noconcatenate load *,FileBaseName() as Arquivo FROM [$(file)](txt, utf8, embedded labels, delimiter is ',', msq);
                                      concatenate(Tab) load * from [$(QVDIncremental)](qvd) where Arquivo <> FileBaseName('$(file)');
                                      end if
                                      drop table c; 
                                      end if
                                      end if
                                    
                                    
                                      If TableNumber('Tab') >= 0 then
                                      If NoOfRows('Tab') > 0 then
                                      Store Tab into [$(QVDIncremental)](qvd);
                                      Drop Table Tab;
                                      end if 
                                      End if 
                                    Next
                                    
                      • Re: Script Incremental
                        Tiago Fernando Cardoso

                        valerioms, boa tarde.

                         

                        O seguinte trecho de código, retirei e alterei diretamente do site Help da Qlik...

                         

                        Se o que você precisa é carregar apenas os dados de hoje da sua fonte de dados e depois anexar apenas os dados de hoje ao seu qvd, pode tentar mais ou menos o seguinte:

                         

                        #Gerar uma variável que carregara a data de hoje:

                         

                        LET vHoje = Today();
                        


                        #Carregar os dados de hoje


                        SuaTabela:

                        LOAD * FROM SuaBase WHERE [SeuCampoData] = '$(vHoje)';
                        

                         

                        #Unir os dados carregados com os antigos:

                         

                        Concatenate LOAD * FROM SeuArquivo.QVD;
                        

                         

                        #Gerar um novo QVD atualizado:

                         

                        STORE 'SuaTabela' INTO SeuArquivo.QVD;
                        

                         

                         

                        Basicamente é isso, o modelo mais simples de carga incremental.

                        Caso precise de mais modelos, pesquise por 'carga incremental qlikview' no goole e entre no link da Help Qlikview para ver outros modelos e exemplos.

                         

                        Espero que lhe seja útil.

                        Att,

                        tiagocardoso

                        • Re: Script Incremental
                          Tiago Fernando Cardoso

                          Valério pelo que percebi, você tem um arquivo para cada dia...

                          Pode aplicar o ScanFolder (função que varre um ou mais diretórios e carrega os arquivos de forma 'automática') no seu diretório e na sequência gerar um QVD incremental (usando basicamente o que eu mencionei acima), mas antes de tudo, segue o código default do ScanFolder - adapte ao que você precisa:

                           

                          Corpo da função:

                           

                          Set vConcatenate = ;
                          sub ScanFolder(Root)
                                    for each FileExtension in 'csv'
                                              for each FoundFile in filelist( Root & '\*.' & FileExtension)
                                                        FileList:
                                                        $(vConcatenate)
                                                        LOAD *, '$(FoundFile)' as SourceFile
                                                        FROM [$(FoundFile)] (txt, codepage is 1252, embedded labels, delimiter is ',', msq, header is 2 lines);
                                                        Set vConcatenate = Concatenate;
                                              next FoundFile
                                    next FileExtension
                                    for each SubDirectory in dirlist( Root & '\*' )
                                              call ScanFolder(SubDirectory)
                                    next SubDirectory
                          end sub
                          

                           

                          Chamada da função no seu diretório:

                           

                          Call ScanFolder('C:\Users\hic\Documents\2012\Work\QV Apps\DoDir') ;