Ошибка В Условии

Тема в разделе "Lotus - Программирование", создана пользователем Altaya, 29 мар 2012.

Статус темы:
Закрыта.
  1. Altaya

    Altaya Active Member

    Регистрация:
    1 мар 2012
    Сообщения:
    35
    Симпатии:
    0
    Ребята, подскажите что я упустила. Сам код работает исправно, но при подстановке еще одного условия - ругается на несоответствие типов и ожидании объявления неизвестного.

    Часть кода:
    Код (LotusScript):
    askme = ws.Prompt (PROMPT_YESNO, "УСТАНОВКА",_
    "Выбрать другой документ?")
    If askme = 0 Then
    Set coll = ws.PickListCollection( _
    PICKLIST_CUSTOM, _
    True, _
    Server, TEST, _
    "test2", "Список", "Выберите документ")  
    If coll.Count = 0 Then
    Messagebox "Не выбран документ" ,, "ОШИБКА"
    Else
    tpl = doc.GetItemValue("tpl")             ' переменная Variant
    If tpl= "Значение1" Then
    Messagebox "Нельзя выбрать этот документ" ,, "ОШИБКА"
    Else
    Set doc = coll.GetFirstDocument
    Set item = doc.GetFirstItem("arss")
    Call item.CopyItemToDocument(doc1, "arss")
    Set item = doc.GetFirstItem("nv")
    Call item.CopyItemToDocument(doc1, "nv")
    If ( uidoc.FieldGetText("dng") = "Да" ) Then
    Call uidoc.FieldSetText( "dng", "Нет")
    End If
    End If
    End If
    Ругается на этих строках:
    tpl = doc.GetItemValue("tpl")
    If tpl= "Значение1" Then
    Messagebox "Нельзя выбрать этот документ" ,, "ОШИБКА"
    Else

    без них отрабатывает нормально, но без этого, естественно, условия.
     
  2. Medevic

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    tpl = doc.GetItemValue("tpl")(0)
    или If tpl(0) = "Значение1" Then
     
  3. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Altaya
    doc.GetItemValue("tpl") возвращает массив, соответственно нужно исправить либо
    tpl = doc.GetItemValue("tpl")(0)
    либо
    If tpl(0) = "Значение1" Then

    Добавлено
    Настоятельно рекомендую использовать опцию Option Declare и явно объявлять все переменные
     
  4. Altaya

    Altaya Active Member

    Регистрация:
    1 мар 2012
    Сообщения:
    35
    Симпатии:
    0
    Если я прописываю
    tpl = doc.GetItemValue("tpl")(0)
    If tpl(0) = "Значение1" Then
    скрипт отрабатывается, но не отрабатывает условие или выдает ошибку "variant does not contain a container"(
     
  5. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    при
    tpl = doc.GetItemValue("tpl")(0)

    так надо
    If tpl= "Значение1" Then
     
  6. Altaya

    Altaya Active Member

    Регистрация:
    1 мар 2012
    Сообщения:
    35
    Симпатии:
    0
    а так просто отрабатывает код без условия((
    попробую сейчас код с нуля написать, может что не так прописала или упустила
     
  7. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    кстати, а в tpl = doc.GetItemValue("tpl")(0) точно значение из doc надо проверять? ибо doc определяется ниже по коду.
     
  8. Altaya

    Altaya Active Member

    Регистрация:
    1 мар 2012
    Сообщения:
    35
    Симпатии:
    0
    Первое определение doc Set doc = ws.CurrentDocument.Document, потом идет передача значений полей из выбранного методом picklist в открытый
     
  9. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Altaya
    В строке
    Код (LotusScript):
                    Set doc = coll.GetFirstDocument
    Вы замещаете текущий открытый документ на выбранный в picklist. Используйте другое имя переменной, например, selectedDoc

    Добавлено
    А замечание OKEN относилось к тому, что конструкцию
    Код (LotusScript):
            If coll.Count = 0 Then
    ...
    Else
    tpl = doc.GetItemValue("tpl")(0)              ' переменная Variant
    If tpl= "Значение1" Then
    ...
    Else
    Set doc = coll.GetFirstDocument
    ...
    End If
    End If
    следует заменить на
    Код (LotusScript):
            If coll.Count = 0 Then
    ...
    Else
    Set doc = coll.GetFirstDocument
    tpl = doc.GetItemValue("tpl")(0)              ' переменная Variant
    If tpl= "Значение1" Then
    ...
    Else
    ...
    End If
    End If
     
  10. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    Меня еще пару моментов смутило - там дальше при копировании еще и какой-то doc1 используется - судя по словам, это и есть еще одна копия переменной для текущего документа (или, может, какой-то временный, из которого потом переносят данные в текущий). И в PickListCollection указана возможность мультивыбора, а проверяется только 1й документ. Дальше остальные обрабатываете или там мультивыбор не нужен?
     
  11. Altaya

    Altaya Active Member

    Регистрация:
    1 мар 2012
    Сообщения:
    35
    Симпатии:
    0
    В связи с тем что я в вашей сфере новичок, выкладываю весь код с комментариями. К сожалению, я еще не все ваши замечания воспринимаю в нужном контексте, приходится многое "переводить на общепринятый язык". Извините, пока еще не адаптировалась.
    Код (LotusScript):
    Sub Click(Source As Button)
    Dim session As New NotesSession
    Dim ws As New NotesUIWorkspace
    Dim db As NotesDatabase
    Dim view As NotesView
    Dim coll As NotesDocumentCollection
    Dim doc As NotesDocument                        ' документ, который выбирается из picklist
    Dim doc1 As NotesDocument              
    Dim uidoc As NotesUIDocument                ' открытый документ
    Dim typeopl As String
    Set db = session.CurrentDatabase
    Set doc = ws.CurrentDocument.Document
    Set uidoc = ws.CurrentDocument
    Set doc1 = uidoc.Document                    ' присваиваю открытому документы значение doc1
    askme = ws.Prompt (PROMPT_YESNO, "УСТАНОВКА",_
    "Будете выбирать документ из этой же категории?")
    If askme = 0 Then
    Set coll = ws.PickListCollection( _
    PICKLIST_CUSTOM, _
    True, _
    Server, TEST, _
    "test2", "Список категорий с документами", "Выберите документ") 
    If coll.Count = 0 Then
    Messagebox "Не выбран документ" ,, "ОШИБКА"
    Else
    If doc.GetItemValue("tpl")(0) = "Нл" Then
    Messagebox "Нельзя выбрать этот документ" ,, "ОШИБКА"
    Else
    Set doc = coll.GetFirstDocument             ' для передачи данных
    ' из выбранного дока, присваиваю ему значение выбранного документа в коллекции
    Set item = doc.GetFirstItem("arss")
    Call item.CopyItemToDocument(doc1, "arss")
    Set item = doc.GetFirstItem("nv")
    Call item.CopyItemToDocument(doc1, "nv")
    If ( uidoc.FieldGetText("dng") = "Да" ) Then
    Call uidoc.FieldSetText( "dng", "Нет")
    End If
    End If
    End If
    Else
    Set coll = ws.PickListCollection( _
    PICKLIST_CUSTOM, _
    True, _
    Server, TEST, _
    "test3", _
    "Документы текущей категории", "Выберите документ",_
    doc.getItemValue("clNum")(0))
    If coll.Count = 0 Then
    Messagebox "Не выбран документ" ,, "Ошибка"
    Else
    If doc.GetItemValue("tpl")(0) = "Нл" Then
    Messagebox "Нельзя выбрать этот документ" ,, "ОШИБКА"
    Else
    Set doc = coll.GetFirstDocument
    Set item = doc.GetFirstItem("arss")
    Call item.CopyItemToDocument(doc1, "arss")
    Set item = doc.GetFirstItem("nv")
    Call item.CopyItemToDocument(doc1, "nv")
    If ( uidoc.FieldGetText("dng") = "Да" ) Then
    Call uidoc.FieldSetText( "dng", "Нет")
    End If
    End If
    End If
    End If
    Call doc1.Save(True, True)
    End Sub
    Результат - отработка всего кода, но без условия.
    Извините, пока еще не догнала что где исправлять. Читаю ваши советы и постепенно вношу коррективы в код и черепную коробку)
     
  12. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    мне всё равно непонятно месторасположение условия:
    если тут doc - это текущий открытый документ, т.е. Set doc = ws.CurrentDocument.Document
    так в чем смысл спрашивать, предоставлять выбор, а потом говорить, что нельзя?
    если doc - это должен быть выбранный документ, т.е. Set doc = coll.GetFirstDocument , то надо строчки с проверкой опустить ниже Set doc = coll.GetFirstDocument
    nvy уже это показал выше, спасибо (не заметила его добавление к сообщению)
    Добавлено: судя по коду, надо убрать мультивыбор: Set coll = ws.PickListCollection( _
    PICKLIST_CUSTOM, _
    False, _
     
  13. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Altaya
    В чём глубокий смысл этого пассажа?
    Код (LotusScript):
        Set doc = ws.CurrentDocument.Document
    Set uidoc = ws.CurrentDocument
    Set doc1 = uidoc.Document
    В результате и doc, и doc1 указывают на один и тот же документ.
     
  14. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    имхо, понятнее было бы, если бы doc1 был текущий документ, а doc - выбранный, чтоб не было путаницы с тем, какой doc там имелся в виду
     
  15. Altaya

    Altaya Active Member

    Регистрация:
    1 мар 2012
    Сообщения:
    35
    Симпатии:
    0
    УРААААА!!!!
    Спасибо, разобралась. Жаль что столько времени ушло.
    1. В Picklist изменила True на False, так как выбрать нужно только 1 документ.
    2. Условие перенесла после объявления Set doc = coll.GetFirstDocument.

    И сразу все заработало. Есть пару моментов для доработки, но на это моих пока имеющихся знаний хватит.

    А суть в том, что есть готовый документ с полями, в которые при выборе из пиклист вносится доп.информация. Но если в документе в поле tpl стоит значение "Нл", то документ с таким параметром не подходит, и данные его в текущем документе сохраняться не должны.

    Всем ОГРОМНЕЙШЕЕ СПАСИБО, от меня + в репутацию))))
     
  16. Мыш

    Мыш Lotus team
    Lotus team

    Регистрация:
    12 фев 2008
    Сообщения:
    1.019
    Симпатии:
    8
    Согласен. Вы берете значение поля "tpl" из открытого в настоящий момент в клиенте Notes документа (того, который у вас на экране, грубо говоря) - а вовсе НЕ из выбранного из PickList.
    Кстати, смотрим дальше:
    Код (LotusScript):
    Set doc = ws.CurrentDocument.Document
    Set uidoc = ws.CurrentDocument
    Set doc1 = uidoc.Document
    В данном случае doc и doc1 - это один и тот же документ! Вопрос - зачем нужен doc1? :)

    PS. Млин, медленно печатаю... :-D
     
  17. Altaya

    Altaya Active Member

    Регистрация:
    1 мар 2012
    Сообщения:
    35
    Симпатии:
    0
    Все равно спасибо за помощь. Я еще не совсем все понимаю, учусь пока(((
    Почему Set doc = ws.CurrentDocument.Document я и сама еще не догнала, нашла где-то в хелпе, пока работает - пользуюсь.
    А присвоение doc1 = uidoc из-за невозможности к uidoc-у использовать нужные методы, подходящие только NotesDocument.
     
  18. Altaya

    Altaya Active Member

    Регистрация:
    1 мар 2012
    Сообщения:
    35
    Симпатии:
    0
    Тему закрываю.
     
Загрузка...
Статус темы:
Закрыта.

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