У меня есть деталь DocumentsDetail с реестром, отображающая Grid документов. Я реализовал в ней группировку документов по типу и в качестве содержимого каждой группы отображаю Grid с набором документов соответствующего типа. Но возникает вопроса:

Как унаследовать конфигурацию Grid и столбцов из DocumentDetail, чтобы Grid каждой группы выглядел идентично гриду детали? Т.е, 1)Имел идентичный набор столбцов. 2) Имел идентичные настройки внешнего вида, стилизацию.

 Я не знаю как мне внутри грида группы отображать именно те столбцы, которые заданы в настройках детали.

 

//diff:

            {               

                "operation": "merge",

                "name": "Detail",

                "values": {

                    }

                }

            },                        

            {

                "operation": "insert",

                "parentName": "Detail",

                "name": "DocumentsTestList",

                "propertyName": "items",

                "values": {

                    "generator": "ConfigurationItemGenerator.generateContainerList",

                    "idProperty": "Id",

                    "itemPrefix": "BorrowerDocGroup",

                    "collection": "BorrowerDocGroupsCollection",

                    "onGetItemConfig": "getDocsControlGroupConfig"

                }

            }

//methods:

getDocsControlGroupConfig: function (itemConfig, item) {             

               

                var itemId = item.get("Id");

                var testItemGroupConfig = {

                    "className": "Terrasoft.ControlGroup",                    

                    "caption": {

                        "bindTo": "Caption"

                    },

                    "collapsed": true,

                    "id": "DocsGroup" + itemId,

                    "items": [{                        

                        "className": "Terrasoft.Grid",

                        "type": "listed",                        

                        "id": itemId,

                        "idProperty": "Id",

                        "itemPrefix": "Id",

                        "collection": {

                            "bindTo": "Collection"

                        },

//как настроить отображение грида, который реализует функциональность первоначального грида детали и имеет идентичную конфигурацию столбцов? 

//здесь мне хотелось бы написать "columnsConfig": { "bindTo: "...?????"}

                        "columnsConfig": [                            

                            {

                                cols: 1,

                                key: [

                                    {

                                        "name": {

                                            "bindTo": "MDocument"

                                        }

                                    } 

                                ]

                            }

                        ],

                        "captionsConfig": [

                            {

                                cols: 1,

                                name: "document caption"

                            }                            

                        ],

                        //"onGetItemConfig": {

                        //    "bindTo": "getDocItemViewConfig"

                        //},                                               

                        "dataItemIdPrefix": "document-item"                        

                    }]

                };               

                itemConfig.config = testItemGroupConfig;                

            },

   

Нравится

2 комментария

Ты создаешь внутри одной детали несколько гридов?

Думаю, можно создать один общий класс для гридов и переопределить методы, которые принимают конфигурации строк и столбцов.



 

Ext.define("Terrasoft.controls.Название_твоего_грида", {

    alternateClassName: "Terrasoft.Название_твоего_грида",

    extend: "Terrasoft.ConfigurationGrid", // или Terrasoft.Grid

и переопределить методы 

/**
	 * Инициализирует начальное значение конфигурации колонок.
	 * @param {Object} gridConfig
	 * @return {Array}
	 */
	initColumnsConfig: function(gridConfig) {
		var type = gridConfig.type;
		var config = this[type + "Config"];
		var columnsConfig = (config ? config.columnsConfig : gridConfig.columnsConfig) || [];
		if (!gridConfig.columnsConfig) {
			gridConfig.columnsConfig = columnsConfig;
		}
		return columnsConfig;
	},

	/**
	 * Инициализирует начальное значение конфигурации заголовков.
	 * @param {Object} gridConfig
	 * @return {Array}
	 */
	initCaptionsConfig: function(gridConfig) {
		var type = gridConfig.type;
		var config = this[type + "Config"];
		var captionsConfig = (config ? config.captionsConfig : gridConfig.captionsConfig) || [];
		if (!gridConfig.captionsConfig) {
			gridConfig.captionsConfig = captionsConfig;
		}
		return captionsConfig;
	}

Если хочешь ещё и из детали получить конфигурацию, то встроенной реализации механизма сообщений нет. Придется в зависимостях прописать sandbox и инициализировать его в методе конструктора

constructor: function (config) {
    this.sandbox = new sandbox();
    this.sandbox.moduleName = "имя_модуля";

    this.sandbox.registerMessages({
        "имя_сообщения": {
            "direction": Terrasoft.MessageDirectionType.PUBLISH,
            "mode": Terrasoft.MessageMode.PTP
        }

    });

    this.callParent(arguments);
},

Как вариант, можно попробовать перехватить Profile в котором находятся конфиги на отображение в списочном и плиточном отображении (listedConfig и tiledConfig).

К примеру в методе initProfile после вызова this.callParent(arguments) взять this.get("Profile") и динамически изменить listedConfig и tiledConfig для изменения конфигуарации колонок грида.

Но только эхтим не обойтись, так как профайл только изменит внешнее отображение, что не подгрузит значения в эти колонки. Чтобы добавить в запрос также нужные колонки можно переопределить addProfileColumns и добавить в него нужные колонки обьекта.

Для примера вот как можно добавить колонку ответсственного в запрос детали с документами (DocumentDetailV2):

addProfileColumns: function(esq) {
  //берем колонки
  var profileColumns = this.getProfileColumns();
  //добавляем новую
  profileColumns.Owner = {
    aggregationType: undefined,
    caption: "Ответстсвенный",
    dataValueType: undefined,
    path: "Owner",
    subFilters: undefined,
    type: "text"
  };
  //а это взято из метода addProfileColumns из GridUtilitiesV2
  Terrasoft.each(profileColumns, function(column, columnName) {
    if (!esq.columns.contains(columnName)) {
      if (column.aggregationType) {
        this.addProfileAggregationColumn(esq, column, columnName);
      } else {
        esq.addColumn(columnName);
      }
    }
  }, this);
}

Таким образом в запросе уйдет и колонка отвественного.

Изменяя значения в Profile можно динамически поменять отображение колонок и их значений.

Показать все комментарии

Добрый день!!!

Можно ли в TS создавать динамический запрос SelectQuery, на основе его создавать колонки в DataSet, и на основе DataSet создавать GridColumns?

Задача такая: в зависимости от выбранного типа операции в Grid'e нужно показывать тот или иной набор столбцов данных. Конечное число столбцов неизвестно, т.к. каждый месяц для новых операций могут быть разные кол-во столбцов и их типы данных.

Нравится

7 комментариев

Здравствуйте, Нурбек.

В следующем примере создается динамически запрос SelectQuery, на основе его создаются поля DataField в Dataset, и на основе созданных DataField добавляются колонки в GridView:

funtion Test()
{
var sq = CreateSelectQuery("Common\\" , 'sq_MySelect4');
var FromTable = Services.GetNewItemByUSI('tbl_MyTable');
var Select = CreateSelectQuerySelect(sq, FromTable, 'MySelect');
var GrivView = Services.GetNewItemByUSI('gvGridView');
AddColumn(Select, FromTable.Fields('ID'));
AddColumn(Select, FromTable.Fields('Namus'));
 
var Dataset = CreateDataset('Common\\' , 'ds_MySelect4' ,sq);
var DataFields = Dataset.DataFields;
var DataField = AddStringDataField(DataFields, 'ID', 'ID', 38, true, false);
//AddStringDataField(DataFields, DataFieldName, DataFieldCaption, TextLength, IsDisplayField, IsSearchField)
DataField.IsFilteringField = false;
DataField.IsReadOnly = true;
Dataset.KeyDataField = DataField;
var GridColumn = CreateGridColumn(DataField, GridView)
DataField = AddStringDataField(DataFields, 'Namus', 'Namus', 250, true, true);
GridColumn = CreateGridColumn(DataField, GridView)
}

Однако, для реализации Вашей задачи, рекомендую Вам добавить в GridView все существующие колонки, а потом, при выборе определенного типа, скрывать "не нужные" колонки:

function wnd_BaseGridAreaOnPrepare(Window) {
        Initialize(Window);
        colTitle.IsVisible = false;
}

У меня список операций, может часто меняться. И в зависимости от новых операций нужно добавлять поля в таблицу-справочник. а оттуда уже нужно динамически генерировать запрос с переменным числом столбов.

Запрос динамически как получить уже понял (разработана функция, возвращает SQL запрос с разным числом столбцов). Остается запрос присвоить сервису SelectQuery

select o.rec_id_billing,
s.name_service,
max(decode(f.name_field, 'msisdn', o.value)) msisdn,
max(decode(f.name_field, 'balance', o.value)) balance
from tbl_ServiceFields sf,
tbl_Fields f,
tbl_Services s,
tbl_Types t,
tbl_OperValues o
where s.service_id = 1
and s.service_id = sf.id_service
and f.id_field = sf.id_field
and t.id_type = f.id_type
and sf.ids = o.serv_field_id
group by o.rec_id_billing, s.name_service
order by o.rec_id_billing, s.name_service

У меня вот такой вот запрос. Здесь каждый раз динамически добавляются столбцы вида max(decode(f.name_field, 'msisdn', o.value)) msisdn. Можно ли такой Custom столбец указать в FromTable? Такой столбец выбирается не из основной таблицы. Как такой столбец добавить в SelectQuery? И в случае когда в запросе есть group by как в selectQuery добавить такую группировку?

Нурбек, для начала Вам необходимо создать сервис SelectQuery:

var sq = CreateSelectQuery("Common\\" , 'sq_MySelect');

Далее, указать с какой таблицы будет производиться выборка данных:

var FromTable = Services.GetNewItemByUSI('tbl_MyTable');

Далее создать блок Select для созданного SelectQuery:

var Select = CreateSelectQuerySelect(sq, FromTable, 'MySelect');

и добавить нужное Вам число колонок с таблицы:

AddColumn(Select, FromTable.Fields('ID'));

Предлагаю сгенерированный Вами SQL запрос разбить на массив строк по некоторому признаку, так чтобы получить название строк которые необходимо выбрать. К примеру
var SQLQuery = 'SELECT ID, Name FROM tbl_Table';
SQLQuery = SQLQuery.split(' ');

Тогда добавлять колонки в блок Select для созданного SelectQuery можно в цикле:

for(var i = 1; SQLQuery.length; i++)
{
if(SQLQuery[i] == 'FROM')
{
break;
}
var SQLColumn = SQLQuery[i].split(',');
AddColumn(Select, FromTable.Fields('SQLColumn[0]'));
}
}

var GridColumn = CreateGridColumn(DataField, GridView)
var GridColumn = CreateGridColumn(DataField, GridView)
DataField = AddStringDataField(DataFields, 'Namus', 'Namus', 250, true, true);
GridColumn = CreateGridColumn(DataField, GridView)

В самой последней строке возникает ошибка, система не может найти функцию CreateGridColumn(DataField, GridView). Где находится эта функция? (у нас версия 3.3.2.210)
По GrepSearch система не может ее найти

Здравствуйте, Нурбек!

Функция CreateGridColumn(DataField, GridView) имеет следующий вид:

function CreateGridColumn(DataField, GridView) {
	var FieldType = DataField.FieldType;
	var FieldName = DataField.Name;
	var ColName = 'col' + GridView.Name + FieldName;
	var GridColumn = Self.CreateComponent('DataGridColumn', ColName);
	GridColumn.DataFieldName = FieldName;
    var Dataset = DataField.ParentDataFields.ParentDataset;    
    if (Dataset.Columns) {    
		var DatasetColumn = Dataset.Columns.CoreItemsByKey(DataField.KeyValue);
		if (DatasetColumn) {
	    	GridColumn.SummaryType = DatasetColumn.SummaryType;
		}
	}
	GridView.Add(GridColumn);
	return GridColumn;
}

Отлично, спасибо. Сделали все по вашим постам. Все работает

Показать все комментарии