• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы 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 в респонсе.
 
C

Chernom0r

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

Gor

если на QuerySave повесить такое условие в респонсе то значение в родителе сразу меняться будет без проведённого сохранения респонса? :D
в любом случае спасибо надо попробовать!!
 
G

Gor

Попробовал....создал поле 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
Всё равно не работает не возвращает значение поля родительского документа если в респонсе поле изменить...
 
C

Chernom0r

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

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

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Делаешь так:
Заводишь глобальную переменную на форме (в разделе 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
 
G

Gor

Всё работает... спасибо за подсказки... Только единственно что я собственно хотел по большей части это чтобы значение в родительском изенялось сразу же после изменения в респонсе статуса, просто пользователи могут забыть сохранить этот документ и статус не отразится в родительском...?
Может быть как нибудь принудительно его сохранять??
Хотя опять же на 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 ещё то когда статус изменяется в респонсе документ всё равно не закрывается
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
<!--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, а это не гуд для таких "забывчивых" пользователей. Или удаление документов ложится на одного пользователя. Скорее всего на админа или дизайнера.
 
G

Gor

ну да....в общем ты прав.....просто хочется уж автоматизировать все процессы чтобы никаких трений не было....
 
G

Gor

И не очень корректно делать так, как ты хочешь. Например, я создаю документ а он сам сохраняется. А если я передумал создавать документ ? Или не там создал ? Мне его удалять надо ?
Ну не совсем всё так))
Схема какая в общем:
Родительский - он создаёт Response Document,
на этом респонсе есть HotSpotы, по нажатию на HotSpot создаётся ещё один респонс, там заполняются поля, он сохраняется - поля передаются в прошлый респонс(а он открытый) значение поля там меняется но ещё дальше не передаётся т.к. его надо тоже сохранять... а пользователь может просто забыть закрыть этот переходный документ...вот я и думаю как бы его сохранить после того как в нём изменится только одно поле...
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
<!--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 твоему "переходному документу".
 
G

Gor

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

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Как обычное поле передаешь. Создаешь поле в главном документе со значением @DocumentUniqueID.
А дальше в свойствах формы респонза ставишь Formulas inherit values...(не помню), если создаешь респонз через собаку или, если через скрипт, пишешь код, который присваивает это значение респонзу.
А изменится то, что ты сможешь поменять значение в главном документе хоть из респонза 10 уровня напрямую.
 
G

Gor

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

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Вот код:
Код:
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 главного документа.
 
G

Gor

выскакивает ошибка 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
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
<!--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 надо тащить через все респонзы.
 
G

Gor

Формула на поле видима не была.... Поставил в переходном респонсе поле 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:
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
<!--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]
А у тебя родительский документ открыт во фронт-енде ?
Если да, то изменения в нем не отразятся. Надо переоткрывать.
 
Мы в соцсетях:

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