DA Version 10.0.0.1569 - backwards compatible?

Hi

Using Delphi 10.3.3 & RODA 10.0.0.1569

After updating from 10.0.0.1559 to 10.0.0.1569 we’ve experiencing several problems with a Javascript client.
It seems that the client is ‘sending’ the correct requests, but on server-side this is not parsed correctly.

While using a bin-message to open a dataset, the server throws an error…

Could not load data for dsSettlements (dossier): (Detail: stack : Error: BinMessage.write: Unknown type of DynamicSelectFieldNames - undefined at BinMessage.write (http://localhost:8000/Dezq/js/RemObjectsSDK.js:964:15) at TableRequestInfoV5.writeTo (http://localhost:8000/Dezq/js/RemObjectsSDK.js:607:16) at BinMessage.write (http://localhost:8000/Dezq/js/RemObjectsSDK.js:880:14) at TableRequestInfoArray.writeTo (http://localhost:8000/Dezq/js/RemObjectsSDK.js:662:14) at BinMessage.write (http://localhost:8000/Dezq/js/RemObjectsSDK.js:880:14) at __namespace.DataAbstractService.GetData (http://localhost:8000/Dezq/js/DataAbstract4_intf.js:269:7) at Object.DoGetData (http://localhost:8000/Dezq/Dezq.js:62916:10) at Object.DoLoad (http://localhost:8000/Dezq/Dezq.js:54849:31) at Object.Load (http://localhost:8000/Dezq/Dezq.js:56112:21) at Object.WebFormCreate (http://localhost:8000/Dezq/Dezq.js:114400:26) message : BinMessage.write: Unknown type of DynamicSelectFieldNames - undefined)

After fixing this by setting AllowWhereSQL to true on serverside, the server throws another error.

Could not load data for dsSettlements (dossier): (Detail: stack : EROUnknownExceptionReceivedFromServer: [FireDAC][Phys][PG][libpq] ERROR: column "columnsorting" does not exist at BinMessage.setResponseStream (http://localhost:8000/Dezq/js/RemObjectsSDK.js:1311:17) at AjaxWrapper.ajax_post_error [as onError] (http://localhost:8000/Dezq/js/RemObjectsSDK.js:759:34) at XMLHttpRequest.onreadystatechange (http://localhost:8000/Dezq/js/RemObjectsSDK.js:1606:16) message : [FireDAC][Phys][PG][libpq] ERROR: column "columnsorting" does not exist name : EROUnknownExceptionReceivedFromServer)

It seems that a “columnsorting” is always added to the where clause (userfilter) of the query.

Changing the BIN message to a JSON message results in a ‘Exception “EROJSONException” with message “Incompatible datatype” happens during reading field “DynamicSelectFieldNames”.’

An example of the JSON send by the client

{"id":"{daec028e-0e46-44c9-a4c5-c5a5c52efe6a}","method":"ParameterService.GetData","params":{"aTableNameArray":["LanguageParameterOverview"],"aTableRequestInfoArray":[{"DynamicSelectFieldNames":{"dataType":"StringArray","value":[""]},"IncludeSchema":{"dataType":"Boolean","value":true},"MaxRecords":{"dataType":"Integer","value":-1},"Parameters":{"dataType":"DataParameterArray","value":[{"Name":"language","Value":1}]},"Sorting":{"dataType":"ColumnSorting","value":null},"UserFilter":{"dataType":"Utf8String","value":""},"WhereClause":{"dataType":"Xml","value":"<?xml version: \"1.0\"?><query xmlns=\"http://www.remobjects.com/schemas/dataabstract/queries/5.0\" version=\"5.0\"><where><binaryoperation operator=\"Equal\"><parameter type=\"LargeInt\">1</parameter><parameter type=\"LargeInt\">1</parameter></binaryoperation></where></query>"},"__type":"TableRequestInfoV5"}]}}

Pls advice.

Regards,
Filip Lagrou

Is this with the client updated and not the server, or the server updated and not the client?

In either case, it does sound like a bug/regression, not a planned change. I rather than the client is JavaScript – what platform is the server using, .NET or Delphi?

Hi Marc

Both client and server are updated.
Server is written in Delphi.

Regards,
Filip

Hi,

can you show your JS code that generates this request, pls?

Hi Evgeny

It’s hard to send the exact JS code because we developed this in Delphi using the Pas2JS compiler (TMS WEBCore).

    this.DoGetData = function (aRequest) {
      var Result = false;
      var aStrings = null;
      var aTabelRequestInfo = null;
      var aRequestInfoV5Data = pas.dasdk.TP2WDATableRequestInfoV5Data.$new();
      var aRequestInfoV5 = null;
      var aSortData = pas.dasdk.TP2WDAColumnSortingData.$new();
      var aDataRequest = null;
      var aDADataSet = null;
      var aParameters = [];
      var aDAService = null;
      if (pas.DB.TLoadOption.loAtEOF in aRequest.FLoadOptions) return false;
      aDADataSet = rtl.as(aRequest.FDataset,$mod.TP2WDADataset);
      aDataRequest = rtl.as(aRequest,$mod.TP2WDADataRequest);
      if (this.FConnection === null) throw $mod.EDADataset.$create("Create$1",[aDADataSet.FName + ": Cannot get data without connection"]);
      if (aDADataSet.FTableName === "") throw $mod.EDADataset.$create("Create$1",[aDADataSet.FName + ": Cannot get data without tablename"]);
      aDAService = this.FConnection.EnsureDataservice();
      aStrings = new RemObjects.DataAbstract.Server.StringArray();
      aStrings.fromObject([aDADataSet.FTableName]);
      aRequestInfoV5Data.MaxRecords = -1;
      aRequestInfoV5Data.IncludeSchema = true;
      aRequestInfoV5Data.DynamicSelectFieldNames = rtl.arraySetLength(aRequestInfoV5Data.DynamicSelectFieldNames,"",1);
      aRequestInfoV5Data.DynamicSelectFieldNames[0] = "";
      aSortData.FieldName = "";
      aSortData.SortDirection = "Ascending";
      aRequestInfoV5Data.Sorting.$assign(aSortData);
      aRequestInfoV5Data.UserFilter = "";
      if (aDADataSet.FWhereClause !== "") aRequestInfoV5Data.WhereClause = aDADataSet.FWhereClause;
      aParameters = this.ConvertParams(aDADataSet);
      if (rtl.length(aParameters) > 0) aRequestInfoV5Data.Parameters = rtl.arrayRef(aParameters);
      aTabelRequestInfo = new RemObjects.DataAbstract.Server.TableRequestInfoArray();
      aRequestInfoV5 = new RemObjects.DataAbstract.Server.TableRequestInfoV5();
      aRequestInfoV5.fromObject(pas.dasdk.TP2WDATableRequestInfoV5Data.$clone(aRequestInfoV5Data));
      aTabelRequestInfo.items.push(aRequestInfoV5);
      aDAService.GetData(aStrings,aTabelRequestInfo,rtl.createCallback(aDataRequest,"doSuccess"),rtl.createCallback(aDataRequest,"DoFail"));
      Result = true;
      return Result;
    };

But this is the request we’re using to fetch data.

Regards,
Filip

Hi,

what version of RO/DA JS are you using - usual or compressed one?

Hi Evgeny

We’re using the uncompressed (or usual) JS files.

Regards,
Filip

Hi,

by some reasons, your code sends

        "Sorting": {
          "dataType": "ColumnSorting",
          "value": null
        },

instead of

        "Sorting": {
          "FieldName": "",
          "SortDirection": "Ascending",
          "__type": "ColumnSorting"
        },

Can you test DA Server sample (Delphi), pls?

for this, do these actions:

we use this .js code:

		// Function that loads the data using Dynamic Select
		function loadData() {
			var dynamicSelect = ["ClientId", "ClientName", "ClientPhone"];
			var includeSchema = true;
			var maxRecords = -1; 		// Load all records
			var userFilter = ""; 		// No filter
			var parameters = []; 		// No additional parameters
			var request = RemObjects.DataAbstract.Util.createRequestInfoV5(includeSchema, maxRecords, userFilter, parameters);
			request.DynamicSelectFieldNames.value.items = dynamicSelect;
			var table = new RemObjects.DataAbstract.DataTable("Clients");

			// Obtaining the data 
			adapter.getData(table, request, function () {
				drawTable(table, "t");
			}, RemObjects.UTIL.showError);
		}

Hi Evgeny

Funny thing is that reverting to 1559 is working fine.
Anyway, I will test your example and dig into it why our code is producing the wrong JS.

I’ll keep you informed.

Regards,
Filip

Hi,

weird, TROJSONSerializer.ReadArray method is the same in .1559 and .1569.
You pass an object instead of array:

"DynamicSelectFieldNames":{"dataType":"StringArray","value":[""]}

our code expects array here …


btw, you can skip empty or null items. in this case the TROJSONMessage.AllowToReadMissingFields property should be set to true


Can you do additional tests in your environment, pls?

  • DAD .1559 and .js files from .1569
  • DAD .1569 and .js files from .1559

Hi Evgeny

We only use the TJSONMessage for testing purposes, setting the property wouldn’t solve our problem (I guess) with the BINMessage.
Furthermore, while digging into it we’ve seen a slight difference in the RemObjectsSDK.js.

We use the fromObject in our code.

And a difference in DataAbstract.js

It’s not clear to me why the .value is removed. Could that be the issue?

BTW: testing with .1569 server and .1559 js files works fine (haven’t tested it - yet - the other way)

Regards,
Filip

Hi,

yes, looks like this is issue. We have removed it because it causes issues with FireFox that was used for testing.
Seems we have to re-review it again .

What browser are you using for client-side ?

Just reverting the JS client is fine, or if you revert client and server?

Hi Evgeny

We’re using Chrome (for now), but our tool should work on every browser (obviously).

Regards
Filip

Hi Marc

Reverting only the JS files was fine.

Regards
Filip

1 Like

Thanx. that will help a lot to narrow it down, I expect.

Hi Marc, Evgeny,

The JS files Evgeny sent solved the problem.
Thanks!

Regards,
Filip

1 Like