Child to Parent table kendoDropDownList

Posted by Martin Velikov on 04-Jul-2017 07:26

Hello, I have this working kendoDropDownList.
Currently I am picking from kendoDropDownList the Name from the Child table and store the SubNum there and everithing is working perfect.
Now I want to see in my Parent table in this column not the SumNum, but the Name and I can't do it. I saw the cascadeFromField example.

                    var subConDataSourceOptions = $scope._$ds.SubConDS.options;
                    $scope.gridRoute.options.columns[7].editor = function (container, options) {
                    	

                        var input = $("<input/>);

                        input.attr("name", options.field);
                        input.appendTo(container);
                        input.kendoDropDownList({
                        	filter: "contains",
                        	minlength: 3,
                        	autoSync: true,
                            dataTextField: "Name",
                            dataValueField: "SubNum",
                            dataSource: subConDataSourceOptions                        
                        });
                        
                    };

Posted by egarcia on 05-Jul-2017 14:33

Hello Martin,

Thank you for the info.

We have a similar scenario.

We both have a configuration with tables.

Customer as the main with grid grid0 using CustomerDS as a the data source and Salesrep with SalesrepDS.

The common column (field) is SalesRep.

It looks like the issue that you are seeing is because the following reference:

     var temp = dataItem.Name;

Did you get an error shown in the JavaScript Console?

Here is an updated version of your code:

                   // Read the Driver records into the data source

                   $scope._$ds.DriverDS.read();

                   this.scope.gridRoute.options.columns[5].template = function(dataItem) {

                       console.log('Template');

                       that.scope._$ds.DriverDS.filter(

                         {field: "DriverNum", operation: "eq", value: dataItem.DriverNum}

                       );

                       var view = that.scope._$ds.DriverDS.view();

                       if (view.length > 0) {

                       console.log('DriverNum: ' + dataItem.DriverNum);

                       console.log('Name: ' + view[0].Name);

                       var temp = kendo.htmlEncode(view[0].Name);

                           return "<span>" + temp + "</span>";

                       } else {

                           return "<span>(record not found)</span>";

                       }

                   };

Please give this code a try and let me know how it goes.

Regards.

P.S.: The capitalization used for the Salesrep table and the SalesRep field come from how they are defined in the Data Dictionary.

All Replies

Posted by Ricardo Perdigao on 04-Jul-2017 11:26

Martin,

This code below was written by Edsel Garcia to do something similar on KUIB 2.0 (coming on July 14Th).  It won't work as is because the the way you reference things is a little different, but it should not be hard for you to get the idea or retrofit it for KUIB 1.1:

    this.$ds.SalesrepDS.read();
 
    var that = this;
 
    this.$components.grid0.options.columns[3].template = function(dataItem) {
        that.$ds.SalesrepDS.filter(
            {field: "SalesRep", operation: "eq", value: dataItem.SalesRep}
        );
        var view = that.$ds.SalesrepDS.view();
        return "<span>" + kendo.htmlEncode(view[0].RepName) + "</span>";
    };
 
    this.$components.grid0.options.columns[3].editor = function(container, options) {
        var input = $("<input/>");
        input.attr("name", options.field);
 
        // Clear filter to ensure that all values are shown
        that.$ds.SalesrepDS.filter({});
 
        input.appendTo(container);
        input.kendoDropDownList({
            dataSource: that.$ds.SalesrepDS,
            dataTextField: "RepName",
            dataValueField: "SalesRep",               
        })
    };

Posted by Martin Velikov on 05-Jul-2017 06:41

Hello Ricardo,

Thank you for the solution. I am close I think but still can't make it. In your example you are using only one table, but I need it with two different. I am a very beginner and I can't get the corresponding Name from the second table (the DriverNum is a common ID). This is my code:

$scope._$ds.RouteDS.read();
                	console.log('Read');
                    var that = this;

                    this.scope.gridRoute.options.columns[5].template = function(dataItem) {
                    	console.log('Template');
                    	that.scope._$ds.DriverDS.filter(
                          {field: "DriverNum", operation: "eq", value: dataItem.DriverNum},
			  {field: "Name", operation: "eq", value: dataItem.Name} // I know that this is not correct
                    	);
                    	console.log('DriverNum:' + dataItem.DriverNum);
                    	console.log('Name:' + dataItem.Name);
                    	var temp = dataItem.Name;
                    	var view = that.scope._$ds.DriverDS.view();
                    	return "<span>" + temp + "</span>";
                    };
                    var driverDataSourceOptions = $scope._$ds.DriverDS.options;
                    $scope.gridRoute.options.columns[5].editor = function (container, options) {
                    	
                        // Clear filter to ensure that all values are shown
                    	console.log('Cleared');
                        $scope._$ds.RouteDS.filter({});
                    	

                        var input = $("<input/>");

                        input.attr("name", options.field);
                        input.appendTo(container);
                        input.kendoDropDownList({
                        	filter: "contains",
                        	minlength: 3,
                        	autoSync: true,
                            dataTextField: "Name",
                            dataValueField: "DriverNum",
                            dataSource: driverDataSourceOptions                        
                        });
                    };

Posted by egarcia on 05-Jul-2017 10:16

Hello Martin,

Based on your description, it looks like the DropDownList is working fine.

Could you provide more information on your issue?

Is the issue that the related value is not showing? (set up of template property is not working)

Do you get any error messages?

The sample code that Ricardo Perdigao mentioned above, corresponds to a grid for the Customer table. One its columns is used to show the RepName from the Salesrep table.

The code only needs to refer to the data source for Salesrep because the data source for Customer is handled by the grid.

Please notice that the code uses $scope._$ds.SalesrepDS.read() to read the data into the SalesrepDS. Otherwise, the data source would be empty.

In your scenario, you mention about using two tables. Could you clarify on how do you use them?

Here is a sample program showing how to add a Kendo UI DropDownList component to a grid using a custom view (created using the blank view option).

Links:

oemobiledemo.progress.com/.../grid-dropdownlist

Source code for view-factory.js:

oemobiledemo.progress.com/.../view-factory.js

Here is the code for the onShow() handler:

                   this.scope = $scope;

$scope._$ds.SalesrepDS.read();

var that = this;

$scope.grid0.options.columns[3].template = function(dataItem) {

$scope._$ds.SalesrepDS.filter(

{field: "SalesRep", operation: "eq", value: dataItem.SalesRep}

);

var view = $scope._$ds.SalesrepDS.view();

if (view.length > 0) {

return "<span>" + kendo.htmlEncode(view[0].RepName) + "</span>";

} else {

return "<span>(record not found)</span>"

}

};

var dataSourceOptions = $scope._$ds.SalesrepDS.options;

$scope.grid0.options.columns[3].editor = function(container, options) {

var input = $("<input/>");

input.attr("name", options.field);

// Clear filter to ensure that all values are shown

$scope._$ds.SalesrepDS.filter({});

input.appendTo(container);

input.kendoDropDownList({

dataSource: dataSourceOptions,

dataTextField: "RepName",

dataValueField: "SalesRep",              

})

};

Please let me know if you need more information.

I hope this helps.

Posted by Martin Velikov on 05-Jul-2017 11:25

Hello Edsel,

In my case I am using two tables (two DS). One (RouteDS) is the main which I use with the grid (gridRoute). The second one (DriverDS) has the driver information. The common column is DriverNum (it exist in the both tables with the corresponding venues). I am trying to preview the driver name (Name) from the DriverDS into gridRoute on the place of DriverNum (which is a column in RouteDS), but just to preview it in the browser, not to overwrite it.

Posted by egarcia on 05-Jul-2017 14:33

Hello Martin,

Thank you for the info.

We have a similar scenario.

We both have a configuration with tables.

Customer as the main with grid grid0 using CustomerDS as a the data source and Salesrep with SalesrepDS.

The common column (field) is SalesRep.

It looks like the issue that you are seeing is because the following reference:

     var temp = dataItem.Name;

Did you get an error shown in the JavaScript Console?

Here is an updated version of your code:

                   // Read the Driver records into the data source

                   $scope._$ds.DriverDS.read();

                   this.scope.gridRoute.options.columns[5].template = function(dataItem) {

                       console.log('Template');

                       that.scope._$ds.DriverDS.filter(

                         {field: "DriverNum", operation: "eq", value: dataItem.DriverNum}

                       );

                       var view = that.scope._$ds.DriverDS.view();

                       if (view.length > 0) {

                       console.log('DriverNum: ' + dataItem.DriverNum);

                       console.log('Name: ' + view[0].Name);

                       var temp = kendo.htmlEncode(view[0].Name);

                           return "<span>" + temp + "</span>";

                       } else {

                           return "<span>(record not found)</span>";

                       }

                   };

Please give this code a try and let me know how it goes.

Regards.

P.S.: The capitalization used for the Salesrep table and the SalesRep field come from how they are defined in the Data Dictionary.

Posted by Martin Velikov on 06-Jul-2017 02:29

Everithing is working :) Thanks again!

This thread is closed