0 / 0 / 0
Регистрация: 17.10.2008
Сообщений: 506
|
|
1 | |
Выборка неповторяющихся по определённым полям документов17.06.2010, 09:04. Показов 24694. Ответов 15
Метки нет (Все метки)
Уважаемые программисты, помогите придумать алгоритм для решения следущуей задачи или подскажите с помощью чего ее можно решить.
1. есть коллекция документов. 2. документы созданы по форме, на которой 2 текстовый поля: название организации и этап работы с этой организацией. из коллекции необходимо убрать документы в который содержание полей одинаково, напрмер есть коллекция: (1) поле1=орг1, поле2=этап1 (2) поле1=орг3, поле2=этап2 (3) поле1=орг2, поле2=этап6 (4) поле1=орг3, поле2=этап2 (5) поле1=орг1, поле2=этап1 (6) поле1=орг5, поле2=этап3 на выходе должна быть коллекция вида: (1) поле1=орг1, поле2=этап1 (2) поле1=орг3, поле2=этап2 (3) поле1=орг2, поле2=этап6 (4) поле1=орг5, поле2=этап3
0
|
17.06.2010, 09:04 | |
Ответы с готовыми решениями:
15
Выборка 5 неповторяющихся значений по критерию Выборка неповторяющихся данных из нескольких таблиц Разграничение доступа к определенным полям в справочнике Поиск документов во View по полям |
0 / 0 / 0
Регистрация: 19.04.2009
Сообщений: 2,219
|
|
17.06.2010, 09:19 | 2 |
dymat
Можно создать скрытое представление с двумя сортированными столбцами, соответствующими нужным полям, и установить галку Generate unique keys in index (5-я закладка). Только нужно в формуле отбора отсечь конфликтные документы (SELECT Form = "MyForm" & !@IsAvailable($Conflict) ). Другой вариант — создать категоризованное представление, где в качестве имени категории объединять значения нужных полей. В цикле перебирать Entry только категорий (см. Set notesViewNavigator = notesView.CreateViewNav; Set notesViewEntry = notesViewNavigator.GetNextSibling( entry ))
0
|
0 / 0 / 0
Регистрация: 16.07.2007
Сообщений: 849
|
|
17.06.2010, 09:58 | 3 |
Какая конечная цель данной коллекции? Что с ней делаться должно? Примерное кол-во документов в коллекции?
0
|
0 / 0 / 0
Регистрация: 17.10.2008
Сообщений: 506
|
|
17.06.2010, 10:04 | 4 |
Сообщение от kizarek
0
|
0 / 0 / 0
Регистрация: 16.07.2007
Сообщений: 849
|
|
17.06.2010, 10:09 | 5 |
Если не принципиально какой из документов оставлять то можно так:
Код
Dim s As New NotesSession Dim coll As NotesDocumentCollection, doc As NotesDocument Dim ListDocumentID List As String, TAG As String Set doc = coll.GetFirstDocument While Not doc Is Nothyng TAG = doc.GetItemValue("ПОЛЕ1")(0)+"~~"+doc.GetItemValue("ПОЛЕ2")(0) ListDocumentID(TAG) = doc.UniversalID Set doc = coll.GetNextDocument(coll) Wend ListDocumentID - Тут уже документы с уникальными значениями из TAG Forall ID In ListDocumentID Set doc = s.CurrentDatabase.GetDocumentByUNID(ID) Тут необходимые действия с документами End Forall
0
|
0 / 0 / 0
Регистрация: 19.04.2009
Сообщений: 2,219
|
|
17.06.2010, 10:12 | 6 |
Сообщение от kizarek
0
|
0 / 0 / 0
Регистрация: 12.01.2009
Сообщений: 246
|
||||||
17.06.2010, 10:17 | 7 | |||||
Лучше сразу из коллекции удалять
0
|
0 / 0 / 0
Регистрация: 16.07.2007
Сообщений: 849
|
|
17.06.2010, 10:18 | 8 |
Сообщение от nvy
50 документов будут даже на самой дряхлой машине получаться очень быстро, а обрабатываться почти моментом. Добавлено:
Сообщение от Darker
0
|
0 / 0 / 0
Регистрация: 13.06.2010
Сообщений: 47
|
|
17.06.2010, 11:02 | 9 |
Очень понравился вариант Darker . Вот сразу в голову не пришло отсекать лишнее, а не выбирать нужное.
P.S. Часто в отчетах бывает нужно количество документов с одинаковыми тэгами. Удобно подсчитывать его в элементах списка. В варианте с категоризированым представлением это тоже легко решается, а с видом с уникальным ключем, наверное нет.
0
|
0 / 0 / 0
Регистрация: 17.10.2008
Сообщений: 506
|
|
17.06.2010, 11:25 | 10 |
Всем спасибо. проблема решена:whoareyou?:
0
|
1 / 1 / 0
Регистрация: 07.12.2009
Сообщений: 1,197
|
|
17.06.2010, 12:43 | 11 |
Эта дуристика с "удалением" не нужна вовсе.
Если пользовать класс notesDocumentCollection, то дубликаты там невозможны по определению. Для теста попробуйте метод AddDocument, при добавлении уже существующего документа поймаете ошибку 4469.
0
|
0 / 0 / 0
Регистрация: 15.03.2009
Сообщений: 615
|
|
17.06.2010, 12:47 | 12 |
Сообщение от VladSh
0
|
0 / 0 / 0
Регистрация: 12.01.2009
Сообщений: 246
|
|
17.06.2010, 12:58 | 13 |
VladSh, вопрос относительный.
К примеру есть мешок картошки, в котором нужно убрать гнилые. Есть два метода: 1) Взять дополнительный пустой мешок, сшитый кустарным способом (в силу отсутствия стандартного метода получения нового пустого), и перекладывать туда не гнилые картофели 2) Сразу взять мусорку и бросать туда гнилые, и останется у нас мешок нормальных Если у нас гнилых больше чем нормальных, то первый способ предпочтительней, в противном случае - второй ошибку 4469, поймать невозможно, так как документы берутся из коллекции
0
|
1 / 1 / 0
Регистрация: 07.12.2009
Сообщений: 1,197
|
|
17.06.2010, 14:56 | 14 |
Darker
Вариант 3-й и правильный (с точки зрения платформы) - получить коллекцию без гнилой картошки либо осуществить проход чисто по нормальной картошке для этого платформа предлагает кучу стандартных методов: 1). Отстройка видов: а). Получение коллекций: - GetAllDocumentsByKey - GetAllEntriesByKey б). "Онлайн" проход с помощью NotesViewNavigatorа. 2). Формирование строки запроса "на лету" и поиск - это notesDatabase.Search. Иногда бывают случаи, когда все отобранные документы нужны, но по различным условиям данные из них вытягиваются или запихиваются разные, а некоторые - общие, т.е. времени на проверку уйдёт гораздо меньше, чем 2 разных поиска и 2 разных перебора. Но таких случаев очень немного; в большинстве же подобные решения - это неправильное использование платформы.
0
|
0 / 0 / 0
Регистрация: 12.01.2009
Сообщений: 246
|
|
17.06.2010, 15:25 | 15 |
VladSh, так задача тривиальная
По мне, получение документов для разовой задачи, с использованием вида - накладно, создание индексов, и т.д., случаются случаи слета индексов.
0
|
1 / 1 / 0
Регистрация: 07.12.2009
Сообщений: 1,197
|
|
17.06.2010, 19:43 | 16 |
Darker
Чтобы индексы видов слетели это надо постараться. Слоган: "Берёшь вьюху - сделай ей Refresh!", никогда не подводило. При правильном проектировании приложений, вьюхи, по которым ищешь, не содержат большого количества документов, и доки в них не накапливаются. А бывают случаи, когда и для одного убойного отчёта лучше отстроить вьюху... notesDatabase.Search, и никаких тебе индексов.
0
|
17.06.2010, 19:43 | |
17.06.2010, 19:43 | |
Помогаю со студенческими работами здесь
16
Реализовать привязку TextBox-ов к определенным полям в таблице БД Объединить в запросе по определенным полям в одной таблице Как в цикле обратиться к определенным полям в отчете? Отсортировать в списке данные о людях по определённым полям Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |