Добрый день. Возник вопрос, как реализовать связь многие ко многим в данной CRM.
Пример такой: у меня есть два раздела (стажерские программы и курсы). В стажерскую программу может входить несколько курсов, а также курс может быть включён в несколько стажерских программ.
Как реализовать связь, в результате которой в курсе я смогу просмотреть все программы, в которые этот курс включен, а в каждой стажерской программе буду видеть все курсы, которые в неё включены.

Нравится

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

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

Для решения подобной задачи Вам необходимо создать таблицу развязки и добавить в схему пользовательский фильтр (бизнес-правило).
Пример Вы можете посмотреть в базовом функционале - деталь «Команда» (раздел «Продажи»).

Также прикрепляю файл с примерным алгоритмом реализации.
ispolzovaniebazovyhshemdetaleysreestromsosvyazyuodinkomnogimmnogiekomnogim.doc

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

Здравствуйте.
Появилась следующая задача для реализации в системе:
Раздел "Контакты". Необходимо создать деталь "Поклиентское планирование", которая должна состоять из двух частей:
1. Деталь периодов планов продаж. (ххх_ContactSalesPlan)
2. Деталь препараты, записи которой привязываются к периодам планов продаж. (tbl_ContactSalesPlanOfferings)
Создала все необходимое: таблицы, запросы, датасеты, окна грида, окна редактирования. В интерефейсе отображаются, все отлично.

Добавила в function RefreshDetails()

else if (pcDetails.ActivePage.Name == pgContactSalesPlanDetail.Name) {
RefreshCommonDetail(BaseWorkspace, wndContactSalesPlanDetail, 'ContactID', 'ContactID');
}

А теперь, собственно, вопрос: как правильно связать вторую деталь с первой? Ее нужно обновлять при переходе между записями планов продаж, при нажатии на "Добавить" передавать ИД плана продаж и т.п.

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

Подскажите, пожалуйста, в какую сторону двигаться.

С уважением, Алевтина.

Нравится

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

Алевтина, посмотрите тему http://www.community.terrasoft.ua/forum/topic/9048, в ней есть и описание реализации подобной задачи, и вложенная инструкция.

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

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

Нравится

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

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

2. Прописано обновление второй детали, в зависимости от проетаИД, т.е. в блоке РефрешДетаилз скрипта скр_ПрожектВоркспейс в строке, где "упоминается" наша деталь дописан рефреш для второго окна:

 else  
	if (pcDetails.ActivePage.Name == pgSectorsInProjectDetail.Name) { //debugger;
		RefreshCommonDetail(BaseWorkspace, wndSectorsInProjectDetail, 'ProjectID',	'ProjectID');
		<strong>RefreshCommonDetail(BaseWorkspace, wndCFDetail, 'ProjectID',	'ProjectID');</strong>
	}

3. Нужно дописать еще, чтобы во втором окне записи фильровались не только по проектуИД, но и по участкуИД, который у нас в "первом" гриде.
этот фильтр я прописала в функции OnSelectionChange грида "участки в проекте":

function grdDataOnSelectionChange(DataGrid) {         //debugger;
	var CashflowWindow = Self.ParentContainer.ParentWindow.ComponentsByName('wndCFDetail').Window;
	var CashflowDataset = CashflowWindow.ComponentsByName('dlData').Dataset;
	if (DataGrid.SelectedIDs.Count == 1) {
		var SectorID = GetDatasetFieldValueByID('ds_SectorsInProject', DataGrid.SelectedIDs(0), 'SectorID');
		CashflowDataset.Close();
		ApplyDatasetFilter(CashflowDataset, 'SectorID', SectorID,true);
		CashflowDataset.Open();
		//debugger;
		CashflowDataset.Attributes('SectorID') = SectorID;
	}
}

4. последняя строчка -- передача атрибута. сделано для того, чтобы заполнять "значения по умолчанию" в Операции (т.е. когда мы нажимаем "добавить" справа, то участок чтобы сразу подставлялся. это даже логично). Этот атрибут нужно дописать в ДефоултВалуес грида операций при открытии карточки, в моем случае это было в функции AddCashflowData :

function AddCashflowData(Control) {
	var WorkspaceDataset = Self.Attributes('WorkspaceDataset');
	if (!Assigned(WorkspaceDataset)) {
/* MODULE PROJECTS */
		if (IsWindowProjectDetail(Self)) {//грид как деталь в Проектах
			var Attributes = GetNewDictionary();
			Attributes('DoNotDisableEvents') = true;
			//------
			<strong>var SectorID = dlData.Dataset.Attributes('SectorID');
			if (!!SectorID) {
				Attributes('SectorID') = SectorID;
			} 			
			BaseGridArea.AddDataDefaultValues = Attributes;</strong>
			//-----------------
			AddGridAreaData(Self, Self, BaseGridArea, Attributes);
		} else {
//...

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

Надеюсь, что схема Вам более-менее понятна. Удачи в реализации.
Если возникнут вопросы/уточнения -- пишите!
С уважением, Ольга

спасибо
все, получилось

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

Роман, здравствуйте!
Не совсем понятна Ваша задача... Вы хотите фильтровать Продукты по Поставщику? или в Продукте указывать Поставщика? если что-то из этого, то это не сдвоенная деталь, это можно немного иначе решить..
Опишите свою задачу подробней, можно с примером -- будет легче понять, что нужно сделать.

Ольга, приветствую,
Задача у меня следующая:
необходимо в модуле продажи в нижнем информационном окне иметь возможность во вкладке продукты открывать дополнительную вкладку поставщики, в настоящий момент там есть только Cross/Up-Sales и "Предыдущие продажи"
вкладка поставщики должна дублировать поставщиков из модуля "Продукты"
т.е. мне необходимо не новую а продублировать имеющуюся в малом дополнительном окне

Роман Борисович, во вложении прилагаю инструкцию. Придерживаясь описанного в инструкции алгоритма действий вы сможете реализовать свою задачу.
Если будут вопросы - пишите.

Наталья, огромное спасибо, пока не удалось победить данное мероприятие, но думаю мои 8 попыток пойдут как положительный опыт :)
что-то видимо делаю не правильно - это исправимо, решу и научусь
как получится, отпишусь
еще раз спасибо

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

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