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

Тема в разделе "Lotus - Программирование", создана пользователем Gor, 16 сен 2005.

  1. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Вот в чём вопрос...
    надо присвоить полю в родительском документе значение такое же какое и в респонсе...
    код на изменение значения поля в родительском у меня такой:
    Код (Text):
    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 в респонсе.
     
  2. Chernom0r

    Chernom0r Гость

    я думаю, нужно завести поле status2_hide, которое будет равно полю статус и на кверисейве респонса проверять не различны ли эти поля. Если они различны - менять в родителе.
     
  3. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    если на QuerySave повесить такое условие в респонсе то значение в родителе сразу меняться будет без проведённого сохранения респонса? :D
    в любом случае спасибо надо попробовать!!
     
  4. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Попробовал....создал поле Status2_hide.....
    код в QuerySave такой сейчас стал:
    Код (Text):
    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
    Всё равно не работает не возвращает значение поля родительского документа если в респонсе поле изменить...
     
  5. Chernom0r

    Chernom0r Гость

    Потомучто ошибка....

    Код (Text):
    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

    Код (Text):
    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)
     
  6. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Делаешь так:
    Заводишь глобальную переменную на форме (в разделе Globals). Например, oldStatus.
    В QueryOpen пишешь:
    Код (Text):
    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) пишешь:


    Код (Text):
    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
     
  7. Chernom0r

    Chernom0r Гость

    можно и так
     
  8. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Всё работает... спасибо за подсказки... Только единственно что я собственно хотел по большей части это чтобы значение в родительском изенялось сразу же после изменения в респонсе статуса, просто пользователи могут забыть сохранить этот документ и статус не отразится в родительском...?
    Может быть как нибудь принудительно его сохранять??
    Хотя опять же на OnChange поля повесил код
    Код (Text):
    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 ещё то когда статус изменяется в респонсе документ всё равно не закрывается
     
  9. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--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, а это не гуд для таких "забывчивых" пользователей. Или удаление документов ложится на одного пользователя. Скорее всего на админа или дизайнера.
     
  10. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    ну да....в общем ты прав.....просто хочется уж автоматизировать все процессы чтобы никаких трений не было....
     
  11. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Ну не совсем всё так))
    Схема какая в общем:
    Родительский - он создаёт Response Document,
    на этом респонсе есть HotSpotы, по нажатию на HotSpot создаётся ещё один респонс, там заполняются поля, он сохраняется - поля передаются в прошлый респонс(а он открытый) значение поля там меняется но ещё дальше не передаётся т.к. его надо тоже сохранять... а пользователь может просто забыть закрыть этот переходный документ...вот я и думаю как бы его сохранить после того как в нём изменится только одно поле...
     
  12. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--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 твоему "переходному документу".
     
  13. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    ну мудрено потому что не знаю как по другому сделать)
    В смысле передавать UNID переходному документы сразу?
    При создании респонса передавать UNID из родительского?
    И что изменится если я буду передавать UNID в переходный документ?
    как вообще осуществить передачу одного поля в родительский через переходный? Поподробнее немного можно? плиз <_< ?
    Я просто другого выхода то и не знаю в моём случае чтобы изменять back end
    когда открыть переходный в front ende...если только может его как нибудь закрывать сразу при создании респонса к нему.... но тогда на PostSave уже не повесишь код для изменения в родительском поля....
     
  14. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Как обычное поле передаешь. Создаешь поле в главном документе со значением @DocumentUniqueID.
    А дальше в свойствах формы респонза ставишь Formulas inherit values...(не помню), если создаешь респонз через собаку или, если через скрипт, пишешь код, который присваивает это значение респонзу.
    А изменится то, что ты сможешь поменять значение в главном документе хоть из респонза 10 уровня напрямую.
     
  15. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Для: Medevic Я так понимаю в моём случае в родительском документе есть поле статус. Этому полю надо присвоить в Default value @DocumentUniqueID? Или надо присвоить значение просто новому созданному полю в родителе?
    В переходном респонсе поставить formulas inherit... и в следующем респонсе от переходного тоже? в хелпе написано что @DocumentUniqueID это доклинк на документ....в принципе что мне вроде бы и надо....только вот не совсем понятно как мне удастся поменять из респонса статус сразу в родительском...без переходного документа...
    Придётся на событие PostSave в респонсе после изменения статуса повесить формулу которая изменит статус сразу в родительском где есть поле @DocumentUniqueID без переходного? Только в хелпе не найду пока я такой формулы которая бы записывала сразу в родительский из респонса без переходного...
     
  16. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Вот код:
    Код (Text):
    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 главного документа.
     
  17. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    выскакивает ошибка Invalid universal ID...
    Код повесил на Postsave в респонсе...
    В родительском документе есть поле RootUNID...значение там @DocumentUniqueID.
    в переходном респонсе нет поля RootUNID я так понял оно там и не нужно...
    а в следующем респонсе уже есть RootUNID свойства формы выставил...formulas inherit......
    По идее он же должен возвращать значение поля статус в родительском? по уникальному UNID без переходного респонса?
    если конечно код немного другой
    Код (Text):
    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
     
  18. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--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 надо тащить через все респонзы.
     
  19. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Формула на поле видима не была.... Поставил в переходном респонсе поле RootUNID значение @InheritedDocumentUniqueID и в следующем респонсе такое же поле с таким же значением..в последнем респонсе на Postsave код:
    Код (Text):
    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:
     
  20. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--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]
    А у тебя родительский документ открыт во фронт-енде ?
    Если да, то изменения в нем не отразятся. Надо переоткрывать.
     
Загрузка...
Похожие Темы - Родительский
  1. Medevic
    Ответов:
    3
    Просмотров:
    2.730

Поделиться этой страницей