• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Как Получить Данные Из Другой Формы?

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

diga

Есть 2 формы:
1) Персонал с полем personName
2) Руководитель с полем OrgLeader

на лебел "Руководитель" по заданию, надо повесить Hotspot, для того чтобы выбрать руководителя из списка персонала, повесил, далее возникает вопрос как получить данные из формы Персонал, а именно список сотрудников, и выбрать таким образом Руководителя?
я так понимаю, надо еще использовать
Код:
@SetField
?
Спасибо.
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
159
Не из формы, а из документа.
Форма всего лишь отображение данных и структура.
ищите picklist можно на @ можно на LS
 
D

diga

Не из формы, а из документа.
Форма всего лишь отображение данных и структура.
ищите picklist можно на @ можно на LS


Код:
Sub Click(Source As Button)
Dim ws As New NotesUIWorkspace
Dim DocSet As NotesDocumentCollection
Dim doc As NotesDocument

Set DocSet = ws.PickListCollection( PICKLIST_CUSTOM, True, "", "staffmanager.nsf", "person", "Title", "Here:")
If DocSet Is Nothing Or DocSet.Count = 0 Then
Msgbox "No document selected."
Else

End If
End Sub

написал таким образом, как теперь можно сделать чтоб при нажатии в окне на окне, выбранное имя появлялось бы на поле OrgLeader
знаю что на @ можно использовать FIELD, в LS не нашел подобное
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
159
Код:
If DocSet Is Nothing Or DocSet.Count = 0 Then
Выдаст ошибку если DocSet будет Nothing
Лотус не поддерживает частичную проверку условий, он всегда вычисляет все условие.
Эту строку надо разделить на 2 условия.
ищите NotesDocument.GetItemValue
 
D

diga

Выдаст ошибку если DocSet будет Nothing
Лотус не поддерживает частичную проверку условий, он всегда вычисляет все условие.
Эту строку надо разделить на 2 условия.
ищите NotesDocument.GetItemValue

переделал так, решил сделать через замену, но выдает ошибку object variable not set

Код:
Sub Click(Source As Button)
Dim ws As New NotesUIWorkspace
Dim DocSet As NotesDocumentCollection
Dim doc As NotesDocument
Dim item As NotesItem
Set DocSet = ws.PickListCollection( PICKLIST_CUSTOM, True, "", "staffmanager.nsf", "(Hidden)\person", "Список работников", "Выбере руководителя:")
If DocSet Is Nothing Then
Msgbox "Ошибка, не выбран руководитель."
Else
If DocSet.Count = 0 Then
Msgbox "Руководитель не выбран."
Else
Call doc.ReplaceItemValue("OrgLeader", DocSet)
End If
End If
End Sub
как исправить?
 
T

ty3uk

посмотри что возращает PickListCollection
В принципе, даже из название понятно что коллекцию документов. Соотвественно, из этой коллекции, тебя надо взять документ (DocSet.getfirstdocument), даже после этого, не нужно пихать документ в поле, возьми из него значение (.getitemvalue("_Field_name_")) и, уже это значение, запихивай в документ.
Как-то не заметил сразу... а зачем ты используешь множественную выборку? Т.е. пользователь может несколько документов выбрать? если нет, то второй параметр поменяй с true на false
 
H

hosm

> Dim doc As NotesDocument
описал тип.
> Call doc.ReplaceItemValue("OrgLeader", DocSet)
используешь.
где получение документа?
и и присвоить полю коллекцию - это круто :)
думать когда будете?
 
D

diga

Код:
If DocSet Is Nothing Or DocSet.Count = 0 Then
Выдаст ошибку если DocSet будет Nothing
Лотус не поддерживает частичную проверку условий, он всегда вычисляет все условие.
Эту строку надо разделить на 2 условия.
ищите NotesDocument.GetItemValue


балабурда вышла какая та, запутался, исправьте пожалуйста..

Код:
Sub Click(Source As Button)
Dim ws As New NotesUIWorkspace
Dim DocSet As NotesDocumentCollection
Dim doc As NotesDocument
Dim item As NotesItem
Dim subj As Variant
Set DocSet = ws.PickListCollection( PICKLIST_CUSTOM, False, "", "staffmanager.nsf", "(Hidden)\person", "Список работников", "Выбере руководителя:")
If DocSet Is Nothing Then
Msgbox "Ошибка, не выбран руководитель."
Else
If DocSet.Count = 0 Then
Msgbox "Руководитель не выбран."
Else
Set doc = DocSet.GetFirstDocument ' берем первый документ коллекции

subj = doc.GetItemValue("OrgLeader")(0) 
Call doc.ReplaceItemValue("OrgLeader", subj)
End If
End If
End Sub
 
T

ty3uk

я делаю по другому
1) я не считаю что если пользователь отказался от выбора, то это ошибка, соотвественно не нудно ему ничего выводить
2) далее, достаточно простая обработка (универсальная, использую не только в диалогах, но и при всевозможных переборах, из-за этого присутсвует tmp_doc)
Код:
 Set DocSet = ws.PickListCollection( PICKLIST_CUSTOM, False, "", "staffmanager.nsf", "(Hidden)\person", "Список работников", "Выбере руководителя:")
set doc=DocSet.GetfirstDocument()
while not(doc is nothing)
set tmp_doc=docset.getnextdocument(doc)
....
....
set doc=tmp_doc
wend

так, теперь в твоём коде, ты берёшь значение из документа который выбрал пользователь, и засовываешь его, опятьже, в тот-же документ. Что ты ожидаешь увидеть? ;-)
 
D

diga

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

:) это я понял, я по справке просто делал,

Syntax

valueArray = notesDocument .GetItemValue( itemName$ )


Parameters

itemName$ - я так понимаю это имя поля.


как именно правильно можно взять значения первого документа коллекции и далее засунуть его в поле?

то бишь, у меня только эта строка не правильная?
Код:
Call doc.ReplaceItemValue("OrgLeader", subj)
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
159
itemName$ - я так понимаю это имя поля.
Правильно
как именно правильно можно взять значения первого документа коллекции и далее засунуть его в поле?
Можно и без промежуточной переменной. можно и с ней. Главное иметь объект документа, в которых надо записать.
Код:
Set doc = dc.GetFirstDocument
call doc2.ReplaceItemValue("itemName", doc.GetItemValue("itemName")) ' Записать все значения
'или
call doc2.ReplaceItemValue("itemName", doc.GetItemValue("itemName")(0)) ' Записать только первое значение
 
D

diga

Можно и без промежуточной переменной. можно и с ней. Главное иметь объект документа, в которых надо записать.
а сам объект doc2 я так понимаю надо заранее определить?
так пойдет?
Dim doc2 As NotesDocument
set doc2 = "что тут будет?"
то есть хочу спросить как определить тот самый новый документ doc2?

P.S. Извините за такие глупые вопросы, но чем больше задаю и чем больше отвечаете я их начинаю понимать)
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
159
doc2...
Есть несколько способов его определить...
1. При открытии формы
В самой форме, в секцию (Global), в подсекцию (Declarations) прописать:
Код:
Dim CurrUIDoc as NotesUIDocument
Dim CurrDoc as NotesDocument
Далее в событие формы PostOpen:
Код:
Sub Postopen(Source As Notesuidocument)
Set currUIDoc = Source
Set currDoc = currUIDoc.Document
End Sub
Таким образом при открытии документа заполняем 2 глобальных объекта.
Жить объекты будут до закрытия документа.
Обращаться к ним можно будет из любой кнопки/события/хот-спота на форме.
2. При конкретном действии
В нужное действие, если требуется работа с документом, в самом начале вставляем код:
Код:
Dim CurrUIDoc as NotesUIDocument
Dim CurrDoc as NotesDocument
Dim ws as New NOtesUIWorkspace
Set currUIDoc = ws.CurrentDocument
Set currDoc = currUIDoc.Document
Таким образом при каждом действии будет создаваться новый объект для работы.
И в каждом действии надо будет объявлять переменные.

То есть все манипуляции по работе с документом надо осуществлять через CurrDoc

У каждого подхода есть и плюсы и минусы.
ws.CurrentDocument - может выдать ошибку и вернуть не тот документ.
"Неведомым магическим способом" внутренний фокус лотуса может смениться на одну из открытых вкладок.
Если открыть документ, затем не закрывая его перейти в другую базу, создать документ там, потом вернуться в открытый документ и нажать действие с ws.CurrentDocument. с вероятностью 0,95 вернется объект нового документа, а не текущего.
Есть подозрение, что это связано с механизмом Compose, но глубже я не копал.

С глобальными объектами тоже бывали проблемы, что они хранили в себе не те объекты, которые надо.
Кажется это было в версии 6 и 7, но в последнее время не воспроизводится на версиях выше 8.

Сам использую глобальные переменные в форме.
 
D

diga

2. При конкретном действии
В нужное действие, если требуется работа с документом, в самом начале вставляем код:
Код:
Dim CurrUIDoc as NotesUIDocument
Dim CurrDoc as NotesDocument
Dim ws as New NOtesUIWorkspace
Set currUIDoc = ws.CurrentDocument
Set currDoc = currUIDoc.Document
Таким образом при каждом действии будет создаваться новый объект для работы.
И в каждом действии надо будет объявлять переменные.

То есть все манипуляции по работе с документом надо осуществлять через CurrDoc


то бишь, как то так должно быть?

Код:
Sub Click(Source As Button)
Dim ws As New NotesUIWorkspace
Dim DocSet As NotesDocumentCollection
Dim doc As NotesDocument
Dim item As NotesItem
Dim subj As Variant
Dim doc2 As NotesDocument
Dim CurrUIDoc As NotesUIDocument
Dim CurrDoc As NotesDocument
Set CurrUIDoc = ws.CurrentDocument
Set CurrDoc = CurrUIDoc.Document
Set DocSet = ws.PickListCollection( PICKLIST_CUSTOM, False, "", "staffmanager.nsf", "(Hidden)\person", "Список работников", "Выбере руководителя:")
If DocSet Is Nothing Then
Msgbox "Ошибка, не выбран руководитель."
Else
If DocSet.Count = 0 Then
Msgbox "Руководитель не выбран."
Else
Set doc= DocSet.GetFirstDocument 
Call CurrDoc.ReplaceItemValue("itemName", doc.GetItemValue("OrgLeader")(0))
End If
End If
End Sub

что естественно не работает (
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
159
Работает) просто изменений на экране нет, а "за спиной" есть ;)
Код:
Call CurrDoc.ReplaceItemValue("itemName", doc.GetItemValue("OrgLeader")(0))
Call CurrUIDoc.Refresh ' обновляем документ на экране, работает только в режиме редактирования

Добавлено: Вместо "ItemName" должно быть поле, которое есть на форме и где должен отобразиться руководитель.
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Подправленная версия</div></div><div class="sp-body"><div class="sp-content">
Код:
Sub Click(Source As Button)
Dim ws As New NotesUIWorkspace
Dim DocSet As NotesDocumentCollection
Dim doc As NotesDocument
Dim CurrUIDoc As NotesUIDocument
Dim CurrDoc As NotesDocument

Set CurrUIDoc = ws.CurrentDocument
Set CurrDoc = CurrUIDoc.Document
Set DocSet = ws.PickListCollection( PICKLIST_CUSTOM, False, "", "staffmanager.nsf", "(Hidden)\person", "Список работников", "Выбере руководителя:")

If DocSet Is Nothing Then Exit sub
If DocSet.Count < 1 Then Exit sub

Set doc= DocSet.GetFirstDocument 
Call CurrDoc.ReplaceItemValue("itemName", doc.GetItemValue("OrgLeader")(0))
Call currUIDoc.Refresh
End Sub
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
159
diga
Поле как называется?
Проверте название, правильное имя поля должно быть вместо ItemName
 
D

diga

diga
Поле как называется?
Проверте название, правильное имя поля должно быть вместо ItemName

поле у меня называется OrgLeader, вроде все правильно. Попробую переписать все заново, иногда помогает, вдруг где букву пропустил, спасибо большое за помощь.
 
M

maffl

diga, Вот эта строка

Код:
Call CurrDoc.ReplaceItemValue("itemName", doc.GetItemValue("OrgLeader")(0))

вероятно должна быть вот такой

Код:
Call CurrDoc.ReplaceItemValue("OrgLeader", doc.GetItemValue("personName")(0))
 
Мы в соцсетях:

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