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)
А может как нибудь ещё проще можно создать дерево для отчётов? структуризировать это всё?
 
Попробуй в кнопки добавить код.
Код:
Dim ws As New NotesUIWorkspace
Call ws.RefreshParentNote
Call ws.CurrentDocument.Close
 
Код:
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?
 
Добавил в кнопки код
Код:
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
Какая переменная не установлена определить не могу( не запускается почему то дебаггер...
 
В таких случаях надо в обработчике ошибок сделать вывод номера строки:
Код:
Errhandle:
Msgbox "Ошибка " + Error$ + " в строке " + Cstr(Erl)
 
Сейчас выводится ошибка NotesUIDocument object is no longer valid при нажатии на кнопку на сабформе(
 
Чтобы работал дебаггер во вьюхе, надо включать его, пока база еще закрыта.
 
Затыкается на 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 на вьюхе...
 
Для: Gor, а дальше что? Вызываешь другой DialogBox? Если ты хочешь из одного DialogBox вызвать другой и при этом закрыть первый, то, имхо, ничего у тебя не получится.
 
Значит, считает, что нет ничего в UI.
Можете проверить if ws.CurrentDocument Is Nothing then ...

Кстати, зачем у вас New NotesUIWorkspace 2 раза задается?
 
Для: Medevic
так и есть...ну по крайней мере задумка была такая....почему нет?
а может тогда как нибудь по другому структуризировать отчёты можно? :) Чтобы во вьюхе не 10 кнопок было на панели а чтобы можно было что нибудь вызвать с перечнем и по перечню перейти (все функции для отчётов строятся по текущей вьюхе)? дерево функций какое нить к примеру?
Или я просто мечтаю уже? :)
Просто Dialog Box я хотел использовать именно чтобы оттуда отчёты вызывать по перечню...
Для: Elena Nefedova
Кстати, зачем у вас New NotesUIWorkspace 2 раза задается?
копировал кусок кода не заметил... ну это не особо принципиально...
проверку тоже можно сделать...тут дело в том что можно в принципе или нет и если нет то как можно)
 
Вариант 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 - зарегистрировать каждый отчет в отдельном документе. При этом названия можно задавать иерархические, как то "Мыло\Хозяйственное"
Далее выбирать из вьюхи, категоризированной по имени отчета
 
Алгоритм

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

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

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

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

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