This is a migrated thread and some comments may be shown as answers.

Proper use of Batch Update against XML web service?

1 Answer 110 Views
Data Source
This is a migrated thread and some comments may be shown as answers.
Steven
Top achievements
Rank 1
Steven asked on 03 May 2012, 12:47 AM
I am hoping someone can shed some light on the proper method for handling batch updates on a grid when the backend data source is an XML based web service.

Here are the particulars:

I would like to use the built in update, create and delete properties of the datasource transport, at the same time, I need to manipulate the data being sent to the web service from json to xml (the reader is json, the writer is xml).   The caveat to this is I need to update the actual cell value being updated not a whole record (model) at a time.   The problem with doing this strictly in the datasource (as far as I can tell) is that I cannot get details about which column changed only that the record (model) was updated.

Is there a way without putting in handlers within the KendoGrid to identify which fields have changed during the parameterMap callback so I can output just those individual values that have changed in a batch mode?


Here is what I did, but I would like to avoid putting a handler in the grid (if possible):

I put an event handler off the save property of the KendoGrid to record a list of changed cells.   Then, on the ParameterMap of the data source, I go through the records and build the proper xml.  


Is this the right approach or is there a better way to do this all within the datasource?

Here is my KendoGrid definition:

$(this._renderTo).kendoGrid({
    dataSource: this.ItemsDS,
    sortable: true,
    pageable: true,
    navigatable: true,
    editable: true,
    save: $.proxy( this.onCellChanged, this ),
    columns: [
        { field: "Position.Name", title: "Position", width: 20 },
        { field: "Headcount.value", title: "Headcount", width: 15 },
        { field: "FTE.value", title: "FTE", width: 15 },
        { field: "EmployeeName.value", title: "EmployeeName", width: 50 },
        { field: "JobCode.value", title: "JobCode", width: 20 },
        { field: "JobTitle.value", title: "JobTitle", width: 100 }
    ]
});


Then, the onCellChanged:
onCellChanged: function (e) {
    var isDirty = false;
 
    var fieldName = e.container[0].firstChild.name;
    if (!fieldName)
        return;
 
    var newValue = e.values[fieldName];
    var oldValue = e.model[fieldName]
 
    if (newValue != oldValue) {
        var esResults = this.ItemsDS._pristine.EmployeeListResponse.Results;
        elemName = fieldName;
 
        // Create the record that will be sent back to TM1
        this._employeeUpdates.items.push({
            Scenario:       esResults.Scenario,
            Position:       e.model.Position,
            Employee:       e.model.Employee,
            EntityDept:     esResults.EntityDept,
            ProductLine_s:  esResults.ProductLine_s,
            Employee_m:     { ID: elemName },
            Value:          newValue
        });
 
        e.container.data("oldValue", newValue);
    }
},

And the datasource definition
this.ItemsDS = new kendo.data.DataSource({
    transport: {
        read: {
            url: this._url + "/EmployeeList",
            dataType: "json"
        },
        update: {
            url: this._url + "/TM1ViewWrite",
            dataType: "xml"
        },
        parameterMap: $.proxy(this._crudItemDS, this)                           
    },
    pageSize: 15,
    schema: {
       :     :    :    :    :

And finally the parameterMap (crud operations):
_crudItemDS: function (options, operation) {
    if (operation == "update") {
        if (this._employeeUpdates) {
            return { events: kendo.stringify(this._employeeUpdates) };
        };
    }
    return null;
},










1 Answer, 1 is accepted

Sort by
0
Alexander Valchev
Telerik team
answered on 08 May 2012, 07:13 AM
Hello Steven,

Your approach and code snippets looks OK.
This functionality is not supported out of the box and I cannot suggest a way to implement this only through the dataSource API without putting a handler in the grid.

Greetings,
Alexander Valchev
the Telerik team
Join us on our journey to create the world's most complete HTML 5 UI Framework - download Kendo UI now!
Tags
Data Source
Asked by
Steven
Top achievements
Rank 1
Answers by
Alexander Valchev
Telerik team
Share this question
or