Lotus script on error

Обработка ошибок Lotus Решение и ответ на вопрос 2071289

okupoko

0 / 0 / 0

Регистрация: 04.10.2007

Сообщений: 2,977

1

Обработка ошибок

30.05.2010, 11:58. Показов 76869. Ответов 64

Метки нет (Все метки)


Всем привет.

Пытаюсь тут наваять принципы обработки ошибок и обработчики поинтереснее придумать под LS.
Возник вопрос, а можно ли определить, что ошибка возникла в текущей процедуре, а не в вызванной из нее?
Понятно, что можно для каждой вызываемой процедуры объявить свой обработчик, ну, а без такового можно?

Кому интересно, из практики:
— результат функции не инициализируется, если в ней возникла необработанная исключительная ситуация, даже, если перед ее возникновением этот результат был назначен.
Т.е.:

LotusScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Function F1() As Variant
F1 = False
Error 1000, "Some error"
End Function
 
Sub Initialize()
так использовать нельзя
On Error Resume Next
If F1() Then
Msgbox "F1 returned True"
End If
 
так лучше
Dim F1Res as Variant
On Error Resume Next
F1Res = F1()
If F1Res Then
Msgbox "F1 returned True"
End If
 
причем, если F1Res используется для возврата значений нескольких функций, то перед вызовом функции ее (F1Res) необходимо сбрасывать!
Dim F2Res as Variant
On Error Resume Next
F2Res = True
F2Res = F1()  F1() не вернула результат, но и не сбросила состояние F2Res!!! F2Res == True из предыдущего состояния
If F2Res Then
ЭТОТ код выполнится ошибочно
Msgbox "F1 returned True"
End If
End Sub

Для решения этой проблемы, нужно иметь в функции обязательный обработчик, в котором происходит инициализация возвращаемого значения, при этом, ошибку необходимо передавать либо в результате, либо в иной структуре (возвращаемый параметр, глобальная переменная/объект).

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

30.05.2010, 11:58

64

ToxoRot

0 / 0 / 0

Регистрация: 04.11.2007

Сообщений: 3,019

30.05.2010, 12:16

2

юзай GetThreadInfo

LotusScript
1
2
3
4
5
6
7
8
9
10
11
12
13
Code    Meaning
LSI_THREAD_LINE Current Line Number
LSI_THREAD_PROC Name of current procedure
LSI_THREAD_MODULE   Name of current module
LSI_THREAD_VERSION  LotusScript version number
LSI_THREAD_LANGUAGE (Human) language setting
LSI_THREAD_COUNTRY  Country or region setting
LSI_THREAD_TICKS    Get current clock ticks
LSI_THREAD_TICKS_PER_SEC    Get clock ticks per second (supported only on platforms that support parallel processing primitives)
LSI_THREAD_PROCESS_ID   Get current process ID (supported only on platforms that support parallel processing primitives)
LSI_THREAD_TASK_ID  Get current task ID (supported only on platforms that support parallel processing primitives)
LSI_THREAD_CALLPROC Get the name of the calling procedure
LSI_THREAD_CALLMODULE   Get the name of the calling module

для обработки ошибок самое оно



0



0 / 0 / 0

Регистрация: 04.10.2007

Сообщений: 2,977

30.05.2010, 12:19

3

Цитата
Сообщение от ToxaRat

юзай GetThreadInfo

Когда-то я хотел на нем построить трассировку вызовов, но почему-то на каком-то из вызовов нотес падал. Есть объяснение?



0



mvyush

0 / 0 / 0

Регистрация: 19.04.2009

Сообщений: 2,219

30.05.2010, 12:28

4

Если лень объявлять обработчики в вызываемых процедурах, то можно, конечно, и такое сваять:

LotusScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Sub Test()
On Error Goto Err1
Call Sub1()
On Error Goto Err2
Call Sub2()
On Error Goto Errh
ExitProc:
Exit Sub
Err1:
Msgbox "Error call Sub1"
Resume ExitProc
Err2:
Msgbox "Error call Sub2"
Resume ExitProc
Errh:
Msgbox "Error in Test"
Resume ExitProc
End Sub

Я предпочитаю объявлять обработчики ошибок явно во всех вызываемых процедурах/функциях в стиле http://www.ferdychristant.com/… OMM-6BPT8R
P.S. Ни разу не удалось трассировкой вызовов уронить Лотус.



0



0 / 0 / 0

Регистрация: 04.10.2007

Сообщений: 2,977

30.05.2010, 12:43

5

Цитата
Сообщение от nvy

P.S. Ни разу не удалось трассировкой вызовов уронить Лотус

Може я особенный? На каком-то из N-уровней вложенности у меня стабильно валился клиент. Был какой-то из 6/7 нотесов.
Спасибо за статью!



0



0 / 0 / 0

Регистрация: 19.04.2009

Сообщений: 2,219

30.05.2010, 12:48

6

Цитата
Сообщение от Akupaka

Може я особенный? На каком-то из N-уровней вложенности у меня стабильно валился клиент. Был какой-то из 6/7 нотесов.

Где-то натыкался на информацию, что недокументированная функция Lsi_info не является thread-safe, т.е. если её дёргают несколько потоков, то можно уронить клиента/сервера. Особенно актуально для сервера. Поэтому лучше использовать GetThreadInfo.

P.S. Тут обсуждалось: http://www-10.lotus.com/ldd/nd6forum.nsf/C…3c?OpenDocument



0



0 / 0 / 1

Регистрация: 30.06.2007

Сообщений: 2,153

30.05.2010, 12:53

7

Я поступаю так же как nvy, обработчик ошибок в каждой процедуре/ф-ии локальный (т.е. не возвращает ошибку наверх).



0



0 / 0 / 0

Регистрация: 15.03.2009

Сообщений: 615

30.05.2010, 12:59

8

Цитата
Сообщение от Akupaka

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

и рыпку съесть и ….
хочеца одновременно и значение вернуть и исключение бросить? так не бывает
про getthreadinfo: можно смело использовать константы, объявленные в хелпе.
по теме есть классика от A. Guirard: http://www.ibm.com/developerworks/lotus/li…gLS2/index.html
Еще один вариант хэндлера попадался недавно в шаблоне discussion 8.5. (lslib)lsClassException.



0



0 / 0 / 0

Регистрация: 04.10.2007

Сообщений: 2,977

30.05.2010, 13:04

9

Цитата
Сообщение от Omh

Я поступаю так же как nvy, обработчик ошибок в каждой процедуре/ф-ии локальный (т.е. не возвращает ошибку наверх).

А он разве так делает? Если он делает так же как в статье, то там обработка ошибок поднимается наверх, но с трейсом.

nvy
Если я правильно помню, то я записывал значения из GetThreadInfo (но не помню точно или из LSI_info) в свой массив! Т.е. не так как в статье.
Так как в статье я тоже делаю обычно, только по-своему группирую. Но в случае с функциями так делать нельзя, почему писал выше.

Добавлено:

Цитата
Сообщение от turumbay

хочеца одновременно и значение вернуть и исключение бросить? так не бывает

Бывает, но надо немного допилить т.е. исключение «поднять» в вызывающей функции. Т.е. как в лотусе часто бывает — через жп.



0



0 / 0 / 0

Регистрация: 19.04.2009

Сообщений: 2,219

30.05.2010, 13:11

10

Цитата
Сообщение от Omh

Я поступаю так же как nvy, обработчик ошибок в каждой процедуре/ф-ии локальный (т.е. не возвращает ошибку наверх).

Не, я поступаю не так. В библиотеках обработчик ошибки возвращает ошибку наверх, а вот в кнопках и событиях ошибки обрабатываются и логируются. В результате всегда (почти) можно посмотреть, откуда у ошибки «ноги растут».

Добавлено:

Цитата
Сообщение от Akupaka

Но в случае с функциями так делать нельзя, почему писал выше.

При возникновении ошибки в функции возможны два подхода. Либо функция генерит ошибку и не возвращает ничего вразумительного, либо внутри себя сбрасывает ошибку и возвращает Null, Nothyng, Empty, False и т.д. Это к вопросу об использовании конструкцци On Error Resume Next — её использование оправдано в исключительных случаях (и побольшей части из-за лени программиста нормально обработать ошибки).



0



0 / 0 / 1

Регистрация: 30.06.2007

Сообщений: 2,153

30.05.2010, 13:31

11

Ну, значит, так как nvy, но ошибку наверх не возвращаю.
Другими словами, не так

Чёт я слажал немного
Смотрю в книгу, вижу фигу.



0



0 / 0 / 0

Регистрация: 04.12.2004

Сообщений: 3,329

30.05.2010, 13:34

12

Цитата
Сообщение от nvy

При возникновении ошибки в функции возможны два подхода. Либо функция генерит ошибку и не возвращает ничего вразумительного, либо внутри себя сбрасывает ошибку и возвращает Null, Nothyng, Empty, False и т.д. Это к вопросу об использовании конструкцци On Error Resume Next — её использование оправдано в исключительных случаях (и побольшей части из-за лени программиста нормально обработать ошибки).

Да можно и ошибку вернуть и значение. Только зачем?



0



0 / 0 / 1

Регистрация: 30.06.2007

Сообщений: 2,153

30.05.2010, 13:44

13

Вот кросс-тема, если кто не читал (насчёт резюм некст):



0



0 / 0 / 0

Регистрация: 15.03.2009

Сообщений: 615

30.05.2010, 14:06

14

Цитата
Сообщение от Akupaka

Бывает, но надо немного допилить ;) т.е. исключение «поднять» в вызывающей функции. Т.е. как в лотусе часто бывает — через жп.

Это не через жп. Это подход, принятый в цивилизованных языках, поддерживающих исключения. Если функция бросила исключение — она не возвращает результата. Грубо говоря — она возвращает объект исключения.

Цитата
Сообщение от Medevic

Да можно и ошибку вернуть и значение.

Ниче не понимаю… Если функция бросает исключение — она ничего не возвращает. Или не так? Можно конечно по сишной традиции возвращать код ошибки, а значение возвращать через входной параметр функции. Но речь вроде идет именно об исключениях?



0



0 / 0 / 0

Регистрация: 04.10.2007

Сообщений: 2,977

30.05.2010, 14:10

15

Цитата
Сообщение от turumbay

Это не через жп. Это подход, принятый в цивилизованных языках, поддерживающих исключения

Да? Значит я думаю через жп ))



0



0 / 0 / 0

Регистрация: 07.02.2010

Сообщений: 1,063

30.05.2010, 14:26

16

А если ошибка возникает уже в обработчике ошибки? Скажем, обработчик уже произошедшей ошибки хочет отправить сообщение по почте, создать документ в базе, зачистить какие-то файлы на уровне ОС и т.п. — и вновь вызывает ошибку. Я в таких случаях пишу «… resume next»…



0



0 / 0 / 0

Регистрация: 15.03.2009

Сообщений: 615

30.05.2010, 14:28

17

Цитата
Сообщение от Akupaka

Да? Значит я думаю через жп ))

Меня бы лично такое поведение(значение + exception) повергло в шок:
Пользователь: Компьютер, скока будет дважды два?
Компьютер: Четыре, и, кстати, у тебя канал до сервера отвалился!
Как документировать такую функцию: всегда возвращает верное значение, но иногда при этом бросает ошибку?
Очевидно напрашивается разделение функции на две, каждая из которых будет занимаца своим делом.



0



0 / 0 / 0

Регистрация: 04.12.2004

Сообщений: 3,329

30.05.2010, 14:38

18

Цитата
Сообщение от turumbay

Ниче не понимаю… Если функция бросает исключение — она ничего не возвращает. Или не так? Можно конечно по сишной традиции возвращать код ошибки, а значение возвращать через входной параметр функции. Но речь вроде идет именно об исключениях?

Исключение мы обработаем внутри. Но с помощью Err можно узнать номер ошибки после выхода из функции. И при желании вызвать еще одно исключение.
Короче, пример. В результате получим и 5, и обработаем ошибку.

Код

Sub test
On Error Goto e
Msgbox(Cstr(errtest))
If Err Then Error Err
Exit Sub
e:
Msgbox Error
Resume
End Sub

Function errtest As Long
On Error Goto e
Dim a As Long, b As Long
b = 1
errtest = 5
errtest = b / 0
Exit Function
e:
Exit Function
End Function



0



0 / 0 / 0

Регистрация: 07.02.2010

Сообщений: 1,063

30.05.2010, 14:48

19

Цитата
Сообщение от Medevic

В результате получим и 5, и обработаем ошибку.

А какая польза-то от этой пятерки? Она же не есть правильное значение, полученное в результате выполнения функции. Хотя если использовать возвращаемое значение как нумератор строк кода… ;)



0



0 / 0 / 0

Регистрация: 04.12.2004

Сообщений: 3,329

30.05.2010, 14:49

20

Цитата
Сообщение от Мыш

А какая польза-то от этой пятерки? Она же не есть правильное значение, полученное в результате выполнения функции. Хотя если использовать возвращаемое значение как нумератор строк кода… ;)

Да хз. Я таким не пользуюсь.



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

30.05.2010, 14:49

Помогаю со студенческими работами здесь

Обработка ошибок
используй erl()
только если в строке с ошибкой нету номера строки erl() возвращает 0

Обработка ошибок
Господа, как можно обеспечить обработку ошибок. Например, человек ввёл букву вместо цифры.Заранее…

Обработка ошибок
Не подскажите, где можно найти материал на эту тему..

обработка ошибок
Привет!
Я реализовываю вывод сообщений пользователю через ajax, и никак не пойму, как это сделать…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

20

I’m a little lost as to how to continue the program execution with this LotusScript snippet. It extracts all the documents from a view, however, it is hitting a certain document that contains an ‘Overflow’ error which stops the program, rather than ignoring this and continuing to the next document. The error message is being printed out, so it’s clear that the code is entering the ErrorHandler, and then subsequently ends.

Option Public
Option Declare

Sub Initialize
    'init stuff, etc

    Set view = db.getView("Main")
    Set doc = view.getFirstDocument()
    Set lastDoc = view.getLastDocument()
    k = 0

    While (Not doc is Nothing)
        dealId = doc.DealId(0)
        If(doc.HasEmbedded) Then 
            Set body = doc.GetFirstItem("Body")         
            If(Not body Is Nothing) Then 
                'code to extract all attachments on a document
            End If
        End If

nextDoc:
        Set doc = view.getNextDocument(doc)
        k = k + 1
    Wend    
    Exit Sub 

errHandler:
    Print "Get error when process document with dealId=" & dealId & " at line " & CStr(Erl) & ". Err=" & CStr(Err) & ", error=" & Error
    GoTo nextDoc
    'this should continue execution of nextDoc
End Sub

Renaud Tarnec's user avatar

asked Jan 14, 2016 at 15:37

logeyg's user avatar

2

Add a line

On Error GoTo errHandler

before While and replace line after Print with

Resume nextDoc

Your code might cause an infinite loop though. If for example view «Main» is not available, the line
Set view = db.getView("Main") would cause an error. Execution would jump to errHandler and from there to nextDoc. The line Set doc = view.getNextDocument(doc) would throw an error too as doc is Nothing. Execution would jump to errHandler and from there to nextDoc and… we have an infinitive loop.

You can avoid this with an error handling like this:

nextDoc:
        Set doc = view.getNextDocument(doc)
        k = k + 1
    Wend    

finito:
    Exit Sub 

errHandler:
    If doc is Nothing then
        Print "This is a serious error before while..."
        Resume finito
    Else
        Print "Get error when process document with dealId=..."
        Resume nextDoc
    End If
End Sub

answered Jan 14, 2016 at 15:41

Knut Herrmann's user avatar

Knut HerrmannKnut Herrmann

30.8k4 gold badges31 silver badges66 bronze badges

2

Класс NotesUIWorkspace – текущее рабочее пространство, отображаемое в текущем окне. Это может быть, или рабочее пространство (рабочий стол Notes), или открытый в настоящее время документ.

В рабочем пространстве можно открыть и представления, но лучше это сделать с помощью класса NotesUIView. Если в представлении присутствует кнопка действия, при помощи которой добавляются, удаляются, или изменяются документы, имеющиеся в представлении, то можно работать с сервером. Для того, чтобы сделанные изменения были видны пользователю можно использовать метод ViewRefresh класса NotesUIWorkspace. Если не применять этот метод, то пользователь не будет знать, что представление изменилось.

Класс NotesUIDatabase имеет 2 метода:

1.OpenView.

2.OpenNavigator.

Объект этого класса служит, прежде всего, для размещения в нем сценариев, присоединенных к событиям БД (например, события PostOpen, QueryClose и др.). Свойство Documents класса NotesUIDatabase предоставляет доступ ко всем документам базы данных.

Документ, открытый в данный момент и отображаемый в рабочем пространстве, является объектом класса NotesUIDocument. Над ним можно выполнять различные действия: перемещать курсор, вносить текстовую информацию в поле, извлекать содержимое поля, обновлять документ, отправлять его по почте. С помощью свойства Document этого класса, можно получить доступ к документу сервера. Метод Refresh, существующий только в классе NotesUIDocument, обновляет текущий документ, вновь выполняя все формулы входной трансляции, входной проверки и формулы вычисляемых полей. Метод Reload обновляет документ клиента, внося в него изменения, которые были выполнены в документе сервера. Метод Reload необходим только в том случае, если для свойства AvtoReload объекта NotesUIDocument установлено false. По умолчанию AvtoReload = True. Если выполняется множество изменений в документе сервера, то устанавливаем AvtoReload = False и после того, как все изменения в документе будут выполнены, вызываем метод Reload.

В агентах, запускаемых на сервере нельзя использовать UI-классы и подключать библиотеки, использующие эти классы.

1.5 Обработка ошибок

Ошибки бывают 2-х типов: ошибки компиляции и ошибки выполнения. Сообщение об ошибке компиляции отображается в нижней части экрана в окне

19

с раскрывающимся списком Errors, пока не будут исправлены все ошибки компиляции, программа не запустится.

Ошибки, которые обнаруживаются только во время выполнения программы, называются ошибками выполнения. Они могут быть различного типа. Рассмотрим функции и операторы языка Lotus Script, облегчающие обработку ошибок:

1.Функция Erl возвращает номер строки, где произошла ошибка;

2.Функция Err возвращает номер текущей ошибки;

3.Оператор Err устанавливает номер текущей ошибки;

4.Функция Error (Error$) возвращает сообщение о текущей ошибке (заранее определенный номер ошибки);

5.Оператор Error генерирует заранее определенный номер ошибки и сообщение о ней;

6.Оператор On Error указывает имя подпрограммы обработки ошибок или определяет, как обрабатывать ошибки (или все, или только какого-либо определенного типа);

7.Оператор Resume указывает, каким образом будет продолжено выполнение программы после ошибки.

Когда происходит ошибка, текущая процедура проверяется на наличие оператора On Error. Если он найден, то он выполняется. Если нет, то проверяется процедура, вызвавшая данную процедуру (если она есть). Если находится оператор On Error, то он выполняется, иначе проверяется следующая вызывающая процедура и т.д. Если подпрограмма обработки данной ошибки не будет найдена, то на экран выводится сообщение об ошибке и выполнение программы прекращается.

Операторы Err и Error используются для установки или генерации ка- ких-либо ошибок и часто применяются при тестировании подпрограмм обработки ошибок (особенно собственных).

Оператор On Error может содержать номер ошибки. Когда происходит ошибка с этим номером, то управление передается подпрограмме обработки ошибок, которая задана в операторе On Error. Но оператор On Error может и не содержать номера ошибки, тогда управление передается указанной в операторе подпрограмме обработки ошибок при возникновении любой ошибки не указанной ни в одном другом операторе On Error. В программе может быть любое количество операторов On Error. Все они обрабатывают ошибки определенных типов, за исключением одного оператора, который обрабатывает все остальные. Если для одного номера ошибки задаются 2 оператора On Error, то выполняться будет последний из них.

20

Существует 5 конструкции операторов, которые могут следовать за оператором On Error:

а) goto label; б) resume next; в) goto 0;

г) resume 0;

д) resume label.

Конструкция goto label при возникновении ошибки передает управление оператору, следующему за меткой label. Конструкция resume next передает управление оператору, следующему за оператором, вызвавшим ошибку (продолжить, не обращая внимания на ошибку). Конструкция Goto 0 указывает, что в текущей процедуре ошибка не должна обрабатываться.

Оператор resume 0 указывает на то, что оператор, вызвавший ошибку, должен быть выполнен снова. Оператор resume label передает управление оператору, следующему за меткой label (resume label используется только в подпрограммах обработки ошибок). Оператор resume также восстанавливает значение функций Err, Erl, Error. Когда они сброшены, то это означает, что либо ошибок нет, либо все они обработаны.

Используя функцию Erl можно вывести на экран пользователю номер строки оператора, вызвавшего ошибку.

При обработке ошибок часто применяется оператор Exit sub, который служит в качестве точки выхода из процедуры, если она завершается нормально, т.е. ошибки отсутствуют.

Ошибки можно задавать не только номером, но и с помощью символических имен констант.

Пример. On Error ErrFileNotFound Goto m1

Эти константы хранятся в файлах LSERR.LSS, LSXUIERR.LSS, LSXBEERR.LSS.

1.6 Взаимодействие с пользователем: функции MessageBox, InputBox, метод DialogBox

Функция MessageBox выводит на экран информацию для пользователя. Функция InputBox обеспечивает ввод пользователем информации в программу. Метод DialogBox отображает на экране форму или документ в диалоговом окне.

21

При использовании этих функций и метода необходимо подключить к программе файл констант LsConst.lss, тогда можно будет использовать имена констант в качестве аргументов.

Функцию MessageBox можно записать в виде MsgBox.

Пример.

RetCode=MessageBox(“Вы хотите продолжить?”, MB_YESNOCANCEL).

Переменной RetCode присваивается значение, возвращаемое функцией MessageBox – число, указывающее какую кнопку выбрал пользователь.

Существует и оператор MessageBox, который не возвращает ни какого значения.

Пример. MessageBox “ошибка”, MB_OK.

Формат функции MessageBox MessageBox (message[,[buttons+icon+default+mode][, boxTitle]])

Аргумент Message – текстовое сообщение, которое будет отображаться в окне. Каждый из аргументов Buttons, Icon, Default, Mode – целые числа, объединение этих чисел в одно определяет, как окно сообщений будет выглядеть и функционировать. Аргумент Buttons определяет, какие кнопки будут отображаться в окне (значения можно задавать цифрами или константами (см. в таблице 1.6)). Аргумент Icon определяет, какая пиктограмма может отображаться в окне сообщения (см. в таблице 1.7). Аргумент Default определяет, какая кнопка будет считаться нажатой по умолчанию, если пользователь нажимает пробел или ввод (см. в таблице 1.8). Аргумент Mode определяет, будет ли окно сообщения окном модального приложения (выполнение текущего приложения останавливается до тех пор, пока пользователь не даст ответ в окне сообщения) или окном системного модального приложения (выполнение всех приложений останавливается до тех пор, пока пользователь не даст ответ в окне сообщения), подробнее см. в таблице 1.9. Аргумент BoxTitle – строковая переменная, длинной до 128 символов, значение которой отображается в области заголовка окна.

Таблица 1.6 – Возможные значения аргумента Button

Имя константы

Значение

Кнопки

MB_OK

0

OK

MB_OKCANCEL

1

OK, Cancel

MB_ABORTRETRYCANCEL

2

Abort, Retry, Cancel

MB_YESNOCANCEL

3

Yes, No, Cancel

MB_YESNO

4

Yes, No

MB_RETRYCANCEL

5

Retry,Cancel

22

Таблица 1.7 – Возможные значения аргумента Icon

Имя константы

Значение

Пиктограмма

MB_ICONSTOP

16

Знак «стоп»

MB_ICONQUESTION

32

Вопросительный знак

MB_ICONEXCLAMATION

48

Восклицательный знак

MB_ICONINFORMATION

64

Информация

Таблица 1.8 – Возможные значения аргумента Default

Имя константы

Значение

Кнопка, нажимаемая по умолчанию

MB_DEFBUTTON1

0

Первая кнопка

MB_DEFBUTTON2

256

Вторая кнопка

MB_DEFBUTTON3

512

Третья кнопка

Таблица 1.9 – Возможные значения аргумента Mode

Имя константы

Значение

Режим

MB_APPLMODAL

0

Приложение

MB_SYSTEMMODAL

4096

Система

Пример. 3 способа кодирования окна сообщения.

1)ret=MessageBox (“продолжить?”, 4387, “ошибка!”)

2)ret=MessageBox (“продолжить?”, 3+32+256+4096, “ ошибка!”)

3)ret=MessageBox ( “продолжить?”, MB_YESNOCANCEL+ MB_ICONQUESTION+ MB_DEFBUTTON2+MB_SYSTEMMODAL, “ ошибка!”)

Функция MessageBox возвращает целое число, которое может быть представлено в виде имени константы (см. в таблице 1.10).

Таблица 1.10 – Возможные значения аргумента Button

Значение

Кнопка

Константа

1

OK

IDOK

2

Cancel

IDCANCEL

3

Abort

IDABORT

4

Retry

IDRETRY

5

Ignore

IDIGNORE

6

Yes

IDYES

7

No

IDNO

23

Функция InputBox позволяет пользователю вводить в окне данные и передает их в программу. Существуют 2 разновидности InputBox:

1)InputBox, которая возвращает данные типа variant;

2)InputBox$, которая возвращает строковые данные.

Формат описания функции InputBox InputBox[$]( prompt[,[title][,[Default][,Xpos, Ypos]]]).

Аргумент Promt – строка, длинной до 128 символов, определяющая текст в окне ввода. Аргумент Title – заголовок окна (до 128 символов). Аргумент Default – величина, которая отображается в редактируемом поле окна ввода. Аргументы Xpos, Ypos – расстояние в пикселях от верхнего левого угла экрана до верхнего угла окна вывода по горизонтали и вертикали соответственно.

Пример. InputBox$ (“введите количество гаражей” , “ число” , 30)

Применяя функцию InputBox, необходимо преобразовывать возвращаемые значения (данные типа Variant) в данные требуемого типа.

Метод DialogBox позволяет отображать определенную форму в диалоговом окне. Информация, введенная пользователем в форме, передается в поля базового документа формы. Основное отличие метода DialogBox от функции @DialogBox – то, что с помощью метода можно отображать не только текущий документ, но и любой другой документ в базе данных.

Вопросы для самоконтроля

1.Преимущества языка программирования Lotus Script.

2.Что такое суффикс типа?

3.Как можно задавать константы в Lotus Script?

4.Что такое литерал?

5.Как объявить переменную в Lotus Script?

6.Применение оператора Deftype.

7.Как описываются массивы в Lotus Script?

8.Особенности работы со списками и данными типа Variant.

9.Блочные операторы в языке Lotus Script.

10.Какие существуют в Lotus Script блочные операторы цикла?

11.Перечислите операторы ветвления и прерывания в Lotus Script.

12.Особенности работы с полями в Lotus Script.

13.Как описываются функции и процедуры в Lotus Script?

14.На какие две большие группы разделяются все классы Domino?

15.Объявление объектной ссылки.

16.Перечислите основные клиентские классы.

24

17.На какие 2 группы можно разделить ошибки в Lotus Script?

18.Перечислите основные функции и операторы языка Lotus Script, позволяющие обрабатывать ошибки?

19.Особенности использования оператора On Error.

20.Зачем используются операторы Err, Error?

21.Перечислите и кратко охарактеризуйте конструкции операторов, которые могут следовать за оператором On Error.

22.Формат описания и область применения функции MessageBox.

23.Функция InputBox, метод DialogBox.

Задание

Напишите на LotusScript проверку заполнения обязательных полей на форме с выводом сообщения и передачей фокуса ввода на незаполненное или неправильно заполненное поле. Необходимо использовать обработчики событий Exiting поля, QuerySave формы. Для вывода сообщений необходимо использовать как функцию MessageBox, так и функцию InputBox.

25

Тема 2 РАБОТА С ДОКУМЕНТАМИ-ОТВЕТАМИ

2.1 Подчиненные формы и общие поля

Подчиненные формы (подформы, subforms) не используются самостоятельно, а могут быть вставлены в другие формы, в том числе и программно. Одну и ту же подформу можно вставить в несколько форм, т.е. подчиненные формы – повторно используемый ресурс. Процесс создания подчиненных форм ни чем не отличается от процесса создания обычных форм. Подформы создаются в Shared Code Æ SubForms. Для включения подчиненной формы в обычную форму необходимо:

1)Открыть основную форму в режиме конструктора и поместить курсор

вто место, куда необходимо вставить подчиненную форму;

2)Выбрать команду меню Create Æ Resource Æ Insert SubForm;

3)В появившемся окне выбрать требуемую подформу.

Общие поля (shared fields) применяются, когда необходимо использовать одно и тоже поле в нескольких формах. В этих полях общими элементами являются свойства и формулы, но не данные! Общее поле можно создать,

выполнив команду меню Create Æ Design Æ Shared Field или сделать существующее поле общим (DesignÆShare This Field). Уже созданные общие поля можно вставлять в форму, выполнив команду меню Create Æ Resource Æ Insert Shared Field, команду Insert Shared Field всплывающего меню или с помощью пиктограммы панели пиктограмм. После создания общего поля откроется окно его свойств. После установки свойств поля можно написать формулы в определенных событиях, точно также как это делается и в других элементах дизайна. Единственное отличие состоит в том, что панель Design не отображается

винтегрированной среде разработки, так как проектируется не форма.

2.2Работа с идентификаторами документов в языке формул

1) Функция @DocumentUniqueID

Область применения: нельзя использовать в формулах навигатора. В формулах полей создает ссылку (DocLink) на текущий документ.

Данная функция возвращает так называемый универсальный идентификатор документа (UNID) – 32-х символьную комбинацию шестнадцатитиричных цифр, уникально идентифицирующую текущий документ во всех репликах распределенной базы.

26

Универсальный идентификатор документа можно посмотреть в окне свойств документа на последней закладке в первых двух строках после метки ”ID”, отбросив символы OF в начале и ON в середине.

Рисунок 2.1 – Последняя закладка свойств документа

Domino генерирует универсальный идентификатор при создании документа. Первые его 16 символов представляют собой дату-время создания документа (с точность до тиков), а вторые 16 символов – случайное число. Domino проверяет, не оказалось ли в текущей реплике базы документа с таким же универсальным идентификатором, и если это так, то снова случайно генерирует вторые 16 символов. После сохранения документа в базе данных его универсальный идентификатор не изменяется. Исключение составляют случаи, когда документ копируется в базу через буфер обмена или пересылается почтой – перед помещением документа в базу проверяется, не существует ли в ней уже документ с таким же универсальным идентификатором, и если это так, то для добавляемого в базу документа генерируется новый универсальный идентификатор. С помощью Lotus Script программист может самостоятельно изменять UNID документа, но в этом случае необходимо самостоятельно заботиться об уникальности UNID.

Третья и четвертая строки после метки ”ID” содержат информацию, специфичную в каждой реплике распределенной базы [9].

Многие понятия и алгоритмы Domino, прежде всего «дерево» докумен- тов-ответов, базируются на универсальных идентификаторах документов. Так документ-ответ всегда содержит предопределенное поле с именем $Ref, в ко-

тором хранится универсальный идентификатор документа-родителя для данного документа-ответа. В поле $Ref отображается на 2 символа больше (всего 34): добавляются символы F и N (из OF и ON соответственно).

Пример. Формула столбца представления выводит в этом столбце для некоторого документа его UNID.

@Text(@DocumentUniqueID)

27

2) Функция @InheritedDocumentUniqueID

Область применения: нельзя использовать в формулах навигатора. Предназначена для работы с документами, созданными по форме с включенной опцией наследования полей. Если опция не включена, то возвращает такое значение, что и функция @DocumentUniqueID. В формулах полей создает ссылку (DocLink) на текущий документ.

Данная функция возвращает универсальный идентификатор документа, который был текущим в момент создания документа, в котором используется эта функция.

3) Функция @NoteID

Область применения: нельзя использовать в формулах формы и навига-

тора.

Данная функция возвращает восьмисимвольный идентификатор документа в базе – строку с префиксом NT, например, NT000008FA (последняя строка последней закладки в окне свойств документа, см. рис. 2.1). @NoteID уникально идентифицирует документ только в текущей базе данных.

4) Функция @GetDocField(UNID; имя_поля)

Область применения: нельзя использовать в формулах отбора, колонок, всплывающих окон и навигатора.

Для текущей базы данных функция возвращает значение поля с именем имя_поля из документа с универсальным идентификатором UNID. Параметр имя_поля – строка, указывается в кавычках. Возвращаемое значение зависит от типа поля: строка или список строк, число или список чисел, дата-время или временной диапазон. Если задан не существующий UNID или поле, то возвращается пустая строка.

Пример. Вычисляемое поле в документе-ответе всегда будет содержать значение поля Subject из главного документа. Когда создается новый документответ, то значение в вычисляемом поле наследуется из главного документа.

@If (@IsNewDoc; Subject; @GetDocField ($Ref; ”Subject”))

5) Функция @SetDocField(UNID; имя_поля; новое_значение)

Область применения: нельзя использовать в формулах отбора, колонок, всплывающих окон и навигатора.

Для текущей базы данных функция присваивает новое значение полю с именем имя_поля в документе с универсальным идентификатором UNID. Па-

28

Соседние файлы в папке Лаб работы domino

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Lotro game error 128
  • Lost connection to mysql server at reading initial communication packet system error 104
  • Lost connection to mysql server at handshake reading initial communication packet system error 11
  • Loop without do ошибка vba
  • Lookup error nltk

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии