Отчет по отображенным записям реестра

Добрый день.

Нужно создать новый отчет.
Создал sq_ ds_ и fr_
Отчет запускается из реестра Контрагенты.

Нужно, что бы в отчет попадали только записи, которые отображаются в реестре. (например стоит фильтр, или записи из группы) У меня сейчас отображаются все существующие записи контрагентов.

В SQ_ поставил создал параментр AccountID и соответствующий фильтр сравнения

При подключении отчета в типе фильтрации стоит "Для всех записей" (правда проботвал и для выделенных)

Помогите пожалуйста решить проблему

Нравится

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

Добрый день!
Если я правильно понял ваш вопрос, то попробуйте сделать следующее.
1. В параметры sq_ добавить параметр ID с типом "Уникальный идентификатор".
2. В Фильтры добавить фильтр tbl_Account.ID = Параметр: ID (выключенный, т.е. со снятой галкой)
3. В Фильтры добавить Include Filter с кодом IDs и полем tbl_Account.ID (также выключенный).
4. В параметрах отчёта выбрать "Для выделенных записей"

Спасибо.

Сделал - не полуилось
;-(

Запрос довольно сложный с Union ALL
Аналогичный запрос как в истории в контрагентах

Где можно посмотреть как запускаются эти отчеты?

попробуйте поискать в конфигурации сервисы fr_ и посмотреть примеры. думаю там найдётся что-то похожее. сам обучался методом тыка :)
и ещё один нюанс. пробовали делать фаст репорты на базе запросов с union all. так вот то что было после union all не вытягивалось в отчёт, хотя в запросе все данные вытягивались. попробуйте сделать часть без union all и всё должно отработать

Поискал уже не нашел....

Вот что нашел...
В scr_BaseWorkSpace

} else {			
  ApplySelectQueryFilter(SelectQuery, 'ReportID', ReportID, true);
  ApplySelectQueryIncludeFilter(SelectQuery, 'ValueIDs', FilterFieldValues, true);
  var ReportCustomTypesDataset = SelectQuery.Open();		    
  MenuIsVisible = (!IsDatasetEmpty(ReportCustomTypesDataset));
  ReportCustomTypesDataset.Close();
}

Есть два фильтра ReportID и ValeuesIDs
Правда я такие тоже создавал и ничего не получилось...

Хотелось бы понять, где запускается применение фильторов, прежде чем запустить отчет?

По крайней мере в версии 3.3.2 есть встроенный функционал, который позволяет с использованием описанного выше алгоритма получать данные для выделенных записей.
Если хотите попробовать события, то в главном окне отчёта в левом верхнем углу есть вкладка "События" и там есть событие "OnPrepare", в нём и можно будет применить фильтры к нужному selectquery

По одной выделенной записи у меня получилось....
А вот по нескольким не выходит...

Может вообще есть другой путь...
Задача следущая

Нужно выести отчет последнего "воздействия"
Все контрагенты разбиты на группы.

Каждый менеджер отвечает за свою группу

Нужен отчет, в котором быдет выводится все контрагенты из данной группы и будет указано для каждого дата последнего действия по нему (задача, заказ, звонок и т.д.)

Запрос аналогичен запросу в детали История.

В общих чертах можно сделать следующим образом:
1. Создать sq_ где главной таблицей сделать таблицу контактов (в вашем случае, та где расположены менеджеры).
2. В ней сделать Include Filter с названием, например, IDs.
3. Построить полностью структуру запроса.
4. Сделать окно предварительного выбора на базе wnd_BaseEdit, в котором будет лукап контрол с возможностью множественного выбора. Для удобства поле можно отфильтровать по нужному вам типу (например, где тип = "Менеджер").
5. К окну сделать скриптик, который будет передавать из этого онка фильтры в Include Filter запроса. Для этого надо расписать событие btnOKOnClick .
А дальше стандартно датасет и сам сервис fr_

Кирилл, здравствуйте!

"Хомутов Кирилл" написал:Запрос довольно сложный с Union ALL

А Вы эти фильтры (ИД и Идс) прописали везде в Юнионе, т.е. в каждом селекте?

Насчет

"Хомутов Кирилл" написал:Где можно посмотреть как запускаются эти отчеты?

то в скрипте scr_ReportUtils есть функция

function ShowSelectedRecordsReport(ReportCode, FilteredDatasetCode,
	GridDatasetIDs, FilterForm) {
	var Report = Services.GetNewItemByUSI(ReportCode);
	var ReportPreviewer = Services.GetNewItemByUSI('wnd_BaseFastReportPreview');
	var ReportPreviewerComponent = ReportPreviewer.Attributes('ReportPreviewer');
	var ReportDataset = Services.GetNewItemByUSI(FilteredDatasetCode);
	SetAttribute(ReportPreviewer, 'Report', Report);	
	var Select = GetSelectQueryPrimarySelect(ReportDataset.SelectQuery);
	var Filters = Select.Filters;
	Filter = GetSelectQueryFilterByCode(ReportDataset.SelectQuery, 'IDs');
	if (!Assigned(Filter)) {
	    Filter = Filters.CreateIncludeFilter();
	    Filter.Code = 'IDs';
	    Filters.Add(Filter);
		Filter.TestExpression =
			Filter.CreateFieldFilterExpression();
		Filter.TestExpression.TableAlias =
			Select.FromTableAlias;
		Filter.TestExpression.Field =
			Select.FromTable.Fields.ItemsByName('ID');
	}
	var Enabled = (GridDatasetIDs.length > 0);
	ApplyDatasetIncludeFilter(ReportDataset, 'IDs', GridDatasetIDs, Enabled);		
	if (Assigned(FilterForm)) {
		SetAttribute(ReportPreviewer, 'FilterForm', FilterForm);
		SetAttribute(ReportPreviewer, 'ShowFilterForm', true);
	}
	ReportPreviewer.Build();
	ReportPreviewer.Prepare();
	ReportPreviewerComponent.DatasetByUSI(FilteredDatasetCode) = ReportDataset;
}

в которую и передаются ИД выделенных записей для построения отчета.

Создавать для этих целей свое окно фильтрации, как описано в предыдущем посте... Не совсем правильно, учитывая, что можно использовать базовый функционал -- просто в Вашем случае нужно в нем разобраться. Можно сделать действительно новый запрос-датасет-отчет, используя как главную таблицу контактов (т.е. без юниона) -- но свое окно фильтрации не делать, а просто создать 2 фильтра -- ИД и Идс, и правильно указать настройки при регистрации отчета в системе.

И еще: у Вас точно в настройках отчета (в Клиенте, раздел Отчеты, Ваш отчет -- изменить свойства) указан тип фильтрации "для выделенных записей"?

Проблему решил
Собственно решение было здесь
http://www.community.terrasoft.ru/forum/topic/8069

Возникла другая проблема !!!!
Теперь при попытке выполнить отчет под не администраторским правами
Выдается ошибка

Разрешение SELECT запрещено для объекта "tbl_Incident", базы данных "TSCRM", схемы dbo. Ошибка открытия источника данных "ds_AccountLastHistory"

Таблица tbl_Incident последния среди всех Union

Принудительно в прямо в базе прописал разрешение на эту таблицу.
ругнулось так же на следущую tbl_Opportunity.
Но по таблице tbl_Opportunity у меня точно есть работающие отчеты, правда без использования Union.

Права естественно есть все, раздал еще на уровне все пользователи.

Помогите пожалуйста решить проблему.

скажите, а Вы случайно не используете кастом-колонки в запросе?
Просто для них нужно в писать не "tbl_", представления -- "vw_".
Подробнее -- в этом блоге.
Тоже с ними в свое время намучилась, только у меня, правда, оно не ругалось так, как у Вас -- просто не отображало некоторые записи, либо вообще ничего не отображало...

Если же ошибка не в этом -- возможно, все-таки права доступа, нужно разбираться...

Использую колонки константы
и Кастом фильтры.
Спасибо, буду разбираться.

Думал простой отчет, сделаю за час :-)))

Все !!!!!
Всем спасибо!!!!
Действительно, все как писала Ольга. (Огромное персональное СПАСИБО!!!)
Заменил в кастом фильтре tbl на vw (правда не везде ;-))) ) и заработало!!!!

Кирилл, рада была помочь))))
Представления везде и не нужно проставлять -- только те таблицы, которые администрируются по записям. Обычно это "основные" таблицы разделов: Контакты, Контрагенты, Договора, Продажи и т.п. А вот Справочники, например, НЕ администрируются по записям, поэтому их заменять на представления не надо.

Насчет ссылки, которую я дала -- она актуальна для администраторов системы, потому что для них по умолчанию доступны все записи, а представления могут делать "выборку", исходя из разданных прав -- и получится "нестыковка". поэтому нужно подменять "вв_" (представления) на "тбл_"(таблицы) перед открытием датасета, о чем и написано в том блоге.

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