Skip to main content
Announcements
Qlik Connect 2024! Seize endless possibilities! LEARN MORE
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