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

Тема в разделе "Lotus - Программирование", создана пользователем fedotxxl, 8 ноя 2007.

  1. fedotxxl

    fedotxxl Well-Known Member

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

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

    alb Well-Known Member

    Регистрация:
    13 июл 2005
    Сообщения:
    212
    Симпатии:
    0
    сам не пробовал но идея есть
    как сдвигать разделы.
    в представлении документы обычно определенным образом сортированы или выводится как были введены в базу.
    вот если их сортировать например по первому столбцу. а туда выводит информацию из какого либо поля.
    потом акшнами верх и вниз изменять значения этих полей(соотвественно если верх то местами поменять значение поле со значенем поля верхнего документа. так же и вниз) и обновить представления.
     
  3. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Вобщем-то так и делается... у каждого документа есть "сортировочный номер"... вся проблема в том, как правильно изменять этот номер?
     
  4. alb

    alb Well-Known Member

    Регистрация:
    13 июл 2005
    Сообщения:
    212
    Симпатии:
    0
    а ты пробовал чтоб поднять нижнего присвоить верхнему а номер верхнего нижнему

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

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Для: alb
    Представь, что у верхнего и нижнего куча ответных документов... номера ты изменил, а потом ответные документы сделал того же уровня, что и бывшие родительские... вот тут все начнет прыгать
     
  6. IsAvailable

    IsAvailable Гость

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

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

    alb Well-Known Member

    Регистрация:
    13 июл 2005
    Сообщения:
    212
    Симпатии:
    0
    ответные документы за своими родителями потянутся ведь
    сдвинуть надо главный документ
     
  8. IsAvailable

    IsAvailable Гость

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

    Sandr Гость

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

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

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


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

    Код (Text):
    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:
     
Загрузка...

Поделиться этой страницей