Добрый день.
Подскажите пожалуйста как реализовать поиск по деталям?
А именно как реализовать выполнение подобного запроса:
acc.Id FROM [dbo].[Account] acc, [dbo].[AccountCommunication] comm
WHERE
comm.AccountId = acc.Id AND
comm.Number LIKE '%123456%'
GROUP BY(acc.id)
чтобы в реестре вывелись записи по заданному условию?
Сейчас сделал так:
Select selectPhone = new Select(Page.UserConnection).Top(15)
.Column("Account","Id")
.From("Account")
.Join(JoinType.Inner, "AccountCommunication")
.On("Account", "Id").IsEqual("AccountCommunication", "AccountId")
.Where("AccountCommunication", "Number").ConsistsWith(Column.Const(Page.PhoneSearchEdit.Value.ToString()))
as Select;
var selectExecute = selectPhone.ExecuteReader(Page.UserConnection.EnsureDBConnection());
Page.TreeGrid.Clear();
while (selectExecute.Read())
{
Page.DataSource.LoadRow(new Guid(selectExecute[0].ToString()));
}
Page.ThrowEvent("LoadRowsByFilter");
return true;
но мне кажется что так не верно.
Возникает две ошибки:
1. Без ограничения количества записей в селекте, возникает ошибка. Очень много вызовов DataSource.Load
2. Перестают обновляться детали.
Нравится
Здравствуйте, Илья!
Такая возможность заложена в базовую функциональность системы: можно вывести значения при помощи агрегирующего фильтра в блоке фильтрации:
1. Наведите мышью справа от ссылки "Добавить условие" и дождитесь появления маркера. Выберите Агрегирующий фильтр:

2. В списке выберите Средства связи Контрагента:
3. Выберите вариант Существует:
4. Укажите дополнительные фильтры, например, номер:

Можно выбирать различные условия, а также гибко фильтровать по периоду при необходимости, сравнивать с текущим пользователем и т.д. Подробнее об агрегирующих фильтрах - в документациию
Анна, спасибо за ответ. Но к сожалению встроенной функциональности не хватает.
Приведенный запрос это лишь первый и самый легкий.
В настоящий момент сделал так :
[csharp]
var dataSource = Page.DataSource;
var structure = dataSource.CurrentStructure;
Select selectPhone = new Select(Page.UserConnection)
.Column("Account","Id")
.From("Account")
.Join(JoinType.Inner, "AccountCommunication")
.On("Account", "Id").IsEqual("AccountCommunication", "AccountId")
.Where("AccountCommunication", "Number").ConsistsWith(Column.Const(Page.PhoneSearchEdit.Value.ToString()))
as Select;
var selectExecute = selectPhone.ExecuteReader(Page.UserConnection.EnsureDBConnection());
var phoneFiltersName = "phoneFilters";
var phoneFilters = dataSource.FindFiltersGroupByName(phoneFiltersName);
if (phoneFilters != null) {
structure.Filters.Remove(phoneFilters);
}
phoneFilters = structure.CreateFiltersGroup(phoneFiltersName, LogicalOperationStrict.Or);
while (selectExecute.Read())
{
phoneFilters.Add(structure.CreateFilterWithParameters(dataSource.Schema, FilterComparisonType.Equal, "Id", new Guid(selectExecute[0].ToString())));
}
Page.ThrowEvent("LoadRowsByFilter");
Page.TreeGrid.Clear();
dataSource.CurrentStructure.Filters.Add(phoneFilters);
dataSource.LoadRows();
return true;
[/csharp]
Но к сожалению осталась одна проблема, при изменении выделенной записи не происходит обновление раздела детали.
Здравствуйте, Константин.
Попробуйте в конце скрипта добавить
[csharp]
Page.TreeGrid.RefreshData();
[/csharp]
Проблема получила продолжение, при выполнение SQL запроса полученного из
[csharp]
Select selectPhone = new Select(Page.UserConnection)
.Column("Account","Id")
.From("Account")
.Join(JoinType.Inner, "AccountCommunication")
.On("Account", "Id").IsEqual("AccountCommunication", "AccountId")
.Join(JoinType.Inner, "Contact")
.On("Account", "Id").IsEqual("Contact", "AccountId")
.Join(JoinType.Inner, "ContactCommunication")
.On("Contact", "Id").IsEqual("ContactCommunication", "ContactId")
.Where("ContactCommunication", "Number").ConsistsWith(Column.Const(Page.PhoneSearchEdit.Value.ToString()))
as Select;
[/csharp]
[sql]
SELECT
[Account].[Id]
FROM
[dbo].[Account]
INNER JOIN [dbo].[AccountCommunication] ON ([Account].[Id] = [AccountCommunication].[AccountId])
INNER JOIN [dbo].[Contact] ON ([Account].[Id] = [Contact].[AccountId])
INNER JOIN [dbo].[ContactCommunication] ON ([Contact].[Id] = [ContactCommunication].[ContactId])
WHERE
[ContactCommunication].[Number] LIKE N'%' + N'456' + N'%'
[/sql]
напрямую из базы, получаем 2530 записей (при Group by около 700)
но если выполнить это же в коде
[csharp]
var selectExecute = selectPhone.ExecuteReader(Page.UserConnection.EnsureDBConnection());
[/csharp]
получаем 3 (три) одинаковых записи.
Вопрос: в чем может быть проблема?
Вопрос 2: раздел Контрагенты. создаю новую страницу реестра контрагентов 2, основанную на реестре контрагентов. добавляю новую вкладку и вставляю ее туда. Опубликовываю. При переходе на эту вкладку2 панель детали перестают обновляться при переходе по контрагентам.
Здравствуйте, Илья!
покажите, пожалуйста, скриншот настроек детали в рабочих местах.
Здравствуйте, Илья!
Ответ на Ваш вопрос был дан тут: http://www.community.terrasoft.ru/forum/topic/9530#comment-40492
От себя могу добавить, что детали формируются в скрипте InitializeDetails и вычитываются из базы данных.
Для того. чтобы заработала Ваша деталь в обход этой процедуры, следует зарегистрировать ее в таблице SysModuleDetail,которая напрямую связана с Рабочими местами.