Добрый день! Возник следующий вопрос:
Исходные данные
Есть таблица со следующими полям : 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, в котором выводятся данные из этого датасета.
Тогда в окне, непосредственно перед открытием датасета, делаете примерно следующее:
[javascript]
// ссылки на объекты в окне
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);
}
[/javascript]
Это гениально!)все заработало!) Спасибо большое) Сейчас приведу в красивый вид и будет вообще здорово.:smile: