Skip to main content
Announcements
Have questions about Qlik Connect? Join us live on April 10th, at 11 AM ET: SIGN UP NOW
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