Skip to main content
Announcements
Live today at 11 AM ET. Get your questions about Qlik Connect answered, or just listen in. SIGN UP NOW
cancel
Showing results for 
Search instead for 
Did you mean: 
mercadante
Creator
Creator

Gerar QVD com foto diária

Sr.(as) Boa tarde!

Alguém pode me ajudar com a seguinte necessidade.

Tenho uma consulta que retorna faturamento e arrecadação, preciso armazenar uma foto diária  desta carga em um QVD.

Porem só quero gravar as linhas que tiveram alteração, pois duplicar o arquivo não é viável

Pensei algo do tipo, diariamente faço a carga e comparo os registros da consulta com os registros já gravados no QVD. Se teve alguma alteração em algum campo eu gravo o registro com a data da alteração. Caso contrário descarto o registro e mantenho o que está no QVD. Não vou substituir o registro do qvd, se tiver alteração adiciono a linha se não mantenho.

Alguém pode me mostrar o caminho das pedras por gentileza?

Obrigado!

18 Replies
lucianosv
Specialist
Specialist

Antônio, o que pode alterar no banco? Você poderia criar um campo na tabela para gravar um autonumberrash feito com todos os campos que podem alterar?

O ideal seria você ter um identificador de linha e comparar só o autonumberrash das linhas entre o qvd e o banco.

mercadante
Creator
Creator
Author

Luciano,

Vou criar uma chave com os 51 campos da minha tabela.

Agora minha duvida é, preciso criar utilizando o autonumber, ou posso simplesmente concatenar os campos e depois compara-los com QVD com SQL?

lucianosv
Specialist
Specialist

Bom dia.

É um pouco custoso para o processamento do QV, mas o autonumberhash parece uma solução melhor que comparar todos os campos.

autonumberhash128(expressão {, expressão})

Calcula um hash de 128 bits dos valores combinados de entrada de expressão e retorna um valor inteiro exclusivo para cada valor de hash distinto encontrado durante a execução do script. Esta função pode ser usada, por exemplo, para criar uma representação de memória compacta de uma chave composta.

Exemplo:

autonumberhash128 ( Região, Ano, Mês )

Apesar disso, você precisará de duas chaves:

Chave 1 - Garantir a compararação das mesmas linhas

Chave 2 - Comparar todo conteúdo da linha.

Caso não ocorram exclusões ou inclusões de linha, talvez você consiga fazer sem a Chave 1, mas o processo ficaria mais fácil de entender com as duas chaves.

nicolett_yuri

Antonio, neste caso você deve utilizar a concatenação de campos, pois o AutoNumberHash é um número gerado em tempo de execução da recarga, a cada recarga esse número pode mudar e não é confiável para a ação que esta tentando utilizar, que é justamente procurar alteração de registro.

lucianosv
Specialist
Specialist

Boa mestre.

Eu achava que o mesmo conjunto de dados geraria o mesmo valor.

Não deveria ser assim?

Aprendi mais uma. Vlw.

mercadante
Creator
Creator
Author

Bom dia!

Estou fazendo desta forma.

[Carga Arrecadação QVD]:

load

  CHAVE,

  [Data/Hora Carga]

From

  [$(vPathQvd)\BASE_DIARIA_ARRECADACAO.QVD]

  (qvd);

NoConcatenate

[Carga Arrecadação SQL]:

LOAD

  CHAVE,

  now(0) AS [Data/Hora Carga]

;

sql

SELECT

  CAMPO01||'|'|| CAMPO02 ||'|'|| CAMPO03 ||'|'|| CAMPO04 ||'|'|| CAMPO05||'|'|| CAMPO06||'|'|| CAMPO07||'|'|| CAMPO08||'|'|| CAMPO09||'|'|| CAMPO09

  ||'|'|| CAMPO10||'|'|| CAMPO11||'|'|| CAMPO12||'|'|| CAMPO13||'|'|| CAMPO14||'|'|| CAMPO15||'|'|| CAMPO16||'|'|| CAMPO17||'|'|| CAMPO18 ||'|'|| CAMPO19||'|'|| CAMPO20

  ||'|'|| CAMPO21 ||'|'|| CAMPO22||'|'|| CAMPO23||'|'|| CAMPO24||'|'|| CAMPO25||'|'|| CAMPO26||'|'|| CAMPO27||'|'|| CAMPO28||'|'|| CAMPO29||'|'|| CAMPO30||'|'|| CAMPO31

  ||'|'|| CAMPO32||'|'|| CAMPO33||'|'|| CAMPO34||'|'|| CAMPO35||'|'|| CAMPO36||'|'|| CAMPO37||'|'|| CAMPO38||'|'|| CAMPO39||'|'|| CAMPO40||'|'|| CAMPO41||'|'|| CAMPO42

  ||'|'|| CAMPO43 ||'|'|| CAMPO44||'|'|| CAMPO45||'|'|| CAMPO46||'|'|| CAMPO47||'|'|| CAMPO48||'|'|| CAMPO49||'|'|| CAMPO50 AS CHAVE

from

      arrecadacao_analitico;

Concatenate ([Carga Arrecadação QVD])

load

  CHAVE,

  [Data/Hora Carga]

Resident

  [Carga Arrecadação SQL]

where

  not Exists('CHAVE',[CHAVE]);

Minha intenção é que quando tenha inclusão de informação no QVD, ele grave a data e hora que esta informação foi alterada.

Mas esta substituindo tudo

nicolett_yuri

Negativo, inclusive se você fizer uma carga incremental e gerar qvds históricos, o risco das chaves se perderem é muito alto. O mais correto é concatenação de campos ou então você deixa para gerar a chave de todos os qvds históricos no momento de leitura para a aplicação final.

lucianosv
Specialist
Specialist

Bom saber.

Mas honestamente considero isso um bug. O algorítimo deveria ser o mesmo e não nos obrigar a concatenar 51 campos e compará-los.

Uma pena.

mercadante
Creator
Creator
Author

Srs. Aparentemente consegui resolver com esse código.

Muito obrigado pela ajuda de vocês, foi fundamental para o meu entendimento.

[QVD]:

load

  CHAVE,

  [Data/Hora Carga]

From

  [$(vPathQvd)\ARRECADACAO.QVD]

  (qvd);

Concatenate([QVD])

LOAD

  now(0) AS [Data/Hora Carga],

  campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo

  &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo

  &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo

  &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo

  &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo

  &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo as CHAVE

where

  not Exists('CHAVE',campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo

    &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo

    &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo

    &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo

    &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo

    &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo &'|'& campo)

;

sql

SELECT

  campo ||'|'|| campo ||'|'|| campo ||'|'|| campo ||'|'|| campo ||'|'|| campo ||'|'|| campo ||'|'|| campo ||'|'|| campo ||'|'|| campo

  ||'|'|| campo ||'|'|| campo ||'|'|| campo ||'|'|| campo ||'|'|| campo ||'|'|| campo ||'|'|| campo ||'|'|| campo ||'|'|| campo

  ||'|'|| campo ||'|'|| campo ||'|'|| campo ||'|'|| campo ||'|'|| campo ||'|'|| campo ||'|'|| campo ||'|'|| campo ||'|'|| campo

  ||'|'|| campo ||'|'|| campo ||'|'|| campo ||'|'|| campo ||'|'|| campo ||'|'|| campo ||'|'|| campo ||'|'|| campo

  ||'|'|| campo ||'|'|| campo ||'|'|| campo ||'|'|| campo ||'|'|| campo ||'|'|| campo ||'|'|| campo ||'|'|| campo

  ||'|'|| campo ||'|'|| campo ||'|'|| campo ||'|'|| campo ||'|'|| campo ||'|'|| campo ||'|'|| campo AS CHAVE,

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

  campo

from

  arrecadacao_analitico;