Добрый день!

Есть деталь "Договоры". Каждый договор может иметь вложенные договоры (уровень вложенности не более 2, т.е. у поддоговора не может быть договора)

Все это отображается с помощью TreeArea. Добавляется без проблем. Однако при нажатии на кнопку "Копировать" происходит копирование договора и бесконечное копирование в него поддоговоров. Остановить это можно только аварийным завершением программы.

Нравится

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

Здравствуйте, Александр!
Для выяснения причин такого поведения необходимо посмотреть скрипт, который выполняется при нажатии на кнопку.
Не могли бы Вы предоставить код скрипта или весь архив сервисов?

Проблема была в скрипте scr_BaseDBEditUtils

Функция SaveChangesWithCheck

/*if (!DoNotSendNotify) {
			SendNotify(Window, MSG_OK);
}*/ 

Я закоментил строку, которая отсылала сообщения окну. Однако это не полностью решает проблему.
Как я могу прислать архив сервисов?

Александр, опишите детальнее, что именно решает разкомментрирование строки?

Вы можете выложить архив здесь, либо прислать на почту технической поддержки support@terrasoft.ru с указанием в теме письма ссылку на это обсуждение (http://www.community.terrasoft.ru/forum/topic/9856).

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

Добрый день!

Помогите решить следующую задачку:

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

Возможно ли вообще такое реализовать?

Нравится

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

У нас было дерево максимум 3 уровней, решали созданием колонки ParentParentID ("Родитель родителя"), заполняемой на датасете при сохранении. И фильтровали ТreeArea по совпадению идентификатора родительской записи с полями ID, ParentID, ParentParentID.

Если данных в таблице сравнительно немного, можно не заполнять поле "Родитель родителя" при сохранении, а вытягивать в SQL-запросе, но это более ресурсоёмко и на больших объёмах тормозит.

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

Подчиненные выбираются юнионом. Когда включена галочка "Отображать вложенные" включается юнион, который выбирает данные в соответсвии со своими фильтрами.

Да, в "проектах" тоже используется фильтрация элементов по принадлежности к дереву. Там в конечном итоге используется фильтр like по полю Path, в котором в одной строке идут подряд все GUID-ы вышестоящих узлов дерева.

Для моего случая глубина дерева была ограничена, а два поля в этом случае работают быстрее поиска в стоке по одному.

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

Path не пойдет. Объясню суть проблемы: У меня задачи переделаны в древовидный грид. И, когда осуществляется переход к задаче через уведомление, видна только задача верхнего уровня. А хотелось бы увидеть еще и подчиненные. Нет у меня такой сущности, как Path :(

Если нет, надо добавить поле. И не забыть скопировать из "проектов" логику его заполнения.

Интересно, а насколько жизнеспособен вариант с внесением изменений в функцию FilterByID?

Добрый день!
Пример работы с function FilterByID () показан в статье http://www.community.terrasoft.ru/forum/topic/1179. Возможно это именно то, что Вам нужно ;)

Да, Павел, спасибо - именно по этому пути и пошел. Все получилось :) В SQL запрос добавил фильтр с двумя параметрами - ID и ParentID, затем в FilterByID создал пару пользовательских фильтров и подсунул им передаваемый ID записи.

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

Добрый день! Ситуация такая:
В древовидном реестре отображаются группы статей и статьи бюджета с названием, содержащим номер (1., 1.01., 1.01.01 и т.д.). Сортировка установлена по названию в запросе. Так вот в гриде сортируются по возрастанию либо корневые группы, либо все подчиненные (при нажатии на название колонки). Есть необходимость, чтобы все статьи и группы шли по возрастанию. В версии 3.4. такой проблемы не возникало!
Версия CRM 3.2.0.10
Буду признателен за помощь!

Нравится

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

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

Проверьте, в запросе-выборке данных сортировка по названию установлена для всех select'ов union all'a?

К сожалению у меня только 1 select, union не пользую...

Иван, Вам нужно переписать запрос добавив туда union, в котором будут выбираться подчиненные элементы (по аналогии с разделом "Проекты" - sq_Project), а в этом запросе добавить сортировку по названию.

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

Доброго времени суток!
Создан новый модуль, в котором основная грида древовидная. Хитрость гриды в том, что родительский элемент дерева - контрагент, а вот подчинненые - продукты из детали продуктов, модуля договоров, где контрагент указан как заказчик, т. е. в свернутом виде видим имена контрагентов, а при клике на плюсик, в той же колонке под контрагентом отображаются продукты из его договоров. Проблема заключается в том, что если пользователь кликает на названии колонки, то фильтруются не просто названия контрагентов, но и продуктов и как итог - рушится логика дерева - по алфавиту фильтруются и контрагенты и продукты. Каким образом можно исправить эту ситуацию? Возможен ли вариант фильтрации только родительских записей? Если такой вариант недостижим, то каким образом можно отключить этот стандартный функционал (может переунаследовать собитие)?

Нравится

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

Добрый день!

Сделать сортировку необходимым образом не получиться. Но отключить ее можно так же, как и в разделе "Проекты" - в функции dlDataOnDatasetBeforeOpen вызвать функцию:

function SetProjectDatasetSortOrder(Dataset, IsSorted) {
	var SelectQuery1 = Dataset.SelectQuery.Items(0);
	var SelectQuery2 = Dataset.SelectQuery.Items(1);
	SetProjectSelectQuerySortOrder(SelectQuery1, IsSorted);
	SetProjectSelectQuerySortOrder(SelectQuery2, IsSorted);
}

Более детально Вы можете посмотреть в реализации раздела "Проекты".

Спасибо, будем смотреть-разбираться

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

Задача состоит в следующем - создать новый модуль, в котором основной реестр будет древовидный. Есть ли примеры/документация по реализации подобного функционала?

Нравится

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

Проблемы нет.
Смотрим на раздел Проекты, и делаем по аналогии.
Окно следует унаследовать от wnd_BaseTreeArea, в самой таблице нужно иметь поля ID - ParentID, для построения дерева, так же в датасете необходимо задать свойство Parent Field, а в DataGrid'e установить свойства:
KeyDataFieldName = ID
ParentDataFiledName = ParentID
Далее у Вас возникнут проблемы с фильтрацией, данный вопрос я поднял тут
И печатью грида реестра, вопрос тут
И кстати, если вы захотите раскрасить реестр, вы столкнетесь с проблемой описанной тут

Сам раздел вы можете создать с помощью мастера создания нового раздела

Добрый день!
Спасибо, АльфаКрыса! За Ваши качественные, практичные ответы. :smile:

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

Добрый день!
Создал раздел в TreeArea.
Количество записей превышает 10 тыс.
Каким образом можно реализовать постраничный вывод, как в GridArea?

Нравится

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

Реализовано, начиная с версии 3.3.2.

Во-первых, нужно включить режим отложенной загрузки для реестра. Для включения режима отложенной загрузки дерева установите свойству Mode объекту grdData в окне реестра значение dtmLazy.

Также необходимо в датасете реестра указать свойство "Родительское поле" (обычно это ParentID; должно быть то же поле, которое указано в свойстве ParentDataFieldName объекта grdData в окне реестра).

Версия 3.3.2.47.
Олег, сделал все как вы описали в разделе "проекты". Ничего не изменилось. Запросы идут те же.

Олег, а есть возможность сделать для версии 3.3.0 ?

"Доленко Юрий" написал:Версия 3.3.2.47.
Олег, сделал все как вы описали в разделе "проекты". Ничего не изменилось. Запросы идут те же.

Юрий, попробуйте отключить фильтры раздела (по периоду, контакту). В системе есть ограничение: постраничность не включается для отфильтрованного набора данных. Кроме того, она происходит по записям первого уровня (то есть, для возможности перехода на вторую страницу, в реестре должно быть больше 40 независимых проектов).

"Ловас Олександр Миколайович" написал:Олег, а есть возможность сделать для версии 3.3.0 ?

Нет, данная возможность появилась только в версии 3.3.2.

Да, точно. top 40 .. where parentID is null, а потом догружает детей на развертывание списка...
Другой вопрос, что знаю крайне мало клиентов, которые пользуются TreeArea без включенных фильтров (если конкретно о Проектах, то таких наверное вообще нет :) ).
Планируется ли у вас реализация постраничной выгрузки с фильтрами? Можно ж выборку хранимой процедурой (или функцией) формировать, ну мол top 40 с фильтрами, а потом рекурсивными запросами родителей затянуть.

Да, Юрий, такая реализация планируется. В версии 3.3.2 это не реализовано из-за поддержки совместимости с MS SQL 2000, в котором нет рекурсивных запросов. Сейчас постраничная выгрузка дерева планируется в версии 3.4, а после тестирования, возможно, будут собраны новые бинарные файлы для версий 3.3.1 и 3.3.2, в которые войдёт данный функционал.

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

Добрый день! Подскажите пожалуйста возможно ли в качестве окна реестра для нового раздела использовать вместо greedArea TreeArea? Версия ТС 3.0.4.112
Т.к. попробовал (добавил поле ParentID, сделал для него соответствующий фильтр) но после заполнения карточки и нажатия на кнопку "ОК" выдает ошибку:

TSMSSQLEngineLibrary.MSSQLDataset: Object 'DataField ' is not assigned

ошибка возникает в функции скрипта scr_DB
function RefreshDataset(Dataset) {
        CheckAssigned(Dataset, 'Dataset');
        Dataset.Close();
        Dataset.Open(); // -- Вот тут ошибка вылетает
}

Притом сама запись сохраняется, это видно в таблице SQL. Затем после перезагрузки Terrasoft при попытке перейти на этот раздел снова вылазит ошибка
TSMSSQLEngineLibrary.MSSQLDataset: Object 'DataField ' is not assigned

пока не удалишь раннее созданную запись руками из MS SQL

Нравится

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

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

Для того, чтобы избежать возникшую у Вас ошибку можем Вам посоветовать проверить наличие присвоенных значений свойствам TreeArea. А именно, Вам необходимо открыть сервис окна грида wnd_xxxTreeArea, перейти на элемент грида grdData. В своствах grdData Вы найдете KeyDataFieldName и ParentDataFieldName. В том случае если у Вас создано поле, например ID, то свойству KeyDataFieldName необходимо присвоить значение ID, а свойству ParentDataFieldName присвоить значение ParentID.

Желаем удачи!

То что доктор прописал! Спасибо!

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