Select <column> from ExactOnlineREST.... en WHERE = .... geeft alle kolommen en geen data

Ik loop er tegenaan dat ik geen kolommen kan selecteren in een SQL script die ik op haal met de Data Replicator.

Nu als test heb ik het script zo simpel mogelijk gemaakt

use 1234567@eol

select code 
from   ExactOnlineREST.System.SystemDivisions@eol 
WHERE  customercode = 12345678

Ik heb het ook geprobeerd met meerdere kolommen, nu maar met één (code). Toch krijg ik altijd alle kolommen mee.

Ook de WHERE customercode = 12345678 werkt niet, in een ander script werkt het wel. Als ik het exacte script kopieer werkt het niet in het nieuwe script.

Waar kan dit door komen?

Ik ben niet in staat om uit de vraag te destilleren wat het probleem is. Kan een voorbeeld toegevoegd worden met schermafdruk (geanonimiseerd) in Query Tool, inclusief versienummer?

De volgende query geeft een resultaat met alleen de gevraagde kolommen en de verwachte waardes:

select code
,      CustomerCode
from   systemdivisions@eol
where  CustomerCode = '8020713'
limit  1

Query SystemDivisions op klantcode

Vergeten om te vertellen dat het in de Query Tool wel werkt.

select code
,      description
,      label
,      customercode 
from   ExactOnlineREST.System.SystemDivisions 
where  customercode = ----`

![image|690x269](upload://qR4xZyMM3nomn2AtByHaRD25pHa.png)

Data Hub versie: 20.1.441-BETA+1678 werkt het niet.

Wat voor melding of gedrag vertoont Data Hub? Liefst met schermafdruk.

Geen foutmeldingen:

Teveel administraties opgehaald:

Administraties

Teveel kolommen opgehaald:

Script wat hiervoor gebruikt is is:

use  ..@eol

select code 
from   ExactOnlineREST.System.SystemDivisions@eol 
where  customercode = ..

Edit:
Ook getest voor items incrementals en GLAccountClassificationMappings. Allebei ook geen kolommen geselecteerd maar volledige data ingeschreven

Het beschreven resultaat is vanuit de software Data Replicator ook het gewenste resultaat.

Het gaat over de tabel SystemDivisions op Exact Online die gerepliceerd wordt op SQL Server.

Verticaal Filteren op Administraties

Allereerst dat er 198 rijen in plaats van enkel de gekozen administraties bij use.

De tabel SystemDivisions is niet-gepartitioneerd, wat betekent dat de inhoud altijd hetzelfde is, onafhankelijk van of en hoeveel administraties gekozen zijn. Op de Exact Online PDF Poster is hierover op de rechterzijde meer te lezen betreffende het verschil tussen gepartitioneerde en niet-gepartitioneerde data.

Merk op dat Exact Online daarnaast nog eens tabellen kent die per Exact Online abonnement een andere inhoud hebben, zoals Users en MailMessagesReceived. Er is voor gekozen om die per partitie te herhalen, ook al kan een abonnement meerdere partities (administraties) bevatten. Als de unieke gegevens per abonnement nodig zijn in dit geval, dan kan dat bijvoorbeeld met:

use 
select min(code) 
from   systemdivisions 
where  status = 1 /* Active. */ 
group 
by     customercode

select ...

Horizontaal Filteren

Er zal automatich een replica gemaakt worden als een query afgevuurd wordt op een tabel en Invantive Data Replicator is actief. De replica is (bewust) volledig: alle rijen van alle gekozen partities (Exact Online: administraties) en alle kolommen worden opgehaald en gerepliceerd naar SQL Server.

Alle kolommen worden opgeslagen in de replica, ook als een SQL query enkel één kolom ophaalt.

Het idee er achter is dat als een volgende Invantive SQL query andere kolommen nodig heeft deze reeds aanwezig zijn. De prestaties van het repliceren worden in het algemeen niet beinvloedt door het aantal kolommen (procenten langzamer), maar enkel door het aantal rijen (pro rata langzamer).

Als echt specifiek maar een deel van de kolommen gewenst zijn, dan kan gewerkt worden met een tussenstap zoals:

--
-- Maak in-memory kopie van de gewenste data.
--
create or replace table mytable@inmemorystorage
as
select /*+ ods(false) */ code
from   exactonlinerest..journals
where  code = '10'

--
-- Tel de rijen, maar wissel met de ods-hint
-- het standaard replicatiegedrag van de in-memory
-- database naar WEL repliceren.
--
select /*+ ods(true, interval '0 seconds') */
       count(*)
from   mytable@inmemorystorage

Echter, deze tussenstap zorgt er wel voor dat het repliceren niet meer per partite afzonderlijk gebeurt. Nadeel daarvan is dat alle partities (administraties) tegelijk verwerkt worden en als er één faalt (bijvoorbeeld door een betalingsachterstand van een zelfboekende ondernemer), dat ze dan allen falen.

Meer informatie over de ods-hint is te vinden op Invantive SQL Grammar.

Bedankt voor de uitgebreide uitleg.

Wordt dit dan ook bij Exact Online gefilterd in de API? Of haal ik dan nog altijd gehele tabellen op en wordt er alleen in de memory storage (lokaal) gefilterd?

In dit voorbeeld (bijgesteld zodat er een filter op zit) zal het filter waar mogelijk doorgegeven worden aan Exact Online. In dit voorbeeld zal $filter=... doorgegeven.

De daadwerkelijk toegepaste filters zijn opvraagbaar zoals beschreven in Welke API calls heeft Invantive SQL daadwerkelijk uitgevoerd?.

1 Like