Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
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
where not Exists (mprd_operacao);
STORE FatoVendaDetalhe into D:\1-QLIKVIEW_DESENVOLVIMENTO\Dados_Armazenados\Dados\2014\Junior\Vendadetalhe_01.qvd(qvd);
DROP Table FatoVendaDetalhe;
Tenta isso:
Temp:
select blo_dtfim from wblgestor;
Let vDataDeFechamento = Peek('blo_dtfim');
Drop Table Temp;
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.
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.
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 ... ;
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.
Tenta isso:
Temp:
select blo_dtfim from wblgestor;
Let vDataDeFechamento = Peek('blo_dtfim');
Drop Table Temp;
Ó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