Do not input private or sensitive data. View Qlik Privacy & Cookie Policy.
Skip to main content

Announcements
Posting on Qlik Community is temporarily paused for some users. Thank you for patience and we'll update you soon!
cancel
Showing results for 
Search instead for 
Did you mean: 
eduardo_dimperio
Specialist II
Specialist II

Utilizacao de FIELD em Select Oracle

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

********************************************************************************

1 Solution

Accepted Solutions
afurtado
Partner Ambassador/MVP
Partner Ambassador/MVP

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

furtado@farolbi.com.br

View solution in original post

10 Replies
afurtado
Partner Ambassador/MVP
Partner Ambassador/MVP

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;

furtado@farolbi.com.br
afurtado
Partner Ambassador/MVP
Partner Ambassador/MVP

o SQL tambem tem o Exists()

furtado@farolbi.com.br
eduardo_dimperio
Specialist II
Specialist II
Author

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.

afurtado
Partner Ambassador/MVP
Partner Ambassador/MVP

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... )

furtado@farolbi.com.br
eduardo_dimperio
Specialist II
Specialist II
Author

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?

eduardo_dimperio
Specialist II
Specialist II
Author

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

//****************************************************************************************************************

afurtado
Partner Ambassador/MVP
Partner Ambassador/MVP

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;



furtado@farolbi.com.br
eduardo_dimperio
Specialist II
Specialist II
Author

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.

afurtado
Partner Ambassador/MVP
Partner Ambassador/MVP

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

furtado@farolbi.com.br