Laad Exact Online in Qlik Sense en Tableau

Invantive Cloud ondersteunt het laden van real-time data uit Exact Online administraties voor Power BI, Power Query en Azure Data Factory via het OData4 protocol.

Qlik Sense, Tableau e.a. met Exact Online

Echter, Qlik Sense ondersteunt alleen OData3. Qlik gebruikers konden voorheen daardoor alleen data beanderen via een tussenstap zoals datareplicatie naar een SQL Server database gegevens verwerken uit Exact Online of één van de andere ondersteunde platformen.

Tableau ondersteunt sinds einde 2022 ook OData4:

For JSON

Dankzij de for json clause is het echter eenvoudig om de data te benaderen met een webapp in Invantive Cloud die de real-time gegevens uit Exact Online teruggeeft voor verwerking in Qlik met de Qlik REST Connector. Voor grotere volumes kan ook Invantive App Online als applicatieserver gebruikt worden.

De Qlik REST Connector ondersteunt standaard de benodigde Basic authentication en via de URL kan meegegeven worden welke tabel(len) uit Exact Online teruggegeven moeten worden. Ook geavanceerdere scenario’s met filteren op Exact Online administratie of bijvoorbeeld specifieke klanten of datums is zo eenvoudig mogelijk.

Terzijde: indien bijvoorbeeld een CSV, XML of Excel-formaat gewenst is, dan kan dat ook via de respectievelijke for ...-clauses zoals bijvoorbeeld beschreven in:

Webapp

Doorloop de volgende stappen om een webapplicatie te maken die de JSON teruggeeft om te analyseren in Qlik Sense. Dit concept is behalve op Exact Online ook eenvoudig toepasbaar voor willekeurig welk cloudplatform zoals ActiveCampaign of Simplicate.

Voer de volgende stappen uit om Exact Online te laden in Qlik:

  • Zorg dat een Exact Online database bestaat. Als die niet bestaat, maak hem aan via Anmelden.
  • Voeg een applicatie toe voor de JSON connector:
    JSON connector
  • Voeg aan deze nieuwe applicatie een uitvoerbare module toe:
    JSON output voor Qlik REST Connector
  • De broncode staat aan het einde van dit topic.
  • Ga terug naar de applicatie en kies de knop “Uitvoeren”:
    Uitvoeren applicatie
  • Kies de Exact Online database:
    Exact Online database
  • En kies de knop “Uitvoeren”.
  • Test de module door op de module te klikken en kies uiteindelijk “Kopieer Link”.
  • Op het klembord staat nu de URL om deze applicatiemodule uit te voeren voor de gekozen database.
  • Plaats deze URL in de Qlik REST Connector met erachter de tabelnaam, samen met de Invantive Cloud aanmeldgegevens:

https://app-online.invantive.com/apps/GUID/databases/URLSEGMENT/modules/GUID/?table=ExactOnlineREST.Financial.Journals

Broncode

declare
  l_table_fq_name constant varchar2 := cloud_http.get_request_query_parameter_value('table');
begin
  --
  -- Check that a table is specified.
  --
  if coalesce(length(l_table_fq_name), 0) = 0
  then
    raise_application_error(-20163, 'Specify a full qualified table name using the ''table'' query parameter.');
  end if;
  --
  -- Check correct table name.
  -- 
  declare
    l_dummy pls_integer;
  begin
    select 1
    into   l_dummy
    from   systemtables@datadictionary
    where  full_qualified_name = l_table_fq_name
    ;
  exception
    when no_data_found
    then
      declare
        l_hint varchar2;
      begin
        select listagg(full_qualified_name || ' (alias ' || ste.provider_data_container_alias || ')')
        into   l_hint
        from   systemtables@datadictionary ste
        where  ( levenshtein(ste.full_qualified_name, l_table_fq_name) <= 10
                 or
                 levenshtein(ste.name, l_table_fq_name) <= 10
               )
        ;
        raise_application_error
        ( -20163
        , 'There is no table with the full qualified name ''' 
          || l_table_fq_name 
          || '''.'
          || case
             when l_hint is not null
             then ' Consider for instance: '
                  || l_hint
             else null
             end
        );
      end;
  end;
  --
  -- Return output as JSON.
  --
  cloud_http.set_response_content_type('application/json');
  --
  -- Append JSON form of table contents to HTTP output.
  --
  for r in
  ( execute
    immediate 
    'select * from ' 
    || coalesce(l_table_fq_name, 'MISSING')
    || ' for json auto'
  )
  loop
    cloud_http.append_to_response_body_text(r.json);
  end loop;
end;

Een voorbeeld URL met de REST connector op Qlik is de volgende URL die alle projecten download uit de voorbeeld database:

https://cloud.invantive.com/app/development/applications/.../execute/.../modules/…?table=Dummy.Demo.Projects

401 foutmelding bij Downloaden in Qlik

Er kan een 401 Unauthorized foutmelding optreden bij het laden van Exact Online in Qlik, die niet optreedt als de URL van App Online in de browser gebruikt wordt. Controleer dan dat de HTTP-header “User-Agent” een waarde heeft gekregen in Qlik. Voeg ook het IP-adres van Qlik zoals ::ffff:52.31.212.214 toe aan de toegestane IP-adressen of gebruik de * wildcard.

XML foutmelding bij ophalen tabellen

Bij het ophalen van de lijst met tabellen dient u te kiezen voor `` JsonV4ListResourcesen niet voorListResources` (die enkel het verouderde XML ondersteunt):

OutOfMemoryException bij Preview

De Qlik Cloud preview kan een OutOfMemoryException geven bij het previewen. Dit is een preview-only issue. Gelieve de gegevens gewoon te laden. Preview is mogelijk door $top=100 bij de OData options op te geven in previewvenster.

1 like

Ik kan de JSON in een browser aanroepen maar ik kom niet verder in Qlik.
Bij het invoeren van “Basic” authentication wordt er nog steeds de onderstaande error gegeven. Moet dit met parameters gedaan worden?

HTTP protocol error 401 (Unauthorized): Requested resource requires authentication.

Wanneer ik onderstaande probeer met bijvoorbeeld divisie code 123456 werkt dit niet. Hoe kan je filters hier invoeren?

https://app-online.invantive.com/apps/GUID/databases/URLSEGMENT/modules/GUID//?table=ExactOnlineREST.System.SystemDivisions?$filter=Code%20eq%20123456

De melding

geeft aan dat blijkbaar de Basic authenticatiegegevens niet doorgegeven worden. Neem even contact op met support via Teamviewer, dan wordt er gezamenlijk gekeken.

M.b.t. filters: die zijn in dit voorbeeld niet mogelijk gemaakt. $filter is OData syntax, maar dit loopt volledig buiten OData om, hetgeen juist het voordeel is voor specifieke toepassingen.

Filters zijn wel mogelijk, net zoals via get_request_query_parameter_value('table') de waarde van de GET-parameter table wordt opgevraagd en gebruikt. Bijvoorbeeld door een parameter division te verwerken in de PSQL is zo’n filter mogelijk.

Hou er wel rekening mee dat GET-parameters maar 1x door een ? voorafgegaan mogen worden om een geldige URL te vormen. Denk aan bijvoorbeeld deze URLs:

https://app-online.invantive.com/apps/GUID/databases/URLSEGMENT/modules/GUID//?table=ExactOnlineREST.System.SystemDivisions&division=123456

1 like

In afwachting van de OData4-driver van Qlik Sense zelf (aangekondigd voor februari 2022) bij deze nog een toevoeging voor accountants.

Het is mogelijk om de download te beperken tot een aantal administraties, bijvoorbeeld door de divisiecodes mee te geven in de GET-parameter divisions als een comman-gescheiden lijst van Exact Online divisiecodes.

Hiervoor dienen de eerste paar regels PSQL aangepast te worden naar:

declare
  l_table_fq_name constant varchar2 := cloud_http.get_request_query_parameter_value('table');
  l_divisions     constant varchar2 := cloud_http.get_request_query_parameter_value('divisions');
begin
  --
  -- Deviate from regular divisions selected in on-startup of database.
  --
  if l_divisions is not null
  then
    use
    select code
    ,      'eol'
    from   systemdivisions@eol
    where  ',' || replace(l_divisions, ' ', '') || ',' like '%,' || code || ',%'
    ;
  end if;
  --
  -- Check that a table is specified.
  --
... oorspronkelijke code die na "Check that a table is specified" staat.