7
777DEN777
Приветствую, подскажите пожалуйста вариант создания временного контейнера для хранения данных на LotusScript, например временной таблицы или списка, (столбец строка)
Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе
Ассоциативный список:
Dim variableName List [ As type ]
' 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
' 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.
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
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 строки постоянные только по строкам,
'затем очистить для использования его в другом цикле по представлению
тут чето не догоняю, что требуется это имеется в виду?'как организовать цикл по массиву с данными, например 4 строки постоянные только по строкам,
For i = 1 To Ubound(MyArr, _индекс нужного измерения_)
' работаем с элементами массива
MyArr(4, i) = чего-то делаем
Next
ну если вынести приведенный вами код в отдельную ф-ию, то и будет происходить очистка массива при каждом вызове этой ф-ии'затем очистить для использования его в другом цикле по представлению
Можно я спрошу несколько в таком же ключе? Мне нужно создать трехмерный ассоциативный массив в 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
...
На 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 (]]>ссылка]]>)
Не совсем понял. Можно пример, пожалуйста?А нельзя использовать (если уж классы не нравятся), многомерный массив, где индетификатором (как и у Lista) считать например первый столбец?
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
Class Users
Private UsersList List As User
Private count as long
End Class
%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
Обучение наступательной кибербезопасности в игровой форме. Начать игру!