Skip to main content
Announcements
Have questions about Qlik Connect? Join us live on April 10th, at 11 AM ET: SIGN UP NOW
cancel
Showing results for 
Search instead for 
Did you mean: 
junior_ehlke
Creator III
Creator III

Atualização QVD Incremental

Boa tarde, hoje eu não tenho em meu banco de dados uma estrutura para a carga incremental do QVD com uma data e hora de alteração confiável, tenho nas tabelas o campo chamado "Operação" que teoricamente é um valor por registro inserido. Criei uma tabela com uma data da qual eu vou usar para fechar o período do sistema, exemplo, se tiver a data 31/05/2014 o QVD vai ser atualizado apenas do dia 01/06/2014 para frente, não alterando os dados para traz, porém o arquivo do mes de Janeiro por exemplo tem quase 20 megas de registros, quando eu modifico a data do fechamento ele deleta todos os dados do QVD e deixa apenas alguns, não consegui achar a lógica. Com o período fechado ele retorna zero na consulta e não deveria alterar o QVD, porém ele esta alterando e deixando apenas alguns arquivos. Meu código é o seguinte:

FatoVendaDetalhe:

SQL

select

  ano_mes_numero as id_tempo,

  mprd_operacao,

  mprd_unid_codigo as id_unidade,

  mprd_valor + mprd_nextra1 as mprd_valor,

  mprd_ctmedio,

  mprd_prod_codigo,

  (select prun_difvenda from produn where prun_prod_codigo=mprd_prod_codigo and prun_unid_codigo=mprd_unid_codigo) as difvenda,

  mprd_ctvenda

  from movprodd0114, dw.dim001_tempo where mprd_status='N' and

  ano_mes_numero='2014-01' and mprd_datamvto=data_media_formatodata and mprd_datamvto > (select blo_dtfim from wblgestor) //esse é o campo criado para fechar o periodo;

and

  mprd_dcto_codigo in (select dcto_codigo from dw.tipo_movimento where mvto_descricao='Venda');

Concatenate LOAD

  id_tempo,

  mprd_operacao,

  id_unidade,

  mprd_valor,

  mprd_ctmedio,

  mprd_prod_codigo,

  difvenda,

  mprd_ctvenda

  from (qvd)

  where not Exists (mprd_operacao);

STORE FatoVendaDetalhe into D:\1-QLIKVIEW_DESENVOLVIMENTO\Dados_Armazenados\Dados\2014\Junior\Vendadetalhe_01.qvd(qvd);

DROP Table FatoVendaDetalhe;

Labels (3)
1 Solution

Accepted Solutions
Anonymous
Not applicable

Tenta isso:

Temp:

select blo_dtfim from wblgestor;


Let vDataDeFechamento = Peek('blo_dtfim');


Drop Table Temp;

View solution in original post

6 Replies
Anonymous
Not applicable

Oi, Hamilton.

O que eu posso imaginar é que o campo mprd_operacao não é único. Varios valores dele devem aparecer repetidos entre a nova fatia de dados que está sendo extraída do banco e os dados que estão no qvd. Assim, você lê apenas algunas dados do qvd (os registros cujo mprd_operacao não aparecem nos novos dados).

Como você não tem uma data de alteração dos registros, você não tem como identificar o que foi alterado ou não. Sendo assim, você só pega os registros mais novos, supondo que mprd_datamvto é preenchido no momento da criação do registro com a data atual. Então, como você só faz append nos dados, você pode dispensar o where not Exists (mprd_operacao) do Load.


Se você quiser continuar usando o Exsists(), não tem outro campo que você possa usar? Algo como id_mvto?

Espero ter ajudado.

junior_ehlke
Creator III
Creator III
Author

Boa tarde Bruno, é isto mesmo, fiz um load com o ID e ficou tudo certinho, não alterou nenhum dado, o problema é que esta sendo feito um estudo para retirar esse ID do banco pois esta dando conflito em outros sistemas, não queria ficar dependendo dele. Mas realmente é isto, vou ter que tentar outra solução. Para carregar o SQL tem a opção parecida com o autonumberhash128? talvez assim eu conseguisse criar um ID automático. E se eu não usar o Exists quando a consulta retornar zero ele vai apagar os dados existentes, estou errado? Pois se eu fizer o append corro o risco de algum dado ser alterado, como um cancelamento de NF ou algo assim, por isso a data do fechamento do período.

Anonymous
Not applicable

Você pode tentar criar uma chave concatenada, algo como Cliente_NumeroNF_SerieNF_Ano_Etc. Você conhece o seu banco e sabe que combinação de campos podem identificar unicamente um registro. Então você usa essa chave no lugar do ID.

Mas eu não conheço nenhuma função tipo AutoNumberHash128 no SQL. Mas, mesmo que tivesse, você não iria poder usá-la, pois as funções AutoNumber... têm seus contadores zerados a cada execução do script, não sendo adequadas para carga incremental. No SQL, seria pior: o contador seria zerado a cada select.

Se você achar que vale a pena, pode usar a função Hash128() (ou Hash256()), mas elas retornam uma string. Se a string for maior que a sua chave concatenada, nem adianta usar. De qualquer forma, para usá-la "no SQL", é só fazer um Load sobre Select:

FatoVendaDetalhe:

Load

     Hash128(campo_para_chave_1, campo_para_chave_2, ...) as ChaveVendaDetalhe,

     *;

SQL Select

     campo_para_chave_1,

     campo_para_chave_2,

     ...

     outro_campo,

     ...

From ... ;

junior_ehlke
Creator III
Creator III
Author

Então, tenho uma maneira "simples" para resolver meu problema. Lembra que eu tenho a data de fechamento de período correto? Então eu não quero que o sistema carregue os meses para tráz do informado então eu pensei no seguinte:

if DatadeFechamento>'1'

Faço o SQL de Janeiro e o Store;

Endif

porém como colocar a select (select blo_dtfim from wblgestor) dentro de uma variável? acho que com esse If resolveria meu problema ja que eu separo mes a mes.

Anonymous
Not applicable

Tenta isso:

Temp:

select blo_dtfim from wblgestor;


Let vDataDeFechamento = Peek('blo_dtfim');


Drop Table Temp;

junior_ehlke
Creator III
Creator III
Author

Ótimo bruno, isso mesmo, eu tinha tentado usar esta logica mas estava fazendo da maneira errada.. Resolveu o problema e ficou melhor do que a ideia inicial. Abraço