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

diga

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

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

savl

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

diga

Member
10.07.2014
20
0
#3
Не из формы, а из документа.
Форма всего лишь отображение данных и структура.
ищите 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 131
102
#4
Код:
If DocSet Is Nothing Or DocSet.Count = 0 Then
Выдаст ошибку если DocSet будет Nothing
Лотус не поддерживает частичную проверку условий, он всегда вычисляет все условие.
Эту строку надо разделить на 2 условия.
ищите NotesDocument.GetItemValue
 

diga

Member
10.07.2014
20
0
#5
Выдаст ошибку если 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
как исправить?
 

ty3uk

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

hosm

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

diga

Member
10.07.2014
20
0
#8
Код:
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
 

ty3uk

Well-known member
31.03.2008
170
0
#9
я делаю по другому
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
так, теперь в твоём коде, ты берёшь значение из документа который выбрал пользователь, и засовываешь его, опятьже, в тот-же документ. Что ты ожидаешь увидеть? ;-)
 

diga

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

Syntax

valueArray = notesDocument .GetItemValue( itemName$ )


Parameters

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


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

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

savl

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

diga

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

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

savl

Lotus team
28.10.2011
2 131
102
#13
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.

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

diga

Member
10.07.2014
20
0
#14
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 131
102
#15
Работает) просто изменений на экране нет, а "за спиной" есть ;)
Код:
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 131
102
#17
diga
Поле как называется?
Проверте название, правильное имя поля должно быть вместо ItemName
 

diga

Member
10.07.2014
20
0
#18
diga
Поле как называется?
Проверте название, правильное имя поля должно быть вместо ItemName
поле у меня называется OrgLeader, вроде все правильно. Попробую переписать все заново, иногда помогает, вдруг где букву пропустил, спасибо большое за помощь.
 

maffl

Member
23.12.2013
15
5
#19
diga, Вот эта строка

Код:
Call CurrDoc.ReplaceItemValue("itemName", doc.GetItemValue("OrgLeader")(0))
вероятно должна быть вот такой

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