Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
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:
Bem é isso.
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;
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í.
posta ai o código de como ta sendo feito esse carregamento
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;
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.
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
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
Conseguiu amigo?
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 & Hour as Parameter