Вопрос По Работе Со Spofu Папкой.

Eugen

Well-Known Member
22.03.2012
177
0
#1
Всем добрый день.

Есть две базы, условно №1 и №2.
В базе №1 пользователь нажимает кнопку примерно с таким
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">кодом</div></div><div class="sp-body"><div class="sp-content">
Код:
Sub Click(Source As Button)
Dim s As New NotesSession
Dim w As New NotesUIWorkspace
Dim db As NotesDatabase
Dim uidb As NotesUIDatabase
Dim docColl As NotesDocumentCollection
Dim view As NotesView
Dim uiview As NotesUIView
Dim SRVName As String
Dim DBPath As String
Dim picklist As Variant
Dim messagelist As String

On Error Goto ErrH

SRVName = "Server"
DBPath = "Folder\test.nsf"

Set uidb = w.CurrentDatabase
Set db = s.GetDatabase (SRVName, DBPath, False)
Set docColl = db.Search({SELECT Form="formPermit"}, Nothing, 0)

Call docColl.PutAllInFolder("SPOFU", True) 'при первом запуске в этом месте матюкается и идет в ErrH.
Continue:
Print "продолжил"
Set view = db.GetView ("SPOFU")
Call view.Refresh
picklist = w.PickListStrings (PICKLIST_CUSTOM, True, SRVName, DBPath, "SPOFU", "Заголовок", "Сообщение", 1)
If Not (Isempty (picklist) ) Then
Forall plist In picklist
messagelist = messagelist & plist & Chr(10)
End Forall
End If

Msgbox messagelist 'выбранные варианты возвращаются в месседж временно,потом это будет в док класться.
Exit Sub

ErrH:
Print "пошел в ошибку"
ERRNUM = Cstr(Err)
If Cstr(Err) = "4291" Then
Print "Ошибка №"+ERRNUM+" появилась первый раз."
Call w.OpenDatabase (SRVName, DBPath, "SPOFU", , True, True)
Call w.CurrentDatabase.Close 'вот этот шаг почему то выполняется уже после закрытия дайлогбокса.
Call docColl.PutAllInFolder("SPOFU", True)		

Resume Continue
Else
Msgbox "Другая ошибка: №"+Cstr(Err)+" "+Error + ". Line "+Cstr(Erl)
Resume EndSub
End If

EndSub:
End Sub
Собственно вопрос: возможно ли как то передать содержимое коллекции в Spofu папку, если она еще ни разу не открывалась пользователем не играясь с открытием/закрытием в воркспейсе?
Почему Call w.CurrentDatabase.Close отрабатывает так поздно?
Т.е. в том виде что у меня есть сейчас происходит следующее: при первом запуске идет в ошибку в Errh, там открывается папка в базе №2, туда передается коллекция, база не закрывается, поверх нее открвается диалог, пользователь что-то выбирает и только после этого закрывается и диалог и база №2. В идеале пользователь вообще не должен видеть открытия второй базы.
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 224
24
#2
Почему Call w.CurrentDatabase.Close отрабатывает так поздно?
потому что вариант отработать сразу Call w.CurrentDatabase.Close(True) - заставляет лотус слетать, ну не доделали индусы ;)

возможно ли как то передать содержимое коллекции в Spofu папку
1) создать папку и наполнить
2) сохранить где нить ID нужный доков и потом использовать

В идеале пользователь вообще не должен видеть открытия второй базы.
не открывай базу и не открывай папку

папку и через DXML можно создать ;)
 

Eugen

Well-Known Member
22.03.2012
177
0
#3
1) создать папку и наполнить
2) сохранить где нить ID нужный доков и потом использовать


не открывай базу и не открывай папку

папку и через DXML можно создать ;)
Папку я в дизайнере создал, но наполнить я ее не могу, пока она персонально для пользователя не создастся.

Насчет DXL - как выгружать документы знаю, а вот как создавать элементы дизайна не в курсе...
 

savl

Well-Known Member
Lotus team
28.10.2011
2 126
163
#4
Call notesDatabase.EnableFolder( foldername$ )
Use the EnableFolder method to make sure a folder exists before calling the PutInFolder, PutAllInFolder, RemoveFromFolder, and RemoveAllFromFolder methods.



Добавлено: Если папки нет, то она создается автоматом. Правда как работает это с Spofu вопрос...
 

Eugen

Well-Known Member
22.03.2012
177
0
#5
Call notesDatabase.EnableFolder( foldername$ )
Use the EnableFolder method to make sure a folder exists before calling the PutInFolder, PutAllInFolder, RemoveFromFolder, and RemoveAllFromFolder methods.



Добавлено: Если папки нет, то она создается автоматом. Правда как работает это с Spofu вопрос...
Буквально 10 минут назад пробовал... не работает со spofu ;)
 

savl

Well-Known Member
Lotus team
28.10.2011
2 126
163
#6
Так... у нас тут в рабочей системе есть такая фича, от авторов "коробки":
Код:
Declare Function NEMGetCurrentSubprogramWindow Lib "nnotesws.dll" () As Long
Declare Function NEMStopSubprogramWindow Lib "nnotesws.dll" (Byval wHandle As Long) As Integer

Call uidb.OpenView( "StatByNum" ,"",True)
wHandle = NEMGetCurrentSubprogramWindow
Call NEMStopSubprogramWindow(wHandle)

Call uidb.OpenView( "StatByCtrl" , "",True)
wHandle = NEMGetCurrentSubprogramWindow
Call NEMStopSubprogramWindow(wHandle)

Call uidb.OpenView( "StatByExec","",True )
wHandle = NEMGetCurrentSubprogramWindow
Call NEMStopSubprogramWindow(wHandle)

Call uidb.OpenView( "StatByFolders","",True )
wHandle = NEMGetCurrentSubprogramWindow
Call NEMStopSubprogramWindow(wHandle)
Я так понял, что они открывают программно папки и тут же закрывают через Handle. Папки как раз spofu.
 

VladSh

начинающий
Lotus team
11.12.2009
1 248
2
#7
Почему Call w.CurrentDatabase.Close отрабатывает так поздно?
Потому что если закрываем текущий элемент, в котором находимся, то сначала выполняется весь код до конца, а только потом срабатывает закрытие. RTFM.

Буквально 10 минут назад пробовал... не работает со spofu ;)
И не будет. Тем на форуме, посвящённых этому, масса.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 483
360
#8
в чем задача такой "игры" с коллекцией?
 

erdi

Well-Known Member
20.08.2008
265
36
#9
Насчет DXL - как выгружать документы знаю, а вот как создавать элементы дизайна не в курсе...
- создаешь папку
- открываешь каким-нибудь пользователе - в результате создастся для этого пользователя папка
- заходишь в дизайнере в папку и экспортируешь в dxl
- потом программно берешь этот файл правишь имя пользователя на нужного
- сохраняешь
- экспортируешь в базу
все...папка для нового пользователя создана
 

alexas

Well-Known Member
10.06.2009
214
0
#10
Буквально 10 минут назад пробовал... не работает со spofu ;)
Работать со SPOFU можно ТОЛЬКО после показа ее в UI, обсуждалось не раз.
Для этого в любом месте (например, при открытии базы, фрейма, дока ...), но что-бы гарантированно выполнилось до кода, где используется SPOFU, собаками или LS или как savl написал (правда не кроссплатформенно это) - открыть и тут-же закрыть нужную папку (папки). Правда "моргнет" вкладка, если SPOFU много надо подготовить - не айс. Я в этом случае в стартовом фреймсете базы, в самом низу, рисую фрейм высотой 2 пикселя (1 - не годится) и в нем открываю (по умолчанию) сколько надо SPOFU. Они не видны, просто чуть толще нижний разделитель, юзер не догадывается, что там что-то есть.