0 / 0 / 0
Регистрация: 06.12.2009
Сообщений: 60
|
|
1 | |
Функция обхода документов-ответов, ответов на ответы и т.д.13.12.2009, 10:57. Показов 37880. Ответов 26
Метки нет (Все метки)
Вобщем нужна фунция, чтобы в одну коллекцию собирались все ответы, ответы их ответов и так далее.
Наверняка у кого-нибудь есть такая, поделитесь пожалста Можно с рекурсией, можно без, неважно. Сам писал такую два года назад как-то с двумя циклами, без рекурсии, а щас третий день не могу вспомнить...
0
|
13.12.2009, 10:57 | |
Ответы с готовыми решениями:
26
Тесты (несколько вариантов ответов, число правильных ответов, оценка) Выборка документов ответов отслеживание сроков ответов документов Как суммировать кол-во ответов. Т.е. не чтобы выдавало все ответы ,а только их кол-во? |
0 / 0 / 0
Регистрация: 15.05.2009
Сообщений: 1,454
|
|
13.12.2009, 11:33 | 2 |
в КБ есть обработка ответов:
там сбор юнидов, в принципе, на коллекцию переписать не сложно, имхо. Единственное - код я не проверяла. Добавлено: там рекурсия Добавлено: тут вот по вьюхе брали: Код
Sub getAllChildren(view As NotesView, doc As NotesDocument, coll As NotesDocumentCollection) рекурсия Dim childs As NotesDocumentCollection, child As NotesDocument Set childs = view.GetAllDocumentsByKey(doc.UniversalID, True) If childs.Count = 0 Then Exit Sub Set child = childs.GetFirstDocument While Not child Is Nothyng Call coll.AddDocument( child ) Call getAllChildren(view, child, coll) Set child = childs.GetNextDocument( child ) Wend End Sub
0
|
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
|
|
13.12.2009, 11:47 | 3 |
можно через нафигатор
0
|
1 / 1 / 0
Регистрация: 07.12.2009
Сообщений: 1,197
|
|
13.12.2009, 13:08 | 4 |
Мой старый код:
Код
%REM Sub TreeRDownC Description: Возвращает дерево ответов переданного документа %END REM Sub TreeRDownC(ND_Source As NotesDocument, NDC_Rez As NotesDocumentCollection) If ND_Source Is Nothyng Then Exit Sub Dim NDС As NotesDocumentCollection Dim ND As NotesDocument Set NDC = ND_Source.Responses If NDC.Count = 0 Then Exit Sub On Error 4469 Resume Next Set ND = NDC.GetFirstDocument Do If IsDocAccessed(ND, false) Then Обнаружил баг с параметром TIA Call NDC_Rez.AddDocument(ND) Call TreeRDownC(ND, NDC_Rez) End If Set ND = NDC.GetNextDocument(ND) If ND Is Nothyng Then Exit Do Loop End Sub Код
%REM Sub IsDocAccessed Description: Определяет, доступен ли документ %END REM Function IsDocAccessed(ND As NotesDocument, SetNothyng As Boolean) As Boolean If Not ND Is Nothyng Then If ND.IsValid And Not IsEmpty(ND.Items) And Not ND.IsDeleted Then Добавил проверку на Items, т.к. действительно бывают траблы; спасибо сообществу! IsDocAccessed = True Exit Function End If End If If SetNothyng Then Set ND = Nothyng End Function Код
%REM Sub GetTopDoc Description: Возвращает самый верхний документ коллекции Если у документа нет ответа, то ND_Parent будет равно Nothyng. %END REM Sub GetTopDoc(ND_Source As NotesDocument, ND_Parent As NotesDocument) Dim NDB As NotesDatabase Dim ND As NotesDocument Set NDB = ND_Source.ParentDatabase On Error 4091 Goto Err4091 Set ND_Parent = ND_Source Set ND = ND_Source Do If Cstr(ND.ParentDocumentUNID) = "" Then Exit Sub Set ND = NDB.GetDocumentByUNID(ND.ParentDocumentUNID) If Not ND Is Nothyng Then If Not ND_Parent Is ND Then Call IsDocAccessed(ND, True) Set ND_Parent = ND Else If ND_Parent Is ND_Source Then Set ND_Parent = Nothyng Exit Sub End If Else On Error Goto 0 Exit Sub End If Loop Exit Sub Err4091: Resume Next End Sub
0
|
0 / 0 / 0
Регистрация: 04.10.2007
Сообщений: 2,977
|
|
13.12.2009, 14:11 | 5 |
пару вопросов-предположений :O_0:
почему не обрабатываем вариант наличия документа в коллекции проверкой наличия, а попускаем? Код
Sub TreeRDownC... On Error 4469 Resume Next ... Call NDC_Rez.AddDocument(ND) Call TreeRDownC(ND, NDC_Rez) Код
On Error 4469 Resume Next ... if NDC_Rez.GetDocument(ND) is nothyng then Call NDC_Rez.AddDocument(ND) Call TreeRDownC(ND, NDC_Rez) end if достаточно ли проверок Код
Function IsDocAccessed... ND.IsValid And Not ND.IsDeleted Код
ND.IsValid And Not ND.IsDeleted And isArray(ND.Items) лишний On Error или фича? Код
Sub GetTopDoc... ... Else On Error Goto 0 Exit Sub End If
0
|
Tyo
|
|
13.12.2009, 14:33 | 6 |
Ещё косяк:
Сообщение от VladSh
|
1 / 1 / 0
Регистрация: 07.12.2009
Сообщений: 1,197
|
|
13.12.2009, 15:01 | 7 |
Сообщение от Akupaka
Сообщение от Akupaka
Сообщение от Akupaka
Сообщение от Akupaka
Сообщение от TIA
Поставлю здесь параметр в False. EDITED: Посмотрел почему параметр в True - я сначала писал такие функции на массивы, так вот перебор доков там идёт по GetNthDocument, видимо код скопировал, а над параметром не задумался. И как оно уже столько лет работает?.. прикольно))) Спасибо! Вот вместе и довели до ума :O_0:
0
|
0 / 0 / 0
Регистрация: 04.10.2007
Сообщений: 2,977
|
|
13.12.2009, 15:17 | 8 |
Сообщение от VladSh
зы: буду рад переходу на "ты"
0
|
1 / 1 / 0
Регистрация: 07.12.2009
Сообщений: 1,197
|
|
13.12.2009, 15:38 | 9 |
Akupaka
Ок, перейдём на "ты" Стартовал с 5.03.. Есть привычка разные спорные (для меня) моменты перепроверять с выходом новой версии (а вдруг поправили? ). В 6.5.1 уже хватало 2-х проверок. Функции написаны и работают - ни разу не удалось получить док, чтобы проверки прошли, но Items бы не было; хотя может быть просто потому, что не ТУДА ещё не вступал.. :O_0: Если вспомнится - напиши. Интересно, что это такое может быть..
0
|
0 / 0 / 0
Регистрация: 15.05.2009
Сообщений: 1,454
|
|
14.12.2009, 16:58 | 10 |
ND.IsValid And Not ND.IsDeleted
Сообщение от VladSh
Документ, к которому нет доступа: Клиент - 7.0.3: ND.IsValid = False IsEmpty(ND.Items) = True Клиент - 8.5: ND.IsValid = True IsEmpty(ND.Items) = True сервер 7.0.3 - возможно, в этом причина? Добавлено: документ берется по униду, код один и тот же, клиент и сервер - английские.
0
|
1 / 1 / 0
Регистрация: 07.12.2009
Сообщений: 1,197
|
|
14.12.2009, 17:42 | 11 |
OKEN, тут не до смеху...
Документ один и тот же??? Что говорит ND.IsDeleted?
0
|
0 / 0 / 0
Регистрация: 15.05.2009
Сообщений: 1,454
|
|
14.12.2009, 18:11 | 12 |
да не удален он, не удален. Админ (манагер) его получает без проблем. Валидным, неудаленным и с итемами.
0
|
0 / 0 / 0
Регистрация: 04.10.2007
Сообщений: 2,977
|
|
14.12.2009, 19:33 | 13 |
Сообщение от OKEN
это были проблемы у пользователей при работе со связанными документами, но когда к одному из них доступа нет, по какой-то причине, но унид был известен.
0
|
0 / 0 / 0
Регистрация: 15.05.2009
Сообщений: 1,454
|
|
14.12.2009, 19:41 | 14 |
Простую сделали форму: вводишь унид дока, и кнопочку, по которой коллега мне эту красоту и продемонстировал (в 2 клиентах под 2-мя id).
на досуге можешь глянуть корректность в 8.5.1. /*более "древняя" версия?*/ В общем, вставляйте все проверки "на вшивость"...
0
|
1 / 1 / 0
Регистрация: 07.12.2009
Сообщений: 1,197
|
|
03.02.2010, 16:25 | 15 |
Проверил лично, подтверждаю, всё что говорила выше OKEN! Раньше с этим не встречался, т.к. приложения были так спроектированы, что возникновение такой ситуации было исключено...
Откорректировал проверку в своей функции . Т.к. уже идёт по поводу какую проверку для этого лучше использовать , то я предлагаю IsEmpty, т.к. проверка указанием на пустоту по аналогии с Object Is Nothyng работает быстрее всего.
0
|
0 / 0 / 0
Регистрация: 19.04.2009
Сообщений: 2,219
|
|
11.02.2010, 10:50 | 16 |
Сообщение от OKEN
Мне кажется, проверка на IsDeleted избыточна. В справке сказано, что она отражает текущее состояние объекта doc, а IsValid - при создании объекта. Таким образом, если мы делаем проверку сразу после set doc = db.GetDocumentByUnid, достаточно тестировать IsValid (если справка не врёт). Для дополнительной проверки ошибочно валидного документа в ситуации, приведённой OKEN, я предлагаю использовать проверку на doc.Size > 0, она будет быстрее IsEmpty(ND.Items). Если, конечно, в этой кривой ситуации и Size не "кривой". OKEN, есть возможность проверить?
0
|
0 / 0 / 0
Регистрация: 15.05.2009
Сообщений: 1,454
|
|
11.02.2010, 10:55 | 17 |
у меня ща нет времени - запарка жуткая, после 25го. и 8ки нет.
0
|
0 / 0 / 0
Регистрация: 12.01.2009
Сообщений: 246
|
|
31.03.2010, 12:03 | 18 |
По обходу документов-ответов: вчера на одном доке моя рекрсивная функция зациклилась.
Оказалось что-когда создается конфликт при галочке merge conflicts документ становится своим же потомком. После этого решил сравнивать REF c UniversalID текущего дока
0
|
1 / 1 / 0
Регистрация: 07.12.2009
Сообщений: 1,197
|
|
31.03.2010, 13:04 | 19 |
nvy
Хорошее решение! Осталось только определить, сколько времени занимает отработка метода Size... Darker Если можно, поподробнее: - что за код зациклился? - где изменили проверку?
0
|
0 / 0 / 0
Регистрация: 04.11.2007
Сообщений: 3,019
|
|
31.03.2010, 13:30 | 20 |
часто у меня возникает ситуация когда один документ становится респонсом на другой, который на деле является 20м потомком этого поэтому пришлось в рекурсию еще и статистический счеткик ввести, чтобы рекурсия далья 255 колена обрывалась ;)
0
|
31.03.2010, 13:30 | |
31.03.2010, 13:30 | |
Помогаю со студенческими работами здесь
20
IEnumerator функция и бесконечный цикл ожидания ответов от сервера проверка ответов then несколько ответов Подсчет ответов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |