Родительский

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

Gor

Вот в чём вопрос...
надо присвоить полю в родительском документе значение такое же какое и в респонсе...
код на изменение значения поля в родительском у меня такой:
Код:
Dim ws As New NotesUIWorkspace
Dim session As New NotesSession
Dim doc As NotesDocument
Set doc = session.CurrentDatabase.GetDocumentByUNID(Source.Document.ParentDocumentUNID)

doc.Status2 = Source.Document.Status2
Call doc.Save(True, True)
Проблема вот в чём...изменить надо поле в родительском только тогда когда в респонсе изменится это поле ( в данном случае это поле Status2)
Пробовал этот код повесить в респонсе на событие OnChange на поле Status2
Чтобы когда это поле изменялось изменялось и поле в родительском...
но когда вешаешь на OnChange выдаёт ошибку - Data not saved due to script error(s). А если повесить например на Postsave у респонса всё работает в родительском Status2 тоже меняется. Но хотелось бы чтобы оно менялось сразу по изменению поля Status2 в респонсе.
 
я думаю, нужно завести поле status2_hide, которое будет равно полю статус и на кверисейве респонса проверять не различны ли эти поля. Если они различны - менять в родителе.
 
если на QuerySave повесить такое условие в респонсе то значение в родителе сразу меняться будет без проведённого сохранения респонса? :D
в любом случае спасибо надо попробовать!!
 
Попробовал....создал поле Status2_hide.....
код в QuerySave такой сейчас стал:
Код:
Sub Querysave(Source As Notesuidocument, Continue As Variant)

Dim ws As New NotesUIWorkspace
Dim session As New NotesSession
Dim doc As NotesDocument

Set doc = session.CurrentDatabase.GetDocumentByUNID(Source.Document.ParentDocumentUNID)

If doc.Status2(0)<> doc.Status2_hide(0) Then	doc.Status2 = Source.Document.Status2
Call doc.Save(True, True)

End Sub
Всё равно не работает не возвращает значение поля родительского документа если в респонсе поле изменить...
 
Потомучто ошибка....

Код:
Sub Querysave(Source As Notesuidocument, Continue As Variant)

Dim ws As New NotesUIWorkspace
Dim session As New NotesSession
Dim doc As NotesDocument
Dim curdoc As NotesDocument

Set curdoc = Source.Document
Set doc = session.CurrentDatabase.GetDocumentByUNID(Source.Document.ParentDocumentUNID)

If curdoc.Status2(0)<> curdoc.Status2_hide(0) Then doc.Status2 = curdoc.Status2
Call doc.Save(True, True)

А ещё лучше не пользоваться расширенным синтаксисом, ибо моветон :D

Код:
Dim ws As New NotesUIWorkspace
Dim session As New NotesSession
Dim doc As NotesDocument
Dim curdoc As NotesDocument
Dim item As NotesItem

Set curdoc = Source.Document
Set doc = session.CurrentDatabase.GetDocumentByUNID(Source.Document.ParentDocumentUNID)

If curdoc.GetItemValue("Status2")(0)<> curdoc.GetItemValue("Status2_hide")(0) Then 
Set item = doc.ReplaceItemValue("Status2", curdoc.GetItemValue("Status2")
Call doc.Save(True, True)
 
Делаешь так:
Заводишь глобальную переменную на форме (в разделе Globals). Например, oldStatus.
В QueryOpen пишешь:
Код:
Sub Queryopen(Source As Notesuidocument, Mode As Integer, Isnewdoc As Variant, Continue As Variant)
If Not Isnewdoc Then 
oldStatus = Source.Document.Status2(0) 
End If
End Sub
И в PostSave (имхо лучше, т.к. если не пройдет валидация, то в родителськом документе ничего не изменится, в отличие от QuerySave) пишешь:


Код:
Sub Postsave(Source As Notesuidocument)
Dim session As New NotesSession
Dim doc As NotesDocument

Set doc = session.CurrentDatabase.GetDocumentByUNID(Source.Document.ParentDocumentUNID)

If doc.Status2(0)<> oldStatus Then
doc.Status2 = Source.Document.Status2
Call doc.Save(True, True)
oldStatus = doc.Status2(0)
End if

End Sub
 
Всё работает... спасибо за подсказки... Только единственно что я собственно хотел по большей части это чтобы значение в родительском изенялось сразу же после изменения в респонсе статуса, просто пользователи могут забыть сохранить этот документ и статус не отразится в родительском...?
Может быть как нибудь принудительно его сохранять??
Хотя опять же на OnChange поля повесил код
Код:
Sub Onchange(Source As Field)
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument

Set uidoc = workspace.CurrentDocument

Call uidoc.Save
Call uidoc.Refresh
End Sub
По идее по изменению поля Status должен сохраняться респонс и следовательна на PostSave респонса висит код по изменению родительского...
но почему то опять толи сохранение не проходит толи надо сохранять и закрывать... если Call uidoc.close добавить в конце на OnChange ещё то когда статус изменяется в респонсе документ всё равно не закрывается
 
<!--QuoteBegin-Gor+20:09:2005, 11:31 -->
<span class="vbquote">(Gor @ 20:09:2005, 11:31 )</span><!--QuoteEBegin-->просто пользователи могут забыть сохранить этот документ и статус не отразится в родительском...?
[snapback]24977" rel="nofollow" target="_blank[/snapback]​
[/quote]
У них склероз ? Чтобы не забывали, делай агента с напоминанием через каждые полчаса. Тогда не будут забывать.
Также пользователю никто не помешает сменить два раза значение поля.

И не очень корректно делать так, как ты хочешь. Например, я создаю документ а он сам сохраняется. А если я передумал создавать документ ? Или не там создал ? Мне его удалять надо ? Значит надо разрешение в ACL, а это не гуд для таких "забывчивых" пользователей. Или удаление документов ложится на одного пользователя. Скорее всего на админа или дизайнера.
 
ну да....в общем ты прав.....просто хочется уж автоматизировать все процессы чтобы никаких трений не было....
 
И не очень корректно делать так, как ты хочешь. Например, я создаю документ а он сам сохраняется. А если я передумал создавать документ ? Или не там создал ? Мне его удалять надо ?
Ну не совсем всё так))
Схема какая в общем:
Родительский - он создаёт Response Document,
на этом респонсе есть HotSpotы, по нажатию на HotSpot создаётся ещё один респонс, там заполняются поля, он сохраняется - поля передаются в прошлый респонс(а он открытый) значение поля там меняется но ещё дальше не передаётся т.к. его надо тоже сохранять... а пользователь может просто забыть закрыть этот переходный документ...вот я и думаю как бы его сохранить после того как в нём изменится только одно поле...
 
<!--QuoteBegin-Gor+20:09:2005, 13:21 -->
<span class="vbquote">(Gor @ 20:09:2005, 13:21 )</span><!--QuoteEBegin-->там заполняются поля, он сохраняется - поля передаются в прошлый респонс(а он открытый) значение поля там меняется но ещё дальше не передаётся т.к. его надо тоже сохранять...
[snapback]24980" rel="nofollow" target="_blank[/snapback]​
[/quote]
А сам себе ты конфликт записи-репликации не сделаешь таким образом ? Изменяя бак-энд документ из другого документа, когда тот открыт во фронт-энде ?
Как-то мудрено у тебя. Если тебе надо изменять еще и главный документ, то передавай его UNID твоему "переходному документу".
 
ну мудрено потому что не знаю как по другому сделать)
В смысле передавать UNID переходному документы сразу?
При создании респонса передавать UNID из родительского?
И что изменится если я буду передавать UNID в переходный документ?
как вообще осуществить передачу одного поля в родительский через переходный? Поподробнее немного можно? плиз <_< ?
Я просто другого выхода то и не знаю в моём случае чтобы изменять back end
когда открыть переходный в front ende...если только может его как нибудь закрывать сразу при создании респонса к нему.... но тогда на PostSave уже не повесишь код для изменения в родительском поля....
 
Как обычное поле передаешь. Создаешь поле в главном документе со значением @DocumentUniqueID.
А дальше в свойствах формы респонза ставишь Formulas inherit values...(не помню), если создаешь респонз через собаку или, если через скрипт, пишешь код, который присваивает это значение респонзу.
А изменится то, что ты сможешь поменять значение в главном документе хоть из респонза 10 уровня напрямую.
 
Для: Medevic Я так понимаю в моём случае в родительском документе есть поле статус. Этому полю надо присвоить в Default value @DocumentUniqueID? Или надо присвоить значение просто новому созданному полю в родителе?
В переходном респонсе поставить formulas inherit... и в следующем респонсе от переходного тоже? в хелпе написано что @DocumentUniqueID это доклинк на документ....в принципе что мне вроде бы и надо....только вот не совсем понятно как мне удастся поменять из респонса статус сразу в родительском...без переходного документа...
Придётся на событие PostSave в респонсе после изменения статуса повесить формулу которая изменит статус сразу в родительском где есть поле @DocumentUniqueID без переходного? Только в хелпе не найду пока я такой формулы которая бы записывала сразу в родительский из респонса без переходного...
 
Вот код:
Код:
Dim ws as New NotesUIWorkspace
Dim session As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim curdoc As NotesUIDocument

Set db = session.CurrentDatabase
Set curdoc = ws.CurrentDocument
Set doc = db.GetDocumentByUNID(curdoc.Document.RootUNID(0))
Где в поле RootUNID содержится UNID главного документа.
 
выскакивает ошибка Invalid universal ID...
Код повесил на Postsave в респонсе...
В родительском документе есть поле RootUNID...значение там @DocumentUniqueID.
в переходном респонсе нет поля RootUNID я так понял оно там и не нужно...
а в следующем респонсе уже есть RootUNID свойства формы выставил...formulas inherit......
По идее он же должен возвращать значение поля статус в родительском? по уникальному UNID без переходного респонса?
если конечно код немного другой
Код:
Sub Postsave(Source As Notesuidocument)
Dim ws As New NotesUIWorkspace
Dim session As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim curdoc As NotesUIDocument

Set db = session.CurrentDatabase
Set curdoc = ws.CurrentDocument
Set doc = db.GetDocumentByUNID(curdoc.Document.RootUNID(0))
doc.Status2 = Source.Document.Status2
Call doc.Save(True, True)
end sub
 
<!--QuoteBegin-Gor+21:09:2005, 09:30 -->
<span class="vbquote">(Gor @ 21:09:2005, 09:30 )</span><!--QuoteEBegin-->выскакивает ошибка Invalid universal ID...
[snapback]25009" rel="nofollow" target="_blank[/snapback]​
[/quote]
Значит RootUNID не имеет значения. Посмотри чему равно значение. Если поле на форме видимо, то в этом поле должна быть ссылка (иконка в виде желтого листка).
RootUNID надо тащить через все респонзы.
 
Формула на поле видима не была.... Поставил в переходном респонсе поле RootUNID значение @InheritedDocumentUniqueID и в следующем респонсе такое же поле с таким же значением..в последнем респонсе на Postsave код:
Код:
Sub Postsave(Source As Notesuidocument)
Dim ws As New NotesUIWorkspace
Dim session As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim curdoc As NotesUIDocument

Set db = session.CurrentDatabase
Set curdoc = ws.CurrentDocument
Set doc = db.GetDocumentByUNID(curdoc.Document.RootUNID(0))
doc.Status2 = Source.Document.Status2
Call doc.Save(True, True)
end sub
Производишь сохранение, но значение в родительском основном всё равно не меняется :blink:
 
<!--QuoteBegin-Gor+21:09:2005, 11:15 -->
<span class="vbquote">(Gor @ 21:09:2005, 11:15 )</span><!--QuoteEBegin-->Производишь сохранение, но значение в родительском основном всё равно не меняется
[snapback]25018" rel="nofollow" target="_blank[/snapback]​
[/quote]
А у тебя родительский документ открыт во фронт-енде ?
Если да, то изменения в нем не отразятся. Надо переоткрывать.
 
Мы в соцсетях:

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