Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Oi Gente,
Tenho uma query sql e depois gostaria de transformar em algo incremental. Ate hoje eu usei uma solução de criar uma string e adicionar ela no where, mas gostaria de saber se é possivel utilizar um FIELD do qvd como clausula.
//******************************************************************************
//FIELD DO QVD
MO_ISSUE_FIELD_STRING:
ISSUE_ID
FROM
[lib://Dados/TESTE/MO_ISSUE_FIELD_STRING.qvd](qvd);
//******************************************************************************
//CONCATENACAO DA EXTRACAO DOS CASOS NOVOS
CONCATENATE(MO_ISSUE_FIELD_STRING)
//******************************************************************************
MO_ISSUE_FIELD_STRING:
Load
ID_ISSUE_FIELD_STRING AS ISSUE_FIELD_STRING_ID,
ISSUE_FIELD_ID,
ISSUE_ID,
FIELD_ID AS CATEGORY_ID,
FIELD_VALUE AS CATEGORY_VALUE,
1 AS ID_STORAGE_TYPE
;
select
ID_ISSUE_FIELD_STRING,
ISSUE_FIELD_ID,
ISSUE_ID,
FIELD_ID,
FIELD_VALUE
from MO_ISSUE_FIELD_STRING
where
????? //GOSTARIA DE COLOCAR AQUI APENAS OS CASOS ONDE ID_ISSUE NAO EXISTA NO QVD
//********************************************************************************
//GAMBIARRA QUE EU USO ATUALMENTE PARA GERAR AUX QUE VAI NA CLAUSULA WHERE
LET vWHERE='';
LET Aux='';
ID_ISSUE_LIST:
load
DISTINCT
ISSUE_ID
RESIDENT MO_ISSUE;
For Each ISSUE_ID in FieldValueList('ISSUE_ID')
Aux='ISSUE_ID='& $(ISSUE_ID)&' OR ';
vWHERE=Aux& vWHERE;
NEXT
If Aux='' then
exit Script;
endif
Aux=LEFT(vWHERE,LEN(vWHERE)-3);
********************************************************************************
não, não faz. Tens que fazer na mão....
No QlikView tem um incremental no LOAD para arquivo texto. Este é automático......mas não tem para banco de dados
Eduardo,
da uma olhada no Exists()
Podes usar ele em conjunto com o Where e assim podes ler ou ignorar dados já lidos ou não lidos
Where Not Exists(Campo) // Neste Caso le quando o Campo ainda nao tiver sido lido anteriormente
Where Exists(Campo) // Le se o Campo ja estiver sido lido antes
e quando falo do Campo me refiro ao conteúdo do campo.
Mas este especificamente seria com LOAD
LOAD
Campo1,
Campo2,
Campo3
Where Exists(Campo1);
SQL SELECT Campo1,Campo2,Campo3 From Table;
o SQL tambem tem o Exists()
Oi Alessandro, tudo bem?
Então o Exists() do SQL exige uma subquery e eu nao tenho ela porque o valor que eu quero esta em um qvd e nao em um banco enquanto o comando Exists() do QS não vai impedir de eu extrair tudo do banco e depois fazer o filtro, o que seria bem ruim pra mim pois são muitos dados.
Eduardo,
coloca um LOAD com o Where Exists antes do SELECT (https://help.qlik.com/pt-BR/qlikview/November2017/Subsystems/Client/Content/Scripting/preceding-load... )
A ideia parece genial, mas esse precending load nao vai fazer meu select trazer todo mundo e só depois selecionar o que eu quero?
Ex:
MO_ISSUE_FIELD_STRING:
Load
ISSUE_ID,
Where ISSUE_ID<100
;
select
ISSUE_ID,
from MO_ISSUE_FIELD_STRING;
Se eu fizer isso, ele vai fazer um select no banco só de quem for menor que cem ou ele vai trazer todo mundo e depois filtrar dessa tabela os que são menores que 100?
Alessandro, fiz dois testes pra efeito de comparação
MO_ISSUE_FIELD_STRING:
Load
ID_ISSUE_FIELD_STRING AS ISSUE_FIELD_STRING_ID,
ISSUE_FIELD_ID,
ISSUE_ID,
FIELD_ID AS MO_ISSUE_FIELD_STRING_CATEGORY_ID,
FIELD_VALUE AS MO_ISSUE_FIELD_STRING_CATEGORY_VALUE,
1 AS ID_STORAGE_TYPE
;
select
ID_ISSUE_FIELD_STRING,
ISSUE_FIELD_ID,
ISSUE_ID,
FIELD_ID,
FIELD_VALUE
from MO_ISSUE_FIELD_STRING
WHERE ISSUE_ID >=270166;
17 segundos de processamento
//****************************************************************************************************************
MO_ISSUE_FIELD_STRING:
Load
ID_ISSUE_FIELD_STRING AS ISSUE_FIELD_STRING_ID,
ISSUE_FIELD_ID,
ISSUE_ID,
FIELD_ID AS MO_ISSUE_FIELD_STRING_CATEGORY_ID,
FIELD_VALUE AS MO_ISSUE_FIELD_STRING_CATEGORY_VALUE,
1 AS ID_STORAGE_TYPE
WHERE ISSUE_ID >=270166
;
select
ID_ISSUE_FIELD_STRING,
ISSUE_FIELD_ID,
ISSUE_ID,
FIELD_ID,
FIELD_VALUE
from MO_ISSUE_FIELD_STRING;
abortado depois de 10 min
//****************************************************************************************************************
Eduardo, tens razão. Tinha lido rápido e me parecia que era leitura do QVD para concatenar, por isto falei do Where Exists().
Mas se entendi o que queres, seria ler do banco de dados o ISSUE_ID maior do que o lido anteriormente e que esta em QVD. Se for isto, segue uma ideia abaixo:
//===============================================================================================
// Aqui le somente o campo ISSUE_ID para pegar o ultimo (partindo da premissa que é o maior)
MO_ISSUE_FIELD_STRING:
LOAD
max(ISSUE_ID) as ISSUE_ID
FROM [lib://Dados/TESTE/MO_ISSUE_FIELD_STRING.qvd](qvd);
//
Let vMaior = Peek('ISSUE_ID');
//
drop table MO_ISSUE_FIELD_STRING;
//===============================================================================================
// Vamos ler do banco de dados a partir do maior numero ISSUE_ID lido antes....
Tabela:
select
ID_ISSUE_FIELD_STRING as ISSUE_FIELD_STRING_ID,
ISSUE_FIELD_ID,
ISSUE_ID,
FIELD_ID as CATEGORY_ID,
FIELD_VALUE as CATEGORY_VALUE
from MO_ISSUE_FIELD_STRING
where ISSUE_ID >= $(vMaior);
//===============================================================================================
//
// Se quiser juntar com QVD ja criado antes...
// Usamos o NOT EXISTS para ter certeza que nao vamos ler do QVD nenhum registro lido do banco de dados
// *****IMPORTANTE - Estou levando em consideração que os nomes do que esta sendo lido no SQL e o do QVD
// sao iguais
concatenate (Tabela)
LOAD
*
FROM [lib://Dados/TESTE/MO_ISSUE_FIELD_STRING.qvd](qvd)
Where not exists(ISSUE_ID);
// O novo arquivo tera os dados do SQL e do QVD e sera SOBREPOSTO ao antigo QVD
// ******* CUIDADO com carga parcial....perde o historico....podes controlar para evitar isto com
// QvdNoOfRecords() e NoOfRows() Ou seja, se a qtde em memoria for maior ou igual do que a do QVD podes salvar
store Tabela into [lib://Dados/TESTE/MO_ISSUE_FIELD_STRING.qvd](qvd);
DROP Table Tabela;
Oi Alessandro, então, essa ideia eu ja tinha aplicado, mas ela serve apenas se ID_ISSUE for uma PK, nesse sentido sim eu pegaria a maior e traria apenas o que for maior que ela, mas eu queria algo mais generico pois nem todas minhas tabelas possuem PK, mas pelo que eu estou vendo o QS não faz esse tipo de integração naturalmente entre qvd e sql.
não, não faz. Tens que fazer na mão....
No QlikView tem um incremental no LOAD para arquivo texto. Este é automático......mas não tem para banco de dados