Skip to main content
Woohoo! Qlik Community has won “Best in Class Community” in the 2024 Khoros Kudos awards!
Announcements
Join us at Qlik Connect for 3 magical days of learning, networking,and inspiration! REGISTER TODAY and save!
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Carregamentos tendo como referência a data mais recente do carregamento anterior

Pessoal,

Tenho uma aplicação que extrai dados a partir de uma API (JSON Rest). Cada chamada permite um máximo de 1.500 registros compreendidos em um intervalo de tempo discriminado nos parâmetros.

Se, por exemplo, coloco nos parâmetros o intervalo 01/02/2016 00:00:00|05/02/2016 23:59:00 (DataInicial|DataFinal), ele me traz os 1.500 primeiros registros, com a última data sendo 02/02/2016 09:35:24. Gostaria de saber se existe uma forma do sistema identificar sempre essa última data e horário, fazendo com que ela conste como data inicial nos parâmetros da próxima chamada e assim por diante. E tudo isso em um único carregamento, de forma que o processo termine quando não houver mais resultados a serem extraídos.

Abaixo, a versão "desenhada" do que pretendo obter:

Screen Shot 02-07-17 at 09.17 AM.JPG

Bem é isso.

Labels (1)
20 Replies
Anonymous
Not applicable
Author

Bom dia,

cria um loop fazendo um load por chamada... utiliza alguma função, tipo rowno(), pra contar a quantidade de registros de cada load ... assim vc consegue criar um condição pra limitar teu loop....  atribui o valor de rowno() a uma variável, quando esse valor for 0 acaba teu loop.

Para usar a data da forma que vc quer, cria uma variável setada com data/hora atual , função now(), dentro do teu loop depois do teu load e usa essa variável como parâmetro...

algo mais ou menos assim:

set vDataInicio = '01/02/2017 00:00:00' ;

set vDataFinal = '05/02/2017 23:59:00' ;

set vChamado = 1 ;

for x =0 to 1 step 0

    

     Tab_Chamado:

     load

     $(vChamado) as chamado,

     rowno() as id,

     *

     from tabela

     where data >= $(vDataInicio) and  data <=$(vDataFinal)

     and id < 1500 ;

     let x = if(peek('id', -1,Tab_Chamado) = 0 , 1 , 0) ; // quando o id for 0 não haverá registros, ele encerra o FOR   

     let vDataInicio  = now() ;

     let vChamado = $(vChamado) + 1 ;

next;

Not applicable
Author

Bom dia, Rodrigo

Obrigado pela sugestão. Mas não serve aqui.

Nos parâmetros da API, não tem como discriminar o número de registros (sobre o id<1.500 que vc colocou no Where)

Já data, sim. Ignore o 1500. Preciso apenas da data como parâmetro.

No seu modelo, ele não identifica a data mais recente do carregamento anterior. É disso que preciso, servindo como referência a cada novo carregamento em loop, até que não tenhamos mais registros, parando aí.

Anonymous
Not applicable
Author

posta ai o código de como ta sendo feito esse carregamento

Not applicable
Author

Segue, apenas omitindo a chave da conexão e endereço do rest:

SET vDataInicial = '2017-01-14 00:00:00'

LET vDataFinal = Date(ConvertToLocalTime(ReloadTime(), 'GMT+01:00'),'YYYY-MM-DD hh:mm:ss');

CUSTOM CONNECT TO "ENDEREÇO API";

RestConnectorMasterTable:

SQL SELECT

  "success",

  "__KEY_root",

  (SELECT

  "mention_id",

  "action",

  "action_id",

  "user_id",

  "comment",

  "log_created_at",

  "collected_at",

  "user_name",

  "publiched_at",

  "__FK_data"

  FROM "data" FK "__FK_data")

FROM JSON (wrap on) "root" PK "__KEY_root"

WITH CONNECTION ( 

      URL "URL API",

      QUERY "publickey" "CHAVE API", 

      QUERY "time" "$(vunixtimestamp)", 

      QUERY "signature" "$(vKeyMD5)",

      QUERY "log_created_at" "$(vDataInicial)|$(vDataFinal)"

  ); 

LOG_Tag:

LOAD [mention_id],

  [action_id],

  [user_id],

  [comment],

  [log_created_at],

  [collected_at],

  [user_name],

  [publiched_at],

  [__FK_data] AS [__KEY_root]

RESIDENT RestConnectorMasterTable

WHERE NOT IsNull([__FK_data]);

DROP TABLE RestConnectorMasterTable;

Not applicable
Author

Ressaltando que a data final tem que ser sempre a mesma (uma hora adiante da data e hora do reload time). O que deve mudar sempre é a data inicial.

Anonymous
Not applicable
Author

Eu tinha confundido ali em vez de pegar a ultima data/hora do carregamento tava pegando a data/hora atual hehe

você tem esse campo data no teu select? que vc consegue identificar 02/02/2016 09:35:24 ??

Se tiver da pra usar o peek depois do select

let vDataInicio = peek( 'nome_campo_data' , -1 , nome_tabela ) ;

esse peek com -1 pega o último registro do campo

mario_sergio_ti
Partner - Specialist
Partner - Specialist

Amigo;

Fiz uma lógica rápida que pode te atender ou te ajudar a pensar;

SET QVDPath = 'C:';

SET QVDPart = '1';

SET vDataInicial = '2017-01-14 00:00:00';

LET vDataFinal = Date(ConvertToLocalTime(ReloadTime(), 'GMT+01:00'),'YYYY-MM-DD hh:mm:ss');

Do while $(vDataInicial) <= $(vDataFinal)

  CUSTOM CONNECT TO "ENDEREÇO API";

  RestConnectorMasterTable:

  LOAD:

   "success",

   "__KEY_root",

   Date("__FK_data",'YYYY-MM-DD hh:mm:ss') as '__FK_data'

  Where RowNo() <=1500;

  SQL SELECT

   "success",

   "__KEY_root",

   (SELECT

   "mention_id",

   "action",

   "action_id",

   "user_id",

   "comment",

   "log_created_at",

   "collected_at",

   "user_name",

   "publiched_at",

   "__FK_data"

   FROM "data" FK "__FK_data")

  FROM JSON (wrap on) "root" PK "__KEY_root"

  WITH CONNECTION (

   URL "URL API",

   QUERY "publickey" "CHAVE API",

   QUERY "time" "$(vunixtimestamp)",

   QUERY "signature" "$(vKeyMD5)",

   QUERY "log_created_at" "$(vDataInicial)|$(vDataFinal)"

   );

 

   STORE RestConnectorMasterTable INTO $(QVDPath)\dados_$(QVDPart).qvd;

   Let = QVDPart+1;

   Let vDataInicial = peek([__FK_data], -1,RestConnectorMasterTable);

Loop

Obs.:

Estou supondo que "__FK_data" é uma data que está sendo carregado em ordem crescente

Recomendo adaptar este script e fazer um incremental

Tente limpas os campos que não precisam carregar

Consultor certificado | Quem compartilha, aprende!
https://www.linkedin.com/in/mariosergioti
mario_sergio_ti
Partner - Specialist
Partner - Specialist

Conseguiu amigo?

Consultor certificado | Quem compartilha, aprende!
https://www.linkedin.com/in/mariosergioti
Not applicable
Author

Olá, amigo. Desculpe não ter respondido.

Tentei implementar o seu modelo. Não deu certo. O "Where RowNo() <=1500;" presente nele não se aplica no meu Select (só consigo modificar o que devo extrair nos parâmetros permitidos pela API).


Procurei resolver no fórum em inglês tb, mas sem respostas por lá: Looping Script using Date &amp; Hour as Parameter