Добрый день!

Необходимо в разделе контрагентов добавить следующие фильтры:
1) Операции - Тип (перечисления). Не знаю, какой фильтр тут использовать, что ы потом в реестре пользователь мог выбрать значение.
2) фильтр: Существуют операции у которых есть Продукты.

Как сделать эти фильтры?

Нравится

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

Kat, добрый день.

По первому вопросу: можно создать справочник, в который добавить два значения - Приход и Расход. ID этих значений установить соответственно ID аналогичных элементов перечисления. Этот справочник не будет использоваться нигде, кроме фильтрации. Фильтр по нему можно создать точно так же, как и любой другой фильтр пользователя типа "Справочник".

По второму вопросу необходимо уточнение, так как в базовой версии операции не связаны напрямую с продуктами, зато они связаны с многими сущностями, которые, в свою очередь, связаны с продуктами. Например: Операция->Договор->Продукт; Операция->Инцидент->Задача->Продукт и т.д. Что касается самого фильтра, его можно реализовать по аналогии с фильтром "Задача: Наличие задач" (AccountTaskExists) в разделе "Контрагенты".

"Лабьяк Олег Игоревич" написал:По первому вопросу: можно создать справочник, в который добавить два значения - Приход и Расход. ID этих значений установить соответственно ID аналогичных элементов перечисления. Этот справочник не будет использоваться нигде, кроме фильтрации. Фильтр по нему можно создать точно так же, как и любой другой фильтр пользователя типа "Справочник".

Олег, решение понятное, но такой "некрасивый" путь наводит на мысли о необходимости доработок построителя запросов и компонента фильтра

"Александр Кудряшов" написал:необходимости доработок построителя запросов и компонента фильтра

Думаю, достаточно доработать сервис SelectQuery, добавив в него возможность создания фильтра пользователя по элементам перечисления. Если датасет содержит поле типа "Перечисление", фильтрация по этому полю вполне работает, как это видно в самом разделе "Операции" (фильтр "Тип").

Создана идея по данному вопросу.

"Лабьяк Олег Игоревич" написал:достаточно доработать сервис SelectQuery, добавив в него возможность создания фильтра пользователя по элементам перечисления

В идеи:wink:

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

Здравствуйте,

Пытаюсь создать фильтр к динамической группе, но что-то не получается.
Вот сам фильтр:
(тип_контрагента=тип1 И вид_деятельности=вд1)
ИЛИ
(тип_контрагента=тип2 И вид_деятельности=вд1)
ИЛИ
(тип_контрагента=тип3 И вид_деятельности=вд2 И отрасль=отр1)

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

CRM 3.3.0

Нравится

1 комментарий

Иван, к сожалению, подобный фильтр нельзя создать с помощью механизма фильтров пользователя в Terrasoft. Нужно искать обходное решение: например, создать такой фильтр в запросе раздела, не используя фильтры пользователя, и включать его по действию либо создать отчёт, использующий этот фильтр. В обоих случаях фильтр будет фиксированным: Вы не сможете добавить в него других условий, кроме ранее заданных. Но можно реализовать механизм управления параметрами, которые передаются в фильтр.

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

Добрый день!
Для того чтобы выключить фильтр в запросе для отчета использую следующую комбинацию:

var MyDS = Services.GetNewItemByUSI('ds_MyDataset');
MyDS.SelectQuery.Items(0).Filters.ItemsByCode('MyFilter').IsEnabled = false;

В этом запросе еще есть подзапросы в которых тоже есть фильтры.
Вопрос как ими управлять(включать/выключать)?
Заранее спасибо!

Нравится

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

Сергей, в scr_DB много функций, посмотрите их.

"Осауленко Александр" написал:Сергей, в scr_DB много функций, посмотрите их.

Эээ, спасибо, а при чем тут функции?
Я не могу составить объектную цепочку чтоб достучаться до подзапросов. Должно быть что-то вроде:

MyDS.SelectQuery.Items(0).SubItems(1).Filters.ItemsByCode('MyFilter').IsEnabled = false;

Я обшарил весь объект датасета в студии но так и не нашел путь ((

Ну так функции на то и нужны, что в них выносят ту логику, которая чаще всего используется и чтобы не искать по иерархии фильтров самому, разработчики вынесли в scr_DB для этого рекурсивные функции по включению/выключению фильтров и еще много чего.

Сергей, у Вас колонки с подзапросами или фильтры с подзапросами?

"Осауленко Александр" написал:Сергей, у Вас колонки с подзапросами или фильтры с подзапросами?

Колонки

Сергей, к ним так так же применимы функции из scr_DB, но сначала Вам необходимо найти нужную колонку, а в ней SelectQuery

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

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

Нравится

3 комментария

Нужно создать свою форму фильтрации, в которой пользователь выберет даты, указать ее при регистрации отчета, а на обработчик кнопки OK передать эти даты атрибутами в отчет следующим образом:

ReportPreviewer.Report.Attributes('FromDate') = DateToStr(FromDate);
	ReportPreviewer.Report.Attributes('ToDate') = DateToStr(ToDate);

Там же можно получить доступ к набору данных отчета и наложить фильтр. Пример смотрите в wnd_ServiceDeskDateFilterScript TerrasoftXRM.

Олег, прикрепила небольшую инструкцию.
Также этот вопрос описан здесь:
http://community.terrasoft.ua/forum/topic/3541

Спасибо. Буду пробовать.

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

(Terrasoft 2.8.9)
Здравствуйте.
Есть небольшой вопрос. В разделе "Компании" по правому клику мышки можно создать задачу для выбранной компании. При создании задачи необходимо, чтобы список контактов этой задачи ограничивался только списком контактов выбранной компании. Сейчас появляется весь список контактов.Не подскажете как правильно настроить фильтр ?

Нравится

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

Добрый день.

Для реализации необходимо открыть скрипт карточки редактирования задачи и привести в ней обработчик события OnDataChange к такому виду:

procedure OnDataChange(FieldName: string);
  var T: TADOQuery;
  begin
    if (FieldName = 'fCompany_id') then
    begin
      if fCompany_ID = null then
         T:=OpenSQL('SELECT ID, Name FROM cm_Contact ORDER BY Name')
      else
         T:=OpenSQL('SELECT ID, Name FROM cm_Contact WHERE Company_ID='+IntToStr(fCompany_ID)+' ORDER BY Name');
      edtContact.ListSource.DataSet:=T;
    end;
  end;

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Олег, спасибо большое ! Все работает:smile:

Извините, поспешил с ответом. Работает, но некорректно.
Если создать в сеансе первую задачу на компанию, то по ней корректно определяются контакты, но при дальнейшем создании задач контакты, определенные в первой задаче сеанса появляются у всех компаний. Т.е.
1-я задача в сеансе:
Компания "Омега" - контакт Пупкин (правильно).
2-я задача в сеансе:
Компания "Омега-2" - контакт Пупкин (неправильно, не такого контакта).
3-я задача в сеансе:
Компания "Омега-3" - контакт Пупкин (неправильно, не такого контакта).

Действительно, я не учёл, что при открытии карточки OnDataChange не срабатывает...

В таком случае, аналогичный код необходимо добавить и в обработку события OnFormShow. Примерно так:

procedure OnFormShow;
  var Q: TADOQuery;
     ... 
  begin
    if fCompany_ID = null then
      Q:=OpenSQL('SELECT ID, Name FROM cm_Contact ORDER BY Name')
    else
      Q:=OpenSQL('SELECT ID, Name FROM cm_Contact WHERE Company_ID='+IntToStr(fCompany_ID)+' ORDER BY Name');
    edtContact.ListSource.DataSet:=Q;
    ...
  end;

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Проверил - работает :). Спасибо огромное :)

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

Есть стандартный фильтр. Как обратиться к его значению.
Я задаю StartDate = 01.01.2010. Как я могу получить его значение, что бы загнать в отчет?

Нравится

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

Пример по передаче значения фильтра в отчет прикреплен к сообщению.
Думаю, что поможет разобраться!:)

В рамках появления темы добавлю небольшое замечание с шансом на идею:smile: Так как вопрос отображения введенных параметров фильтрации в отчете возникает практически всегда при создании отчета за период, по менеджерам и прочее могу предложить добавить автоматическое добавление всех введенных параметров фильтрации в атрибуты создаваемого отчета. Особенно это будет полезно, если передавать в отчет параметры вида "Дата начала = текущая неделя" - требуется писать дополнительную обработку выбранного значения в выпадающем списке фильтра...

 

"Александр Кудряшов" написал:Особенно это будет полезно, если передавать в отчет параметры вида "Дата начала = текущая неделя" - требуется писать дополнительную обработку выбранного значения в выпадающем списке фильтра...

Поддерживаю!
Не раз сталкивалась с таким "желанием" пользователей.

Спасибо за примерчик.
Есть еще вопросик.
Вот этот код подтягивает в отчет значение:

ReportPreviewer.Report.Attributes('StartDate') = 'Значение';

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

"itmaster_muh" написал:можно ли вместо 'Значение' написать какой ниубдь обработчик для доступа к заданым данным полей фильтра из конкретного стандартного фильтра?

Уточните, пожалуйста, что имелось в виду под "конкретным стандартным фильтром". Это фильтр отчёта, фильтр раздела или фильтр запроса?

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Фильтр тот который создается во время создания отчета в FastReport.

Здесь описано, как можно получить доступ к значениям окна фильтрации из скрипта отчёта. Смотрите сообщения, начиная с 24 февраля.

Если в двух словах - передавать FiltersBuilder из окна фильтрации в скрипт отчёта в качестве атрибута. После этого в скрипте отчёта можно получить доступ к параметрам фильтрации.

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

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

Добрый день!
переношу номенклатуру из 1с, в частности заполняю цены
код такой:

ClearDSFilters(dsOfferingPrice);
ApplyDSFirstLevelFilter(dsOfferingPrice, "PriceCategoryID", PriceCategoryID, TRUE);
dsOfferingPrice.Open();

т.е. устанавливаю фильтр по типу цен, но еще нужен фильтр по товару ("OfferringID")

как установить фильтр по нескольким полям?

Нравится

5 комментариев
ClearDSFilters(dsOfferingPrice);
ApplyDSFirstLevelFilter(dsOfferingPrice, "PriceCategoryID", PriceCategoryID, TRUE);
 
var OfferingID = 'Your_Needed_GUID';
ApplyDatasetFilter(dsOfferingPrice, 'OfferingID', OfferingID, true);
 
dsOfferingPrice.Open();

Александр, а процедуры ApplyDSFirstLevelFilter() и ApplyDatasetFilter() одинаковые? или второй фильтр устанавливается по-другому?

вот фрагмент кода по этой процедуре: (он из обработки, которую здесь можно найти)

procedure ApplySQFirstLevelFilter(Query, FilterName, ParamValue, IsEnabled)
	SetEnabledSQFirstLevelFilter(Query, FilterName, IsEnabled);
	if (IsEnabled = TRUE) then
		SetSQParameterValue(Query, FilterName, ParamValue)
	endif;		
endprocedure
 
procedure ApplyDSFirstLevelFilter(Dataset, FilterName, ParamValue, IsEnabled)
	var Query;	
	Query = Dataset.SelectQuery;
	ApplySQFirstLevelFilter(Query, FilterName, ParamValue, IsEnabled);
endprocedure 

"Старостин Д.В." написал:SetEnabledSQFirstLevelFilter(Query, FilterName, IsEnabled);

а это смотря что у вас в этой хитрой функции написано:smile: я у себя ее в 3.3.1\3.3.2 не нашел
ApplyDatasetFilter() это штатная функция, можно посмотреть в scr_DB
вообще похоже что одно и то же

Это практически одно и то же, за исключением того факта, что первая функция используется в ert-файлах 1С, а вторая - в скриптах Terrasoft.

Если необходимо включить несколько фильтров первого уровня, то Вам необходимо несколько раз подряд вызвать ApplyDSFirstLevelFilter с нужными кодами фильтров, как уже писал Александр.

Если же речь идёт о фильтрах большего уровня вложенности, то там не всё так просто, нужно разбираться в работе функций SetEnabledSQFirstLevelFilter и SetSQParameterValue. По идее, перебрать все подчинённые фильтры указанного фильтра, включить нужные и установить соответствующие им параметры.

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

спасибо, работает

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

Подскажите как создать такой фильтр:

В карточке документ (раздела Документы) добавил поле "Своя компания" (тип lookupdatacontrol) с выбором из Контрагентов.
Нужно наложить фильтр на это поле по типу Контрагента "Наша компания" (из справочника Типы контрагентов), есть один нюанс в карточке Контрагент отключено поле "Тип контрагента" и сделана деталь "Тип контрагента", на основе существующего справочника "Тип контрагента" (чтобы у контрагента можно было задать несколько типов).

Нравится

2 комментария

Юрий, Вам необходимо добавить в запрос sq_Account следующий фильтр типа Exists:

exists (select ID from tbl_AccountTypeInAccount where AccountID = tbl_Account.ID and AccountTypeID = :OurCompanyTypeID)

Здесь предполагается, что таблица, в которой хранятся значения из детали "Тип контрагента", имеет название tbl_AccountTypeInAccount и содержит поля AccountID (для связи с реестром раздела) и AccountTypeID (для связи со справочником "Тип контрагента"). Также в запрос необходимо добавить параметр с названием "OurCompanyTypeID", типом "Уникальный идентификатор" и значением, равным ID типа "Наша компания" (из таблицы tbl_AccountType). Фильтр должен быть отключён.

После того, как фильтр создан, необходимо создать обработчик события OnPrepareSelectWindow для контрола "Своя компания" в окне редактирования документа, и в этот обработчик вставить текст:

var LookupDataset = LookupDataControl.DataField.LookupDataset;	
ApplyDatasetFilter(LookupDataset, <код созданного фильтра в одинарных кавычках>, OurCompanyAccountTypeID, true);

Предварительно нужно убедиться, что в скрипте scr_Consts объявлена константа OurCompanyAccountTypeID, равная ID типа "Наша компания". Если такой константы нет, её необходимо добавить (или вставить значение ID вместо констаны в приведённый выше скрипт.)

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Спасибо.
То что надо.

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

Здравствуйте. Проблема такая - при работе в фаст репорт добавляю фильтр. Потом решил его удалить, но при удалении (при нажатии ОК) всплывает дебаггер и террасофт выдает ошибку .... вот что выходит

Это ошибка или так должно быть??? Просто опасаешься уже иной раз эту кнопочку нажимать :(

Нравится

2 комментария

Евгений, добрый день.

Для устранения проблемы необходимо внести изменение в функцию SaveFilters скрипта wnd_ReportFiltersScript - вместо null вставить '', как указано ниже:

function SaveFilters(Window) {
	if (ReportFilters.QueryBuilderData) {
		if (fbcMain.DataFieldsList.Count == 0) {
			return;
		}
		ReportFilters.QueryBuilderData.QueryFilterData = GetNewXMLStorage();
		var XMLStorage = ReportFilters.QueryBuilderData.QueryFilterData;
		XMLStorage.InitRootNode(xddnFiltersBuilderControlData);
		fbcMain.DataFieldsList.Serialize(XMLStorage.RootNode);
        return;
	}
 
	if (!Assigned(ReportFilters.FastReport)) {
		return;
	}
	if (fbcMain.DataFieldsList.Count == 0) {
		ReportFilters.FastReport.FiltersXML = '';
		return;
	}
	ReportFilters.FastReport.FiltersXML = 
		RemoveFilterBuilderItems(fbcMain);
}

После сохранения скрипта необходимо перезапустить Администратор Terrasoft.

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Спасибо, заработало

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

В отчете надо показать контактную иформацию определенного пользователя. Для этого на отчет добавил dataset. В запрос добавлен фильтр сравнения.
На событие BeforeOpen датасета пытаюсь применить фильтр.

function ds_RespMngOnDatasetBeforeOpen(Dataset, DoOpen) {
ApplyDataSetFilter(Dataset,'FilterCurrentUserID','{59b9825d-a16d-48af-9c20-4df1100e4bd5}',true);
}

выбрасывает сообщение:
Ошибка выполнения метода 'ds_RespMngOnDatasetBeforeOpen'. Object expected

Террасофт 3.3.046 MS SQL 2005 express

Нравится

2 комментария

В скрипт подключите scr_DB
И название функции ApplyDatasetFilter (регистр)

скрипт-то был включен, а вот регистр...
Большое спасибо, Валерий!

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