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

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

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

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

Как сделать правильный порядок кода в лотусе

Gandliar

Lotus Team
16.02.2004
556
26
BIT
40
Здравствуйте!

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

Проявляется на 8.5.3, 9

Помогите победить пожалуйста.

Пример кода
Код:
%REM
    Library r   
    Description: Comments for Library
%END REM
Option Public
Option Declare

%REM
    Property Get session
    Description: Comments for Property Get
%END REM
Static Private Property Get session As NotesSession
    Static this As NotesSession
    If this Is Nothing Then Set this = New NotesSession
    Set session = this
End Property


%REM
    Property Get db
    Description: Comments for Property Get
%END REM
Static Private Property Get db As NotesDatabase
    Static this As NotesDatabase
    If this Is Nothing Then Set this = session.Currentdatabase
    Set db = this
End Property


%REM
    Property Get viewWorkflow
    Description: Comments for Property Get
%END REM
Static Private Property Get viewWorkflow As NotesView
    Static this As NotesView
    If this Is Nothing Then
        Set this = db.Getview("workflow")
        Call this.Refresh()
        this.Autoupdate = False
    End If
End Property
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
217
Последнее редактирование:

Gandliar

Lotus Team
16.02.2004
556
26
BIT
40
Попробовал, не получается, видимо что то делаю не так

Если код не в правильной последовательности, получается что не видит методов класса.



Снимок.PNG
 

savl

Lotus Team
28.10.2011
2 599
311
BIT
193
Оптимальный вариант: ctrl + x / ctrl +v
eclipse редактор всегда перестраивает код, если меняется его последовательность использования.
Особенно это заметно когда git используешь.
В либе функции могут перемещаться вверх, так как они начинают использоваться раньше чем написаны.
Но при этом в редакторе они могут идти последовательно.

в данном случае, он не видит переменную db
там сразу под module name два свойства, но тела их пустые.
Не знаю зачем именно так делать, но наверное проще сделать это переменной/функцией

Добавлю:
я попробовал создать такую либу, ошибка повторяется и чтобы не делал, все равно лезет.
При этом хранит он правильно, но то ли собирает в UI не так, то ли что-то еще интересное.
Сначала думал 11.0.1FP2 виноват, потом откатил на FP1, но тоже самое.

И вот еще, если переписать вот так, то ошибки не будет:
Код:
Static Private Property Get db1 As NotesDatabase
    Static this As NotesDatabase
    If this Is Nothing Then Set this = session.Currentdatabase
    Set db1 = this
End Property

%REM
    Property Get viewWorkflow
    Description: Comments for Property Get
%END REM
Static Private Property Get viewWorkflow As NotesView
    Static this As NotesView
    Dim db As NotesDatabase
    Set db = db1
    If this Is Nothing Then
        Set this = db.Getview("workflow")
        Call this.Refresh()
        this.Autoupdate = False
    End If
End Property
 
  • Нравится
Реакции: Gandliar

Gandliar

Lotus Team
16.02.2004
556
26
BIT
40
И вот еще, если переписать вот так, то ошибки не будет:
Код:
Static Private Property Get db1 As NotesDatabase
    Static this As NotesDatabase
    If this Is Nothing Then Set this = session.Currentdatabase
    Set db1 = this
End Property

%REM
    Property Get viewWorkflow
    Description: Comments for Property Get
%END REM
Static Private Property Get viewWorkflow As NotesView
    Static this As NotesView
    Dim db As NotesDatabase
    Set db = db1
    If this Is Nothing Then
        Set this = db.Getview("workflow")
        Call this.Refresh()
        this.Autoupdate = False
    End If
End Property
Спасибо огромное! Отличное обходное решение!

Не знаю зачем именно так делать, но наверное проще сделать это переменной/функцией
С целью упрощения кода. Например есть библиотека с классами для работы с кадровой базой. В эту библиотеку засунуть статический проперти класс employeeManager. Таким образом подключив библиотеку в любой функции можно вызвать этот класс не заботясь об его объявлении, проверке на существование и так далее. А внутри класса/модуля также статические проперти, которые активируются по мере надобности и как бы кэшируются для переиспользования.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
217
@Gandliar я понимаю - что классы в нотусне вещь корявая, но в них проще с областями видимости, "пропадут" всякие статики и предварительная декларация ф-ций, вот ток при наследовании классов нужен порядок...
и неудобство - пересборка (ЛС) при изменении мемберов по ходу использования
не нужно "фиксировать родительские объекты (типа NotesDataBase) - чтобы не "унесло" NotesView, при потере области видимости ф-ции (привет статикам и пабликам в либах)
еще вывод информации облегчён - не нужно мудрить с именами либ...
Visual Basic:
    %REM
    *--------------------------------------------
        Function PrintTrace
        Description: Comments for Function
    %END REM
    Public Function PrintTrace(msg As String) As NotesRichTextItem
        Dim routineName As String
        routineName="PrintTrace"
        On Error GoTo ErrH
        'your code here
        Set PrintTrace=Me.PrintMsg(TypeName(Me) &{.} &GetThreadInfo(LSI_THREAD_CALLPROC) &{->} &msg)
'        If me.rtTrace Is Nothing Then GoTo Quit
'        Call me.rtTrace.AppendText(TypeName(Me) &{.} &GetThreadInfo(LSI_THREAD_CALLPROC) &{->} &msg)
'        Call me.rtTrace.Addnewline(1, True)
'        Set PrintTrace=me.rtTrace
Quit:
        Exit Function
ErrH:
        Error Err, RaiseError
        Resume Quit
    End Function
    %REM
    *--------------------------------------------
        Function PrintMsg
        Description: Comments for Function
    %END REM
    Function PrintMsg(msg As String) As NotesRichTextItem
        Dim routineName As String
        routineName="PrintMsg"
        On Error GoTo ErrH
        'your code here
        If me.rtTrace Is Nothing Then
            If me.doc Is Nothing Then
                Dim ses As New NotesSession
                Set me.msgdb=ses.CurrentDatabase
                Set me.doc=me.msgdb.Createdocument()
            End If
            Set me.rtTrace=me.doc.Createrichtextitem({body})
            Call doc.Replaceitemvalue({Form}, {Log})
        End If
        Call me.rtTrace.AppendText(msg)
        Call me.rtTrace.Addnewline(1, True)
        Set PrintMsg=me.rtTrace
Quit:
        Exit Function
ErrH:
        Error Err, RaiseError
        Resume Quit
    End Function
включение лога от вложенного класса:
Visual Basic:
            Dim rt As NotesRichTextItem, rt1 As NotesRichTextItem
            Set rt=Me.PrintMsg({***jsonService trace***})
            Set rt1=me.jsonService.PrintMsg({***end jsonService trace***})
            Call rt.Appendrtitem(rt1)
            rt.Update
потом я вывожу документ лога в интерактив, либо по ошибке, либо принудительно
Visual Basic:
    Function ShowLog() As NotesUIDocument
        Dim routineName As String
        routineName="ShowLog"
        On Error GoTo ErrH
        'your code here
        Dim wks As New NotesUIWorkspace
        If Not me.rtTrace Is Nothing Then
            'me.PrintMsg({***********************})
            me.rtTrace.Update
            Set ShowLog=wks.Editdocument(True, me.rtTrace.Parent)
        Else
            Print {Log doc is Nothig}
        End If
Quit:
        Exit Function
ErrH:
        Error Err, RaiseError
    End Function
 
Последнее редактирование:
  • Нравится
Реакции: Gandliar
Мы в соцсетях:

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