<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Qlik Sense loads data from QVD but considers the table empty for further operations in Integration, Extension &amp; APIs</title>
    <link>https://community.qlik.com/t5/Integration-Extension-APIs/Qlik-Sense-loads-data-from-QVD-but-considers-the-table-empty-for/m-p/2527311#M22434</link>
    <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-start="47" data-end="326"&gt;Hello, I am new to Qlik and recently started working on an API query project. To summarize, my project involves retrieving data from a curve between two dates, and I would like to save this data into a QVD file that I can later load at the end of my script to analyze the data.&lt;/P&gt;
&lt;P data-start="328" data-end="437"&gt;The code asks the user to enter their credentials, which works fine. The user can choose between two modes:&lt;/P&gt;
&lt;OL data-start="439" data-end="879"&gt;
&lt;LI data-start="439" data-end="610"&gt;
&lt;P data-start="442" data-end="610"&gt;&lt;STRONG data-start="442" data-end="455"&gt;RESET = 1&lt;/STRONG&gt;: In this mode, the script requests data from the earliest date of the curve up to today and saves everything to the QVD file. This mode works perfectly.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI data-start="611" data-end="879"&gt;
&lt;P data-start="614" data-end="879"&gt;&lt;STRONG data-start="614" data-end="627"&gt;RESET = 0&lt;/STRONG&gt;: This mode is causing some issues. When the script runs, it should load the existing QVD file and retrieve the last date from it. Then, it uses this date to request data from that point until today, in order to avoid reloading already existing data.&lt;/P&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P data-start="881" data-end="1156"&gt;The problem is that the table &lt;CODE data-start="911" data-end="920"&gt;OldData&lt;/CODE&gt; is considered empty, so I cannot concatenate the new data with the existing data. I have already verified that the table does contain data, but Qlik does not recognize it, preventing the concatenation :&lt;/P&gt;
&lt;P&gt;// ============================================================&lt;BR /&gt;// PARAMÈTRES À RENSEIGNER&lt;BR /&gt;// ============================================================&lt;/P&gt;
&lt;P&gt;// --- Paramètres Ikologik API ---&lt;BR /&gt;LET vCustomer = '#######'; // Customer Tag&lt;BR /&gt;LET vInstallation = '######'; // Installation Tag&lt;BR /&gt;LET vTag = '#######'; // Graph Tag&lt;BR /&gt;LET vDataType = 'DATA'; // Type de données (DATA, ALARM, etc.)&lt;/P&gt;
&lt;P&gt;// --- Date de début à modifier par l'utilisateur (format : jj/mm/aa hh:mm) ---&lt;BR /&gt;LET vUserDate = 'DD/MM/YY hh:mm';&lt;/P&gt;
&lt;P&gt;// --- Nom personnalisé de la variable observée (ex : Température (C°)) ---&lt;BR /&gt;LET vObservationLabel = 'Température (C°)';&lt;/P&gt;
&lt;P&gt;// RESET de la BDD QVD&lt;BR /&gt;LET RESET = 0; // 1= executer le STORE QVD ; 0= ignorer le STORE&lt;/P&gt;
&lt;P&gt;// ============================================================&lt;BR /&gt;// 1. Rafraîchissement du token via le refreshToken&lt;BR /&gt;// ============================================================&lt;BR /&gt;LIB CONNECT TO 'ikologik_API_login_acces_token (eco_qlik-user-pro-erp)';&lt;/P&gt;
&lt;P&gt;LET Query = '{""token"":""$(vRefreshToken)""}';&lt;/P&gt;
&lt;P&gt;RefreshTokenTable:&lt;BR /&gt;SQL SELECT &lt;BR /&gt;"refreshToken",&lt;BR /&gt;"accessToken"&lt;BR /&gt;FROM JSON (wrap on) "root"&lt;BR /&gt;WITH CONNECTION (&lt;BR /&gt;URL "&lt;A href="https://api.ikologik.com/api/v2/auth/refresh" target="_blank"&gt;https://api.ikologik.com/api/v2/auth/refresh&lt;/A&gt;",&lt;BR /&gt;HTTPHEADER "Content-Type" "application/json",&lt;BR /&gt;BODY "$(Query)"&lt;BR /&gt;);&lt;/P&gt;
&lt;P&gt;LET vRefreshToken = Peek('refreshToken', 0, 'RefreshTokenTable');&lt;BR /&gt;LET vToken = Peek('accessToken', 0, 'RefreshTokenTable');&lt;BR /&gt;DROP TABLE RefreshTokenTable;&lt;/P&gt;
&lt;P&gt;// ============================================================&lt;BR /&gt;// 2. Conversion de la date utilisateur avec prise en compte heure d'été/hiver&lt;BR /&gt;// ============================================================&lt;BR /&gt;TempUserDate:&lt;BR /&gt;LOAD &lt;BR /&gt;Timestamp(&lt;BR /&gt;Timestamp#('$(vUserDate)', 'DD/MM/YY hh:mm')&lt;BR /&gt;- IF(&lt;BR /&gt;Date(Floor(Timestamp#('$(vUserDate)', 'DD/MM/YY hh:mm'))) &amp;gt;= &lt;BR /&gt;MakeDate(Year(Timestamp#('$(vUserDate)', 'DD/MM/YY hh:mm')), 3, 31)&lt;BR /&gt;- WeekDay(MakeDate(Year(Timestamp#('$(vUserDate)', 'DD/MM/YY hh:mm')), 3, 31), 0)&lt;BR /&gt;AND&lt;BR /&gt;Date(Floor(Timestamp#('$(vUserDate)', 'DD/MM/YY hh:mm'))) &amp;lt; &lt;BR /&gt;MakeDate(Year(Timestamp#('$(vUserDate)', 'DD/MM/YY hh:mm')), 10, 31)&lt;BR /&gt;- WeekDay(MakeDate(Year(Timestamp#('$(vUserDate)', 'DD/MM/YY hh:mm')), 10, 31), 0),&lt;BR /&gt;2/24, // Été : -2h&lt;BR /&gt;1/24 // Hiver : -1h&lt;BR /&gt;)&lt;BR /&gt;) AS LocalInput&lt;BR /&gt;AUTOGENERATE 1;&lt;/P&gt;
&lt;P&gt;LET vStartQlikTimestamp = Peek('LocalInput', 0, 'TempUserDate');&lt;BR /&gt;LET vEndQlikTimestamp = Now();&lt;BR /&gt;DROP TABLE TempUserDate;&lt;/P&gt;
&lt;P&gt;// ============================================================&lt;BR /&gt;// 2b. Gestion du QVD existant (si RESET = 0)&lt;BR /&gt;// ============================================================&lt;BR /&gt;LET vSafeObservationLabel = Replace('$(vObservationLabel)', ' ', '_');&lt;BR /&gt;LET vSafeObservationLabel = Replace('$(vSafeObservationLabel)', '(', '');&lt;BR /&gt;LET vSafeObservationLabel = Replace('$(vSafeObservationLabel)', ')', '');&lt;BR /&gt;LET vSafeObservationLabel = Replace('$(vSafeObservationLabel)', '°', 'deg');&lt;/P&gt;
&lt;P&gt;LET vQvdFilePath = 'lib://QVDs_Quentin (eco_qlik-user-pro-erp)/' &amp;amp; '$(vSafeObservationLabel)' &amp;amp; '.qvd';&lt;/P&gt;
&lt;P&gt;IF $(RESET) = 0 THEN&lt;BR /&gt;IF FileSize('$(vQvdFilePath)') &amp;gt; 0 THEN&lt;/P&gt;
&lt;P&gt;TempQvdData:&lt;BR /&gt;LOAD *&lt;BR /&gt;FROM [$(vQvdFilePath)] (qvd);&lt;/P&gt;
&lt;P&gt;// Lecture de la dernière date au format texte dans le QVD&lt;BR /&gt;LET vLastDateRaw = Peek('LocalTime_$(vObservationLabel)', -1, 'TempQvdData');&lt;BR /&gt;Trace Derniere date dans le QVD : $(vLastDateRaw);&lt;/P&gt;
&lt;P&gt;DROP TABLE TempQvdData;&lt;BR /&gt;&lt;BR /&gt;TempLastDateCalc:&lt;BR /&gt;LOAD&lt;BR /&gt;// On récupère la dernière date du QVD en heure locale&lt;BR /&gt;Timestamp#('$(vLastDateRaw)', 'DD/MM/YYYY hh:mm:ss') AS LocalTime,&lt;BR /&gt;// Conversion en UTC en retirant le décalage été/hiver&lt;BR /&gt;Timestamp#('$(vLastDateRaw)', 'DD/MM/YYYY hh:mm:ss') &lt;BR /&gt;- IF(&lt;BR /&gt;Date(Floor(Timestamp#('$(vLastDateRaw)', 'DD/MM/YYYY hh:mm:ss'))) &amp;gt;= &lt;BR /&gt;MakeDate(Year(Timestamp#('$(vLastDateRaw)', 'DD/MM/YYYY hh:mm:ss')), 3, 31)&lt;BR /&gt;- WeekDay(MakeDate(Year(Timestamp#('$(vLastDateRaw)', 'DD/MM/YYYY hh:mm:ss')), 3, 31), 0)&lt;BR /&gt;AND&lt;BR /&gt;Date(Floor(Timestamp#('$(vLastDateRaw)', 'DD/MM/YYYY hh:mm:ss'))) &amp;lt; &lt;BR /&gt;MakeDate(Year(Timestamp#('$(vLastDateRaw)', 'DD/MM/YYYY hh:mm:ss')), 10, 31)&lt;BR /&gt;- WeekDay(MakeDate(Year(Timestamp#('$(vLastDateRaw)', 'DD/MM/YYYY hh:mm:ss')), 10, 31), 0),&lt;BR /&gt;2/24, // été&lt;BR /&gt;1/24 // hiver&lt;BR /&gt;)&lt;BR /&gt;+ 5/1440 // +5 minutes pour la prochaine valeur&lt;BR /&gt;AS UTC_Input&lt;BR /&gt;AUTOGENERATE 1;&lt;/P&gt;
&lt;P&gt;LET vStartQlikTimestamp = Peek('UTC_Input', 0, 'TempLastDateCalc');&lt;/P&gt;
&lt;P&gt;DROP TABLE TempLastDateCalc;&lt;/P&gt;
&lt;P&gt;TRACE vStartQlikTimestamp UTC calculé : $(=Date($(vStartQlikTimestamp), 'DD/MM/YYYY')) $(=Time($(vStartQlikTimestamp), 'hh:mm:ss'));&lt;/P&gt;
&lt;P&gt;ELSE&lt;BR /&gt;TRACE Fichier QVD introuvable ou vide : $(vQvdFilePath);&lt;BR /&gt;ENDIF&lt;BR /&gt;ENDIF&lt;/P&gt;
&lt;P&gt;&lt;BR /&gt;// ============================================================&lt;BR /&gt;// 3. Boucle de récupération des données par tranche de 6 mois&lt;BR /&gt;// ============================================================&lt;BR /&gt;LET vCurrentDate = vStartQlikTimestamp;&lt;/P&gt;
&lt;P&gt;FOR i = 1 TO 100&lt;/P&gt;
&lt;P&gt;LET vFromDate = Floor((vCurrentDate - MakeDate(1970)) * 86400000);&lt;BR /&gt;LET vNextDate = AddMonths(vCurrentDate, 6);&lt;BR /&gt;IF vNextDate &amp;gt; vEndQlikTimestamp THEN &lt;BR /&gt;LET vNextDate = vEndQlikTimestamp; &lt;BR /&gt;ENDIF&lt;BR /&gt;LET vToDate = Floor((vNextDate - MakeDate(1970)) * 86400000);&lt;/P&gt;
&lt;P&gt;LET vUrl =&lt;BR /&gt;'&lt;A href="https://api.ikologik.com/api/v2/customer/" target="_blank"&gt;https://api.ikologik.com/api/v2/customer/&lt;/A&gt;' &amp;amp; '$(vCustomer)' &amp;amp;&lt;BR /&gt;'/installation/' &amp;amp; '$(vInstallation)' &amp;amp;&lt;BR /&gt;'/graphmeter/' &amp;amp; '$(vTag)' &amp;amp;&lt;BR /&gt;'/graph/data/' &amp;amp; '$(vDataType)' &amp;amp;&lt;BR /&gt;'/' &amp;amp; '$(vFromDate)' &amp;amp; '/' &amp;amp; '$(vToDate)' &amp;amp;&lt;BR /&gt;'?autoReduce=false&amp;amp;limit=1000000';&lt;/P&gt;
&lt;P&gt;LIB CONNECT TO 'ikologik_GET_Data (eco_qlik-user-pro-erp)';&lt;/P&gt;
&lt;P&gt;RestConnectorMasterTable:&lt;BR /&gt;SQL SELECT &lt;BR /&gt;"__KEY_root",&lt;BR /&gt;(SELECT "@Value", "__FK_root"&lt;BR /&gt;FROM "root" FK "__FK_root" ArrayValueAlias "@Value")&lt;BR /&gt;FROM JSON (wrap on) "root" PK "__KEY_root"&lt;BR /&gt;WITH CONNECTION (&lt;BR /&gt;URL "$(vUrl)",&lt;BR /&gt;HTTPHEADER "Authorization" "Bearer $(vToken)"&lt;BR /&gt;);&lt;/P&gt;
&lt;P&gt;[root_$(i)]:&lt;BR /&gt;LOAD [@Value], [__FK_root] AS [__KEY_root], '$(i)' AS BatchID&lt;BR /&gt;RESIDENT RestConnectorMasterTable&lt;BR /&gt;WHERE NOT IsNull([__FK_root]);&lt;/P&gt;
&lt;P&gt;DROP TABLE RestConnectorMasterTable;&lt;/P&gt;
&lt;P&gt;LET vCurrentDate = vNextDate;&lt;/P&gt;
&lt;P&gt;EXIT FOR WHEN vCurrentDate &amp;gt;= vEndQlikTimestamp;&lt;/P&gt;
&lt;P&gt;NEXT i;&lt;/P&gt;
&lt;P&gt;// ============================================================&lt;BR /&gt;// 4. Fusion des données collectées&lt;BR /&gt;// ============================================================&lt;BR /&gt;CombinedRaw:&lt;BR /&gt;LOAD [@Value], RowNo() AS RowNum&lt;BR /&gt;RESIDENT [root_1];&lt;BR /&gt;DROP TABLE [root_1];&lt;/P&gt;
&lt;P&gt;FOR j = 2 TO $(i)&lt;BR /&gt;IF TableNumber('root_$(j)') &amp;gt; 0 THEN&lt;BR /&gt;CONCATENATE (CombinedRaw)&lt;BR /&gt;LOAD [@Value], RowNo() AS RowNum&lt;BR /&gt;RESIDENT [root_$(j)];&lt;BR /&gt;DROP TABLE [root_$(j)];&lt;BR /&gt;ENDIF&lt;BR /&gt;NEXT j;&lt;/P&gt;
&lt;P&gt;// ============================================================&lt;BR /&gt;// 5. Séparation temps / observation&lt;BR /&gt;// ============================================================&lt;BR /&gt;Times:&lt;BR /&gt;LOAD [@Value] AS Time, Floor(RowNum / 2) + 1 AS PairID&lt;BR /&gt;RESIDENT CombinedRaw&lt;BR /&gt;WHERE Mod(RowNum, 2) = 1;&lt;/P&gt;
&lt;P&gt;Observations:&lt;BR /&gt;LOAD [@Value] AS [$(vObservationLabel)], Floor((RowNum + 1) / 2) AS PairID&lt;BR /&gt;RESIDENT CombinedRaw&lt;BR /&gt;WHERE Mod(RowNum, 2) = 0;&lt;/P&gt;
&lt;P&gt;DROP TABLE CombinedRaw;&lt;/P&gt;
&lt;P&gt;// ============================================================&lt;BR /&gt;// 6. Fusion temps + observation&lt;BR /&gt;// ============================================================&lt;BR /&gt;FinalData:&lt;BR /&gt;JOIN (Times)&lt;BR /&gt;LOAD PairID, [$(vObservationLabel)]&lt;BR /&gt;RESIDENT Observations;&lt;/P&gt;
&lt;P&gt;DROP TABLE Observations;&lt;/P&gt;
&lt;P&gt;// DROP conditionnel de FinalData (évite erreur si table inexistante)&lt;BR /&gt;IF TableNumber('FinalData') &amp;gt; 0 THEN&lt;BR /&gt;DROP TABLE FinalData;&lt;BR /&gt;ENDIF&lt;/P&gt;
&lt;P&gt;// ATTENTION : ici on vient de DROP FinalData, &lt;BR /&gt;// la table Times existe encore et sera utilisée dans l'étape suivante&lt;/P&gt;
&lt;P&gt;// ============================================================&lt;BR /&gt;// 7. Conversion des timestamps UTC → Heure locale (Bruxelles)&lt;BR /&gt;// ============================================================&lt;BR /&gt;FinalData_LocalTime:&lt;BR /&gt;LOAD&lt;BR /&gt;Timestamp(&lt;BR /&gt;([Time] / 1000) / 86400 + MakeDate(1970) +&lt;BR /&gt;If(&lt;BR /&gt;Date(Floor(([Time] / 1000) / 86400 + MakeDate(1970))) &amp;gt;= &lt;BR /&gt;MakeDate(Year(Floor(([Time] / 1000) / 86400 + MakeDate(1970))), 3, 31) - &lt;BR /&gt;WeekDay(MakeDate(Year(Floor(([Time] / 1000) / 86400 + MakeDate(1970))), 3, 31), 0)&lt;BR /&gt;and &lt;BR /&gt;Date(Floor(([Time] / 1000) / 86400 + MakeDate(1970))) &amp;lt; &lt;BR /&gt;MakeDate(Year(Floor(([Time] / 1000) / 86400 + MakeDate(1970))), 10, 31) - &lt;BR /&gt;WeekDay(MakeDate(Year(Floor(([Time] / 1000) / 86400 + MakeDate(1970))), 10, 31), 0),&lt;BR /&gt;2/24,&lt;BR /&gt;1/24&lt;BR /&gt;)&lt;BR /&gt;) AS [LocalTime_$(vObservationLabel)],&lt;BR /&gt;Replace([$(vObservationLabel)], '.', ',') AS [$(vObservationLabel)]&lt;BR /&gt;RESIDENT Times;&lt;/P&gt;
&lt;P&gt;DROP TABLE Times;&lt;/P&gt;
&lt;P&gt;// ============================================================&lt;BR /&gt;// 8. Création du chemin QVD avec nom basé sur vObservationLabel (nettoyé)&lt;BR /&gt;// ============================================================&lt;/P&gt;
&lt;P&gt;IF $(RESET) = 0 THEN&lt;/P&gt;
&lt;P&gt;OldData:&lt;BR /&gt;LOAD *&lt;BR /&gt;FROM [$(vQvdFilePath)] (qvd);&lt;/P&gt;
&lt;P&gt;// Lecture de la dernière date au format texte dans le QVD&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;P&gt;// Concaténation seulement si OldData et FinalData_LocalTime existent&lt;/P&gt;
&lt;P&gt;CONCATENATE (OldData)&lt;BR /&gt;LOAD *&lt;BR /&gt;RESIDENT FinalData_LocalTime;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;BR /&gt;STORE OldData INTO [$(vQvdFilePath)] (qvd);&lt;BR /&gt;LET vLastDateRaw2 = Peek('LocalTime_$(vObservationLabel)', -1, 'OldData');&lt;BR /&gt;Trace Derniere date dans le QVD : $(vLastDateRaw2);&lt;/P&gt;
&lt;P&gt;DROP TABLE OldData;&lt;BR /&gt;DROP TABLE FinalData_LocalTime;&lt;/P&gt;
&lt;P&gt;ELSE&lt;/P&gt;
&lt;P&gt;STORE FinalData_LocalTime INTO [$(vQvdFilePath)] (qvd);&lt;/P&gt;
&lt;P&gt;DROP TABLE FinalData_LocalTime;&lt;/P&gt;
&lt;P&gt;ENDIF&lt;/P&gt;
&lt;P&gt;// ============================================================&lt;BR /&gt;// 9. Chargement des données depuis le QVD pour analyse&lt;BR /&gt;// ============================================================&lt;/P&gt;
&lt;P&gt;DataFromQVD:&lt;BR /&gt;LOAD *&lt;BR /&gt;FROM [$(vQvdFilePath)] (qvd);&lt;/P&gt;
&lt;P data-start="881" data-end="1156"&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;</description>
    <pubDate>Thu, 14 Aug 2025 09:34:31 GMT</pubDate>
    <dc:creator>Quent_3814</dc:creator>
    <dc:date>2025-08-14T09:34:31Z</dc:date>
    <item>
      <title>Qlik Sense loads data from QVD but considers the table empty for further operations</title>
      <link>https://community.qlik.com/t5/Integration-Extension-APIs/Qlik-Sense-loads-data-from-QVD-but-considers-the-table-empty-for/m-p/2527311#M22434</link>
      <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-start="47" data-end="326"&gt;Hello, I am new to Qlik and recently started working on an API query project. To summarize, my project involves retrieving data from a curve between two dates, and I would like to save this data into a QVD file that I can later load at the end of my script to analyze the data.&lt;/P&gt;
&lt;P data-start="328" data-end="437"&gt;The code asks the user to enter their credentials, which works fine. The user can choose between two modes:&lt;/P&gt;
&lt;OL data-start="439" data-end="879"&gt;
&lt;LI data-start="439" data-end="610"&gt;
&lt;P data-start="442" data-end="610"&gt;&lt;STRONG data-start="442" data-end="455"&gt;RESET = 1&lt;/STRONG&gt;: In this mode, the script requests data from the earliest date of the curve up to today and saves everything to the QVD file. This mode works perfectly.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI data-start="611" data-end="879"&gt;
&lt;P data-start="614" data-end="879"&gt;&lt;STRONG data-start="614" data-end="627"&gt;RESET = 0&lt;/STRONG&gt;: This mode is causing some issues. When the script runs, it should load the existing QVD file and retrieve the last date from it. Then, it uses this date to request data from that point until today, in order to avoid reloading already existing data.&lt;/P&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P data-start="881" data-end="1156"&gt;The problem is that the table &lt;CODE data-start="911" data-end="920"&gt;OldData&lt;/CODE&gt; is considered empty, so I cannot concatenate the new data with the existing data. I have already verified that the table does contain data, but Qlik does not recognize it, preventing the concatenation :&lt;/P&gt;
&lt;P&gt;// ============================================================&lt;BR /&gt;// PARAMÈTRES À RENSEIGNER&lt;BR /&gt;// ============================================================&lt;/P&gt;
&lt;P&gt;// --- Paramètres Ikologik API ---&lt;BR /&gt;LET vCustomer = '#######'; // Customer Tag&lt;BR /&gt;LET vInstallation = '######'; // Installation Tag&lt;BR /&gt;LET vTag = '#######'; // Graph Tag&lt;BR /&gt;LET vDataType = 'DATA'; // Type de données (DATA, ALARM, etc.)&lt;/P&gt;
&lt;P&gt;// --- Date de début à modifier par l'utilisateur (format : jj/mm/aa hh:mm) ---&lt;BR /&gt;LET vUserDate = 'DD/MM/YY hh:mm';&lt;/P&gt;
&lt;P&gt;// --- Nom personnalisé de la variable observée (ex : Température (C°)) ---&lt;BR /&gt;LET vObservationLabel = 'Température (C°)';&lt;/P&gt;
&lt;P&gt;// RESET de la BDD QVD&lt;BR /&gt;LET RESET = 0; // 1= executer le STORE QVD ; 0= ignorer le STORE&lt;/P&gt;
&lt;P&gt;// ============================================================&lt;BR /&gt;// 1. Rafraîchissement du token via le refreshToken&lt;BR /&gt;// ============================================================&lt;BR /&gt;LIB CONNECT TO 'ikologik_API_login_acces_token (eco_qlik-user-pro-erp)';&lt;/P&gt;
&lt;P&gt;LET Query = '{""token"":""$(vRefreshToken)""}';&lt;/P&gt;
&lt;P&gt;RefreshTokenTable:&lt;BR /&gt;SQL SELECT &lt;BR /&gt;"refreshToken",&lt;BR /&gt;"accessToken"&lt;BR /&gt;FROM JSON (wrap on) "root"&lt;BR /&gt;WITH CONNECTION (&lt;BR /&gt;URL "&lt;A href="https://api.ikologik.com/api/v2/auth/refresh" target="_blank"&gt;https://api.ikologik.com/api/v2/auth/refresh&lt;/A&gt;",&lt;BR /&gt;HTTPHEADER "Content-Type" "application/json",&lt;BR /&gt;BODY "$(Query)"&lt;BR /&gt;);&lt;/P&gt;
&lt;P&gt;LET vRefreshToken = Peek('refreshToken', 0, 'RefreshTokenTable');&lt;BR /&gt;LET vToken = Peek('accessToken', 0, 'RefreshTokenTable');&lt;BR /&gt;DROP TABLE RefreshTokenTable;&lt;/P&gt;
&lt;P&gt;// ============================================================&lt;BR /&gt;// 2. Conversion de la date utilisateur avec prise en compte heure d'été/hiver&lt;BR /&gt;// ============================================================&lt;BR /&gt;TempUserDate:&lt;BR /&gt;LOAD &lt;BR /&gt;Timestamp(&lt;BR /&gt;Timestamp#('$(vUserDate)', 'DD/MM/YY hh:mm')&lt;BR /&gt;- IF(&lt;BR /&gt;Date(Floor(Timestamp#('$(vUserDate)', 'DD/MM/YY hh:mm'))) &amp;gt;= &lt;BR /&gt;MakeDate(Year(Timestamp#('$(vUserDate)', 'DD/MM/YY hh:mm')), 3, 31)&lt;BR /&gt;- WeekDay(MakeDate(Year(Timestamp#('$(vUserDate)', 'DD/MM/YY hh:mm')), 3, 31), 0)&lt;BR /&gt;AND&lt;BR /&gt;Date(Floor(Timestamp#('$(vUserDate)', 'DD/MM/YY hh:mm'))) &amp;lt; &lt;BR /&gt;MakeDate(Year(Timestamp#('$(vUserDate)', 'DD/MM/YY hh:mm')), 10, 31)&lt;BR /&gt;- WeekDay(MakeDate(Year(Timestamp#('$(vUserDate)', 'DD/MM/YY hh:mm')), 10, 31), 0),&lt;BR /&gt;2/24, // Été : -2h&lt;BR /&gt;1/24 // Hiver : -1h&lt;BR /&gt;)&lt;BR /&gt;) AS LocalInput&lt;BR /&gt;AUTOGENERATE 1;&lt;/P&gt;
&lt;P&gt;LET vStartQlikTimestamp = Peek('LocalInput', 0, 'TempUserDate');&lt;BR /&gt;LET vEndQlikTimestamp = Now();&lt;BR /&gt;DROP TABLE TempUserDate;&lt;/P&gt;
&lt;P&gt;// ============================================================&lt;BR /&gt;// 2b. Gestion du QVD existant (si RESET = 0)&lt;BR /&gt;// ============================================================&lt;BR /&gt;LET vSafeObservationLabel = Replace('$(vObservationLabel)', ' ', '_');&lt;BR /&gt;LET vSafeObservationLabel = Replace('$(vSafeObservationLabel)', '(', '');&lt;BR /&gt;LET vSafeObservationLabel = Replace('$(vSafeObservationLabel)', ')', '');&lt;BR /&gt;LET vSafeObservationLabel = Replace('$(vSafeObservationLabel)', '°', 'deg');&lt;/P&gt;
&lt;P&gt;LET vQvdFilePath = 'lib://QVDs_Quentin (eco_qlik-user-pro-erp)/' &amp;amp; '$(vSafeObservationLabel)' &amp;amp; '.qvd';&lt;/P&gt;
&lt;P&gt;IF $(RESET) = 0 THEN&lt;BR /&gt;IF FileSize('$(vQvdFilePath)') &amp;gt; 0 THEN&lt;/P&gt;
&lt;P&gt;TempQvdData:&lt;BR /&gt;LOAD *&lt;BR /&gt;FROM [$(vQvdFilePath)] (qvd);&lt;/P&gt;
&lt;P&gt;// Lecture de la dernière date au format texte dans le QVD&lt;BR /&gt;LET vLastDateRaw = Peek('LocalTime_$(vObservationLabel)', -1, 'TempQvdData');&lt;BR /&gt;Trace Derniere date dans le QVD : $(vLastDateRaw);&lt;/P&gt;
&lt;P&gt;DROP TABLE TempQvdData;&lt;BR /&gt;&lt;BR /&gt;TempLastDateCalc:&lt;BR /&gt;LOAD&lt;BR /&gt;// On récupère la dernière date du QVD en heure locale&lt;BR /&gt;Timestamp#('$(vLastDateRaw)', 'DD/MM/YYYY hh:mm:ss') AS LocalTime,&lt;BR /&gt;// Conversion en UTC en retirant le décalage été/hiver&lt;BR /&gt;Timestamp#('$(vLastDateRaw)', 'DD/MM/YYYY hh:mm:ss') &lt;BR /&gt;- IF(&lt;BR /&gt;Date(Floor(Timestamp#('$(vLastDateRaw)', 'DD/MM/YYYY hh:mm:ss'))) &amp;gt;= &lt;BR /&gt;MakeDate(Year(Timestamp#('$(vLastDateRaw)', 'DD/MM/YYYY hh:mm:ss')), 3, 31)&lt;BR /&gt;- WeekDay(MakeDate(Year(Timestamp#('$(vLastDateRaw)', 'DD/MM/YYYY hh:mm:ss')), 3, 31), 0)&lt;BR /&gt;AND&lt;BR /&gt;Date(Floor(Timestamp#('$(vLastDateRaw)', 'DD/MM/YYYY hh:mm:ss'))) &amp;lt; &lt;BR /&gt;MakeDate(Year(Timestamp#('$(vLastDateRaw)', 'DD/MM/YYYY hh:mm:ss')), 10, 31)&lt;BR /&gt;- WeekDay(MakeDate(Year(Timestamp#('$(vLastDateRaw)', 'DD/MM/YYYY hh:mm:ss')), 10, 31), 0),&lt;BR /&gt;2/24, // été&lt;BR /&gt;1/24 // hiver&lt;BR /&gt;)&lt;BR /&gt;+ 5/1440 // +5 minutes pour la prochaine valeur&lt;BR /&gt;AS UTC_Input&lt;BR /&gt;AUTOGENERATE 1;&lt;/P&gt;
&lt;P&gt;LET vStartQlikTimestamp = Peek('UTC_Input', 0, 'TempLastDateCalc');&lt;/P&gt;
&lt;P&gt;DROP TABLE TempLastDateCalc;&lt;/P&gt;
&lt;P&gt;TRACE vStartQlikTimestamp UTC calculé : $(=Date($(vStartQlikTimestamp), 'DD/MM/YYYY')) $(=Time($(vStartQlikTimestamp), 'hh:mm:ss'));&lt;/P&gt;
&lt;P&gt;ELSE&lt;BR /&gt;TRACE Fichier QVD introuvable ou vide : $(vQvdFilePath);&lt;BR /&gt;ENDIF&lt;BR /&gt;ENDIF&lt;/P&gt;
&lt;P&gt;&lt;BR /&gt;// ============================================================&lt;BR /&gt;// 3. Boucle de récupération des données par tranche de 6 mois&lt;BR /&gt;// ============================================================&lt;BR /&gt;LET vCurrentDate = vStartQlikTimestamp;&lt;/P&gt;
&lt;P&gt;FOR i = 1 TO 100&lt;/P&gt;
&lt;P&gt;LET vFromDate = Floor((vCurrentDate - MakeDate(1970)) * 86400000);&lt;BR /&gt;LET vNextDate = AddMonths(vCurrentDate, 6);&lt;BR /&gt;IF vNextDate &amp;gt; vEndQlikTimestamp THEN &lt;BR /&gt;LET vNextDate = vEndQlikTimestamp; &lt;BR /&gt;ENDIF&lt;BR /&gt;LET vToDate = Floor((vNextDate - MakeDate(1970)) * 86400000);&lt;/P&gt;
&lt;P&gt;LET vUrl =&lt;BR /&gt;'&lt;A href="https://api.ikologik.com/api/v2/customer/" target="_blank"&gt;https://api.ikologik.com/api/v2/customer/&lt;/A&gt;' &amp;amp; '$(vCustomer)' &amp;amp;&lt;BR /&gt;'/installation/' &amp;amp; '$(vInstallation)' &amp;amp;&lt;BR /&gt;'/graphmeter/' &amp;amp; '$(vTag)' &amp;amp;&lt;BR /&gt;'/graph/data/' &amp;amp; '$(vDataType)' &amp;amp;&lt;BR /&gt;'/' &amp;amp; '$(vFromDate)' &amp;amp; '/' &amp;amp; '$(vToDate)' &amp;amp;&lt;BR /&gt;'?autoReduce=false&amp;amp;limit=1000000';&lt;/P&gt;
&lt;P&gt;LIB CONNECT TO 'ikologik_GET_Data (eco_qlik-user-pro-erp)';&lt;/P&gt;
&lt;P&gt;RestConnectorMasterTable:&lt;BR /&gt;SQL SELECT &lt;BR /&gt;"__KEY_root",&lt;BR /&gt;(SELECT "@Value", "__FK_root"&lt;BR /&gt;FROM "root" FK "__FK_root" ArrayValueAlias "@Value")&lt;BR /&gt;FROM JSON (wrap on) "root" PK "__KEY_root"&lt;BR /&gt;WITH CONNECTION (&lt;BR /&gt;URL "$(vUrl)",&lt;BR /&gt;HTTPHEADER "Authorization" "Bearer $(vToken)"&lt;BR /&gt;);&lt;/P&gt;
&lt;P&gt;[root_$(i)]:&lt;BR /&gt;LOAD [@Value], [__FK_root] AS [__KEY_root], '$(i)' AS BatchID&lt;BR /&gt;RESIDENT RestConnectorMasterTable&lt;BR /&gt;WHERE NOT IsNull([__FK_root]);&lt;/P&gt;
&lt;P&gt;DROP TABLE RestConnectorMasterTable;&lt;/P&gt;
&lt;P&gt;LET vCurrentDate = vNextDate;&lt;/P&gt;
&lt;P&gt;EXIT FOR WHEN vCurrentDate &amp;gt;= vEndQlikTimestamp;&lt;/P&gt;
&lt;P&gt;NEXT i;&lt;/P&gt;
&lt;P&gt;// ============================================================&lt;BR /&gt;// 4. Fusion des données collectées&lt;BR /&gt;// ============================================================&lt;BR /&gt;CombinedRaw:&lt;BR /&gt;LOAD [@Value], RowNo() AS RowNum&lt;BR /&gt;RESIDENT [root_1];&lt;BR /&gt;DROP TABLE [root_1];&lt;/P&gt;
&lt;P&gt;FOR j = 2 TO $(i)&lt;BR /&gt;IF TableNumber('root_$(j)') &amp;gt; 0 THEN&lt;BR /&gt;CONCATENATE (CombinedRaw)&lt;BR /&gt;LOAD [@Value], RowNo() AS RowNum&lt;BR /&gt;RESIDENT [root_$(j)];&lt;BR /&gt;DROP TABLE [root_$(j)];&lt;BR /&gt;ENDIF&lt;BR /&gt;NEXT j;&lt;/P&gt;
&lt;P&gt;// ============================================================&lt;BR /&gt;// 5. Séparation temps / observation&lt;BR /&gt;// ============================================================&lt;BR /&gt;Times:&lt;BR /&gt;LOAD [@Value] AS Time, Floor(RowNum / 2) + 1 AS PairID&lt;BR /&gt;RESIDENT CombinedRaw&lt;BR /&gt;WHERE Mod(RowNum, 2) = 1;&lt;/P&gt;
&lt;P&gt;Observations:&lt;BR /&gt;LOAD [@Value] AS [$(vObservationLabel)], Floor((RowNum + 1) / 2) AS PairID&lt;BR /&gt;RESIDENT CombinedRaw&lt;BR /&gt;WHERE Mod(RowNum, 2) = 0;&lt;/P&gt;
&lt;P&gt;DROP TABLE CombinedRaw;&lt;/P&gt;
&lt;P&gt;// ============================================================&lt;BR /&gt;// 6. Fusion temps + observation&lt;BR /&gt;// ============================================================&lt;BR /&gt;FinalData:&lt;BR /&gt;JOIN (Times)&lt;BR /&gt;LOAD PairID, [$(vObservationLabel)]&lt;BR /&gt;RESIDENT Observations;&lt;/P&gt;
&lt;P&gt;DROP TABLE Observations;&lt;/P&gt;
&lt;P&gt;// DROP conditionnel de FinalData (évite erreur si table inexistante)&lt;BR /&gt;IF TableNumber('FinalData') &amp;gt; 0 THEN&lt;BR /&gt;DROP TABLE FinalData;&lt;BR /&gt;ENDIF&lt;/P&gt;
&lt;P&gt;// ATTENTION : ici on vient de DROP FinalData, &lt;BR /&gt;// la table Times existe encore et sera utilisée dans l'étape suivante&lt;/P&gt;
&lt;P&gt;// ============================================================&lt;BR /&gt;// 7. Conversion des timestamps UTC → Heure locale (Bruxelles)&lt;BR /&gt;// ============================================================&lt;BR /&gt;FinalData_LocalTime:&lt;BR /&gt;LOAD&lt;BR /&gt;Timestamp(&lt;BR /&gt;([Time] / 1000) / 86400 + MakeDate(1970) +&lt;BR /&gt;If(&lt;BR /&gt;Date(Floor(([Time] / 1000) / 86400 + MakeDate(1970))) &amp;gt;= &lt;BR /&gt;MakeDate(Year(Floor(([Time] / 1000) / 86400 + MakeDate(1970))), 3, 31) - &lt;BR /&gt;WeekDay(MakeDate(Year(Floor(([Time] / 1000) / 86400 + MakeDate(1970))), 3, 31), 0)&lt;BR /&gt;and &lt;BR /&gt;Date(Floor(([Time] / 1000) / 86400 + MakeDate(1970))) &amp;lt; &lt;BR /&gt;MakeDate(Year(Floor(([Time] / 1000) / 86400 + MakeDate(1970))), 10, 31) - &lt;BR /&gt;WeekDay(MakeDate(Year(Floor(([Time] / 1000) / 86400 + MakeDate(1970))), 10, 31), 0),&lt;BR /&gt;2/24,&lt;BR /&gt;1/24&lt;BR /&gt;)&lt;BR /&gt;) AS [LocalTime_$(vObservationLabel)],&lt;BR /&gt;Replace([$(vObservationLabel)], '.', ',') AS [$(vObservationLabel)]&lt;BR /&gt;RESIDENT Times;&lt;/P&gt;
&lt;P&gt;DROP TABLE Times;&lt;/P&gt;
&lt;P&gt;// ============================================================&lt;BR /&gt;// 8. Création du chemin QVD avec nom basé sur vObservationLabel (nettoyé)&lt;BR /&gt;// ============================================================&lt;/P&gt;
&lt;P&gt;IF $(RESET) = 0 THEN&lt;/P&gt;
&lt;P&gt;OldData:&lt;BR /&gt;LOAD *&lt;BR /&gt;FROM [$(vQvdFilePath)] (qvd);&lt;/P&gt;
&lt;P&gt;// Lecture de la dernière date au format texte dans le QVD&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;P&gt;// Concaténation seulement si OldData et FinalData_LocalTime existent&lt;/P&gt;
&lt;P&gt;CONCATENATE (OldData)&lt;BR /&gt;LOAD *&lt;BR /&gt;RESIDENT FinalData_LocalTime;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;BR /&gt;STORE OldData INTO [$(vQvdFilePath)] (qvd);&lt;BR /&gt;LET vLastDateRaw2 = Peek('LocalTime_$(vObservationLabel)', -1, 'OldData');&lt;BR /&gt;Trace Derniere date dans le QVD : $(vLastDateRaw2);&lt;/P&gt;
&lt;P&gt;DROP TABLE OldData;&lt;BR /&gt;DROP TABLE FinalData_LocalTime;&lt;/P&gt;
&lt;P&gt;ELSE&lt;/P&gt;
&lt;P&gt;STORE FinalData_LocalTime INTO [$(vQvdFilePath)] (qvd);&lt;/P&gt;
&lt;P&gt;DROP TABLE FinalData_LocalTime;&lt;/P&gt;
&lt;P&gt;ENDIF&lt;/P&gt;
&lt;P&gt;// ============================================================&lt;BR /&gt;// 9. Chargement des données depuis le QVD pour analyse&lt;BR /&gt;// ============================================================&lt;/P&gt;
&lt;P&gt;DataFromQVD:&lt;BR /&gt;LOAD *&lt;BR /&gt;FROM [$(vQvdFilePath)] (qvd);&lt;/P&gt;
&lt;P data-start="881" data-end="1156"&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;</description>
      <pubDate>Thu, 14 Aug 2025 09:34:31 GMT</pubDate>
      <guid>https://community.qlik.com/t5/Integration-Extension-APIs/Qlik-Sense-loads-data-from-QVD-but-considers-the-table-empty-for/m-p/2527311#M22434</guid>
      <dc:creator>Quent_3814</dc:creator>
      <dc:date>2025-08-14T09:34:31Z</dc:date>
    </item>
    <item>
      <title>Re: Qlik Sense loads data from QVD but considers the table empty for further operations</title>
      <link>https://community.qlik.com/t5/Integration-Extension-APIs/Qlik-Sense-loads-data-from-QVD-but-considers-the-table-empty-for/m-p/2527336#M22435</link>
      <description>&lt;P&gt;Can you translate to English all the 9 points first?&lt;/P&gt;</description>
      <pubDate>Thu, 14 Aug 2025 13:06:56 GMT</pubDate>
      <guid>https://community.qlik.com/t5/Integration-Extension-APIs/Qlik-Sense-loads-data-from-QVD-but-considers-the-table-empty-for/m-p/2527336#M22435</guid>
      <dc:creator>robert_mika</dc:creator>
      <dc:date>2025-08-14T13:06:56Z</dc:date>
    </item>
  </channel>
</rss>

