• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Временный список

  • Автор темы 777DEN777
  • Дата начала
7

777DEN777

Приветствую, подскажите пожалуйста вариант создания временного контейнера для хранения данных на LotusScript, например временной таблицы или списка, (столбец строка)
 
R

RAJ

Ассоциативный список:
Dim variableName List [ As type ]
 
R

RAJ

Код:
' Make string comparison case insensitive
' in this module.
Option Compare NoCase
' Declare a list—myList—to hold first names.
' The list tags will be unique IDs.
Dim myList List As String
Dim newTag As String
Dim newValue As String
' Put some elements in the list.
myList("A1234") = "Andrea"
myList("A2345") = "Vera"
myList("A3456") = "Isabel"
' Ask the user to enter an ID and a name.
newTag$ = InputBox$("Please enter your ID:")
newValue$ = InputBox$("Please enter your first name:")
' Add a new element to the list with
' the user's ID as the list tag and the user's name as
' the value of the new element.
myList(newTag$) = newValue$
Print myList(newTag$)
' Output: the name that the user entered

Динамические массивы

Example 1
Код:
' The array x has not been previously declared, 
' so ReDim automatically assigns it the data type Variant. 
ReDim x(5)
Print DataType(x(1))				 ' Prints 0.
' The Dim statement declares array y with the 
' data type String.
Dim y() As String
' The ReDim statement can’t change the data type of an
' existing array. If you specify a data type for array y in
' the ReDim statement, it must be String.
ReDim y(5) As String
Print DataType(y$(1))				 ' Prints 8.
Example 2
Код:
Option Base 1
' Declare a two-dimensional dynamic array, of Variant type.
ReDim markMar(2, 2)
' Assign a value to each element.
markMar(1, 1) = 1
markMar(2, 1) = 2
markMar(1, 2) = 3
markMar(2, 2) = 4
' Change the upper bound of the last dimension of markMar
' from 2 to 3, preserving the values already stored in
' existing elements of markMar.
ReDim Preserve markMar(2,3)
' Assign values to the additional elements of markMar.
markMar(1, 3) = 5
markMar(2, 3) = 6
 
7

777DEN777

RAJ спасибо за примеры, опыта маловато не пойму как реализовать-закинуть данные из представления в массив, а потом пробежаться по массиву, будет ли правильный следующий код:
Код:
Option Base 1
'--------------------------
N=0
ReDim MyArr(4,0)
'цикл по View
Set DcMain=VwMain.GetFirst
While Not(DcMain Is Nothing)
N=N+1
ReDim Preserve MyArr(4,N)
MyArr(1,N)=DcMain.ColumnValues(1)
MyArr(2,N)=DcMain.ColumnValues(2)
MyArr(3,N)=DcMain.ColumnValues(3)
MyArr(4,N)=DcMain.ColumnValues(4)
Set DcMain=VwMain.GetNextDocument(DcMain)
Wend
'как организовать цикл по массиву с данными, например 4 строки постоянные только по строкам, 
'затем очистить для использования его в другом цикле по представлению
 
A

amigolinx

заполнение массива выглядит правильно

'как организовать цикл по массиву с данными, например 4 строки постоянные только по строкам,
тут чето не догоняю, что требуется :( это имеется в виду?
Код:
For i = 1 To Ubound(MyArr, _индекс нужного измерения_)
' работаем с элементами массива
MyArr(4, i) = чего-то делаем
Next

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

или я все не так понял?? :rolleyes:
 
A

Anonimous

Можно я спрошу несколько в таком же ключе? Мне нужно создать трехмерный ассоциативный массив в xml-парсере. Массив первого уровня - массив атрибутов (Название атрибута как индекс, значение - значение его элемента). Элементы массива второго уровня содержат массивы первого уровня как значения, а атрибут "id" - индекс его элементов. Массив 3-го уровня как индекс содержит имя тега, как значение - элементы массива второго уровня.

Не нашел, как создать в LotusScript ассоциативный массив. Стал создавать ассоциативные списки. Двумерный ассоциативный список создается, но эти двумерные списки не хотят запихиваться в элементы массива 3-го уровня - говорит "Type mismatсh..."

XML-на такая

<Users>

<User id = "94" login = "Pupkin" password = "12345" firstname = "Вася" secondname = "Пупкин" email = "" >
</User>
<User id = "93" login = "Pipkin" password = "parolka" firstname = "Женя" secondname = "Пипкин" email = "test@test.test" >
</User>

</Users>

Вот его хочу распарсить в трехмерный массив или список
Привожу код парсера

Public Class SaxLoad ' Класс Загрузки
' ============================================================

' Это ассоциативные списки
' lAttr - одномерный, вложится в элементы lIDs , элементы lIDs - в элементы lUnits

Private lUnits List As Variant
Private lIDs List As Variant
Private lAttr List As Variant

' ============================================================
' Конструктор
Public Sub New( )

End Sub

Public Sub CreateSaxLoad
'Процедура создает парсер Sax, который распарсит xml-файл в трехмерный массив

Dim filename As String
Dim session As New NotesSession
Dim saxParser As NotesSAXParser

Dim xml_in As NotesStream
filename$ = "C:\xml\users.xml" ' open input file
Set xml_in=session.CreateStream
If Not xml_in.Open(filename$) Then
' MessageBox "Cannot open " & filename$,, "XML file error"
Exit Sub
End If
If xml_in.Bytes = 0 Then
' MessageBox filename$ & " is empty",, "XML file error"
Exit Sub
End If

Set saxParser=session.CreateSAXParser(xml_in)

' Тут события парсера. Важны эти

On Event SAX_EndElement From saxParser Call SAXEndElement

On Event SAX_StartElement From saxParser Call SAXStartElement


saxParser.Process

End Sub

' Далее переходим в событиям в парсере
' Находим элемент <User> в xml-файле

Public Sub SAXStartElement (Source As NotesSAXParser,_
ByVal elementname As String, Attributes As NotesSAXAttributeList)

Dim i As Integer, ind As Integer

If Attributes.Length > 0 Then

Dim attrname As String
For i = 1 To Attributes.Length
attrname = Attributes.GetName(i)

' Запоминаем индекс для элемента списка 2-го уровня - он равен атрибуту id

If attrname="id" Then ind=Attributes.GetValue(i)

' Список 1-го уровня ЭЛЕМЕНТ(Название)="Значение"

lAttr(attrname)=CStr(Attributes.GetValue(i))

Next

' Список 2-го уровня lIDs(значение атрибута id)= Список 1-го уровня (атрибуты в теге User). Запихнуть дает. Список получается двумерным
lIDs(ind)=lAttr

End If
End Sub

' Парсер нашел тег конца элемента User

Public Sub SAXEndElement (Source As NotesSAXParser, ByVal ElementName As String)

' Хочу создать элемент списка 3-го уровня lUnits("USER") = Массив 2-го уровня, к-рый содержит все атрибуты в тегах User, упорядоченные по id
' Ошибка здесь, он не хочет двумерный ассоциативный список запихнуть как значение элемента lUnits

lUnits(ElementName)=lIDs

End If
End Sub

Вышеприведенный код находится в библе "DataSynchronizationLS", эту библу использует агент.

Код агента

Option Explicit
Option Public

Use "DataSynchronizationLS"
Sub Initialize

Dim SL As New SaxLoad()
SL.CreateSaxLoad
End Sub

А я хотел сделать так:

lAttr("login")="Pipkin"
lAttr("id") = "94"
...

Потом этот список лежит в элементе lIDs("94") = lAttr
А lUnits("User")=Двумерный список, включающий lIDs("94") и lIDs("93")
Потом в этом трехмерном списке может быть добавлен, например, элемент lUnits("Department"), когда в xml появится тег <Department id="1"...
Но Лотус не хочет присваивать lUnits("User") двумерный список lIDs в качестве значения.


Извините, если информация оказалась лишней
Вопрос в том, могут ли быть в ЛотусСкрипте ассоциативные списки трехмерными? Или я что-то забыл. Если нет, то где я бы мог почитать про трехмерные ассоциативные массивы на java? Заранее спасибо
 
D

Dragon108

Можно я спрошу несколько в таком же ключе? Мне нужно создать трехмерный ассоциативный массив в xml-парсере. Массив первого уровня - массив атрибутов (Название атрибута как индекс, значение - значение его элемента). Элементы массива второго уровня содержат массивы первого уровня как значения, а атрибут "id" - индекс его элементов. Массив 3-го уровня как индекс содержит имя тега, как значение - элементы массива второго уровня.

Не нашел, как создать в LotusScript ассоциативный массив. Стал создавать ассоциативные списки. Двумерный ассоциативный список создается, но эти двумерные списки не хотят запихиваться в элементы массива 3-го уровня - говорит "Type mismatсh..."

XML-на такая

<Users>

<User id = "94" login = "Pupkin" password = "12345" firstname = "Вася" secondname = "Пупкин" email = "" >
</User>
<User id = "93" login = "Pipkin" password = "parolka" firstname = "Женя" secondname = "Пипкин" email = "test@test.test" >
</User>

</Users>

Вот его хочу распарсить в трехмерный массив или список
Привожу код парсера

Public Class SaxLoad ' Класс Загрузки
' ============================================================

' Это ассоциативные списки
' lAttr - одномерный, вложится в элементы lIDs , элементы lIDs - в элементы lUnits

Private lUnits List As Variant
Private lIDs List As Variant
Private lAttr List As Variant

' ============================================================
' Конструктор
Public Sub New( )

End Sub

Public Sub CreateSaxLoad
'Процедура создает парсер Sax, который распарсит xml-файл в трехмерный массив

Dim filename As String
Dim session As New NotesSession
Dim saxParser As NotesSAXParser

Dim xml_in As NotesStream
filename$ = "C:\xml\users.xml" ' open input file
Set xml_in=session.CreateStream
If Not xml_in.Open(filename$) Then
' MessageBox "Cannot open " & filename$,, "XML file error"
Exit Sub
End If
If xml_in.Bytes = 0 Then
' MessageBox filename$ & " is empty",, "XML file error"
Exit Sub
End If

Set saxParser=session.CreateSAXParser(xml_in)

' Тут события парсера. Важны эти

On Event SAX_EndElement From saxParser Call SAXEndElement

On Event SAX_StartElement From saxParser Call SAXStartElement


saxParser.Process

End Sub

' Далее переходим в событиям в парсере
' Находим элемент <User> в xml-файле

Public Sub SAXStartElement (Source As NotesSAXParser,_
ByVal elementname As String, Attributes As NotesSAXAttributeList)

Dim i As Integer, ind As Integer

If Attributes.Length > 0 Then

Dim attrname As String
For i = 1 To Attributes.Length
attrname = Attributes.GetName(i)

' Запоминаем индекс для элемента списка 2-го уровня - он равен атрибуту id

If attrname="id" Then ind=Attributes.GetValue(i)

' Список 1-го уровня ЭЛЕМЕНТ(Название)="Значение"

lAttr(attrname)=CStr(Attributes.GetValue(i))

Next

' Список 2-го уровня lIDs(значение атрибута id)= Список 1-го уровня (атрибуты в теге User). Запихнуть дает. Список получается двумерным
lIDs(ind)=lAttr

End If
End Sub

' Парсер нашел тег конца элемента User

Public Sub SAXEndElement (Source As NotesSAXParser, ByVal ElementName As String)

' Хочу создать элемент списка 3-го уровня lUnits("USER") = Массив 2-го уровня, к-рый содержит все атрибуты в тегах User, упорядоченные по id
' Ошибка здесь, он не хочет двумерный ассоциативный список запихнуть как значение элемента lUnits

lUnits(ElementName)=lIDs

End If
End Sub

Вышеприведенный код находится в библе "DataSynchronizationLS", эту библу использует агент.

Код агента

Option Explicit
Option Public

Use "DataSynchronizationLS"
Sub Initialize

Dim SL As New SaxLoad()
SL.CreateSaxLoad
End Sub

А я хотел сделать так:

lAttr("login")="Pipkin"
lAttr("id") = "94"
...

Потом этот список лежит в элементе lIDs("94") = lAttr
А lUnits("User")=Двумерный список, включающий lIDs("94") и lIDs("93")
Потом в этом трехмерном списке может быть добавлен, например, элемент lUnits("Department"), когда в xml появится тег <Department id="1"...
Но Лотус не хочет присваивать lUnits("User") двумерный список lIDs в качестве значения.


Извините, если информация оказалась лишней
Вопрос в том, могут ли быть в ЛотусСкрипте ассоциативные списки трехмерными? Или я что-то забыл. Если нет, то где я бы мог почитать про трехмерные ассоциативные массивы на java? Заранее спасибо


;) Если честно не до конца понял что нужно, но на мой взгляд слишком сложно получается с простыми типами, делайте лучше через классы и реализуйте включения классов, что-нибудь типа:

Код:
Class Class1
Public VaraibleClass1 List As Class2
...
End Class

Class Class2
Public VaraibleClass2 List As Class3
...
End Class

...
 
A

Anonimous

На LotusScript, как я понял, нельзя создать ассоциативный массив. А списки ассоциативные можно сделать трехмерными? Кто-нибудь когда-нибудь пытался?
 
D

Dragon108

На LotusScript, как я понял, нельзя создать ассоциативный массив. А списки ассоциативные можно сделать трехмерными? Кто-нибудь когда-нибудь пытался?

Из хелпа: ( )

List - A one-dimensional set whose elements have the same data type and are referred to by name rather than by subscript.

Ассоциативный массив в LS это и есть список - List ( )

P.S.
А нельзя использовать (если уж классы не нравятся), многомерный массив, где индетификатором (как и у Lista) считать например первый столбец?
 
A

Anonimous

Из хелпа: (]]>Ссылка]]>)

List - A one-dimensional set whose elements have the same data type and are referred to by name rather than by subscript.

Ассоциативный массив в LS это и есть список - List (]]>ссылка]]>)

Очень понятно, вот я и стал использовать List.

Опишу попроще

Есть библа LS, называется test. Вот ее полный код

Option Public
Option Explicit

Sub Initialize

End Sub
Sub test()
Dim lUnits List As Variant
Dim lIDs List As Variant
Dim lAttr List As Variant

Dim i As Integer

For i=0 To 10
lAttr("A" & CStr(i))=i*i
Next

lIDs("Second_Level")=lAttr
lUnits("Third_Level")=lIDs

End Sub

Вот агент, который ее вызывает

Option Explicit
Option Public

Use "test"
Sub Initialize

test
End Sub

В Дебаггере:

Список lAttr создался, он одномерный. Созданный список lAttr я запихиваю в значение элемента списка lIDs с индексом "Second_Level".
Получаю двумерный список lIDs из одного элемента. Все хорошо.
Дальше этот список lIDs пытаюсь запихнуть в значение элемента списка lUnits с индексом "Third_Level".
Вылетает ошибка
"Type mismach in method ListAllocCopy: Unknown found, Unknown expected"
Найти информацию конкретно о такой ошибке не удается. Список 3-го уровня создать не получается. Размер в байтах списка lIDs в Дебаггере не отображается.
А нельзя использовать (если уж классы не нравятся), многомерный массив, где индетификатором (как и у Lista) считать например первый столбец?
Не совсем понял. Можно пример, пожалуйста?
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
159
надо делать класс (или структуру), каждый элемент которого является отдельным User.
В парсере заполнять поля этого класса/структуры и не надо никаких сложных массивов.
Задаче наверняка не просто распарсить, а что-то с этими данными сделать потом.
Если изначально заполнить некую логическую единицу данными, потом с ней легче работать.
"Массив массивом массив погоняет" это порой необходимое решение, но не обязательное.
Если через структуру:
Код:
Type User
id As String
login As String
password As String
firstname As String
secondname As String
email As String
End Type
' Это запись на одного пользователя

' список пользователей
Dim UsersList List As User
Получаем список пользователей, каждый элемент списка - запись пользователя.

Если через класс идти, то практически тоже самое, только методы дописать и класс организовать.
Лично я бы сделал: тип User и класс Users, как-то так:
Код:
Class Users
Private UsersList List As User
Private count as long
End Class
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
на ЛС есть всякие ограничения, но есть бридж в java, где можно гибче работать со списками
и часто есть единственный вопрос - напуркуа мутить то что не поддерживает ЛС? - может задача решается неправильно?
 
A

Anonimous

Спасибо, savl, пробую с классами. Map-ы в java тоже не очень удобные. Если что, в java тоже попытаюсь с классами
 

Darkhan

Green Team
14.12.2012
99
2
BIT
0
Извиняюсь, за возможно не очевидный пример использования
Код:
%REM
Agent dd
Created Jul 22, 2013
Description: Comments for Agent
%END REM
Option Public
Option Declare

%REM
Class ListHolder
Description: Comments for Class
%END REM
Public Class ListHolder
Private list_ List As Variant

Sub Delete
Call truncate()
End Sub 

%REM
Sub truncate
Description: Comments for Sub
%END REM
Public Sub truncate()
Erase me.list_
End Sub

%REM
Sub add
Description: Comments for Sub
%END REM
Public Sub addElement(tag As Variant, object As Variant)
If IsObject(object) Then
Set me.list_(tag) = object
Else
me.list_(tag) = object
End If
End Sub

%REM
Function getElement
Description: Comments for Function
%END REM
Public Function getElement(tag As Variant) As Variant
If IsElement(me.list_(tag)) Then
Dim returnValue As Variant
returnValue = me.list_(tag)
If IsObject(returnValue) Then
Set getElement = returnValue
Else
getElement = returnValue
End If
End If
End Function

End Class
Sub Initialize
Dim u1 List As ListHolder
Dim u2 List As ListHolder
Dim u3 List As ListHolder

Set u3("3.1") = New ListHolder
Call u3("3.1").addElement("3.1.1", 311)
Call u3("3.1").addElement("3.1.2", 312)

Set u3("3.2") = New ListHolder
Call u3("3.2").addElement("3.2.1", 321)
Call u3("3.2").addElement("3.2.2", 322)

Set u2("2.1") = New ListHolder
Call u2("2.1").addElement("2.1.1", u3)

Set u1("1.1") = New ListHolder
Call u1("1.1").addElement("1.1.1", u2)
End Sub
 
A

Anonimous

Извиняюсь, за возможно не очевидный пример использования

О нет, любой пример очень ценен ))) Спасибо, Darkhan, обязательно возьму на вооружение
 
Мы в соцсетях:

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