• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Как правильно сделать сортировку документов в иерархическом виде?

  • Автор темы fedotxxl
  • Дата начала
F

fedotxxl

У меня есть иерархический вид - документы, ответные документы и т.д... Теперь представим, что для навигации используется не вид, а аутлайн... Мы можем перемещать разделы (вверх, вниз), можем изменять их уровень (делать ответными и т.д.)... Вот подобный функционал необходим для моего вида
Все довольно просто если эти задачи идут независимо (т.е. либо, либо)... Но как правильно сделать сортировку, когда мне необходим и функционал перемещения раздела вверх, вниз и изменения уровня раздела? (основная проблема, на мой взгляд, когда перемещается раздел с дочерними документами предположим на две позиции вверх, а потом дочерние документы переносятся на уровень влево (т.е. становятся на тот же уровень, что и бывшый родительский документ)

... Вот так... кто-нить понял, что я хочу?
 
A

alb

сам не пробовал но идея есть
как сдвигать разделы.
в представлении документы обычно определенным образом сортированы или выводится как были введены в базу.
вот если их сортировать например по первому столбцу. а туда выводит информацию из какого либо поля.
потом акшнами верх и вниз изменять значения этих полей(соотвественно если верх то местами поменять значение поле со значенем поля верхнего документа. так же и вниз) и обновить представления.
 
F

fedotxxl

Вобщем-то так и делается... у каждого документа есть "сортировочный номер"... вся проблема в том, как правильно изменять этот номер?
 
A

alb

а ты пробовал чтоб поднять нижнего присвоить верхнему а номер верхнего нижнему

или тебя интересует конкретно как изменить значения поля
 
F

fedotxxl

Для: alb
Представь, что у верхнего и нижнего куча ответных документов... номера ты изменил, а потом ответные документы сделал того же уровня, что и бывшие родительские... вот тут все начнет прыгать
 
I

IsAvailable

Честно говоря - не до конца въехал в суть вопроса, но предложение всё же выскажу:

а что если делать "сортировочный номер" с некоторым шагом... Например, 10-20-30-... Ну или 100-200-300-...
а уже сортировочные номера ответных документов пересчитывать относительно этого номера у "родителя"...
 
A

alb

ответные документы за своими родителями потянутся ведь
сдвинуть надо главный документ
 
I

IsAvailable

Что-то мне при такой реализации видится только вариант - поиграть с MakeResponse...
То есть, когда "родитель" уходит на другой уровень, то его "родительство" перекладывать на другой документ.
 
S

Sandr

Задача для лабораторной работы...

если отображение дочерних документов строится на | @AllDescentals то достаточно менять номера у ролительскиз документов - дочерние сами подтянутся... Если как то по другому, то примерно так:

Допустим, что нумерация для дочерних определяется так номер родителя.номер сына.номер внука и т.д через точки.
Тобишь двигая родительский документ, нам нужно во всех детках поменять первую циферку до первой точки.


Пишем небольшую рекурсивную функцию, которая бегает по коллекции дочерних документов и в каждом документе коллекции вызывает аму себя передавая туда документ коллекции. Кроме этого функция естесственно меняет нужную циферку...

Код:
Function changeNum(doc As notesdocument, num As Long, index As Long)
%REM
doc - долк, у которого мы меняем номер
num - номер, который хотим дать
index - номер в иерархии, вообще можно и без него, просто 0 вместо него использовать, но если вдруг понадобится менять номер не с главного дока, тогда он нужен...
%END REM
Dim col As notesdocumentCollection
Dim oldNum As Variant
Dim newNum As String
Dim response As notesdocument
If Not IsNull(InStr(doc.getItemValue("Num"), ".")) Then
oldNum = Split(doc.getItemValue("Num"), ".")
oldNum(index) = Cstr(num)
Else
oldNum = doc.getItemValue("Num")
End If
newNum = Join(oldNum, ".")
Set col = doc.responses
Set response = col.getFirstDocument
Call doc.ReplaceItemvalue("Num", newNum)
While Not response Is Nothing
Call changeNum(Response, num, index)
Wend
End Function

Могут быть синтаксические ошибки.. писал прямо тут... :huh:
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!