Дано:
- документ со всякими полями
- встроенная вьюшка
болезнь:
-получение списка доков во вьюшке
-обновление документа, после действий во вьюшке
костыли больному...
при старте дока, на PO делаем source.EditMode и source.Refresh, получаем (глобально для формы) unid
Симпотомы и последствия:
получить список из встроенной вьюшки можно через...
если не создать коллекцию, в либе (из кот. вызывается ф-ция) db.UnprocessedDocuments иcчезнет вместе с "окончанием" ф-ции
Хорошо, коллекцию обработали через кнопку (экшн во встроенной вьюшке), у нас есть текуший док: wks.CurrentDocument, который и является доком, в кот. встроена вьюшка. Нужно обновить поля из экшена!
Вот тут и будет засада - поля обновить можно, НО uidoc.Update вызывает малевича, ибо обновление сносит напрочь объект вcтроенной вьюшки и "все что было в коде" экшена, код для кнопки, кот. обновляет поле в основном доке, по результатам обработки выделенных доков в эмбеде
что можно предпринять?
Т.к. придется вызвать сохранение дока, то логично разместить код именно в нем (инмемори вариант невозможен в лоб)
но и там (мы же помним - код вызывается из встроенной вьюшке) низя вызвать uidoc.Update, как и вызвать uidoc.close:wks.EditDocument(true, doc)
потомучта опять - все объекты будут уничтожены (даже если doc получить из БД) и все что в форме, внутри события будет убито после close. Такова специфика вызова из встроенного объекта
Делаем доп. документ! В нем создаем поле с юнид текущего uidoc.Document.UniversalID, форма по вкусу
В форме нового дока может быть код, на QC (потому что открытым нам док не нужен) и вот там... мы запишем:
а PS основного дока
"от така х..ня маляты" unid - это я глобально для формы задал (в PO иницаализировал)
Получили матрешку, для обхода "ограничений"
все это я проверял на Release 9.0.1FP10 SHF252
- документ со всякими полями
- встроенная вьюшка
болезнь:
-получение списка доков во вьюшке
-обновление документа, после действий во вьюшке
костыли больному...
при старте дока, на PO делаем source.EditMode и source.Refresh, получаем (глобально для формы) unid
Симпотомы и последствия:
получить список из встроенной вьюшки можно через...
Код:
Function SelectedDocsEmbedded() As NotesDocumentCollection
On Error GoTo ErrH
GoTo Continue
ErrH:
Error Err, RaiseError
Continue:
Dim session As New NotesSession
Dim db As NotesDatabase
Dim col As NotesDocumentCollection
Dim doc As NotesDocument
Set db = session.CurrentDatabase
Dim NDC As NotesDocumentCollection
Set NDC= db.CreateDocumentCollection
Stop
'Print "Check Unprocrssed"
Set col=db.UnprocessedDocuments
Set doc = col.GetFirstDocument
'preserve docs collection (to avoid delete after db object desctruction)
While Not doc Is Nothing
Print doc.UniversalID
Call NDC.Adddocument(doc)
Set doc = col.GetNextDocument(doc)
Wend
'Print {selected docs count:} NDC.Count
Set SelectedDocsEmbedded=NDC
End Function
Хорошо, коллекцию обработали через кнопку (экшн во встроенной вьюшке), у нас есть текуший док: wks.CurrentDocument, который и является доком, в кот. встроена вьюшка. Нужно обновить поля из экшена!
Вот тут и будет засада - поля обновить можно, НО uidoc.Update вызывает малевича, ибо обновление сносит напрочь объект вcтроенной вьюшки и "все что было в коде" экшена, код для кнопки, кот. обновляет поле в основном доке, по результатам обработки выделенных доков в эмбеде
Код:
Sub Click(Source As Button)
On Error Goto ErrH
Goto Begin
ErrH:
Error Err, RaiseError
Begin:
Dim wks As New NotesUIWorkspace, uidoc As NotesUIDocument, lst
Set uidoc=wks.CurrentDocument
lst=SetDiscountsUI
If Not uidoc Is Nothing Then
If (Len(lst(0))>0 And uidoc.Document.GetItemValue({Form})(0)={dProfile}) Then
Dim doc As NotesDocument
Set doc=uidoc.Document
Call doc.Replaceitemvalue({unids}, Fulltrim(Arrayunique(Arrayappend(doc.Getitemvalue({unids}),Split(lst(0),{;})))))
uidoc.Save
End If
End If
End Sub
что можно предпринять?
Т.к. придется вызвать сохранение дока, то логично разместить код именно в нем (инмемори вариант невозможен в лоб)
но и там (мы же помним - код вызывается из встроенной вьюшке) низя вызвать uidoc.Update, как и вызвать uidoc.close:wks.EditDocument(true, doc)
потомучта опять - все объекты будут уничтожены (даже если doc получить из БД) и все что в форме, внутри события будет убито после close. Такова специфика вызова из встроенного объекта
Делаем доп. документ! В нем создаем поле с юнид текущего uidoc.Document.UniversalID, форма по вкусу
В форме нового дока может быть код, на QC (потому что открытым нам док не нужен) и вот там... мы запишем:
Код:
Sub Queryclose(Source As Notesuidocument, Continue As Variant)
Dim unid As String
unid=Source.Document.GetItemValue({unid2Open})(0)
Print {Unid to open:}unid
Dim wks As New NotesUIWorkspace, doc As NotesDocument
Set doc=wks.CurrentDatabase.Database.GetDocumentByUNID(unid)
Call wks.EditDocument(True,doc)
Continie=True
End Sub
Код:
Sub Postsave(Source As Notesuidocument)
On Error Goto ErrH
Goto Begin
ErrH:
Error Err, Raiseerror
Begin:
If source.EditMode Then
Dim doc As NotesDocument
Set doc=db.CreateDocument()
Call doc.ReplaceItemValue({unid2Open},unid)
Call doc.ReplaceItemValue({form},{Refresh})
Dim uidoc As NotesUIDocument
Set uidoc=wks.EditDocument(True, doc)
source.Close
uidoc.Close
Exit Sub
'source.Refresh
End If
End Sub
Получили матрешку, для обхода "ограничений"
все это я проверял на Release 9.0.1FP10 SHF252