• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы Altaya
  • Дата начала
Статус
Закрыто для дальнейших ответов.
A

Altaya

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

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

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

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
tpl = doc.GetItemValue("tpl")(0)
или If tpl(0) = "Значение1" Then
 
N

nvyush

Altaya
doc.GetItemValue("tpl") возвращает массив, соответственно нужно исправить либо
tpl = doc.GetItemValue("tpl")(0)
либо
If tpl(0) = "Значение1" Then

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

Altaya

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

morpheus

при
tpl = doc.GetItemValue("tpl")(0)

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

Altaya

а так просто отрабатывает код без условия((
попробую сейчас код с нуля написать, может что не так прописала или упустила
 
H

hosm

кстати, а в tpl = doc.GetItemValue("tpl")(0) точно значение из doc надо проверять? ибо doc определяется ниже по коду.
 
A

Altaya

Первое определение doc Set doc = ws.CurrentDocument.Document, потом идет передача значений полей из выбранного методом picklist в открытый
 
N

nvyush

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
 
H

hosm

Меня еще пару моментов смутило - там дальше при копировании еще и какой-то doc1 используется - судя по словам, это и есть еще одна копия переменной для текущего документа (или, может, какой-то временный, из которого потом переносят данные в текущий). И в PickListCollection указана возможность мультивыбора, а проверяется только 1й документ. Дальше остальные обрабатываете или там мультивыбор не нужен?
 
A

Altaya

В связи с тем что я в вашей сфере новичок, выкладываю весь код с комментариями. К сожалению, я еще не все ваши замечания воспринимаю в нужном контексте, приходится многое "переводить на общепринятый язык". Извините, пока еще не адаптировалась.
Код:
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

Результат - отработка всего кода, но без условия.
Извините, пока еще не догнала что где исправлять. Читаю ваши советы и постепенно вношу коррективы в код и черепную коробку)
 
H

hosm

мне всё равно непонятно месторасположение условия:
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.
 
N

nvyush

Altaya
В чём глубокий смысл этого пассажа?
Код:
	Set doc = ws.CurrentDocument.Document
Set uidoc = ws.CurrentDocument
Set doc1 = uidoc.Document
В результате и doc, и doc1 указывают на один и тот же документ.
 
H

hosm

имхо, понятнее было бы, если бы doc1 был текущий документ, а doc - выбранный, чтоб не было путаницы с тем, какой doc там имелся в виду
 
A

Altaya

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

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

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

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

Мыш

Lotus Team
12.02.2008
1 219
29
BIT
66
если тут 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
 
A

Altaya

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

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