Twinfield.Dimenions.Customers geeft Invalid JSON. A comma character ‘,’ was expected in scope ‘Array’

Op de Twinfield.Dimensions.Customers krijg ik een foutmelding (zowel in Power BI als in Invantive Query Tool. De onderstaande foutmelding krijg ik als ik de data via Power BI ontsluit:

Failed to save modifications to the server.
Error returned: 'OLE DB or ODBC error: [DataSource.Error]
OData: Invalid JSON.
A comma character ‘,’ was expected in scope ‘Array’.
Every two elements in an array and properties of an object must be separated by commas…

Welke oorspronkelijke foutmelding (code en tekst) is bij dit verzoek te zien in Invantive Bridge Online Monitoring bij doorklikken naar het request?

Een nieuwe release van Invantive Bridge Online is zojuist in productie genomen. Advies is om voor zekerheid de download nogmaals te draaien. Mocht het niet werken, gelieve dan een antwoord toe te voegen met de melding.

Helaas nog steeds hetzelfde probleem, foutmelding in Power BI, lijkt te komen nadat de gegevens zijn gedownload en verwerkt worden in Power BI. Althans deze indruk krijg ik.

Twinfield Dimensions Customers@tfd
Failed to save modifications to the server.
Error returned: 'OLE DB or ODBC error: [DataSource.Error]
OData: Invalid JSON.
A comma character ‘,’ was expected in scope ‘Array’.
Every two elements in an array and properties of an object must be separated by commas…
The current operation was cancelled because another operation in the transaction failed. '.

Twinfield Dimensions CustomerAddresses@tfd

Failed to save modifications to the server.
Error returned: 'OLE DB or ODBC error: [DataSource.Error]
OData: Invalid JSON.
A comma character ‘,’ was expected in scope ‘Array’.
. Every two elements in an array and properties of an object must be separated by commas…
The current operation was cancelled because another operation in the transaction failed. '.

Helaas is de bridge-online monitor niet beschikbaar : HTTP ERROR 401

Een melding HTTP 401 kan incidenteel optreden (we zien dat vaker in Google Chrome). 401 betekent “Unauthorized” en dan heeft Chrome te snel geoordeeld dat aanmelden niet lukte. Helaas staat dit buiten onze controle en treedt ook bij andere sites op.

Advies is om dan via F5 het venster te vernieuwen en alsnog de aanmeldgegevens in te voeren.

Welke melding staat dan in Invantive Bridge Online Monitoring?

In de query tool krijg ik de onderstaande melding terug, wellicht dat dit extra informatie verschaft.

Invantive.Basics.InvantiveSqlException
at Invantive.Basics.ValidationException…ctor(GlobalState owner, ExecutionOptions executionOptions, String messageCode, String errorMessage, String kindRequest, String localStackTrace, String nk, Exception innerException, Boolean inheritMessageCodeWhenPresent, Nullable1 uid, Boolean isRecoverable, String poolIdentityId, String url) at Invantive.Basics.InvantiveSqlException..ctor(GlobalState owner, ExecutionOptions executionOptions, String validationCode, String errorMessage, String kindRequest, String stackTrace, String nk, Exception innerException, Boolean inheritMessageCodeWhenPresent, Nullable1 uid, Boolean isRecoverable, String poolIdentityId)
at Invantive.Data.Providers.Soap.SoapProvider.DoRequest(GlobalState owner, ExecutionOptions executionOptions, HttpWebRequest request, String url, ObjectDefinition objectDefinition, String partitionCode, String callSafeNameOverrule, ParameterList parameters, Object requestData, ExecutionStatistics& executionStatistics)
at Invantive.Data.Providers.Soap.SoapProvider.Post(GlobalState owner, ExecutionOptions executionOptions, String relativeUrl, Dictionary2 headers, Byte[] postData, ObjectDefinition objectDefinition, CacheSettings cacheSettings, String cachePostfix, ExecutionStatistics& executionStatistics, String acceptMimeType, String contentType, Boolean authenticate, Boolean preventRetry, String partitionCode, String method, String callSafeNameOverrule, ParameterList parameters, String publicQueryParameters, String additionalContextNativeCall, String dataContainerIdOverrule) at Invantive.Data.Providers.Twinfield.TwinfieldProvider.CVB(GlobalState , ExecutionOptions , String , String , String , ObjectDefinition , QueryObject , CacheSettings , String , String , Boolean , Boolean , String , String , ParameterList , String , String ) at Invantive.Data.Providers.Twinfield.TwinfieldProvider.QZP.MoveNext() at Invantive.Data.Providers.Twinfield.TwinfieldProvider.HZP.MoveNext() at Invantive.Data.SqlUtility.IFE.MoveNext() at System.Linq.Enumerable.<SelectManyIterator>d__172.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext() at Invantive.Sql.V1.DataSourceOrFunctionTree.<GetData>d__51.MoveNext() at Invantive.Data.CompressedEnumerable1.d__10.MoveNext()
at Invantive.Sql.V1.FirehoseResultSet.HJ.MoveNext()
at Invantive.Sql.V1.FirehoseResultSet.FJ.MoveNext()
at Invantive.Data.CompressedEnumerable1.<GetEnumerator>d__10.MoveNext() at Invantive.Sql.V1.FirehoseResultSet.HJ.MoveNext() at Invantive.Sql.V1.FirehoseResultSet.FJ.MoveNext() at Invantive.Sql.V1.FilterIterator.SJ.MoveNext() at Invantive.Sql.V1.FirehoseResultSet.FJ.MoveNext() at Invantive.Sql.V1.ChainedFirehose.AJ.MoveNext() at Invantive.Sql.V1.FirehoseResultSet.FJ.MoveNext() at Invantive.Sql.V1.SelectListIterator.EL.MoveNext() at Invantive.Sql.V1.FirehoseResultSet.FJ.MoveNext() at Invantive.Data.CompressedEnumerable1.d__10.MoveNext()
at Invantive.Sql.V1.FirehoseResultSet.HJ.MoveNext()
at Invantive.Sql.V1.MaterializeSparseArrayIterator.d__1.MoveNext()
at Invantive.Sql.V1.QueryPlan.CS.MoveNext()
at Invantive.Data.ExtensionMethods.KVE1.AVE.MoveNext() at System.Collections.Generic.List1…ctor(IEnumerable1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable1 source)
at Invantive.Data.ConnectionManager.WN.P(QueryPlan )
at System.Linq.Enumerable.WhereSelectArrayIterator2.MoveNext() at System.Linq.Buffer1…ctor(IEnumerable1 source) at System.Linq.Enumerable.ToArray[TSource](IEnumerable1 source)
at Invantive.Data.ConnectionManager.ExecuteAndCombineQueryPlansV1(GlobalState owner, ExecutionOptions executionOptions, QueryPlan[] queryPlans, String sqlStatement, ParameterList parameters)
at Invantive.Data.ConnectionManager.ExecuteProviderPassthroughSqlActionTable(GlobalState owner, ExecutionOptions executionOptions, String actionSql, ParameterList parameters, String callSafeNameOverrule)
at Invantive.Data.ConnectionManager.PassthroughSqlActionTable(GlobalState owner, ExecutionOptions executionOptions, String actionSql, ParameterList parameters, String callSafeNameOverrule)
at Invantive.Data.ActionProceduresBase.PassthroughSqlActionTable(GlobalState owner, ExecutionOptions executionOptions, String actionSql, ParameterList parameters)
at Invantive.Producer.Windows.Forms.QueryToolResults.BJG(GlobalState , ExecutionOptions , IProgressNotifier , String , ParameterList , Boolean , Boolean , Boolean , Boolean )
at Invantive.Producer.Windows.Forms.QueryToolResults.OJG(GlobalState , ExecutionOptions , String , ParameterList )
at Invantive.Producer.Windows.Forms.QueryToolResults.JP.W()
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at Invantive.Data.Providers.Soap.SoapProvider.DoRequest(GlobalState owner, ExecutionOptions executionOptions, HttpWebRequest request, String url, ObjectDefinition objectDefinition, String partitionCode, String callSafeNameOverrule, ParameterList parameters, Object requestData, ExecutionStatistics& executionStatistics)
at Invantive.Data.Providers.Soap.SoapProvider.Post(GlobalState owner, ExecutionOptions executionOptions, String relativeUrl, Dictionary2 headers, Byte[] postData, ObjectDefinition objectDefinition, CacheSettings cacheSettings, String cachePostfix, ExecutionStatistics& executionStatistics, String acceptMimeType, String contentType, Boolean authenticate, Boolean preventRetry, String partitionCode, String method, String callSafeNameOverrule, ParameterList parameters, String publicQueryParameters, String additionalContextNativeCall, String dataContainerIdOverrule) at Invantive.Data.Providers.Twinfield.TwinfieldProvider.CVB(GlobalState , ExecutionOptions , String , String , String , ObjectDefinition , QueryObject , CacheSettings , String , String , Boolean , Boolean , String , String , ParameterList , String , String ) at Invantive.Data.Providers.Twinfield.TwinfieldProvider.QZP.MoveNext() at Invantive.Data.Providers.Twinfield.TwinfieldProvider.HZP.MoveNext() at Invantive.Data.SqlUtility.IFE.MoveNext() at System.Linq.Enumerable.<SelectManyIterator>d__172.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext() at Invantive.Sql.V1.DataSourceOrFunctionTree.<GetData>d__51.MoveNext() at Invantive.Data.CompressedEnumerable1.d__10.MoveNext()
at Invantive.Sql.V1.FirehoseResultSet.HJ.MoveNext()
at Invantive.Sql.V1.FirehoseResultSet.FJ.MoveNext()
at Invantive.Data.CompressedEnumerable1.<GetEnumerator>d__10.MoveNext() at Invantive.Sql.V1.FirehoseResultSet.HJ.MoveNext() at Invantive.Sql.V1.FirehoseResultSet.FJ.MoveNext() at Invantive.Sql.V1.FilterIterator.SJ.MoveNext() at Invantive.Sql.V1.FirehoseResultSet.FJ.MoveNext() at Invantive.Sql.V1.ChainedFirehose.AJ.MoveNext() at Invantive.Sql.V1.FirehoseResultSet.FJ.MoveNext() at Invantive.Sql.V1.SelectListIterator.EL.MoveNext() at Invantive.Sql.V1.FirehoseResultSet.FJ.MoveNext() at Invantive.Data.CompressedEnumerable1.d__10.MoveNext()
at Invantive.Sql.V1.FirehoseResultSet.HJ.MoveNext()
at Invantive.Sql.V1.MaterializeSparseArrayIterator.d__1.MoveNext()
at Invantive.Sql.V1.QueryPlan.CS.MoveNext()
at Invantive.Data.ExtensionMethods.KVE1.AVE.MoveNext() at System.Collections.Generic.List1…ctor(IEnumerable1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable1 source)
at Invantive.Data.ConnectionManager.WN.P(QueryPlan )
at System.Linq.Enumerable.WhereSelectArrayIterator2.MoveNext() at System.Linq.Buffer1…ctor(IEnumerable1 source) at System.Linq.Enumerable.ToArray[TSource](IEnumerable1 source)
at Invantive.Data.ConnectionManager.ExecuteAndCombineQueryPlansV1(GlobalState owner, ExecutionOptions executionOptions, QueryPlan[] queryPlans, String sqlStatement, ParameterList parameters)
at Invantive.Data.ConnectionManager.ExecuteProviderPassthroughSqlActionTable(GlobalState owner, ExecutionOptions executionOptions, String actionSql, ParameterList parameters, String callSafeNameOverrule)
— End of stack trace from previous location where exception was thrown —
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at Invantive.Data.ConnectionManager.ExecuteProviderPassthroughSqlActionTable(GlobalState owner, ExecutionOptions executionOptions, String actionSql, ParameterList parameters, String callSafeNameOverrule)
at Invantive.Data.ConnectionManager.PassthroughSqlActionTable(GlobalState owner, ExecutionOptions executionOptions, String actionSql, ParameterList parameters, String callSafeNameOverrule)
— End of stack trace from previous location where exception was thrown —
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at Invantive.Data.ConnectionManager.PassthroughSqlActionTable(GlobalState owner, ExecutionOptions executionOptions, String actionSql, ParameterList parameters, String callSafeNameOverrule)
at Invantive.Data.ActionProceduresBase.PassthroughSqlActionTable(GlobalState owner, ExecutionOptions executionOptions, String actionSql, ParameterList parameters)
at Invantive.Producer.Windows.Forms.QueryToolResults.BJG(GlobalState , ExecutionOptions , IProgressNotifier , String , ParameterList , Boolean , Boolean , Boolean , Boolean ) in c:\smoke\ws-22.0\Invantive.Producer\src\Invantive.Producer.Windows.Forms\QueryTool\QueryToolTraceViewModel.cs:line 17
at Invantive.Producer.Windows.Forms.QueryToolResults.OJG(GlobalState , ExecutionOptions , String , ParameterList ) in c:\smoke\ws-22.0\Invantive.Producer\src\Invantive.Producer.Windows.Forms\QueryTool\QueryToolDbmsOutputViewModel.cs:line 133

http 401 melding komt uit microsoft edge

Dank! Ik begrijp dat hetzelfde probleem ook in Invantive Query Tool optreedt. Welke foutcode (itgen…) staat hier bij?

Invantive query tool geeft: itgensop033

Inmiddels al vorderingen te melden of is de zoektocht een uitdaging?

De foutcode itgensop033 heet in nieuwe versies itgensop090. Ook bij een andere gebruiker treed deze melding op; het betreft een Cloudflare response timeout. Zie Error 524 (itgensop090) bij ophalen GeneralLedgerDetailsV3

In dit geval treedt blijkbaar een time-out bij het ophalen van dimensiewaardes, terwijl het andere geval het ophalen van een groot aantal boekingen betreft.

We tasten nog in het duister waarom deze Cloudflare foutmeldingen niet eerder gezien zijn. Met klanten zal het pagineren per periode ook niet lukken zoals nu de gedachte aanvliegroute voor de transacties.

Enkele vragen:

  • Heeft het ophalen van Twinfield.Dimensions.Customers@tfd ooit gewerkt? Of worden ze de eerste keer opgehaald?
  • Hoeveel klanten / klantadressen worden grofweg verwacht (10, 100, 1.000, 10.000, 100.000, 1 miljoen)?

Voor het Invantive Query Tool is het voorlopige advies om in ieder geval een upgrade te plaatsen naar de meest recente productieversie voor een duidelijker melding. De meest recente versie is te vinden op https://releasenotes.invantive.com.

Het ophalen van “Customers” heeft nooit gewerkt. Dit is de eerste keer dat we dit gebruiken.

Grofweg gaat het om 125k klanten, ongeveer 108MB

Het aantal van 125.000 klanten is een orde van grootte groter dan van andere Twinfield-omgevingen.

De download van Customers is teruggevonden van deze omvang. Het gaat om 11 MB aan data die na tussen 82 en 100 seconden een antwoord geeft.

In een korte steekproef is dit de reguliere doorvoersnelheid. 500 relaties zijn circa 50 KB en kosten 750 ms om op te halen. Deze Twinfield API biedt geen paginering; alle data komt in 1x retour en is onderworpen aan de tijdslimieten die Twinfield hiervoor stelt.

Als alternatief kan eventueel DebtorDimensionValues gebruikt worden; die is vrijwel identiek qua aantal rijen en gebruikt paginering. Helaas heeft DebtorDimensionValues wel veel minder kolommen. De DebtorDimensionValues is gebaseerd op de Twinfield “Finder” met een filter op de dimensiewaarde “DEB”.

Een workaround kan zijn om dezelfde query herhaaldelijk af te vuren. Het lijkt er op dat bij overschrijding van de 90 of 100 seconden deze foutmelding optreedt. Soms is het wel gelukt om het binnen deze tijdslimiet op te vragen.

Tenslotte kan het zijn dat er nog features zijn die wel beschikbaar zijn, maar niet in de Twinfield-documentatie staan. U kunt de vraag eventueel neerleggen bij Twinfield zelf; mogelijk dat zij op basis van interne documentatie hier nog tips bij hebben.