Подскажите пожалуйста. Как сделать так чтоб отображалось количество записей в детали?

Нравится

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

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

К сожалению такой функционал можно реализовать исключительно средствами разработки. 

Добавили ваше обращение в список пожеланий.

С уважением, 

Антон

Александр, добрый вечер.

 

Могу помочь в решении Вашей задачи, напишите мне на почту - savelieva.crm@gmail.com.

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





 

Вот что хотелось бы получить, если 3 сделки на детали, то чтоб напротив детали отображалось 3 и так далее в зависимости от количества сделок в делате 

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

Всем доброго дня! 

Добавила свои кастомные быстрые фильтры через аттрибуты и переопределение функции initQueryFilters , фильтры работают как нужно. Теперь не могу найти где находится базовый пересчет количества. Может быть кто-то знает.

Изображение удалено.

Прикрепленные файлы

Нравится

6 комментариев
              var activeViewName = this.getActiveViewName();
              if (activeViewName === this.get("AnalyticsDataViewName")) {
                this.sandbox.publish("SectionUpdateFilter",
                                     null, [this.getQuickFilterModuleId()]);
              }

Пробуйте запустить такой код после применения ваших фильтров

не помогло, пробовала также и без проверки условия.

Можете отправить полный код, где делаете фильтр?

Трефилов Павел Сергеевич,

define("OrderSectionV2", ["ProcessModuleUtilities","BaseFiltersGenerateModule","css!UsrStylesOrderSectionV2"], function(ProcessModuleUtilities,BaseFiltersGenerateModule) {
	return {
		entitySchemaName: "Order",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		attributes: {
            "UsrPPNumberFilter": {
                "dataValueType": Terrasoft.DataValueType.TEXT
            },
            "UsrPPNumbers": {
                "dataValueType": Terrasoft.DataValueType.TEXT,
                "values": ""
            },
			"UsrMyNumberFilter": {
                "dataValueType": Terrasoft.DataValueType.TEXT
            },
            "UsrMyNumbers": {
                "dataValueType": Terrasoft.DataValueType.TEXT,
                "values": ""
            },
			"UsrContrFilter": {
                "dataValueType": Terrasoft.DataValueType.TEXT
            },
            "UsrContr": {
                "dataValueType": Terrasoft.DataValueType.TEXT,
                "values": ""
            },
			"UsrNameFilter": {
                "dataValueType": Terrasoft.DataValueType.TEXT
            },
            "UsrMyName": {
                "dataValueType": Terrasoft.DataValueType.TEXT,
                "values": ""
            },
			"UsrQua": {
                "dataValueType": Terrasoft.DataValueType.INTEGER,
                "values": ""
            },
        },
		diff: /**SCHEMA_DIFF*/[	
			{
                "operation": "insert",
                "name": "MyFilterContainer",
                "parentName": "LeftGridUtilsContainer",
                "propertyName": "items",
                "index": 3,
                "values": {
                    "id": "MyFilterContainer",
                    "itemType": this.Terrasoft.ViewItemType.CONTAINER,
                    "items": [],
 
                }
            },
 
 
			{
                "operation": "insert",
                "parentName": "MyFilterContainer",
                "propertyName": "items",
                "name": "PP_Number",
				"index": 1,
                "values": {
                    "bindTo": "UsrPPNumberFilter",
                    "caption": {"bindTo": "Resources.Strings.UsrPPNumberCaption"},
 
					"controlConfig": {
                        "change": {
                            "bindTo": "ppNumChanged"
                        }
                    }
 
                }
            },
 
			{
					"operation": "insert",
					"parentName": "MyFilterContainer",
					"propertyName": "items",
					"name": "DeleteButton1",
					"index": 2,
					"values": {
						"itemType": Terrasoft.ViewItemType.BUTTON,
						"caption": "",
						"imageConfig": {"bindTo": "Resources.Images.del_but"},
						"controlConfig": {
						},
						"layout": {
							"column": 0,
							"row": 2,
							"colSpan": 1
						},
						"click": { "bindTo": "onDel" },
					}
			},
			{
                "operation": "insert",
                "parentName": "MyFilterContainer",
                "propertyName": "items",
                "name": "my_Number",
				"index": 3,
                "values": {
                    "bindTo": "UsrMyNumberFilter",
                    "caption": {"bindTo": "Resources.Strings.myNumber"},
 
					"controlConfig": {
                        "change": {
                            "bindTo": "myNumberChanged"
                        }
                    }
 
                }
            },
			{
					"operation": "insert",
					"parentName": "MyFilterContainer",
					"propertyName": "items",
					"name": "DeleteButton2",
					"index": 4,
					"values": {
						"itemType": Terrasoft.ViewItemType.BUTTON,
						"caption": "",
						"imageConfig": {"bindTo": "Resources.Images.del_but"},
						"controlConfig": {
						},
						"layout": {
							"column": 0,
							"row": 2,
							"colSpan": 1
						},
						"click": { "bindTo": "onDel2" },
					}
			},
			{
                "operation": "insert",
                "parentName": "MyFilterContainer",
                "propertyName": "items",
                "name": "my_Contr",
				"index": 5,
                "values": {
                    "bindTo": "UsrContrFilter",
                    "caption": {"bindTo": "Resources.Strings.myContr"},
 
					"controlConfig": {
                        "change": {
                            "bindTo": "myContrChanged"
                        }
                    }
 
                }
            },
			{
					"operation": "insert",
					"parentName": "MyFilterContainer",
					"propertyName": "items",
					"name": "DeleteButton3",
					"index": 6,
					"values": {
						"itemType": Terrasoft.ViewItemType.BUTTON,
						"caption": "",
						"imageConfig": {"bindTo": "Resources.Images.del_but"},
						"controlConfig": {
						},
						"layout": {
							"column": 0,
							"row": 2,
							"colSpan": 1
						},
						"click": { "bindTo": "onDel3" },
					}
			},
			{
					"operation": "insert",
					"parentName": "MyFilterContainer",
					"propertyName": "items",
					"name": "PeriodSelectButton",
					"index": 7,
					"values": {
						"itemType": Terrasoft.ViewItemType.BUTTON,
						"caption": "",
						"imageConfig": {"bindTo": "Resources.Images.LookupIcon"},
						"controlConfig": {
						},
						"layout": {
							"column": 0,
							"row": 2,
							"colSpan": 1
						},
						"click": { "bindTo": "openMyLook" },
					}
			},
			{
                "operation": "insert",
                "parentName": "MyFilterContainer",
                "propertyName": "items",
                "name": "my_Name",
				"index": 8,
                "values": {
                    "bindTo": "UsrNameFilter",
                    "caption": {"bindTo": "Resources.Strings.myName"},
 
					"controlConfig": {
                        "change": {
                            "bindTo": "myNameChanged"
                        }
                    }
 
                }
            },
			{
					"operation": "insert",
					"parentName": "MyFilterContainer",
					"propertyName": "items",
					"name": "DeleteButton4",
					"index": 9,
					"values": {
						"itemType": Terrasoft.ViewItemType.BUTTON,
						"caption": "",
						"imageConfig": {"bindTo": "Resources.Images.del_but"},
						"controlConfig": {
						},
						"layout": {
							"column": 0,
							"row": 2,
							"colSpan": 1
						},
						"click": { "bindTo": "onDel4" },
					}
			},
 
        ]/**SCHEMA_DIFF*/,
 
		methods: {
 
		clearFilter: function() {
			this.set("UsrPPNumberFilter", "");
			this.onUsrFilterChanged();
		},
 
		onUsrFilterChanged: function() {
			this.reloadGridData();
		},
 
		initQueryFilters: function(esq) {
			this.callParent(arguments);
			//номер в пп
			var usrEmailFilter = this.get("UsrPPNumbers");
			if (usrEmailFilter) {
				esq.filters.add("UsrPPNumberFilter", this.Terrasoft.createColumnFilterWithParameter(
					this.Terrasoft.ComparisonType.CONTAIN, "UsrNumberInPP".substring(), usrEmailFilter));
			} else {
				esq.filters.removeByKey("UsrPPNumberFilter");
			}		
 
			//Номер
			var usrMyFilter = this.get("UsrMyNumbers");
			if (usrMyFilter) {
				esq.filters.add("UsrMyNumberFilter", this.Terrasoft.createColumnFilterWithParameter(
					this.Terrasoft.ComparisonType.CONTAIN, "Number".substring(), usrMyFilter));
			} else {
				esq.filters.removeByKey("UsrMyNumberFilter");
			}
			//Контрагент
			var usrContrFilter = this.get("UsrContr");
			if (usrContrFilter) {
				esq.filters.add("UsrContrFilter", this.Terrasoft.createColumnFilterWithParameter(
					this.Terrasoft.ComparisonType.CONTAIN, "Account.Name".substring(), usrContrFilter));
			} else {
				esq.filters.removeByKey("UsrContrFilter");
			}
			//Название
			var usrNameFilter = this.get("UsrMyName");
			if (usrNameFilter) {
				esq.filters.add("UsrNameFilter", this.Terrasoft.createColumnFilterWithParameter(
					this.Terrasoft.ComparisonType.CONTAIN, "UsrName".substring(), usrNameFilter));
			} else {
				esq.filters.removeByKey("UsrNameFilter");
			}
 
 
		},
 
		ppNumChanged: function(a, b, c) {
			this.set("UsrPPNumbers", a);
			this.onUsrFilterChanged();
 
		},
 
		myNumberChanged: function(a, b, c) {
			this.set("UsrMyNumbers", a);
			this.onUsrFilterChanged();
		},
 
		myContrChanged: function(a, b, c) {
			this.set("UsrContr", a);
			this.onUsrFilterChanged();
		},
 
		myNameChanged: function(a, b, c) {
			this.set("UsrMyName", a);
			this.onUsrFilterChanged();	
		},
 
		addCallBack: function(args) {
		  this.selectedRows = args.selectedRows.getItems();
 
			var ids = [];
			var names = [];
			this.selectedRows.forEach(function(item) {
				ids.push(item.Id);
				names.push(item.Name);
		   });
			this.set("UsrContr",names);
			document.getElementById('OrderSectionV2my_ContrTextEdit-el').value = names;
			document.getElementById('OrderSectionV2my_ContrTextEdit-el').focus();
			document.getElementById('OrderSectionV2my_ContrTextEdit-el').blur();
		},
 
 		openMyLook: function(){
			var config = {
				entitySchemaName: "Account",
				columns: ["Name"]
			};
			this.openLookup(config, this.addCallBack, this);
		},
		onDel: function(){
			document.getElementById('OrderSectionV2PP_NumberTextEdit-el').value = null;
			this.set("UsrPPNumberFilter", "");
			this.onUsrFilterChanged();
		},
		onDel2: function(){
			document.getElementById('OrderSectionV2my_NumberTextEdit-el').value = null;
			this.set("UsrMyNumberFilter", "");
			this.onUsrFilterChanged();
		},
		onDel3: function(){
			document.getElementById('OrderSectionV2my_ContrTextEdit-el').value = null;
			this.set("UsrContrFilter", "");
			this.onUsrFilterChanged();
		},
		onDel4: function(){
			document.getElementById('OrderSectionV2my_NameTextEdit-el').value = null;
			this.set("UsrNameFilter", "");
			this.onUsrFilterChanged();
		},
 
		}
	};
});

 

Анастасия Шумейко,

Добрый день.

 

Вам нужно проверить уходит ли запрос на получение количества записей.

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

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

Анастасія Шумейко,

А поделитесь, пожалуйста, способом сделать свои кастомные быстрые фильтры ?

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

Добрый день!

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

Вот запрос, по которому нужен фильтр:

SELECT COUNT(*) FROM (SELECT DISTINCT ScreenID FROM
(select * from dbo.tbl_Shows where (DealID = :DealID) ) a) a;

Заранее благодарю!

Нравится

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

Вы можете использовать "итоги" в в любом реестре. Для подсчета количества записей в реестре подходит Ваш фильтр(который выводит id уникальных записей) с включенным итогом (по количеству) на одном из полей реестра.

мне необходимо использовать результат запроса в скрипте

Используйте свойство RecordsCount набора данных(Dataset). Как вариант, опишите задачу полностью, может есть простое решение :)

И к датасету не привязан фильтр.

Задача такова:
в Сделке необходимо посчитать количество уникальных продуктов. И в зависимости от полученного числа применить определенную скидку.

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

А Select distinct ScreenID from ххх - Вам не подходит?

Насколько я понял, то "продукты в сделке" являются деталью. Поскольку в зависимости от полученного числа уникальных продуктов будет зависеть скидка, то именно бизнес логика должна определять метод, с помощью которого Вы будете вычислять значение этого поля.
Попробую догадаться..
Приведу простой пример:
1. Изменение количества продуктов в сделке: отказ от продукта, добавление нового и т.д.
2. Утверждение скидки менеджером: вероятнее всего скидка должна быть утверждена (а то я возьму у Вас по карандашу и ручке каждого вида и получу неправомерную скидку).

Варианты как можно решить Вашу задачу:
1. Триггер на таблице "продукты в сделке", который записывает нужное количество в таблицу "сделок".
2. Вычисляемое поле в наборе данных (датасете) сделки.
3. ExecuteCustomSQL - есть в комьюнити описание как выполнять любой запрос с параметрами.
4. Функция (вызывается по кнопке "Пересчитать" в карточке сделки), которая вычисляет данное поле.

Спасибо, Сергей
Я думала, что смогу уйти от этого ExecuteCustomSQL, но, видимо, все же придется его использовать.

>А Select distinct ScreenID from ххх - Вам не подходит?

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

Необязательно использовать ExecuteCustomSQL :)
Может Вам проще будет использовать такую конструкцию:

Создайте 2 сервиса: запрос (sq) и датасет(ds)c одним полем "ScreenID".
Запрос "Select distinct ScreenID from ххх" с фильтром по заказу.
теперь

var ds = Services.GetNewItemByUSI('ds');
ApplyDatasetFilter(ds, '[название ID заказа]', [значение ID заказа],true);
ds.Open();
var Count = ds.RecordsCount;

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

Сергей, сделала почти так же, как вы описали, но без создания сервиса ds

результатом фильтрации sq_ScreensCount является набор записей с уникальными id

var SelectQuery = Services.GetNewItemByUSI('sq_ScreensCount');
SetParameterValue(SelectQuery.Parameters, 'DealID', DealID);
var ScreenCountDataset = SelectQuery.Open();
var ScreensCount = ScreenCountDataset.RecordsCount;
ScreenCountDataset.Close();

Всем огромное спасибо за помощь!

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

В FAQ нашел ответ на интересующий меня вопрос

Вопрос:
Существует ли возможность в реестре записей вывести более 40 записей?
Ответ:
Настройка количества записей, отображаемых в реестре, осуществляется в окне настройки конфигурации. При нажатии на кнопку [Дополнительно] данного окна в появившемся поле [Кол. записей в наборе данных] необходимо установить требуемое значение.

Но вот задача, не могу найти я это пресловутое окно настройки конфигурации. Где именно оно находится? Версия crm 3.0.2.66

Искал и в самой программе (TSLauncher.exe) и в админке (TSAdmin.exe), не нашел не там не там. Покажите, может даже не там ищу?

Нравится

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

Окно настройки конфигурации находится при логине - поле "Конфигурация" кнопка с изображением лупы, далее нажать на кнопку "Изменить".
Но нужная Вам настройка появилась начиная с 3.1.0 при создании конфигурации по кнопке "Дополнительно>>"

Извините, не с 3.1.0, а 3.1.1

спасибо, кхм, а в версии ниже не получится изменить это значение?

Для все конфигурации нет, но можно для конкретного DBDataset/Select FetchRecordsCount или Top соответсвенно.

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

Одновременно отображается одна деталь. Или Вы переделывали конфигурацию?
В принципе если захотеть, то неоптимальным запросом(1-на деталь) можно "положить" сервер так, что прийдется всех отключать...

Если изменений не было, то по умолчанию любая деталь(кроме деталей с UNION, но они редко когда превышают 40 записей для одного обьекта) выбирает не больше 40 записей.

"Осауленко Александр" написал:Для все конфигурации нет, но можно для конкретного DBDataset/Select FetchRecordsCount или Top соответсвенно.

Как ето реализовать на 3.1.0? куда вписывать фетч?

Здравствуйте, Роман.
У Dataset.FetchRecordsCount или у Select.Top(Select эл. коллекции SelectQuery). Эти свойства необходимо изменять после закрытия и перед открытием Dataset. Для Select когда угодно если Вы потом вызываете у SelectQuery.Open

первая ссылка не открываетса....а вторая: разве если я в селект квери введу вместо -1 например 60...то в гриде появлятся на одну страницу 60 записей и смогу перелистывать страницы по всем записям??

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