Добрый день! Возник следующий вопрос: Исходные данные
Есть таблица со следующими полям : AccountID, ContractID, CountMin , DataCall.
Задача заключается в том чтобы построить из этих данных таблицу вида
Наименование контрагента, Город контрагента, Номер договора, Дата звонка 1 , Дата звонка 2 .... Дата звонка n
и на пересечении даты и контрагента вставить сумму по минутам за данную дату. Уже мозг сломал не знаю как в XRM данную таблицу сделать. Cross отчет в фаст репорте не вывозит такое количество записей. Зависает наглухо. Помогите кто сталкивался
Два варианта:
1) создать сервисы SelectQuery и Dataset, указать в нем только те колонки, которые нужны всегда (контрагент, договор и т.д.). Колонки с датой звонка создавать в SelectQuery перед его открытием (как Колонка с текстом SQL), в которой прописывать необходимый подзапрос. В Dataset над этим SelectQuery также надо добавлять колонки, типа IntegerField. Если данные надо вывести в гриде - аналогично создавать колонки в сервисе окна с гридом.
Следует учесть, что у сервера БД может быть ограничение на количество колонок в запросе (или таблиц).
2)создать сервис MemoryDataset, в котором перед открытием создавать требуемое количество колонок, а при заполнении - для каждого дополнительного поля вызывать запрос, который вычисляет количество. Будет работать медленнее чем первый вариант, но нет ограничений на количество колонок.
Попробую схематично на примере. Допустим есть некоторый sq_Example и над ним ds_Example, в котором определены некоторые поля, которые всегда выбираются из базы. Также есть окно wnd_ExampleGridArea, в котором выводятся данные из этого датасета.
Тогда в окне, непосредственно перед открытием датасета, делаете примерно следующее:
// ссылки на объекты в окне
var ds_Example = dlData.Dataset;
var sq_Example = ds_Example.SelectQuery;
var wnd_ExampleGridArea = Self;
var DataGridView = wnd_ExampleGridArea.ComponentsByName('grdData').ActiveView;// допустим 1 и 2 января
var d1 =new Date(2011, 0, 1);
var d1 =new Date(2011, 0, 2);
var a =new Array(d1, d2);// пройдемся по массиву с датамиfor(var i =0; i < a.length; i++){// создаем колонки в sq_
var alias ='col'+ i;
var c = sq_Example.Items(0).Columns.CreateSQLTextColumn();
c.ColumnAlias= alias;// тут нужно корректный запрос, с использованием даты из массива:
c.SQLText='(select sum(aaa) from tbl_Minutes where () and () )';
sq_Example.Items(0).Columns.Add(c);
var f = ds_Example.DataFields.CreateFloatDataField();
f.Name= alias;
f.Caption= a[i];
ds_Example.DataFields.Add(f);
var Column = wnd_ExampleGridArea.CreateComponent('DataGridColumn', DataGridView.Name+'_'+ alias);
Column.DataFieldName= f.Name;
DataGridView.AddItem(Column);}