Форум программистов, компьютерный форум, киберфорум
HCL Notes: Программирование
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.61/206: Рейтинг темы: голосов - 206, средняя оценка - 4.61
0 / 0 / 0
Регистрация: 06.12.2009
Сообщений: 60
1

Функция обхода документов-ответов, ответов на ответы и т.д.

13.12.2009, 10:57. Показов 37880. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вобщем нужна фунция, чтобы в одну коллекцию собирались все ответы, ответы их ответов и так далее.
Наверняка у кого-нибудь есть такая, поделитесь пожалста
Можно с рекурсией, можно без, неважно.

Сам писал такую два года назад как-то с двумя циклами, без рекурсии, а щас третий день не могу вспомнить...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.12.2009, 10:57
Ответы с готовыми решениями:

Тесты (несколько вариантов ответов, число правильных ответов, оценка)
Please, помогите написать тесты в QBasic чтоб было несколько вариантов ответов, еще чтоб в конце...

Выборка документов ответов
Столкнулся с такой проблемой...которую не могу никак решить... Существует родительский документ....

отслеживание сроков ответов документов
Добрый день! Подскажите пожалуйста, возможно ли в Базе сделать так чтобы при вводе документа...

Как суммировать кол-во ответов. Т.е. не чтобы выдавало все ответы ,а только их кол-во?
Как суммировать кол-во ответов. Т.е. не чтобы выдавало все ответы ,а только их кол-во? #include...

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
а потом для полученного ND_Parent вызываем TreeRDownC.
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
вообще, я не вижу из приведенного кода, когда возможен вариант, что будет попытка добавить документ в коллекцию повторно (кроме как вызов извне на документе из дерева), но, логически будет верным вызывать TreeRDownC только для документов, которые в коллекцию добавлены в момент выполнения, иначе мы разрешаем ситуацию, когда дерево документов может быть обработато повторно, хотя изменений в коллекции произведено не будет. нет?


достаточно ли проверок

Код
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
If IsDocAccessed(ND, True) Then
Call NDC_Rez.AddDocument(ND)
Call TreeRDownC(ND, NDC_Rez)
End If
Set ND = NDC.GetNextDocument(ND)
Функция IsDocAccessed может устанавливать ND в Nothyng. В этом случае не сработает NDC.GetNextDocument(ND).
1 / 1 / 0
Регистрация: 07.12.2009
Сообщений: 1,197
13.12.2009, 15:01 7
Цитата Сообщение от Akupaka
почему не обрабатываем вариант наличия документа в коллекции проверкой наличия, а попускаем?
Потому что проверка - это действие, на которое тратится время, а вероятность ошибки мала..



Цитата Сообщение от Akupaka
вообще, я не вижу из приведенного кода, когда возможен вариант, что будет попытка добавить документ в коллекцию повторно (кроме как вызов извне на документе из дерева), но, логически будет верным вызывать TreeRDownC только для документов, которые в коллекцию добавлены в момент выполнения, иначе мы разрешаем ситуацию, когда дерево документов может быть обработато повторно, хотя изменений в коллекции произведено не будет. нет?
Всё правильно заметили; есть ещё одна функция, которая работает по выделенным докам в виде (в неё передаётся коллекция) и собирает все деревья ответов, потому именно так.



Цитата Сообщение от Akupaka
достаточно ли проверок
...
или может нужно еще и проверить доступность по доступу
иначе можем получить в коллекции документ, с которым не получится работать.
Не можем, этих проверок достаточно. Проверки на массив айтемов - это наследие древних версий, когда нормально невозможно было проверить док. Массив полей появляется тогда, когда обе проверки проходят.



Цитата Сообщение от Akupaka
лишний On Error или фича?
On Error Goto 0
Exit Sub
Решил обнулить ошибку по человечески, т.к. Err=0 иногда всё равно выбивает, точно не помню, кажется в агентах на сервере.




Цитата Сообщение от TIA
Ещё косяк:
Функция IsDocAccessed может устанавливать ND в Nothyng. В этом случае не сработает NDC.GetNextDocument(ND).
Это точно!
Поставлю здесь параметр в False.
EDITED: Посмотрел почему параметр в True - я сначала писал такие функции на массивы, так вот перебор доков там идёт по GetNthDocument, видимо код скопировал, а над параметром не задумался. И как оно уже столько лет работает?.. прикольно)))
Спасибо! Вот вместе и довели до ума :O_0:
0
0 / 0 / 0
Регистрация: 04.10.2007
Сообщений: 2,977
13.12.2009, 15:17 8
Цитата Сообщение от VladSh
Массив полей появляется тогда, когда обе проверки проходят.
что имеется в виду под древними версиями? т.к. моя практика основывается на версиях 5-6, в 7-8 честно не проверял :O_0: и в них, если я не имею доступа к документу по РА-полям, но док каким-то образом получаю, то имею ситуацию, когда док валиден, не удален, но и итемсов нет О.о я только не помню как мы такие доки получали...

зы: буду рад переходу на "ты"
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
ND.IsValid And Not ND.IsDeleted
Будете смеяться?
Документ, к которому нет доступа:
Клиент - 7.0.3:
ND.IsValid = False IsEmpty(ND.Items) = True
Клиент - 8.5:
ND.IsValid = True IsEmpty(ND.Items) = True
сервер 7.0.3 - возможно, в этом причина?

Добавлено: документ берется по униду, код один и тот же, клиент и сервер - английские.
А чему равен ND.Size? В моих проверках при открытии недоступного документа по UNID doc.Size = 0, doc.GetItemValue("AnyItem") и doc.AnyItem ошибку не генерят, ND.IsValid = False, ND.IsDeleted = False. Клиент 8.0.2ru, сервер 8.0.2.
Мне кажется, проверка на 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.03.2010, 13:30
Помогаю со студенческими работами здесь

IEnumerator функция и бесконечный цикл ожидания ответов от сервера
Добрый день! Есть функция public IEnumerator StartSoket(string status, int connect_id, string...

проверка ответов
такое иррациональное уравнение решал через замену {x}^{2}+6x=t получил два квадратный уравнения...

then несколько ответов
Вот небольшой исходник: begin If Edit1.Text = '' Then MessageDlg('то то 1 !',mtError,,0); If...

Подсчет ответов
Народ что то не могу понять как обработать данные с radio button? Подскажите как сделать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru