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

Тема в разделе "Lotus - Программирование", создана пользователем 777DEN777, 23 июл 2009.

Наш партнер Genesis Hackspace
  1. 777DEN777

    777DEN777 Гость

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

    RAJ Well-Known Member

    Регистрация:
    17 янв 2007
    Сообщения:
    440
    Симпатии:
    0
    Ассоциативный список:
    Dim variableName List [ As type ]
     
  3. 777DEN777

    777DEN777 Гость

    А можно пример?

    Как его заполнять данными? Очистить список, узнать количество строк?
     
  4. RAJ

    RAJ Well-Known Member

    Регистрация:
    17 янв 2007
    Сообщения:
    440
    Симпатии:
    0
    Код (Text):
    ' 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
    Код (Text):
    ' 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
    Код (Text):
    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
     
  5. 777DEN777

    777DEN777 Гость

    RAJ спасибо за примеры, опыта маловато не пойму как реализовать-закинуть данные из представления в массив, а потом пробежаться по массиву, будет ли правильный следующий код:
    Код (Text):
    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 строки постоянные только по строкам,
    'затем очистить для использования его в другом цикле по представлению
     
  6. amigolinx

    amigolinx Гость

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

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

    или я все не так понял?? :rolleyes:
     
  7. Anonimous

    Anonimous Well-Known Member

    Регистрация:
    15 июн 2012
    Сообщения:
    120
    Симпатии:
    0
    Можно я спрошу несколько в таком же ключе? Мне нужно создать трехмерный ассоциативный массив в 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? Заранее спасибо
     
  8. Dragon108

    Dragon108 Well-Known Member

    Регистрация:
    19 янв 2010
    Сообщения:
    265
    Симпатии:
    0

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

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

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

    ...
     
  9. Anonimous

    Anonimous Well-Known Member

    Регистрация:
    15 июн 2012
    Сообщения:
    120
    Симпатии:
    0
    На LotusScript, как я понял, нельзя создать ассоциативный массив. А списки ассоциативные можно сделать трехмерными? Кто-нибудь когда-нибудь пытался?
     
  10. Dragon108

    Dragon108 Well-Known Member

    Регистрация:
    19 янв 2010
    Сообщения:
    265
    Симпатии:
    0
    Из хелпа: (Ссылка)

    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) считать например первый столбец?
     
  11. Anonimous

    Anonimous Well-Known Member

    Регистрация:
    15 июн 2012
    Сообщения:
    120
    Симпатии:
    0
    Очень понятно, вот я и стал использовать 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 в Дебаггере не отображается.
    Не совсем понял. Можно пример, пожалуйста?
     
  12. savl

    savl Well-Known Member
    Команда форума Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.086
    Симпатии:
    155
    надо делать класс (или структуру), каждый элемент которого является отдельным User.
    В парсере заполнять поля этого класса/структуры и не надо никаких сложных массивов.
    Задаче наверняка не просто распарсить, а что-то с этими данными сделать потом.
    Если изначально заполнить некую логическую единицу данными, потом с ней легче работать.
    "Массив массивом массив погоняет" это порой необходимое решение, но не обязательное.
    Если через структуру:
    Код (LotusScript):
    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, как-то так:
    Код (LotusScript):
    Class Users
    Private UsersList List As User
    Private count as long
    End Class
     
  13. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.168
    Симпатии:
    306
    на ЛС есть всякие ограничения, но есть бридж в java, где можно гибче работать со списками
    и часто есть единственный вопрос - напуркуа мутить то что не поддерживает ЛС? - может задача решается неправильно?
     
  14. Anonimous

    Anonimous Well-Known Member

    Регистрация:
    15 июн 2012
    Сообщения:
    120
    Симпатии:
    0
    Спасибо, savl, пробую с классами. Map-ы в java тоже не очень удобные. Если что, в java тоже попытаюсь с классами
     
  15. Darkhan

    Darkhan Well-Known Member
    Lotus team

    Регистрация:
    14 дек 2012
    Сообщения:
    97
    Симпатии:
    4
    Извиняюсь, за возможно не очевидный пример использования
    Код (Text):
    %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
     
  16. Anonimous

    Anonimous Well-Known Member

    Регистрация:
    15 июн 2012
    Сообщения:
    120
    Симпатии:
    0
    Извиняюсь, за возможно не очевидный пример использования

    О нет, любой пример очень ценен ))) Спасибо, Darkhan, обязательно возьму на вооружение
     
Загрузка...

Поделиться этой страницей