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

Тема в разделе "Lotus - Программирование", создана пользователем diga, 22 июл 2014.

  1. diga

    diga Member

    Регистрация:
    10 июл 2014
    Сообщения:
    20
    Симпатии:
    0
    Есть 2 формы:
    1) Персонал с полем personName
    2) Руководитель с полем OrgLeader

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

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Не из формы, а из документа.
    Форма всего лишь отображение данных и структура.
    ищите picklist можно на @ можно на LS
     
  3. diga

    diga Member

    Регистрация:
    10 июл 2014
    Сообщения:
    20
    Симпатии:
    0

    Код (LotusScript):
    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 не нашел подобное
     
  4. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Код (LotusScript):
    If DocSet Is Nothing Or DocSet.Count = 0 Then
    Выдаст ошибку если DocSet будет Nothing
    Лотус не поддерживает частичную проверку условий, он всегда вычисляет все условие.
    Эту строку надо разделить на 2 условия.
    ищите NotesDocument.GetItemValue
     
  5. diga

    diga Member

    Регистрация:
    10 июл 2014
    Сообщения:
    20
    Симпатии:
    0
    переделал так, решил сделать через замену, но выдает ошибку object variable not set

    Код (LotusScript):
    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
    как исправить?
     
  6. ty3uk

    ty3uk Well-Known Member

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

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    > Dim doc As NotesDocument
    описал тип.
    > Call doc.ReplaceItemValue("OrgLeader", DocSet)
    используешь.
    где получение документа?
    и и присвоить полю коллекцию - это круто :)
    думать когда будете?
     
  8. diga

    diga Member

    Регистрация:
    10 июл 2014
    Сообщения:
    20
    Симпатии:
    0

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

    Код (LotusScript):
    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
     
  9. ty3uk

    ty3uk Well-Known Member

    Регистрация:
    31 мар 2008
    Сообщения:
    169
    Симпатии:
    0
    я делаю по другому
    1) я не считаю что если пользователь отказался от выбора, то это ошибка, соотвественно не нудно ему ничего выводить
    2) далее, достаточно простая обработка (универсальная, использую не только в диалогах, но и при всевозможных переборах, из-за этого присутсвует tmp_doc)
    Код (LotusScript):
     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
    так, теперь в твоём коде, ты берёшь значение из документа который выбрал пользователь, и засовываешь его, опятьже, в тот-же документ. Что ты ожидаешь увидеть? ;-)
     
  10. diga

    diga Member

    Регистрация:
    10 июл 2014
    Сообщения:
    20
    Симпатии:
    0
    :) это я понял, я по справке просто делал,

    Syntax

    valueArray = notesDocument .GetItemValue( itemName$ )


    Parameters

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


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

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

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Правильно
    Можно и без промежуточной переменной. можно и с ней. Главное иметь объект документа, в которых надо записать.
    Код (LotusScript):
    Set doc = dc.GetFirstDocument
    call doc2.ReplaceItemValue("itemName", doc.GetItemValue("itemName")) ' Записать все значения
    'или
    call doc2.ReplaceItemValue("itemName", doc.GetItemValue("itemName")(0)) ' Записать только первое значение
     
  12. diga

    diga Member

    Регистрация:
    10 июл 2014
    Сообщения:
    20
    Симпатии:
    0
    а сам объект doc2 я так понимаю надо заранее определить?
    так пойдет?
    Dim doc2 As NotesDocument
    set doc2 = "что тут будет?"
    то есть хочу спросить как определить тот самый новый документ doc2?

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

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    doc2...
    Есть несколько способов его определить...
    1. При открытии формы
    В самой форме, в секцию (Global), в подсекцию (Declarations) прописать:
    Код (LotusScript):
    Dim CurrUIDoc as NotesUIDocument
    Dim CurrDoc as NotesDocument
    Далее в событие формы PostOpen:
    Код (LotusScript):
    Sub Postopen(Source As Notesuidocument)
    Set currUIDoc = Source
    Set currDoc = currUIDoc.Document
    End Sub
    Таким образом при открытии документа заполняем 2 глобальных объекта.
    Жить объекты будут до закрытия документа.
    Обращаться к ним можно будет из любой кнопки/события/хот-спота на форме.
    2. При конкретном действии
    В нужное действие, если требуется работа с документом, в самом начале вставляем код:
    Код (LotusScript):
    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.

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

    diga Member

    Регистрация:
    10 июл 2014
    Сообщения:
    20
    Симпатии:
    0

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

    Код (LotusScript):
    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
    что естественно не работает (
     
  15. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Работает) просто изменений на экране нет, а "за спиной" есть ;)
    Код (LotusScript):
    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">
    Код (LotusScript):
    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
     
  16. diga

    diga Member

    Регистрация:
    10 июл 2014
    Сообщения:
    20
    Симпатии:
    0
    у меня почему то так же остается без изменений. даже после CurrUIDoc.Refresh режим редактирования включен
     
  17. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    diga
    Поле как называется?
    Проверте название, правильное имя поля должно быть вместо ItemName
     
  18. diga

    diga Member

    Регистрация:
    10 июл 2014
    Сообщения:
    20
    Симпатии:
    0
    поле у меня называется OrgLeader, вроде все правильно. Попробую переписать все заново, иногда помогает, вдруг где букву пропустил, спасибо большое за помощь.
     
  19. maffl

    maffl Member

    Регистрация:
    23 дек 2013
    Сообщения:
    15
    Симпатии:
    10
    diga, Вот эта строка

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

    Код (LotusScript):
    Call CurrDoc.ReplaceItemValue("OrgLeader", doc.GetItemValue("personName")(0))
     
Загрузка...

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