Добрый день! Возник следующий вопрос:
Исходные данные
Есть таблица со следующими полям : AccountID, ContractID, CountMin , DataCall.
Задача заключается в том чтобы построить из этих данных таблицу вида
Наименование контрагента, Город контрагента, Номер договора, Дата звонка 1 , Дата звонка 2 .... Дата звонка n
и на пересечении даты и контрагента вставить сумму по минутам за данную дату. Уже мозг сломал не знаю как в XRM данную таблицу сделать. Cross отчет в фаст репорте не вывозит такое количество записей. Зависает наглухо. Помогите кто сталкивался

Нравится

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

Два варианта:
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);
    }

Спасибо так по понятнее) буду пробовать)

Это гениально!)все заработало!) Спасибо большое) Сейчас приведу в красивый вид и будет вообще здорово.:smile:

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