Добавил новые условия фильтрации в группу Задачи в разделе Контакты. Фильтры видны только у администратора у остальных пользователей не работают. В чем может быть проблема? Terrasoft Sale 3

Нравится

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

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

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

Нужно отфильтровать операции по состоянию связанной с операцией продажи.

В разделе продажи есть, например, вот такой фильтр по отрасли контрагента:

Мне нужно что-то похожее. Каким образом это сделать?
Спасибо!

Нравится

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

Такие фильтры делаются в TSAdmin. В частности, «отрасль» настроена в сервисе «sq_Opportunity».
фильтр «отрасль»
Вам нужно создать свой фильтр аналогично.

"Зверев Александр" написал:

Такие фильтры делаются в TSAdmin. В частности, «отрасль» настроена в сервисе «sq_Opportunity».

Вам нужно создать свой фильтр аналогично.


Александр, спасибо!

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

Добрый день! В разделе клиенты необходимо создать вкладку "Мои клиенты", которая бы отображала только клиентов с последней продажей текущего контакта (пользователя). Написали скрипт (рис. Результат), который отображает подобных клиентов, перенесли его структуру в сервис sq нужного нам раздела, но в системе отображаются совсем не похожие на предыдущие результаты скрипта записи.
Скриншоты и скрипт прилагаю. Очень интересно, что даже запрос на сервер не идет почему то...

Нравится

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

А почему должна добавляться фильтрация, если она не включена?
У Вас InvoiceFilters в фильтрации MyAcc не влючен и плюс ко всему, отсутствует связь Контрагента со Счетом в фильтрации.

Обратите внимание как настроена фильтрация IndustryFilters или InvoiceFilters в сервисе sq_Account.

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

Здравствуйте, подскажите пожалуйста, при фильтрации задач по контакту, отображаются задачи, где данный контакт является ответственным, а необходимо также отображать все групповые задачи,где указана группа ответственных в которую входит данный контакт. Как это можно реализовать?

Заранее спасибо

Нравится

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

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

Уточните, пожалуйста, версию продукта, который Вы используете.

Этот же вопрос обсуждается здесь.

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

Добрый день! Подскажите, пожалуйста, каким образом в гриде можно установить возможность раскрывать плюсиком, к примеру сущность контакт, что бы внутри него отобразились направления по этому контакту. К примеру при создании справочников эта возможность присутствует изначально, а как ее реализовать в разделе?

Нравится

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

Здравствуйте, Антон!

А почему не вывести эти колонки в реестр записей?

Алексей, в приложении пример того отображения записей в разделе, который мы хотим. У менеджера может быть несколько контрагентов, соответственно раскрыв его - мы их увидим, так же и с контрагентами и так далее... Вопрос именно в том, как это отображение реализовать?

Здравствуйте, Антон!

Если правильно Вас понял, вы имеете ввиду такой пример:

Для этого необходимо выполнить такую последовательность действий (пример приведу на разделе [Контрагенты]):

  1. 1. В нужном сервисе запроса, в нашем случае это будет sq_Account, вывести те колонки таблицы, которые необходимо отобразить в реестре. Если колонку выводим с помощью подзапроса, тогда необходимо настроить фильтрацию
  2. 2. В источнике данных, в нашем примере это ds_Account, выводи созданное поле на предыдущем шаге наше
  3. 3. Заполняем поля. В поле [Заголовок] вводим название колонки. В поле [Группа] вводим название группы, под этим названием будет группироваться колонки. в поле [Многострочный заголовок] вводим сгруппированное название вида: [Группа]|[Многострочный заголовок].
  4. 4. Повторяем предыдущие пункты, если нам необходимо вывести еще пару полей и группируем их в группу [Обязательства]
  5. 5.Добавляем ранее созданные поля в реестр. Для этого открываем окно реестре, в нашем случае это wnd_AccountsGridArea, добавляем поле(я) и заполняем необходимые значения.

Вы можете сгруппировать любые поля в одну группу. Главное в источнике данных заполнить поле [Группа] и [Многострочный заголовок]

По группировке в добавлении колонок, понятно, спасибо! А как можно настроить такую же группировку только в рамках сущности прямо в гриде? Скриншот прилагается
А так же подскажите, пожалуйста, где можно найти документацию по созданию разделов системы версии 3.3.2

Здравствуйте, Антон!

Создание древовидного грида (TreeDataGrid) не простая задача, пример создания такого грида и раздела можете рассмотреть на примере раздела [Проекты].

Также рекомендую ознакомиться со статьями на community по этому вопросу:
Организовать древовидный список
TreeArea в качестве основного реестра раздела
Создание нового раздела
Дотянуться до поля ParentID
Создание нового раздела
TreeArea
Не могу разобраться с TreeArea
Как организовать фильтрацию по наличию подчиненного элемента в TreeArea?

Руководство пользователя

Не получается ввести ключ

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

У Вас не корректный путь.

Каким образом ввести корректный?

В Вашем случае полный путь будет таким:
"C:\Program Files (x86)\Terrasoft Sales\Bin\TSClient.exe" /wnd=wnd_CreateNewWorkspace

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

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

Сервис, в котором хранятся иконки для разделов системы, называется il_Main (\\Common\Main).

спасибо, а каким образом можно использовать этот сервис по отношению к новому разделу?

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

Для нового раздела вы можете сделать по аналогии с уже существующими разделами, например, раздела [Контрагенты].

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

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

Нравится

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

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

Уточните, пожалуйста, о каких фильтрах идет речь? В разделах фильтры размещены вверху страницы, а не внизу.

В приложении скрин, там выделена нужная нам область фильтров
Спасибо

Пример добавления пользовательского фильтра описан в файле во вложении.
Также существует возможность добавления или отключения фильтра в датасете раздела. Для этого нужно запустить TSAdmin, найти датасет раздела и для датафилда датасета (нужного поля) установить/снять признак 'Поле фильтрации'.

Спасибо!

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

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

подскажите пожалуйтста, можно ли использовать возможности полнотекстового поиска mssql2012 в террасофт 3.4 ?

Или может быть есть идеи или готовые решения как это реализовать.

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

Нравится

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

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

Для организации полнотекстового поиска mssql2012 в Terrasoft 3.4 можете создать свой кастомный запрос который подключите в своем справочнике. Если у Вас уже настроен справочник, то можете добавить кастомное условие и использовать его для фильтрации.

Павел, спасибо!

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

Приведу пример на Контрагентах.

  1. Открываем сервис sq_Account ([Accounts\General\Main Grid\sq_Account])
  2. Добавляем новый фильтр к запросу [Custom SQL Filter]
  3. В созданном условии пишем свое условие
  4. Сохраняем запрос

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

Приведу пример готового решения поиска.

1. В sql пишем функцию, которая выполняет поиск:

GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
 
create function [dbo].[tsf_GetContactIDsPr](@CONTAINSText nvarchar(255))
returns @Result table(ID uniqueidentifier)
as
begin
	set @CONTAINSText = rtrim(ltrim(@CONTAINSText));
		set @CONTAINSText = @CONTAINSText + '*';
		set @CONTAINSText = '"' + @CONTAINSText + '"';
		insert into @Result
		select ID
		FROM [dbo].[tbl_Contact] AS [tbl_ Contact] 
		WHERE (CONTAINS([tbl_ Contact].[Description], @CONTAINSText))	
		end
 
	return		
End

2. В Террасофт в sq_Contact добавляем пользовательский sql-фильтр

3. В фильтре прописываем вызов функции

Exists
(
select *
from dbo.tsf_GetFileIDsCONTAINSVarious(:DescripWords) b
where b.ID = [tbl_Files].[ID]
)

4. Сохраняем изменения в сервисе.

5. Активируем фильтр

var DescripWords =edtSearch.Value; //поле поиска
if (!IsEmptyValue(DescripWords)) {
	ApplyDatasetFilter(Dataset, DescripWordsFilters, DescripWords, true);
}
Показать все комментарии

Добрый день!
Возникла такая задача:
Нужно отфильтровать данные в lookupDataControl на основе фильтра в запросе.

При использовании

var Dataset1 = dlData.Dataset; 
        var Dataset = LookupDataControl.DataField.LookupDataset;
ApplyDatasetFilter(Dataset, 'IncidentID', Dataset1.Values('IncidentID'), true);
        EnableDatasetFilters(Dataset, true, 'IncidentID');

вылетает в ошибку с необработанным исключением.
Как решить сию задачу?

Нравится

3 комментария
        var FieldID = dlData.Dataset('FieldID');
	if (FieldID != null) {
		var Dataset = LookupDataControl.DataField.LookupDataset;
		ApplyDatasetFilter(Dataset, 'FieldID', FieldID, true);
	}

это если у вас поле не списочное (нет стрелочки вниз - вместо нее лупа).

Олейник Дмитрий
Подскажи как написать фильтр в массиве для одного поля
Типо такого
ApplyDatasetFilter(Dataset, 'FieldID', New Array(1 фильтр, 2 фильтр), true);

ApplyDatasetIncludeFilter(Dataset, 'FieldID', FieldIDsArray, true);

При этом IncludeFilter должен быть заранее задизайнен в сервисе SelectQuery.

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

Здравствуйте!
В функции GetLookupDatasetFieldValue (scr_DB) стоило бы прописать отключение фильтра, строку
ApplySelectQueryFilter(SelectQuery, 'ID', IDValue, false);
перед выходом из функции, поскольку это сказывается при повторном поиске для поля, которое передается первым параметром.

Нравится

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

А в чем проблема? Этот фильтр включать всегда ведь нужно, а значения параметра (IDValue) может быть разным.

Например, для контактов при попытке выборе другого контакта, в окне wnd_SelectGridArea показывается только тот контакт, который был выбран ранее, хотя критерии выбора не задаются. Выбор становится невозможным.

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

Здравствуйте Дмитрий!
Мне нужно анализировать входящие звонки. В карточке входящего звонка есть флажок "Запрос с сайта" (WebReq) и поле LookupDataControl ContactID - ID абонента. Нужно, чтобы для абонента был обязательным адрес E-Mail (Communication4), если включен флажок "Запрос с сайта". Я это реализовал в карточке звонка. Предусмотрел обработчик события dlDataOnDatasetBeforePost:

if (Dataset.ValAsBool('WebReq')) {
var EMail = GetLookupDatasetFieldValue(Dataset.DataFields('ContactID'), 'Communication4');
if (IsEmptyValue(EMail)) {
ShowErrorDialog('Не указан E-Mail абонента');
DoPost.Value = false;
IncommingCallsEdit.Result = DoPost.Value;
}
}

Первый раз отрабатывает нормально, но при повторном использовании происходит то, что я описал.

Добрый день, Владимир!

Спасибо, передадим информацию в департамент разработки.

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

Добрый день. Я уже как-то поднимала этот вопрос тут Тогда окончательный я так и не получила. Напомню, что задача была, задавая дату, получить на основе журнала изменений количество продаж в состоянии в работе на эту дату. Эта первоначальная задача решена запросом

SELECT count (ID) FROM tbl_Opportunity
WHERE EXISTS
(SELECT ID FROM
(SELECT top (1) CreatedOn,StatusName, StageStage, Title, ID, RecordID, Cash, Revenue  FROM tbl_OpportunityLog WHERE
[tbl_OpportunityLog].[RecordID] = [tbl_Opportunity].[ID]AND
[tbl_OpportunityLog].[CreatedOn] = :CreatedOn
ORDER BY [tbl_OpportunityLog].[CreatedOn] DESC) AS OpportunityTable
WHERE [OpportunityTable].[StatusName] = :STATUS AND
 ([OpportunityTable].[StageStage] =:Stage1 OR
 [OpportunityTable].[StageStage] = :Stage2 OR
 [OpportunityTable].[StageStage] = :Stage3))
GROUP BY
        [tbl_Opportunity].[Title]

Остался открытым вопрос , как изменить этот запрос, чтобы получить ответ на вопрос "какой был потенциал этих продаж на требуемую дату".
У меня получается вытянуть только сегодняшний потенциал - sum ([tbl_Opportunity].[Cash]) , на все другие изменения запроса sql ругается - sum ([tbl_OpportunityLog].[Cash]), sum([OpportunityTable].[Cash]....
А варианты запросов сразу к журналу изменений приводят к дублированию продаж.

Нравится

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

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

SELECT [tbl_Opportunity].[Title], 
CONVERT(DATE, [tbl_Opportunity].[CreatedOn], 102) As CreatedOn, 
sum([tbl_Opportunity].[Cash])/count([tbl_OpportunityLog].[id]) as CashToday,
sum([tbl_OpportunityLog].[Cash])/count([tbl_OpportunityLog].[id]) AS [AvgCashLog]
 
FROM tbl_Opportunity inner join [tbl_OpportunityLog] on 
 [tbl_OpportunityLog].[RecordID] = [tbl_Opportunity].[ID] and
[tbl_OpportunityLog].[CreatedOn] <= CONVERT(DATETIME, '2014-03-31 00:00:00', 102) and
[tbl_OpportunityLog].[StatusName] = :STATUS AND
 ([tbl_OpportunityLog].[StageStage] =:Stage1 OR
 [tbl_OpportunityLog].[StageStage] = :Stage2 OR
 [tbl_OpportunityLog].[StageStage] = :Stage3) 
 
// в ЭТОМ МЕСТЕ НАДО еще добавить условие на выбор записи журнала изменений с МАКСИМАЛЬНОЙ датой CreatedOn. КАК?
 
 
 WHERE exists
(SELECT ID,StatusName, StageStage, Title, RecordID, Cash, Revenue from 
(Select top (1) CreatedOn,StatusName, StageStage, Title, ID, RecordID, Cash, Revenue  from tbl_OpportunityLog WHERE 
[tbl_OpportunityLog].[RecordID] = [tbl_Opportunity].[ID]and
[tbl_OpportunityLog].[CreatedOn] <= CONVERT(DATETIME, '2014-03-31 00:00:00', 102)
ORDER BY [tbl_OpportunityLog].[CreatedOn] Desc) As OpportunityTable
Where [OpportunityTable].[StatusName] = :STATUS AND
 ([OpportunityTable].[StageStage] =:Stage1 OR
 [OpportunityTable].[StageStage] = :Stage2 OR
 [OpportunityTable].[StageStage] = :Stage3)) 
GROUP BY
	[tbl_Opportunity].[Title], [tbl_Opportunity].[CreatedOn]

Спасибо за Ваше обращение. Мы зарегистрировали его в Службе технической поддержки и назначили специалиста, который сможет Вас компетентно проконсультировать по данному вопросу

where [tbl_OpportunityLog].[CreatedOn] = (select max([CreatedOn]) from [tbl_OpportunityLog])

Два раза подряд WHERE такого sql не понимает.
Скобки тоже не помогли.

Если вообще убрать WHERE и продолжить писать условия через and для выборки INNER JOIN, то получится пустое множество.

Виктория, я демонстрировал конструкцию.
В вашем запросе она должна располагаться так:

SELECT [tbl_Opportunity].[Title], 
CONVERT(DATE, [tbl_Opportunity].[CreatedOn], 102) AS CreatedOn, 
sum([tbl_Opportunity].[Cash])/count([tbl_OpportunityLog].[id]) AS CashToday,
sum([tbl_OpportunityLog].[Cash])/count([tbl_OpportunityLog].[id]) AS [AvgCashLog]
 
FROM tbl_Opportunity INNER JOIN [tbl_OpportunityLog] ON 
 [tbl_OpportunityLog].[RecordID] = [tbl_Opportunity].[ID] AND
[tbl_OpportunityLog].[CreatedOn] <= CONVERT(DATETIME, '2014-03-31 00:00:00', 102) AND
[tbl_OpportunityLog].[StatusName] = :STATUS AND
 ([tbl_OpportunityLog].[StageStage] =:Stage1 OR
 [tbl_OpportunityLog].[StageStage] = :Stage2 OR
 [tbl_OpportunityLog].[StageStage] = :Stage3) 
 
 WHERE EXISTS
(SELECT ID,StatusName, StageStage, Title, RecordID, Cash, Revenue FROM 
(SELECT top (1) CreatedOn,StatusName, StageStage, Title, ID, RecordID, Cash, Revenue  FROM tbl_OpportunityLog WHERE 
[tbl_OpportunityLog].[RecordID] = [tbl_Opportunity].[ID]AND
[tbl_OpportunityLog].[CreatedOn] <= CONVERT(DATETIME, '2014-03-31 00:00:00', 102)
ORDER BY [tbl_OpportunityLog].[CreatedOn] DESC) AS OpportunityTable
WHERE [OpportunityTable].[StatusName] = :STATUS AND
 ([OpportunityTable].[StageStage] =:Stage1 OR
 [OpportunityTable].[StageStage] = :Stage2 OR
 [OpportunityTable].[StageStage] = :Stage3)) AND
 [tbl_OpportunityLog].[CreatedOn] = (SELECT max([CreatedOn]) FROM [tbl_OpportunityLog])
GROUP BY
        [tbl_Opportunity].[Title], [tbl_Opportunity].[CreatedOn]

Так, как Вы написали , тоже же получается пустое множество.

Да и не нужна там эта строка.
После WHERE EXISTS очень правильный запрос уже написан. Он одновременно 1) проверяет существуют ли в журнале изменений записи, дата которых меньше, чем указанная, а состояния равны указанным. Таких записей может быть несколько 2) и выбирает с помощью top (1) CreatedOn и сортировки DESC максимальную из дат , которая удовлетворяет требованию.

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

ПОЛУЧИЛОСЬ! надо было просто не бояться впихнуть еще один селект

SELECT [tbl_Opportunity].[Title], 
CONVERT(DATE, [tbl_Opportunity].[CreatedOn], 102) As CreatedOn, 
sum([tbl_Opportunity].[Cash])/count([tbl_OpportunityLog].[id]) as CashToday,
sum([tbl_OpportunityLog].[Cash])/count([tbl_OpportunityLog].[id]) AS [CashLogOnDate]
 
FROM tbl_Opportunity inner join [tbl_OpportunityLog] on 
 [tbl_OpportunityLog].[RecordID] = [tbl_Opportunity].[ID] and
[tbl_OpportunityLog].[CreatedOn] <= CONVERT(DATETIME, '2014-03-31 00:00:00', 102) and
[tbl_OpportunityLog].[StatusName] =:STATUS AND
 ([tbl_OpportunityLog].[StageStage] =:Stage1 OR
 [tbl_OpportunityLog].[StageStage] = :Stage2 OR
 [tbl_OpportunityLog].[StageStage] = :Stage3)and
 [tbl_OpportunityLog].[CreatedOn] = (SELECT max([tbl_OpportunityLog1].[CreatedOn]) from  [tbl_OpportunityLog] as   [tbl_OpportunityLog1] 
 where  
 [tbl_OpportunityLog1].[RecordID] = [tbl_Opportunity].[ID] and
[tbl_OpportunityLog1].[CreatedOn] <= CONVERT(DATETIME, '2014-03-31 00:00:00', 102) and
[tbl_OpportunityLog1].[StatusName] = :STATUS AND
 ([tbl_OpportunityLog1].[StageStage] =:Stage1 OR
 [tbl_OpportunityLog1].[StageStage] = :Stage2 OR
 [tbl_OpportunityLog1].[StageStage] = :Stage3)
  )
 WHERE exists
(SELECT ID,StatusName, StageStage, Title, RecordID, Cash, Revenue from 
(Select top (1) CreatedOn,StatusName, StageStage, Title, ID, RecordID, Cash, Revenue  from tbl_OpportunityLog WHERE 
[tbl_OpportunityLog].[RecordID] = [tbl_Opportunity].[ID]and
[tbl_OpportunityLog].[CreatedOn] <= CONVERT(DATETIME, '2014-03-31 00:00:00', 102)
ORDER BY [tbl_OpportunityLog].[CreatedOn] Desc) As OpportunityTable
Where [OpportunityTable].[StatusName] = :STATUS AND
 ([OpportunityTable].[StageStage] =:Stage1 OR
 [OpportunityTable].[StageStage] = :Stage2 OR
 [OpportunityTable].[StageStage] =:Stage3))
GROUP BY
	[tbl_Opportunity].[Title], [tbl_Opportunity].[CreatedOn]
Показать все комментарии