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: 
Cipolla
Contributor II
Contributor II

Relacionamento Entre Tabelas - Venda, Compras e Perdas - Chave Sintética

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 ?

Ligação.jpg 

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

5 Replies
danilostochi
Creator II
Creator II

Gabriel_Fernandes
Contributor III
Contributor III

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

Cipolla
Contributor II
Contributor II
Author

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 ?

thiago_alessand
Contributor III
Contributor III

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.

 

 

 

vanessa_nery
Partner - Contributor II
Partner - Contributor II

 

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