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

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

Можно ли в 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;
}

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

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