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

  • Автор темы soleil
  • Дата начала
S

soleil

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

alik86

Кнопка на виде
Код:
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 из документа.

Вроде когда-то где-то такое работало :)
 
S

soleil

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

Akupaka

Все работает хорошо, родителя документ меняет, только единственное он добавляет документ в начало, а хотелось бы в конец.
И второй вопрос остается открытым, как двигать документы одно уровня иерархии в представлении: выше/ниже?
оба вопроса в компетенции сортировки документов в представлении
 
A

alik86

Как вариант, добавьте в документ числовое поле, в которое вносите «номера по-порядку» (а менять их можно по-разному, от «ручками», до «кодом» :)), и в представление столбец с этим полем, по которому сделайте сортировку…
Как-то так.
 
S

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) Взять текст справа до определенного символа?
 
A

alik86

1) CInt ( ) и CStr()
2) Посмотри в хелпе всякого рода Right(), Left(), StrRight(), StrLeft() и им подобные и выбери то, что надо...

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

soleil

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

я делала так:
Код:
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 работает нормально, а если это ответный документ, то нет.
Как же все-таки взять ответный документ по заданному значению поля?
 
N

nvyush

soleil
Для этого лучше сделать отдельный служебный вид.
 
S

soleil

Сделала отдельный скрытый вид (nvy, служебный вид - это же просто обычный вид?)
Вид отбирает документы сделанные по двум формам, по главной и ответной. В виде одна отсортированная колонка, в ней отображается то или иное значение определенного поля, в зависимости от формы.
Снова пытаюсь отобрать документ по значению поля и, чтобы проверить берется или не берется документ, кладу его в папку и вывожу с помощью PickListCollection
Код:
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?
 
T

TIA

Если отдельный скрытый вид "Название вида" открыть (через Ctrl+Shift+View Goto), будут ли там отображены документы по форме ответного документа на первом уровне иерархии? Вид "Название вида" должен быть "плоским", т.е. без галки "Show response documents in hierarhy".
 
S

soleil

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

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]
Спасибо всем за помощь
 
Мы в соцсетях:

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