Порядок документов в представлении

Тема в разделе "Lotus - Программирование", создана пользователем soleil, 22 фев 2010.

  1. soleil

    soleil Гость

    В представлении отображается документы, созданные по форме Document, и все их ответы, созданные по форме Response to response.
    Хотелось бы иметь возможность перемещать документы в представлении.
    Например создать Action, который бы передвигал документ вверх/вниз или на уровень выше/ниже(поменять родителя).
    Возможно ли изменить порядок отображения документов в представлении?
     
  2. alik86

    alik86 Lotus team
    Lotus team

    Регистрация:
    20 ноя 2008
    Сообщения:
    465
    Симпатии:
    0
    Кнопка на виде
    Код (Text):
    Sub Click(Source As Button)
    Dim Session As New NotesSession
    Dim Wsp As New NotesUIWorkspace
    Dim Db As NotesDatabase
    Dim View As NotesView
    Dim Doc, DocPar As NotesDocument
    Dim DocColl As NotesDocumentCollection

    Set Db = Session.CurrentDatabase
    Set Doc = Db.UnprocessedDocuments.GetFirstDocument()
    Set View = Wsp.CurrentView.View
    Set DocColl = Wsp.PickListCollection( PICKLIST_CUSTOM, False, Db.Server(), Db.FilePath(), view.Name, "", "")
    Set DocPar = DocColl.GetFirstDocument()
    Call Doc.MakeResponse(DocPar)  
    Call Doc.save( True, True, True)   
    End Sub
    Подчиняет документ Doc документу DocPar.

    Чтобы убрать подчинение – удаляешь поле $Ref из документа.

    Вроде когда-то где-то такое работало :)
     
  3. soleil

    soleil Гость

    alik86, спасибо! Как появится у меня 10 сообщений поставлю плюс.
    Все работает хорошо, родителя документ меняет, только единственное он добавляет документ в начало, а хотелось бы в конец.
    И второй вопрос остается открытым, как двигать документы одно уровня иерархии в представлении: выше/ниже?
     
  4. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    оба вопроса в компетенции сортировки документов в представлении
     
  5. soleil

    soleil Гость

    Akupaka, не могли бы Вы поподробнее объяснить как это сделать?
     
  6. alik86

    alik86 Lotus team
    Lotus team

    Регистрация:
    20 ноя 2008
    Сообщения:
    465
    Симпатии:
    0
    Как вариант, добавьте в документ числовое поле, в которое вносите «номера по-порядку» (а менять их можно по-разному, от «ручками», до «кодом» :)), и в представление столбец с этим полем, по которому сделайте сортировку…
    Как-то так.
     
  7. soleil

    soleil Гость

    Вот если, допустим, завести не числовое, а текстовое поле, потому что необходимо не просто иметь порядковый номер документа, а номер документа в иерархии:
    1
    -1.1
    --1.1.1
    --1.1.2
    -1.2
    2
    -2.1
    ....
    Возьмем, например, документ с номером 1.1.2 и будем двигать его вверх:

    1)Возьмем из поля номера документа текст до точки справа (2)
    2)Переведем его в число и уменьшим его на единицу (1)
    3)Возьмем текст до последней точки слева (1.1.)
    4)Склеим его с числом полученным вычитанием единицы (1.1.1)
    5)Запишем в поле и сохраним документ
    Аналогично увеличим предыдущий документ (1.1.1 до 1.1.2)
    Получится, что поменяем местами два документа.

    Только у меня возникло два вопроса о том, как на LotusScript:
    1) Перевести текст в число и обратно?
    2) Взять текст справа до определенного символа?
     
  8. alik86

    alik86 Lotus team
    Lotus team

    Регистрация:
    20 ноя 2008
    Сообщения:
    465
    Симпатии:
    0
    1) CInt ( ) и CStr()
    2) Посмотри в хелпе всякого рода Right(), Left(), StrRight(), StrLeft() и им подобные и выбери то, что надо...

    А вообще можно не запариваться, а таки ввести числовое поле и просто указывать номер, т.к. подчиненные документы все равно будут отображаться под родительским и сортироваться в лишь своей «нише» (в представлении не забудьте поставить галку «Show response documents in a hierarchy»).
    Т.е. получится:
    1
    -1
    -2
    --1
    --2
    -3
    2
    -1
    -2
     
  9. soleil

    soleil Гость

    спасибо. только сейчас заметила дополнение сообщения. попробую с числами.
    только у меня по ходу дела возник вопрос:
    как в виде взять документ по значению поля?

    я делала так:
    Код (Text):
    Dim Session as New NotesSession
    Dim DB as NotesDatabase
    Dim doc as NotesDocument
    Dim View as NotesView

    Set DB = Session.CurrentDatabase
    Set View = DB.GetView("Название вида")
    Set Doc = View.GetDocumentByKey("1", False)
    "1" - значение в первой колонке вида (колонка отсортирована)

    Дело в том, что у меня в виде "Название вида" отображаются иерархия документов (созданных по форме Document) и все ответные документы (созданные по форме Response to Response).
    Так вот, если это документ, созданный по форме Document, то GetDocumentByKey работает нормально, а если это ответный документ, то нет.
    Как же все-таки взять ответный документ по заданному значению поля?
     
  10. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    soleil
    Для этого лучше сделать отдельный служебный вид.
     
  11. soleil

    soleil Гость

    Сделала отдельный скрытый вид (nvy, служебный вид - это же просто обычный вид?)
    Вид отбирает документы сделанные по двум формам, по главной и ответной. В виде одна отсортированная колонка, в ней отображается то или иное значение определенного поля, в зависимости от формы.
    Снова пытаюсь отобрать документ по значению поля и, чтобы проверить берется или не берется документ, кладу его в папку и вывожу с помощью PickListCollection
    Код (Text):
    Dim Session as New NotesSession
    Dim WS as New NotesUIWorkspace
    Dim DB as NotesDatabase
    Dim Doc as NotesDocument
    Dim View as NotesView
    Dim Collection as NotesDocumentCollection
    Dim VC as NotesViewEnryCollection

    Set DB = Session.CurrentDatabase
    Set View = DB.GetView("Название вида")
    Set Doc = View.GetDocumentByKey("1", False)
    Set VC = View.AllEntries
    Call VC.RemoveAllFromFolder("Имя папки")
    Call Doc.PutInFolder("Имя папки")
    Set Collection = WS.PickListCollection (PICKLIST_CUSTOM, True, DB.Server, DB.FilePath, "Имя папки", "","")
    Так вот, проблема осталась та же:если документ главный, то он благополучно помещается в папку
    и все ок, а вот если ответный, то он не берется. Выдает ошибку "Object variable not set"

    Казалось бы простая задача: взять документ из вида с заданным значением в поле. Может есть другие способы кроме GetDocumentByKey?
     
  12. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    Если отдельный скрытый вид "Название вида" открыть (через Ctrl+Shift+View Goto), будут ли там отображены документы по форме ответного документа на первом уровне иерархии? Вид "Название вида" должен быть "плоским", т.е. без галки "Show response documents in hierarhy".
     
  13. soleil

    soleil Гость

    TIA, ага, проблема как раз и была в галке "Show response documents in hierarhy". Спасибо.
     
  14. soleil

    soleil Гость

    Сделала наконец-то перемещение документов в представлении.
    Я завела числовое поле, в котором прописывается номер документа.
    В виде отсортировала по этому полю. Затем на кнопке прописала код:

    [codebox]Sub Click(Source As Button)
    Dim Session As New NotesSession
    Dim WS As New NotesUIWorkspace
    Dim DB As NotesDatabase
    Dim Doc, Doc_Current, Doc_Previous, Doc_Parent As NotesDocument
    Dim View As NotesView
    Dim UIView As NotesUIView
    Dim VC As NotesViewEntryCollection
    Dim Collection As NotesDocumentCollection

    Set DB = Session.CurrentDatabase
    Set Doc_Current = DB.UnprocessedDocuments.GetFirstDocument()
    Set View = WS.CurrentView.View
    Set Doc_Parent = View.GetParentDocument(Doc_Current)
    Set Collection = Doc_Parent.Responses
    N = Collection.Count
    If Doc_Current.Task_Number(0)=1 Then
    If N = 1 Then
    Messagebox "Задача """ + Doc_Parent.Task_Name(0) + """ имеет единственную подзадачу """ _
    + Doc_Current.Task_Name(0) + """" _
    + ". Если Вы хотите переместить данную подзадачу на другой уровень иерархии воспользуйтесь кнопкой ""Переместить задачу""." ,, "Невозможно переместить подзадачу"
    Else
    Set View = DB.GetView ( "Folder" )
    Set VC= View.AllEntries
    Call VC.RemoveAllFromFolder("Folder")
    Call Collection.PutAllInFolder("Folder")
    Set Doc = View.GetFirstDocument
    Call Doc.ReplaceItemValue("Task_Number",0)
    Call Doc.Save(True, True, True)
    For i = 1 To N-1
    Set Doc = View.GetNextSibling(Doc)
    Call Doc.ReplaceItemValue("Task_Number", Doc.Task_Number(0)-1)
    Call Doc.Save(True, True, True)
    Next
    Set Doc = View.GetFirstDocument
    Call Doc.ReplaceItemValue("Task_Number",N)
    Call Doc.Save(True, True, True)
    Set UIView = WS.CurrentView
    Call WS.ViewRefresh
    Call UIView.SelectDocument(Doc_Current)
    End If
    Else
    Set View = WS.CurrentView.View
    Set Doc_Parent = View.GetParentDocument(Doc_Current)
    Set Doc_Previous = View.GetPrevSibling(Doc_Current)
    Call Doc_Previous.ReplaceItemValue("Task_Number", Doc_Current.Task_Number(0))
    Call Doc_Previous.Save(True, True, True)
    Call Doc_Current.ReplaceItemValue("Task_Number", Doc_Current.Task_Number(0)-1)
    Call Doc_Current.Save(True,True,True)
    Set UIView = WS.CurrentView
    Call WS.ViewRefresh
    Call UIView.SelectDocument(Doc_Current)
    End If
    Set View = DB.GetView("Иерархия")
    Call View.Refresh
    End Sub[/codebox]
    Спасибо всем за помощь
     
Загрузка...

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