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

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

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

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

Dialogbox...

  • Автор темы Gor
  • Дата начала
G

Gor

Недавно столкнулся с такой проблемкой...
У меня на вьюхе очень много Actions для составления отчётов а отчёты все однотипные.
Вот захотелось бы как нибудь это структуризировать. Построить некое дерево. Создал кнопку одну на вьюхе которая вызывает - @DialogBox("tree";[AutoHorzFit] :[AutoVertFit] :[NoCancel]:[NoOkCancel];"Составление отчётов"). На Layout Повесил 6 Button - ов с выполнением разных отчётов.
И ситуация получилась такая... Когда вызываю Action появляется Dialogbox с моим Layoutom и кнопками для функций... но функции не отрабатываются ошибки одни и теже Object Variable not set.
Так вот вопрос такой как сделать так чтобы при нажатии на кнопку расположенную на вызванной Сабформе с определённым названием сначала закрывалась текущая сабформа а уж потом выполнялся отчёт соответствующий данной кнопке а дальше шло определение текущей вьюхи итд итп....В общем то хочется узнать как закрыть программно из LotusScript текущую сабформу а потом сразу перейти к дальнейшим действиям.
Ниже приведён пример кода на кнопке расположенной на сабформе (конечно же урезанный)

Код:
	Dim session As New NotesSession
Dim db As NotesDatabase
Dim cView As String
Dim formula As String
Dim supplier As String	
Dim doc As NotesDocument
Dim ws As New NotesUIWorkspace
Dim p,s,a,f As Variant
Set doc = New NotesDocument( session.currentDatabase )
Set ws = New NotesUIWorkspace



Set v = ws.CurrentView.View
Set db = session.CurrentDatabase

Call ws.DialogBox(".win.send", True, True, False, False, False, False, "Составление отчёта", doc )
p = doc.GetItemValue("datanac")(0)

p = Right(p,4) + ";" + Left(Right(p,7),2) + ";" + Left(p,2)
s = doc.GetItemValue("datakon")(0)

s = Right(s,4) + ";" + Left(Right(s,7),2) + ";" + Left(s,2)
a = doc.GetItemValue("vnk")(0)
f = doc.GetItemValue("vno")(0)
А может как нибудь ещё проще можно создать дерево для отчётов? структуризировать это всё?
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Попробуй в кнопки добавить код.
Код:
Dim ws As New NotesUIWorkspace
Call ws.RefreshParentNote
Call ws.CurrentDocument.Close
 
E

Elena Nefedova

Код:
Call ws.DialogBox(".win.send", True, True, False, False, False, False, "Составление отчёта", doc )
Надо:
Код:
b = ws.DialogBox(".win.send", True, True, False, False, False, False, "Составление отчёта", doc )
чтобы проверять, если Cancel нажато.

Какая переменная не установлена? doc?
 
G

Gor

Добавил в кнопки код
Код:
Sub Click(Source As Button)
On Error Goto Errhandle

Dim session As New NotesSession
Dim db As NotesDatabase
Dim cView As String
Dim formula As String
Dim supplier As String	
Dim vecoll 
[b]Dim ws As New NotesUIWorkspace[/b]	
Set ws = New NotesUIWorkspace
[b]	Call ws.RefreshParentNote
Call ws.CurrentDocument.Close[/b]	
Set v = ws.CurrentView.View
Set db = session.CurrentDatabase
Всё равно выводит ошибку при нажатии кнопки на сабформе - 91Object variable not set
Какая переменная не установлена определить не могу( не запускается почему то дебаггер...
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
В таких случаях надо в обработчике ошибок сделать вывод номера строки:
Код:
Errhandle:
Msgbox "Ошибка " + Error$ + " в строке " + Cstr(Erl)
 
G

Gor

Сейчас выводится ошибка NotesUIDocument object is no longer valid при нажатии на кнопку на сабформе(
 
E

Elena Nefedova

Чтобы работал дебаггер во вьюхе, надо включать его, пока база еще закрыта.
 
G

Gor

Затыкается на 14 строке - Object variable not set...
а при повторном нажатии уже выдаёт ошибку - NotesUIDocument object is no longer valid...
Код:
Sub Click(Source As Button)
On Error Goto Errhandle
Dim session As New NotesSession
Dim db As NotesDatabase
Dim cView As String
Dim formula As String
Dim supplier As String	
Dim doc As NotesDocument
Dim ws As New NotesUIWorkspace
Dim p,s,a,f As Variant
Set doc = New NotesDocument( session.currentDatabase )
Set ws = New NotesUIWorkspace
Call ws.RefreshParentNote
Call ws.CurrentDocument.Close
14 [color=#FF0000]Set v = ws.CurrentView.View
15 Set db = session.CurrentDatabase[/color]

с чем может быть связано? без дебаггера сложно понять....(
Sub click идёт из сабформы....а сабформа вызывется из Actions на вьюхе...
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Для: Gor, а дальше что? Вызываешь другой DialogBox? Если ты хочешь из одного DialogBox вызвать другой и при этом закрыть первый, то, имхо, ничего у тебя не получится.
 
E

Elena Nefedova

Значит, считает, что нет ничего в UI.
Можете проверить if ws.CurrentDocument Is Nothing then ...

Кстати, зачем у вас New NotesUIWorkspace 2 раза задается?
 
G

Gor

Для: Medevic
так и есть...ну по крайней мере задумка была такая....почему нет?
а может тогда как нибудь по другому структуризировать отчёты можно? :) Чтобы во вьюхе не 10 кнопок было на панели а чтобы можно было что нибудь вызвать с перечнем и по перечню перейти (все функции для отчётов строятся по текущей вьюхе)? дерево функций какое нить к примеру?
Или я просто мечтаю уже? :)
Просто Dialog Box я хотел использовать именно чтобы оттуда отчёты вызывать по перечню...
Для: Elena Nefedova
Кстати, зачем у вас New NotesUIWorkspace 2 раза задается?
копировал кусок кода не заметил... ну это не особо принципиально...
проверку тоже можно сделать...тут дело в том что можно в принципе или нет и если нет то как можно)
 
E

Elena Nefedova

Вариант 1 - присвоить отчетам некие внутренние номера и выбирать из них
Код:
	Redim arVariant(200)		' все лишние пустоты потом уберем с fulltrim
arVariant(0) = "Отчет утренний"
arVariant(1) = "Отчет дневной"	
arVariant(2) = "Отчет вечерний"	
v_variant = ws.Prompt(4, "Выбор отчета", "Укажите название отчета", arVariant(0), Fulltrim(arVariant))
If Isempty(v_variant) Or Isnull(v_variant) Then Goto EndLab
v_ind = Arraygetindex(arVariant, Cstr(v_variant))
После этого
Код:
	 select case v_ind
case 0
...

Вариант 2 - зарегистрировать каждый отчет в отдельном документе. При этом названия можно задавать иерархические, как то "Мыло\Хозяйственное"
Далее выбирать из вьюхи, категоризированной по имени отчета
 
D

Domino6

Алгоритм

1.Основной код в нем вызов диалога

2.В диалоге простая кнопка без кода которая выставляем признак действия (к примеру поле Action) и закрывает диалог с сохранение (т.е. возврат в основной код)

3. Считиваем код дейсвия и выполняем нужное

Смысл весь код в одном месте а из диалога регулируем что выполнять
 
Мы в соцсетях:

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