Модификация документа через Action

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

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
Refresh в кнопке. Наверное, можно вынести.
С PostOpen тоже работает.

С PostOpen не работает. :)

Наверное потому, что событие PostOpen уже произошло. :)
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
Я апдейтнул. С постопеном не может чисто логически работать. :)
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
Перенес в новую базу. Не работает. :)
Разобрался почему. В событии(в нашем случае в PostSave) в открываемом документе должно быть хоть-что нибудь. Например, декларация переменной. :ph34r:

Хотя, теперь и с пустыми работает. Странно всё.
 
A

Akupaka

Хотя, теперь и с пустыми работает. Странно всё
аааа! вспомнил!
там фигня такая, что лотус генерит спец код, который мы не видим, но он есть в итемах, можешь глянуть :ph34r:
короче, он Bind'ит объекту обработчик, и если в дизайнере не написать ниче, то не Bind'ит.
если не Bind'ит, то заменить его тоже нельзя!
я в таких случаях комментировал одну строку.

ты написал строку, потом потер, но там остался символ, который заставляет лотус генерить код, попробуй выделить все (sub ... end sub) и удалить, тогда перестанет работать

СПАСИБО! :)

зы: вот такую штуку он генерит и запускает где-то там...
Код:
Private Sub BindEvents(Byval Objectname_ As String)
Static Source As NOTESUIDOCUMENT
Set Source = Bind(Objectname_)
On Event Postsave From Source Call Postsave
End Sub
 
A

Akupaka

phantom76, ты сделай как тебе дядьки советуют - понравится :ph34r:

по кнопке нужно переиначить обработчик открываемого документа на свой. в форме открываемого документа, в PostSave комментируешь одну пустую строку.

Код:
(Declarations)
Dim uidoc As NotesUIDocument

Sub Click(Source As Button)
On Error Goto handler
Dim w As NotesUIWorkspace
Dim doc As NotesDocument
Dim subdoc As NotesDocument
Dim subuidoc As NotesUIDocument
Dim docChanged As Boolean
Dim db2 As NotesDatabase
Dim ses As New NotesSession
Set db2= ses.CurrentDatabase


Set w = New NotesUIWorkspace
Set uidoc = w.CurrentDocument
'	uidoc.AutoReload = False
Set doc = uidoc.document

Set subdoc = New NotesDocument(db2)
call subdoc.ReplaceItemValue("Form", "(comments)")
set subuidoc = w.EditDocument(True, subdoc)
On Event Postsave From subuidoc Call subuidocPostsave

Exit Sub
handler:
Messagebox "Ошибка :" & Error & " в строке " & Cstr(Erl()),16, "Ошибка"
Exit Sub
End Sub

Sub subuidocPostsave(Source As Notesuidocument)
Dim ws As New NotesUIWorkspace
If Not(uidoc Is Nothing) Then
Call uidoc.Document.ReplaceItemValue("sub_com", Source.Document.GetItemValue("sub_com2"))
If uidoc.EditMode Then
Call uidoc.Refresh() ' ???
Else
Call uidoc.Document.Save(True, False, False)
Call ws.EditDocument(, uidoc.Document)
Call uidoc.Close(True)
End If
Call Source.Close(True)
End If
End Sub

только предупрежу сразу, что в другом конкретном случае, когда документ (главный) открывающий второй (ведомый) закрывается, а потом открывается заново, а ведомый не закрывается, то последуещее сохранение ведомого не изменит значения в ново-открытом ведущем...

твой вариант через диалог тоже рабочий, но ты там не переоткрываешь ведущий документ! а надо! :)



Код:
If docChanged Then
If subdoc Is Nothing Then
' ничего
Msgbox "Empty"
Else

Call doc.ReplaceItemValue("sub_com",subdoc.GetItemValue("sub_com2")(0))
Call doc.Save (True, True)

Call w.EditDocument(False, doc)
call uidoc.Close(true)

End If

End If
 
P

phantom76

phantom76
Я ссылку привел на практически такую же задачу. Смотрел? :ph34r:

Akupaka
У меня работает в 8-ке.
Хотя я давно и в 6-ке пробовал. Наверное тоже работало, иначе не стал бы писать. :)

Смотрел, но у меня не респонсы...



phantom76, ты сделай как тебе дядьки советуют - понравится ;)

по кнопке нужно переиначить обработчик открываемого документа на свой. в форме открываемого документа, в PostSave комментируешь одну пустую строку.

Код:
(Declarations)
Dim uidoc As NotesUIDocument

Sub Click(Source As Button)
On Error Goto handler
Dim w As NotesUIWorkspace
Dim doc As NotesDocument
Dim subdoc As NotesDocument
Dim subuidoc As NotesUIDocument
Dim docChanged As Boolean
Dim db2 As NotesDatabase
Dim ses As New NotesSession
Set db2= ses.CurrentDatabase


Set w = New NotesUIWorkspace
Set uidoc = w.CurrentDocument
'	uidoc.AutoReload = False
Set doc = uidoc.document

Set subdoc = New NotesDocument(db2)
call subdoc.ReplaceItemValue("Form", "(comments)")
set subuidoc = w.EditDocument(True, subdoc)
On Event Postsave From subuidoc Call subuidocPostsave

Exit Sub
handler:
Messagebox "Ошибка :" & Error & " в строке " & Cstr(Erl()),16, "Ошибка"
Exit Sub
End Sub

Sub subuidocPostsave(Source As Notesuidocument)
Dim ws As New NotesUIWorkspace
If Not(uidoc Is Nothing) Then
Call uidoc.Document.ReplaceItemValue("sub_com", Source.Document.GetItemValue("sub_com2"))
If uidoc.EditMode Then
Call uidoc.Refresh() ' ???
Else
Call uidoc.Document.Save(True, False, False)
Call ws.EditDocument(, uidoc.Document)
Call uidoc.Close(True)
End If
Call Source.Close(True)
End If
End Sub

только предупрежу сразу, что в другом конкретном случае, когда документ (главный) открывающий второй (ведомый) закрывается, а потом открывается заново, а ведомый не закрывается, то последуещее сохранение ведомого не изменит значения в ново-открытом ведущем...

твой вариант через диалог тоже рабочий, но ты там не переоткрываешь ведущий документ! а надо! ;)



Код:
If docChanged Then
If subdoc Is Nothing Then
' ничего
Msgbox "Empty"
Else

Call doc.ReplaceItemValue("sub_com",subdoc.GetItemValue("sub_com2")(0))
Call doc.Save (True, True)

Call w.EditDocument(False, doc)
call uidoc.Close(true)

End If

End If

это первый вариант кода, я уже чуть выше другой кусок приложил...
 
A

Akupaka

Смотрел, но у меня не респонсы...
ох уж мне эти программисты! ты их на идею наталкиваешь, а они тебе - "у меня не такая же задача" :))

по 48-му посту пробовал? :ph34r: там тебе чистый код дали ;)

это первый вариант кода, я уже чуть выше другой кусок приложил...
чаво?.. я не понял, не работает что-то? ))
 
P

phantom76

сорри, может туплю, но основной так и не закрыл..
начну сначала:
из основного документа через Action создается псевдодочерний док1.:
Sub Click(Source As Button)
Dim doc As NotesDocument
Dim uidoc As NotesUIDocument
Dim uidoccom As NotesUIDocument
Dim w As New NotesUIWorkspace
Dim db As NotesDatabase
Dim ses As NotesSession
Dim docid As String
Dim number As String
' идентификатор родительского документа
Set uidoc = w.CurrentDocument
Set doc = uidoc.Document
docid = doc.GetItemValue("docid")(0)
number = doc.GetItemValue("number")(0)

Set uidoccom = w.ComposeDocument( "", "", "nc" )
Call uidoccom.FieldAppendText("docid_p", docid)
Call uidoccom.FieldAppendText("number_p", number)

End Sub



далее вновь в созданном документе, через Экшен сохраняем док2: @If(@IsValid;
@Do(@Command([FileSave]); @Command([FileCloseWindow])); "")

в событиях формы2:

Sub Querysave(Source As Notesuidocument, Continue As Variant)
Dim ses As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim pdoc As NotesDocument
Dim uidoc As NotesUIDocument
Dim uipdoc As NotesUIDocument
Dim w As New NotesUIWorkspace
Dim pview As NotesView
Dim key As String
Set db=ses.CurrentDatabase
Set uidoc = w.CurrentDocument
Set doc = uidoc.Document
' ищем родительский документ заявку
Set pview = db.GetView("sortdocid")
Print "найдено представление: " & pview.Name
key = doc.GetItemValue("docid_p")(0)
Set pdoc = pview.GetDocumentByKey(key)
If pdoc Is Nothing Then
Print "Документ заявка не найден! "
Exit Sub
End If
Print "PDOC : " & pdoc.GetItemValue("Number")(0)

Call pdoc.ReplaceItemValue("WF_CurrentUser", "[Manager]")
Call pdoc.ReplaceItemValue("Serv_Man", "[Manager]")
Call pdoc.Save( True, True)
'Set uipdoc = w.EditDocument(True, pdoc)
'Call uipdoc.Save
'Call uipdoc.Close
Call uidoc.Close
'Call w.ReloadWindow

End Sub


Sub Postsave(Source As Notesuidocument)
Call Source.Close
End Sub

но первоначальный док1 я так и не смог закрыть вместе со вторым или что-то я не понял :ph34r:

еще момент: хочу акшен скрывать потекущему занчению поля в доке типа Names.
сделать видимой кнопку только для пользователя имя которого на данный момент прописано в этом поле..

в случае ролей все понятно:
@If(!@IsMember("[Admin]"; @UserRoles); @True ;!@IsMember("[Supervisor]"; @UserRoles); @True; @False)
а с полем должно быть что-то типо такого:
!@IsMember(@UserName; FieldName)
 
P

phantom76

возвращаюсь в вопросу.. ;)

открываем документ1 , нужно через действие из документа1 создать документ2 , после чего закрыть документ1.

пока добился того, что появляется запрос на закрытие сразу 2-х документов , если по сторому сказать отмена, то закроется только документ1.

или нужен хотя бы вариант, чтобы при закрытии документа2 закрывался вслед и документ1. (документы не связанные между собой)


Sub Click(Source As Button) - из формы экшенов в документе1
Dim doc As NotesDocument
Dim doccom As NotesDocument
Dim uidoc As NotesUIDocument
Dim uidoccom As NotesUIDocument
Dim w As New NotesUIWorkspace
Dim db As NotesDatabase
Dim ses As New NotesSession
Set db=ses.CurrentDatabase
Dim docid As String
Dim number As String
' идентификатор родительского документа
Set uidoc = w.CurrentDocument
Set doc = uidoc.Document
docid = doc.GetItemValue("docid")(0)
number = doc.GetItemValue("number")(0)
Set uidoccom = w.ComposeDocument( "", "", "nc" )
Call uidoccom.FieldAppendText("docid_p", docid)
Call uidoccom.FieldAppendText("number_p", number)

Call uidoc.Close - в этом случае, пытаеся закрывать оба документа.

End Sub

вариант2:

Sub Click(Source As Button)
Dim doc As NotesDocument
Dim doccom As NotesDocument
Dim uidoc As NotesUIDocument
Dim uidoccom As NotesUIDocument
Dim w As New NotesUIWorkspace
Dim db As NotesDatabase
Dim ses As New NotesSession
Set db=ses.CurrentDatabase
Dim docid As String
Dim number As String
' идентификатор родительского документа
Set uidoc = w.CurrentDocument
Set doc = uidoc.Document
docid = doc.GetItemValue("docid")(0)
number = doc.GetItemValue("number")(0)
Set doccom = db.CreateDocument

doccom.Form = "nc"
doccom.docid_p=docid
doccom.number_p=number
Call doccom.Save(True,True)
Set uidoccom = ws.Editdocument(True, doccom) - здесь пока появляется ошибка..


Call uidoc.Close








End Sub
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
Попробуй тему с начала почитать. Решение уже дали.
 
P

phantom76

Огромное спасибо сделал все аналогично #48 ;)
ошибку нашел, все работает !
 
P

phantom76

а как из формы при открытии документа в QueryOpen получить открываемый документ как объект?
стандартный вариант set doc = uidoc.document - не работает :blink:
 
K

Kee_Keekkenen

никак по-моему, т.к. документа как объекта еще нет, бери его в постопене
зы. чушь написал..
я использую синглетоны для работы с событиями..
а почему не получить в постопене ?
 
T

turumbay

а как из формы при открытии документа в QueryOpen получить открываемый документ как объект?
стандартный вариант set doc = uidoc.document - не работает :blink:
если документ не новый - то source.document
новый док-т в queryopen, насколько мне известно, получить не удастся
 
Мы в соцсетях:

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