Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Senhores, Boa tarde!
Estou com a seguinte situação, tenho 4 banco de dados, uma matriz e três filiais, implementei na interface quatro botões onde escolho qual quero realizar a analise e faço a carga dos dados. Agora preciso realizar uma analise comparativa onde mostre as vendas, e outras informações de todas de uma forma consolidada, o que vocês recomendam para poder implementar essa recurso.
Desde já agradeço a quem possa me orientar.
Abraço.
Boa noite, Alessandro,
Testei o script com for que você enviou, porém duas situações ocorreram:
1 ) No teste IF $(vBanco)=1 THEN ele conecta no banco da matriz executa o script depois trava o computador.
analisando identifiquei que a variável vBanco não é incrementada então adicionei um incremento antes do
next => vBanco = vBanco + 1; com isso ele se conecta em todas as base e executa o script depois trava
nesta tela abaixo:
Edlazaro,
segue um exemplo do laco sem conexão com banco para ver que não precisa incrementar na mão......O For faz isto.
O ideal seria deixar quem sabe 1 tabela e colocar trace para ver aonde para.
E se me permite uma sugestão, troque todos os SELECT *
por
SELECT CAMPO1,CAMPO2 From .....
Desta forma, a performance muda muito. Para dar um exemplo, lendo 2 tabelas do SAP com * levava +20minutos. Com os campos que precisávamos, caiu o tempo para 2 minutos. Neste caso, as tabelas tinham +150campos.....Nao conheço as suas, mas como boa pratica, nunca usar o *......
Segue o script....
For vBanco = 1 to 4
IF $(vBanco)=1 THEN
SET vLoja=Matriz;
//OLEDB CONNECT TO [Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Initial Catalog=Matriz;Data Source=x.x.x.x.x;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=NOTEDLAZARO;Use Encryption for Data=False;Tag with column collation when possible=False] (XPassword is STNVLaJOBDdeGZVNBbcIXSJOSBMCTYAIASTA);
Endif
IF $(vBanco)=2 THEN
SET vLoja=Feira;
//OLEDB CONNECT TO [Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Initial Catalog=Feira;Data Source=x.x.x.x.x;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=NOTEDLAZARO;Use Encryption for Data=False;Tag with column collation when possible=False] (XPassword is STNVLaJOBDdeGZVNBbcIXSJOSBMCTYAIASTA);
Endif
IF $(vBanco)=3 THEN
SET vLoja=VCA;
//OLEDB CONNECT TO [Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Initial Catalog=VCA;Data Source=x.x.x.x.x;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=NOTEDLAZARO;Use Encryption for Data=False;Tag with column collation when possible=False] (XPassword is STNVLaJOBDdeGZVNBbcIXSJOSBMCTYAIASTA);
Endif
IF $(vBanco)=4 THEN
SET vLoja=Aracaju;
//OLEDB CONNECT TO [Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Initial Catalog=Aracaju;Data Source=x.x.x.x.x;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=NOTEDLAZARO;Use Encryption for Data=False;Tag with column collation when possible=False] (XPassword is STNVLaJOBDdeGZVNBbcIXSJOSBMCTYAIASTA);
ENDIF
TRACE ================================;
TRACE ==== $(vLoja) ====;
TRACE ================================;
// ------------------------------
Tabela:
LOAD
'$(vLoja)' as Loja,
CampoA,
CampoB;
LOAD * INLINE [
CampoA,CampoB
TesteA,TesteB
];
next
DISCONNECT;
IMPORTANTE
Vi agora. Na realidade nao tinha prestado muita atencao a imagem. Tem chaves sinteticas nela. Este é o motivo da demora.
Neste caso podes fazer assim
For vBanco = 1 to 4
IF $(vBanco)=1 THEN
SET vLoja=Matriz;
//OLEDB CONNECT TO [Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Initial Catalog=Matriz;Data Source=x.x.x.x.x;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=NOTEDLAZARO;Use Encryption for Data=False;Tag with column collation when possible=False] (XPassword is STNVLaJOBDdeGZVNBbcIXSJOSBMCTYAIASTA);
Endif
IF $(vBanco)=2 THEN
SET vLoja=Feira;
//OLEDB CONNECT TO [Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Initial Catalog=Feira;Data Source=x.x.x.x.x;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=NOTEDLAZARO;Use Encryption for Data=False;Tag with column collation when possible=False] (XPassword is STNVLaJOBDdeGZVNBbcIXSJOSBMCTYAIASTA);
Endif
IF $(vBanco)=3 THEN
SET vLoja=VCA;
//OLEDB CONNECT TO [Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Initial Catalog=VCA;Data Source=x.x.x.x.x;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=NOTEDLAZARO;Use Encryption for Data=False;Tag with column collation when possible=False] (XPassword is STNVLaJOBDdeGZVNBbcIXSJOSBMCTYAIASTA);
Endif
IF $(vBanco)=4 THEN
SET vLoja=Aracaju;
//OLEDB CONNECT TO [Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Initial Catalog=Aracaju;Data Source=x.x.x.x.x;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=NOTEDLAZARO;Use Encryption for Data=False;Tag with column collation when possible=False] (XPassword is STNVLaJOBDdeGZVNBbcIXSJOSBMCTYAIASTA);
ENDIF
If $(vBanco)= 1 THEN
SET vTabela='Tabela:';
ELSE
SET vTabela='concatenate (Tabela)';
ENDIF;
TRACE ================================;
TRACE ==== $(vLoja) ====;
TRACE ================================;
$(vTabela)
LOAD
'$(vLoja)' as Loja,
CampoA,
CampoB;
LOAD * INLINE [
CampoA,CampoB
TesteA,TesteB
];
next
DISCONNECT;
A parte que muda seria esta:
If $(vBanco)= 1 THEN
SET vTabela='Tabela:';
ELSE
SET vTabela='concatenate (Tabela)';
ENDIF;
TRACE ================================;
TRACE ==== $(vLoja) ====;
TRACE ================================;
$(vTabela)
LOAD
'$(vLoja)' as Loja,
CampoA,
CampoB;
LOAD * INLINE [
CampoA,CampoB
TesteA,TesteB
];
sendo que teria que dar uma trabalhada para atender as tabelas. Neste caso fiz para uma......
Bom dia! Alessandro,
Seguir a sua recomendação no comando select, deixando somente os campos que preciso. Quanto ao travamento continua sempre para nas chave sintética, porém se executarmos somente em uma tabela não trava, não entendi
essa parte abaixo que você incluiu.
If $(vBanco)= 1 THEN
SET vTabela='Tabela:';
ELSE
SET vTabela='concatenate (Tabela)';
ENDIF;
Para não travar com chaves sintéticas, depois da primeira leitura, usaríamos o concatenate para forçar o Qlik a colocar na mesma tabela os dados que estão sendo lidos.
Então basicamente seria,
vBanco = 1
Tabela:
LOAd
.....
vBanco=2
concatenate (Tabela)
LOAD
....
Alessandro,
Obrigado pela sua ajuda, mas infelizmente não funcionou a contento, com a utilização de chave sintética houve perda de performance/travamento ou eu não estou acertando implementar corretamente no script. Estarei pesquisando outras formas de implementar esse recurso. Caso alguém tenha mais alguma informação que possa ajudar fico grato.
Como ficou sua modelagem final?
Anexe um print
Edlazaro,
a ideia é não ter chave sintética.
Fiz um modelo que você pode rodar e deve funcionar.
Tem um bloco inicial que vai criar as tabelas com um campo chamado Lixo que depois sera removido.
Assim, os LOAD com concatenate funcionara e não vai criar chave sintética.
Alessandro,
Você poderia enviar o script em formato texto, estou usando a versão personal edition, não tenho com abrir qvw.
Obrigado!