Можно ли в TS создавать динамический запрос SelectQuery, на основе его создавать колонки в DataSet, и на основе DataSet создавать GridColumns?
Задача такая: в зависимости от выбранного типа операции в Grid'e нужно показывать тот или иной набор столбцов данных. Конечное число столбцов неизвестно, т.к. каждый месяц для новых операций могут быть разные кол-во столбцов и их типы данных.
В следующем примере создается динамически запрос SelectQuery, на основе его создаются поля DataField в Dataset, и на основе созданных DataField добавляются колонки в GridView:
[javascript]
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'));
Однако, для реализации Вашей задачи, рекомендую Вам добавить в GridView все существующие колонки, а потом, при выборе определенного типа, скрывать "не нужные" колонки:
[javascript]
function wnd_BaseGridAreaOnPrepare(Window) {
Initialize(Window);
colTitle.IsVisible = false;
}
[/javascript]
У меня список операций, может часто меняться. И в зависимости от новых операций нужно добавлять поля в таблицу-справочник. а оттуда уже нужно динамически генерировать запрос с переменным числом столбов.
Запрос динамически как получить уже понял (разработана функция, возвращает 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:
[javascript]
var sq = CreateSelectQuery("Common\\" , 'sq_MySelect');
[/javascript]
Далее, указать с какой таблицы будет производиться выборка данных:
[javascript]
var FromTable = Services.GetNewItemByUSI('tbl_MyTable');
[/javascript]
Далее создать блок Select для созданного SelectQuery:
[javascript]
var Select = CreateSelectQuerySelect(sq, FromTable, 'MySelect');
[/javascript]
и добавить нужное Вам число колонок с таблицы:
[javascript]
AddColumn(Select, FromTable.Fields('ID'));
[/javascript]
Предлагаю сгенерированный Вами SQL запрос разбить на массив строк по некоторому признаку, так чтобы получить название строк которые необходимо выбрать. К примеру
var SQLQuery = 'SELECT ID, Name FROM tbl_Table';
SQLQuery = SQLQuery.split(' ');
Тогда добавлять колонки в блок Select для созданного SelectQuery можно в цикле:
[javascript]
В самой последней строке возникает ошибка, система не может найти функцию CreateGridColumn(DataField, GridView). Где находится эта функция? (у нас версия 3.3.2.210)
По GrepSearch система не может ее найти