Skip to main content
Announcements
Qlik Connect 2024! Seize endless possibilities! LEARN MORE
cancel
Showing results for 
Search instead for 
Did you mean: 
valerioms
Creator
Creator

Script Incremental

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.

1 Solution

Accepted Solutions
Clever_Anjos
Employee
Employee

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

View solution in original post

13 Replies
Clever_Anjos
Employee
Employee

Poderia dar mais detalhes? Como obter ajuda? Leia antes de postar

valerioms
Creator
Creator
Author

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.

Clever_Anjos
Employee
Employee

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

TiagoCardoso
Creator II
Creator II

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

valerioms
Creator
Creator
Author

Novas linhas são adicionadas a um arquivo.

TiagoCardoso
Creator II
Creator II

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') ;

valerioms
Creator
Creator
Author

Não Tiago. Eu tenho um arquivo que é acrescido de linhas diariamente. No exemplo dado eu tenho o arquivo XPTO_201703.xls que é do mês de Março.

TiagoCardoso
Creator II
Creator II

Então se for assim, meu primeiro comentário te satisfaz?

valerioms
Creator
Creator
Author

Penso que sim. Vou executar e respondo. Por enquanto obrigado.