Persoonsgegevens uit EasyFlex API ophalen

Graag zouden wij een koppeling maken met de Easyflex API waar wij een enkele tabel van willen ontsluiten. Is het mogelijk om hier een ontsluiting voor te maken in afwachting van een mogelijke driver?

Om welke specifieke tabel gaat het?

Als u een licentiesleutel stuurt van een testomgeving, dan zullen we proberen dat te vangen in een standaard HTTPDownload query.

Het gaat om de tabel: fw_persoonsgegevens.

Als het maar om één tabel uit de EasyFlex API gaat, dan is een view mogelijk een oplossing:

create or replace view EasyFlexPersoonsgegevens
as
select xml.*
from   HTTPDownload@DataDictionary
       ( url => 'https://easyflex.net/dataservice/'
       , method => 'POST'
       , contentType => 'text/xml'
       , diskCache => true
       , diskCacheMaxAgeSec => 86400 /* Cache one day. */
       , textPayload
         =>
         xmlformat
         ( '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:EfDataService"><soapenv:Header/><soapenv:Body>'
           || '<urn:ds_fw_persoonsgegevens_all>'
           || xmlelement('urn:license', 'PUT-HERE-SECRET-LICENSE-KEY-OR-JOIN-WITH-A-SETTINGS-TABLE')
           || '<urn:parameters>'
           || xmlelement('urn:memorubrieken', false)
           || xmlelement('urn:communicatie', false)
           || xmlelement('urn:reservering', false)
           || '</urn:parameters>'
           || '<urn:fields>'
           || '<urn:fw_persoonsgegevens_all_registratienummer/>'
           || '<urn:fw_persoonsgegevens_all_inschrijver/>'
           || '<urn:fw_persoonsgegevens_all_dossiernummer/>'
           || '<urn:fw_persoonsgegevens_all_achternaam/>'
           || '<urn:fw_persoonsgegevens_all_voornaam/>'
           || '</urn:fields>'
           || '</urn:ds_fw_persoonsgegevens_all>'
           || '</soapenv:Body></soapenv:Envelope>'
         )
       ) htp
join   XMLTable
       ( '/*["Envelope"=local-name()]/*["Body"=local-name()]/*["ds_fw_persoonsgegevens_all_result"=local-name()]/*["fields"=local-name()]/*["item"=local-name()]'
         passing htp.contents_char
         columns registratienummer int      not null path './*["fw_persoonsgegevens_all_registratienummer"=local-name()]'
         ,       inschrijver       int      not null path './*["fw_persoonsgegevens_all_inschrijver"=local-name()]'
         ,       dossiernummer     int64        null path './*["fw_persoonsgegevens_all_dossiernummer"=local-name()]'
         ,       achternaam        varchar2 not null path './*["fw_persoonsgegevens_all_achternaam"=local-name()]'
         ,       voornaam          varchar2     null path './*["fw_persoonsgegevens_all_voornaam"=local-name()]'
       ) xml

Een dergelijke view kan vastgelegd worden zoals beschreven in Eigen database-views gebruiken voor SQL en BI-tools door hem vast te leggen in de “On Startup SQL” van de database.

De view gebruikt local-name; dat kan efficiënter, maar is vlotte en eenvoudige manier om de XML-namespaces niet te hoeven organiseren.

De HTTP diskcache is in HTTPDownload@DataDictionary ingesteld op 1 kalenderdag.

Gebruik

De persoonsgegevens uit EasyFlex zijn vervolgens vlot te benaderen in Invantive SQL via bijvoorbeeld:

select *
from   EasyFlexPersoonsgegevens

met als resultaat bijvoorbeeld:

In Power BI kan de tabel gekozen worden mits de viewdefinitie in de startup SQL staat. Vergeet niet om bij wijzigingen in de view in Bridge Online in het menu rechtsboven te kiezen voor “Cache resetten”.

Een luxere versie is gebruik maken van een klein app in Invantive App Online, maar dat is in geval van maar één tabel overmatig complex.

Performance

Een test is uitgevoerd met circa 2400 regels. Verwachting was dat de looptijd van de Invantive SQL query even zou duren, maar ondanks het riante gebruik van local-name worden alle gegevens ruim binnen de second opgehaald.