Добрый день.
Подскажите пожалуйста как реализовать поиск по деталям?
А именно как реализовать выполнение подобного запроса:
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. Перестают обновляться детали.
Нравится
Илья, опишите, пожалуйста, при каких действиях должна отрабатывать логика, т.к. может отличаться реализация (например, при активации детали либо при нажатии на кнопку и т.д)
Наталия. в последней итерации это выглядит так.
в реестре контрагентов добавлено тесктовое поле и кнопка по нажатию которой происходит поиск.
и ссответственно код:
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", "SearchNumber").ConsistsWith(Column.Const(Page.edtPhoneSearch.Value.ToString())) .Union(new Select(Page.UserConnection) .Column("Account","Id") .From("Account") .Join(JoinType.Inner, "Contact") .On("Account", "Id").IsEqual("Contact", "AccountId") .Join(JoinType.Inner, "ContactCommunication") .On("Contact", "Id").IsEqual("ContactCommunication", "ContactId") .Where("ContactCommunication", "SearchNumber").ConsistsWith(Column.Const(Page.edtPhoneSearch.Value.ToString())) as Select) 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); var i=0; while (selectExecute.Read()) { i++; var guidFromSelect = selectExecute[0].ToString(); phoneFilters.Add(structure.CreateFilterWithParameters(dataSource.Schema, FilterComparisonType.Equal, "Id", new Guid(guidFromSelect))); } Page.ThrowEvent("LoadRowsByFilter"); Page.TreeGrid.Clear(); if (i>0) { dataSource.CurrentStructure.Filters.Add(phoneFilters); dataSource.LoadRows(); Page.TreeGrid.RefreshData(); } return true;
сильно......поизучаю на досуге......thnx что поделились....
Итого. Последняя версия на текущий момент:
var dataSource = Page.DataSource; var structure = dataSource.CurrentStructure; Terrasoft.UI.WebControls.Controls.DataSourceFilterCollection filters = null; filters = dataSource.FindFiltersGroupByName("CustomFilters"); if (filters != null) { structure.Filters.Remove(filters); } var address = Page.edtAddressSearch.Value.ToString(); address = address.Trim(); var phone = Page.edtPhoneSearch.Value.ToString(); phone = phone.Trim(); var ret = false; if (address == String.Empty) { Page.ClearAddressSearch.Hide(); } else { Page.ClearAddressSearch.Show(); } if (phone == String.Empty) { Page.ClearPhoneSearch.Hide(); } else { Page.ClearPhoneSearch.Show(); } if ((address == String.Empty)&&(phone == String.Empty)) { return true; } string searchColumn = "Number"; var compareType = FilterComparisonType.NotEqual; var compareStringPhone = "Телефон"; var compareStringFax = "Факс"; var filterValues = new object[] { "0DA6A26B-D7BC-DF11-B00F-001D60E938C6", //Домашний телефон "3DDDB3CC-53EE-49C4-A71F-E9E257F59E49", //Рабочий телефон "D4A2DC80-30CA-DF11-9B2A-001D60E938C6", //Мобильный телефон "2B387201-67CC-DF11-9B2A-001D60E938C6", //Дополнительный телефон "6A3FB10C-67CC-DF11-9B2A-001D60E938C6", //Телефон "9A7AB41B-67CC-DF11-9B2A-001D60E938C6" //Факс }; if (Page.cbCommunication.Text == "Телефон") { compareType = FilterComparisonType.Equal; searchColumn = "SearchNumber"; StringBuilder sb = new StringBuilder(); foreach (var ch in phone) { if (Char.IsNumber(ch)) { sb.Append(ch); } } phone = sb.ToString(); } filters = structure.CreateFiltersGroup("CustomFilters", LogicalOperationStrict.And); if (!string.IsNullOrEmpty(address)) { var addressfilters = structure.CreateFiltersGroup("CustomAddressFilters", LogicalOperationStrict.Or); addressfilters.Add(structure.CreateFilterWithParameters(dataSource.Schema, FilterComparisonType.Contain, "[AccountAddressCLADR:Account].AddressString", address)); addressfilters.Add(structure.CreateFilterWithParameters(dataSource.Schema, FilterComparisonType.Contain, "[Contact:Account].[ContactAddressCLADR:Contact].AddressString", address)); filters.Add(addressfilters); } if (!string.IsNullOrEmpty(phone)) { var phonefilters = structure.CreateFiltersGroup("CustomPhoneFilters", LogicalOperationStrict.Or); var accountCommunicationtypefilters = structure.CreateFiltersGroup("ContactCommunicationTypeFilters", LogicalOperationStrict.And); accountCommunicationtypefilters.Add(structure.CreateFilterWithParameters(dataSource.Schema, FilterComparisonType.Contain, "[AccountCommunication:Account]." + searchColumn,//SearchNumber", phone)); accountCommunicationtypefilters.Add(structure.CreateFilterWithParameters(dataSource.Schema, compareType, "[AccountCommunication:Account].[CommunicationType:Id:CommunicationType].Id", filterValues)); phonefilters.Add(accountCommunicationtypefilters); var contactCommunicationtypefilters = structure.CreateFiltersGroup("ContactCommunicationTypeFilters", LogicalOperationStrict.And); contactCommunicationtypefilters.Add(structure.CreateFilterWithParameters(dataSource.Schema, FilterComparisonType.Contain, "[Contact:Account].[ContactCommunication:Contact]." + searchColumn,//SearchNumber", phone)); contactCommunicationtypefilters.Add(structure.CreateFilterWithParameters(dataSource.Schema, compareType, "[Contact:Account].[ContactCommunication:Contact].[CommunicationType:Id:CommunicationType].Id", filterValues)); phonefilters.Add(contactCommunicationtypefilters); filters.Add(phonefilters); } Page.TreeGrid.Clear(); if (filters.Count > 0) { structure.Filters.Add(filters); dataSource.LoadRows(); Page.TreeGrid.RefreshData(); } return true;