Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Pessoal, boa noite!
Estou desenvolvendo uma aplicação que tem como objetivo demostrar toda movimentação do produto na empresa, portanto, devo considerar as Vendas, Compras e as Perdas desses produtos.
Pesquisei diversas postagens referentes Linktables, Concatenate etc, porém, ainda tenho muitas dúvidas e não consigo criar um modelo "correto".
Ao término da carga de dados, está sendo gerado o modelo abaixo com a chaves sintéticas, porém, sei que não é o correto!!!
Se possível, alguém poderia enviar um exemplo de como "unificar" as informações de venda, compras e perdas ?
Nesse caso, qual seria a melhor opção ?
Segue abaixo a parte das cargas das fatos:
for v_ano = VsAnoAtual to VsAnoAtual
for v_mes = 04 to 04
v_mes_f = Num(v_mes, '00')
IF FileSize('lib://DADOS/VDA_VendaDia_$(v_ano)_$(v_mes_f).QVD') > 0 THEN
Trace CARREGANDO ANO $(v_ano) MES $(v_mes_f);
/// Vendas
VENDAS:
LOAD DATA,
NRO_EMPRESA,
SEQPRODUTO,
NRO_SEGMENTO,
SK_CATEGORIA,
SEQFAMILIA,
CGO,
QTDE,
VALOR,
VLR_CONTRIB
FROM [lib://DADOS/VDA_VendaDia_$(v_ano)_$(v_mes_f).QVD](qvd);
ELSE
Trace O QVD de ANO $(v_ano) MES $(v_mes_f) Não existe....;
ENDIF;
/// Compras
COMPRAS:
LOAD NROEMPRESA as NRO_EMPRESA,
DTAENTRADA AS DATA,
NROCGO,
QTDEMBALAGEM,
QUANTIDADE,
VLRITEM,
SEQPRODUTO,
SEQFAMILIA;
SQL SELECT NROEMPRESA,
DTAENTRADA,
NROCGO,
QTDEMBALAGEM,
QUANTIDADE,
VLRITEM,
SEQPRODUTO,
SEQFAMILIA,
(SELECT Y.SEQFAMILIA FROM DIM_PRODUTO Y WHERE Y.SEQPRODUTO = X.SEQPRODUTO) SEQFAMILIA
FROM DWNAGT_NFLOJAMATRIZ X
where X.NROCGO IN (1,7,200)
and X.DTAENTRADA >= to_date( '2019-04-01', 'YYYY-MM-DD' );
////Perdas
PERDA:
LOAD CODGERALOPER,
TIPO_PERDA,
DTAENTRADASAIDA as DATA,
SEQPRODUTO,
SEQFAMILIA,
NRO_EMPRESA,
(QTDLANCTO* VALORLANCTO) as VALORLANCTO;
SQL SELECT CODGERALOPER,
"TIPO_PERDA",
DTAENTRADASAIDA,
SEQPRODUTO,
"NRO_EMPRESA",
QTDLANCTO,
SEQFAMILIA,
VALORLANCTO,
VALORLANCTOBRT
FROM CONSINCODW."QLV_PERDA"
WHERE CODGERALOPER IN (35,33,24,90)
and DTAENTRADASAIDA >= to_date( '2019-04-01', 'YYYY-MM-DD' );
Bom dia ,
basicamente, as chaves sintéticas são criadas porque você tem mais de 1 campo em comum entre as tabelas.
dessa forma, você precisaria criar um novo campo concatenando esses campos em comum para criar uma Chave ou ID entre a suas tabelas fato e a dimensão.
acho que é isso
Danilo, boa tarde!
Conceitualmente entendi como deve funcionar o processo, porém, ainda tenho dificuldade para criar a estrutura.
Nesse caso, deveria unificar em uma unica tabela os movimentos de vendas, compras e perdas ?
Bom dia @Cipolla ,
não sei qual seria a regra para a criação da chave, para que as suas tabelas conversem (código com código, item com item, etc).
Mas você pode tentar realizar o seguinte:
Quando temos o mesmo nome de campo em duas tabelas ou mais, automaticamente estas tabelas são relacionadas.
O que você pode fazer é criar um alias (usando o comando AS. Ex: DATA AS DataCompras), e na sequência criar uma chave nas 3 tabelas:
Data&'|'&NROEMPRESA&'|'&SEQPRODUTO%'|'&SEQFAMILIA AS ChavePrincipal
Aí você coloca esta mesma chave no Load das 3 tabelas. Como estará com o mesmo alias, o Qlik irá criar um relacionamento com esta chave.
Caso não precise utilizar os campos que estão na chave, você pode comentá-los individualmente, senão creio que o ideal seria criar um alias para cada um, conforme citado acima.
Obs: o alias deve ser diferente um do outro, senão ele irá criar um vínculo, igual será criado com o ChavePrincipal, fazendo com que a chave sintética seja criada novamente.
Espero ter ajudado.
Olá ,
Para resolver esse problema, vamos criar uma tabela de ligação (Link Table).
Para criar a LinkTable, você deve criar uma chave utilizando a função AutoNumber(), concatenando os campos comuns entre as tabelas e comentar os campos envolvidos na chave.
COMPRAS:
LOAD
AutoNumber(NROEMPRESA&'|'&DTAENTRADA&'|'&SEQFAMILIA&'|'&SEQPRODUTO) as %ChaveLinkTable,
//NROEMPRESA as NRO_EMPRESA,
//DTAENTRADA AS DATA,
NROCGO,
QTDEMBALAGEM,
QUANTIDADE,
VLRITEM,
//SEQPRODUTO,
//SEQFAMILIA;
SQL SELECT NROEMPRESA,
DTAENTRADA,
NROCGO,
QTDEMBALAGEM,
QUANTIDADE,
VLRITEM,
SEQPRODUTO,
SEQFAMILIA,
(SELECT Y.SEQFAMILIA FROM DIM_PRODUTO Y WHERE Y.SEQPRODUTO = X.SEQPRODUTO) SEQFAMILIA
FROM DWNAGT_NFLOJAMATRIZ X
where X.NROCGO IN (1,7,200)
and X.DTAENTRADA >= to_date( '2019-04-01', 'YYYY-MM-DD' );
PERDA:
LOAD
AutoNumber(NRO_EMPRESA&'|'&DTAENTRADASAIDA&'|'&SEQFAMILIA&'|'&SEQPRODUTO) as %ChaveLinkTable,
CODGERALOPER,
TIPO_PERDA,
//DTAENTRADASAIDA as DATA,
//SEQPRODUTO,
//SEQFAMILIA,
//NRO_EMPRESA,
(QTDLANCTO* VALORLANCTO) as VALORLANCTO;
SQL SELECT CODGERALOPER,
"TIPO_PERDA",
DTAENTRADASAIDA,
SEQPRODUTO,
"NRO_EMPRESA",
QTDLANCTO,
SEQFAMILIA,
VALORLANCTO,
VALORLANCTOBRT
FROM CONSINCODW."QLV_PERDA"
WHERE CODGERALOPER IN (35,33,24,90)
and DTAENTRADASAIDA >= to_date( '2019-04-01', 'YYYY-MM-DD' );
VENDAS:
LOAD
AutoNumber(NRO_EMPRESA&'|'&DATA&'|'&SEQFAMILIA&'|'&SEQPRODUTO) as %ChaveLinkTable,
//DATA,
//NRO_EMPRESA,
//SEQPRODUTO,
NRO_SEGMENTO,
SK_CATEGORIA,
//SEQFAMILIA,
CGO,
QTDE,
VALOR,
VLR_CONTRIB
FROM [lib://DADOS/VDA_VendaDia_$(v_ano)_$(v_mes_f).QVD](qvd);
Depois de criar a chave e comentar/eliminar os campos comuns entre as tabelas, vamos criar a tabela de ligação (LinkTable).
Link Table:
LOAD DISTINCT
AutoNumber(NROEMPRESA&'|'&DTAENTRADA&'|'&SEQFAMILIA&'|'&SEQPRODUTO) as %ChaveLinkTable,
NROEMPRESA as NRO_EMPRESA,
DTAENTRADA AS DATA,
SEQPRODUTO,
SEQFAMILIA
Resident COMPRAS;
LOAD DISTINCT
AutoNumber(NRO_EMPRESA&'|'&DTAENTRADASAIDA&'|'&SEQFAMILIA&'|'&SEQPRODUTO) as %ChaveLinkTable,
DTAENTRADASAIDA as DATA,
SEQPRODUTO,
SEQFAMILIA,
NRO_EMPRESA
Resident PERDA;
LOAD DISTINCT
AutoNumber(NRO_EMPRESA&'|'&DATA&'|'&SEQFAMILIA&'|'&SEQPRODUTO) as %ChaveLinkTable,
DATA,
NRO_EMPRESA,
SEQPRODUTO,
SEQFAMILIA
Resident VENDAS;
Pronto!
Segue link de um material muito bom sobre Link Table:
http://dicasqlikview.blogspot.com/2011/02/trabalhando-com-mais-de-uma-tabela-fato.html