I have a ListGrid where I update a set of rows via javascript and save them with saveAllEdits().
If more than one row is updated, I get a warning dialog with the message "Server returned SUCCESS with no error message performing operation 'foo_update'."
The callback from saveAllEdits seems not to be called.
What is wrong?
How can I avoid this warning dialog?
SmartClient Version: v12.0p_2018-11-13/LGPL Development Only (built 2018-11-13)
This is the code for the web page.
The data source. Backend is written in ruby based on the article from wiki.
If more than one row is updated, I get a warning dialog with the message "Server returned SUCCESS with no error message performing operation 'foo_update'."
The callback from saveAllEdits seems not to be called.
What is wrong?
How can I avoid this warning dialog?
Code:
09:54:35.305:TMR2:DEBUG:ResultSet:isc_ResultSet_0 (dataSource: foo, created by: fooList):getRange(0, 3) satisfied from cache 09:54:35.314:TMR2:INFO:RPCManager:sendQueue called with no current queue, ignoring 09:54:35.325:TMR5:WARN:RPCManager:Multiple RPCRequests with params attribute in one transaction - merging 09:54:35.325:TMR5:WARN:RPCManager:Multiple RPCRequests with params attribute in one transaction - merging 09:54:35.326:TMR5:INFO:RPCManager:sendQueue[3]: 3 RPCRequest(s); transport: xmlHttpRequest; target: /foo/update 09:54:35.330:TMR5:DEBUG:RPCManager:XMLHttpRequest POST to /foo/update?isc_dataFormat=json contentType: application/json with body -->{ "transaction": { "transactionNum": 3, "operations": [{ "dataSource":"foo", "operationType":"update", "textMatchStyle":"exact", "componentId":"fooList", "data":{ "id":1, "value2":"" }, "oldValues":{ "id":1, "value1":"Hallo", "value2":"doIt" } }, { "dataSource":"foo", "operationType":"update", "textMatchStyle":"exact", "componentId":"fooList", "data":{ "id":2, "value2":"" }, "oldValues":{ "id":2, "value1":"Welt", "value2":"doIt" } }, { "dataSource":"foo", "operationType":"update", "textMatchStyle":"exact", "componentId":"fooList", "data":{ "id":3, "value2":"" }, "oldValues":{ "id":3, "value1":"!", "value2":"doIt" } }]}}<-- 09:54:35.474:XRP7:INFO:RPCManager:transaction 3 arrived after 138ms 09:54:35.475:XRP7:DEBUG:RPCManager:Result string for transaction 3: "{"response":[{"data":[{"id":1,"value1":"Hallo","value2":null}],"startRow":null,"endRow":null,"status":0,"totalRows":null},{"data":[{"id":2,"value1":"Welt","value2":null}],"startRow":null,"endRow":null,"status":0,"totalRows":null},{"data":[{"id":3,"value1":"!","value2":null}],"startRow":null,"endRow":null,"status":0,"totalRows":null}]}" 09:54:35.482:XRP7:INFO:RPCManager:rpcResponse(unstructured) results -->{response: Array[3]}<-- 09:54:35.488:XRP7:DEBUG:ResultSet:isc_ResultSet_0 (dataSource: foo, created by: fooList):dataSource data changed firing 09:54:35.492:XRP7:INFO:ResultSet:isc_ResultSet_0 (dataSource: foo, created by: fooList):updating cache in place after operationType: update, allMatchingRowsCached true 09:54:35.494:XRP7:INFO:ResultSet:isc_ResultSet_0 (dataSource: foo, created by: fooList):Updating cache: operationType 'update' submitted by 'fooList',3 rows update data: [ {id: 1, value1: "Hallo", value2: null}, {id: 2, value1: "Welt", value2: null}, {id: 3, value1: "!", value2: null} ] 09:54:35.497:XRP7:DEBUG:ResultSet:isc_ResultSet_0 (dataSource: foo, created by: fooList):updated cache: 0 row(s) added, 3 row(s) updated, 0 row(s) removed. 09:54:35.498:XRP7:INFO:ResultSet:isc_ResultSet_0 (dataSource: foo, created by: fooList):doSort: sorting on properties [id] : directions [true] : full cache allows local sort 09:54:35.509:XRP7:INFO:RPCManager:rpcResponse(unstructured) results -->undef<-- 09:54:35.589:XRP7:WARN:RPCManager:Server returned SUCCESS with no error message performing operation 'foo_update'. - response: {operationId: "foo_update", clientContext: undef, internalClientContext: Obj, context: Obj, transactionNum: 3, httpResponseCode: 200, httpResponseText: "{"response":[{"data":[{"id":1,"value1":"..."[336], xmlHttpRequest: [object XMLHttpRequest], transport: "xmlHttpRequest", status: 0, clientOnly: undef, httpHeaders: Obj, isStructured: true, callbackArgs: null, results: undef, data: undef} 09:54:35.590:XRP7:INFO:RPCManager:rpcResponse(unstructured) results -->undef<-- 09:54:35.611:XRP7:WARN:RPCManager:Server returned SUCCESS with no error message performing operation 'foo_update'. - response: {operationId: "foo_update", clientContext: undef, internalClientContext: Obj, context: Obj, transactionNum: 3, httpResponseCode: 200, httpResponseText: "{"response":[{"data":[{"id":1,"value1":"..."[336], xmlHttpRequest: [object XMLHttpRequest], transport: "xmlHttpRequest", status: 0, clientOnly: undef, httpHeaders: Obj, isStructured: true, callbackArgs: null, results: undef, data: undef} 09:54:35.616:XRP7:DEBUG:EventHandler:firing threadExitActions: [ anonymous() ] 09:54:35.668:TMR3:DEBUG:ResultSet:isc_ResultSet_0 (dataSource: foo, created by: fooList):getRange(0, 3) satisfied from cache 09:54:35.674:TMR3:INFO:RPCManager:sendQueue called with no current queue, ignoring
This is the code for the web page.
Code:
<script> function doThings( what, viewer, records) { fooList.startEditing(); var rows = []; for( i = 0; i < records.length; i++) { var record = records[i]; var row = fooList.getRecordIndex( record); rows[i] = row; fooList.setEditValue( row, "value2", what); } fooList.endEditing(); fooList.saveAllEdits( rows, function( dsResponse, dsRequest) { console.warn( "callback"); console.warn( dsResponse);}); } isc.ListGrid.create({ ID: "fooList", autodraw: false, width: "99%", height: "450", autoFitWidthApproach: "both", autoFitFieldWidths: true, canSort: true, canGroupBy: true, showFilterEditor: true, alternateRecordStyles: true, dataSource: "foo", autoFetchData: true, selectionType: "multiple", canEdit: false, autoSaveEdits: false, initialSort: [ { property: "id" } ], dataPageSize: 20, showRowNumbers: true, fields: [ {name: "id", title: "ID"}, {name: "value1", title: "Value 1"}, {name: "value2", title: "Value 2"} ], editComplete: function( rowNum, colNum, newValues, oldValues, editCompletionEvent, dsResponse) { console.warn( "editComplete for row " + rowNum); console.warn( dsResponse); }, editFailed: function( rowNum, colNum, newValues, oldValues, editCompletionEvent, dsResponse) { console.warn( "editFailed for row " + rowNum); console.warn( dsResponse); } }); isc.IButton.create({ ID: "doItButton", autodraw: false, title:"doIt", click: function () { doThings( "doIt", fooList, fooList.getSelectedRecords()); } }); isc.IButton.create({ ID: "undoItButton", autodraw: false, title:"undoIt", click: function () { doThings( "", fooList, fooList.getSelectedRecords()); } }); </script> <div> <h1>Just a simple example</h1> </div> <div> <script> isc.VStack.create({ ID: "main", position: "relative", width: "99%", defaultHeight: 15, overflow: "visible", membersMargin: 5, members: [ fooList, doItButton, undoItButton ] }); </script> </div> <!-- Die Konsole: --> <script>isc.showConsole()</script>
Code:
isc.RestDataSource.create({ ID: "foo", fields: [ {name: "id", type: "integer", primaryKey: true}, {name: "value1", type: "text", length: 30}, {name: "value2", type: "text", length: 30} ], dataFormat: "json", jsonPrefix: "", jsonSuffix: "", operationBindings: [ {operationType: "fetch", dataProtocol: "postMessage", dataURL: "/foo/fetch"}, {operationType: "update", dataProtocol: "postMessage", dataURL: "/foo/update"} ] });