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

Статус
Закрыто для дальнейших ответов.

Altaya

Active Member
01.03.2012
34
0
35
Москва
#1
Ребята, подскажите что я упустила. Сам код работает исправно, но при подстановке еще одного условия - ругается на несоответствие типов и ожидании объявления неизвестного.

Часть кода:
Код:
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

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

nvyush

Well-Known Member
Lotus team
22.04.2009
2 317
0
48
Подмосковье
#3
Altaya
doc.GetItemValue("tpl") возвращает массив, соответственно нужно исправить либо
tpl = doc.GetItemValue("tpl")(0)
либо
If tpl(0) = "Значение1" Then

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

Altaya

Active Member
01.03.2012
34
0
35
Москва
#4
Если я прописываю
tpl = doc.GetItemValue("tpl")(0)
If tpl(0) = "Значение1" Then
скрипт отрабатывается, но не отрабатывает условие или выдает ошибку "variant does not contain a container"(
 

Altaya

Active Member
01.03.2012
34
0
35
Москва
#6
а так просто отрабатывает код без условия((
попробую сейчас код с нуля написать, может что не так прописала или упустила
 

hosm

* so what *
18.05.2009
2 442
9
42
Kiev, Ukraine
#7
кстати, а в tpl = doc.GetItemValue("tpl")(0) точно значение из doc надо проверять? ибо doc определяется ниже по коду.
 

Altaya

Active Member
01.03.2012
34
0
35
Москва
#8
Первое определение doc Set doc = ws.CurrentDocument.Document, потом идет передача значений полей из выбранного методом picklist в открытый
 

nvyush

Well-Known Member
Lotus team
22.04.2009
2 317
0
48
Подмосковье
#9
Altaya
В строке
Код:
				Set doc = coll.GetFirstDocument
Вы замещаете текущий открытый документ на выбранный в picklist. Используйте другое имя переменной, например, selectedDoc

Добавлено
А замечание OKEN относилось к тому, что конструкцию
Код:
		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
следует заменить на
Код:
		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
 

hosm

* so what *
18.05.2009
2 442
9
42
Kiev, Ukraine
#10
Меня еще пару моментов смутило - там дальше при копировании еще и какой-то doc1 используется - судя по словам, это и есть еще одна копия переменной для текущего документа (или, может, какой-то временный, из которого потом переносят данные в текущий). И в PickListCollection указана возможность мультивыбора, а проверяется только 1й документ. Дальше остальные обрабатываете или там мультивыбор не нужен?
 

Altaya

Active Member
01.03.2012
34
0
35
Москва
#11
В связи с тем что я в вашей сфере новичок, выкладываю весь код с комментариями. К сожалению, я еще не все ваши замечания воспринимаю в нужном контексте, приходится многое "переводить на общепринятый язык". Извините, пока еще не адаптировалась.
Код:
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
Результат - отработка всего кода, но без условия.
Извините, пока еще не догнала что где исправлять. Читаю ваши советы и постепенно вношу коррективы в код и черепную коробку)
 

hosm

* so what *
18.05.2009
2 442
9
42
Kiev, Ukraine
#12
мне всё равно непонятно месторасположение условия:
If doc.GetItemValue("tpl")(0) = "Нл" Then
Messagebox "Нельзя выбрать этот документ" ,, "ОШИБКА"
Else
если тут doc - это текущий открытый документ, т.е. Set doc = ws.CurrentDocument.Document
так в чем смысл спрашивать, предоставлять выбор, а потом говорить, что нельзя?
если doc - это должен быть выбранный документ, т.е. Set doc = coll.GetFirstDocument , то надо строчки с проверкой опустить ниже Set doc = coll.GetFirstDocument
nvy уже это показал выше, спасибо (не заметила его добавление к сообщению)
Добавлено: судя по коду, надо убрать мультивыбор: Set coll = ws.PickListCollection( _
PICKLIST_CUSTOM, _
False, _
Set notesDocumentCollection = notesUIWorkspace.PickListCollection( type% [, multipleSelection ], server$, databaseFileName$, viewName$, title$, prompt$ [, Singlecategory$ ] )

multipleSelection
Boolean. Optional. Specify True if you want to select multiple documents. Defaults to False.
 

nvyush

Well-Known Member
Lotus team
22.04.2009
2 317
0
48
Подмосковье
#13
Altaya
В чём глубокий смысл этого пассажа?
Код:
	Set doc = ws.CurrentDocument.Document
Set uidoc = ws.CurrentDocument
Set doc1 = uidoc.Document
В результате и doc, и doc1 указывают на один и тот же документ.
 

hosm

* so what *
18.05.2009
2 442
9
42
Kiev, Ukraine
#14
имхо, понятнее было бы, если бы doc1 был текущий документ, а doc - выбранный, чтоб не было путаницы с тем, какой doc там имелся в виду
 

Altaya

Active Member
01.03.2012
34
0
35
Москва
#15
УРААААА!!!!
Спасибо, разобралась. Жаль что столько времени ушло.
1. В Picklist изменила True на False, так как выбрать нужно только 1 документ.
2. Условие перенесла после объявления Set doc = coll.GetFirstDocument.

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

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

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

Мыш

Well-Known Member
Lotus team
12.02.2008
1 084
13
#16
если тут doc - это текущий открытый документ, т.е. Set doc = ws.CurrentDocument.Document
так в чем смысл спрашивать, предоставлять выбор, а потом говорить, что нельзя?
Согласен. Вы берете значение поля "tpl" из открытого в настоящий момент в клиенте Notes документа (того, который у вас на экране, грубо говоря) - а вовсе НЕ из выбранного из PickList.
Кстати, смотрим дальше:
Код:
Set doc = ws.CurrentDocument.Document
Set uidoc = ws.CurrentDocument
Set doc1 = uidoc.Document
В данном случае doc и doc1 - это один и тот же документ! Вопрос - зачем нужен doc1? :)

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

Altaya

Active Member
01.03.2012
34
0
35
Москва
#17
Все равно спасибо за помощь. Я еще не совсем все понимаю, учусь пока(((
Почему Set doc = ws.CurrentDocument.Document я и сама еще не догнала, нашла где-то в хелпе, пока работает - пользуюсь.
А присвоение doc1 = uidoc из-за невозможности к uidoc-у использовать нужные методы, подходящие только NotesDocument.
 
Статус
Закрыто для дальнейших ответов.