Добавление Строк В Таблицу.

Тема в разделе "Lotus - Программирование", создана пользователем Lehandr, 29 июл 2014.

  1. Lehandr

    Lehandr Member

    Регистрация:
    2 авг 2013
    Сообщения:
    9
    Симпатии:
    0
    Доброго дня!
    При создании документа на событии PostOpen пишу :
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">код создания таблицы</div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
    Set uidoc=ws.CurrentDocument
    Set doccur=uidoc.Document
    Set rtItem=New NotesRichTextItem(doccur, \"tableForm\")
    Set rtStyle=sess.CreateRichTextStyle
    Call rtItem.AppendTable(2,4)
    rtStyle.Bold=True
    Set rtnav=rtItem.CreateNavigator
    Set rtTable=rtnav.GetFirstElement(RTELEM_TYPE_TABLE)
    Set rtnav=rtItem.CreateNavigator
    Call rtnav.FindFirstElement(RTELEM_TYPE_TABLECELL)
    mytext(1, 1) = \"Наименование показателей, ед. измерений\"
    mytext(2, 1) = \"НД на методы испытаний\"
    mytext(3, 1) = \"Норма по НД\"
    mytext(4, 1) = \"Фактическое значение\"
    For j=1 To 1
    For i=1 To 4
    Call rtItem.BeginInsert(rtnav)
    Call rtItem.AppendStyle(rtStyle)
    Call rtItem.AppendText(mytext(i, j))
    Call rtItem.EndInsert
    Call rtnav.FindNextElement(RTELEM_TYPE_TABLECELL)
    Next
    Next       

    Call doccur.Save(True, True)
    Call uidoc.Close(True)
    Call ws.EditDocument(True, doccur)
    Необходимо чтобы в процессе работы над документом можно было добавлять в поле \"tableForm\", содержащую только таблицу, добавлять новые строки при нажатии на кнопочку и отображать это добавление.
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">сразу на экране</div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
        Dim ws As New NotesUIWorkspace
    Dim uidoc As NotesUIDocument
    Dim doc As NotesDocument
    Dim rtItem As NotesRichTextItem
    Dim rtTable As NotesRichTextTable
    Dim rtnav As NotesRichTextNavigator

    Set uidoc=ws.CurrentDocument
    Set doc=uidoc.Document

    If uidoc.EditMode=False Then uidoc.EditMode=True
    Set rtItem=doc.GetFirstItem(\"tableForm\")\'Получаю доступ к существующему rt-полю
    Set rtnav=rtItem.CreateNavigator()
    \'  Set rtTable = rtnav.GetElement
    Set rtTable=rtnav.GetFirstElement(RTELEM_TYPE_TABLE)
    Set rtnav=rtItem.CreateNavigator()
    Call rtnav.FindLastElement(RTELEM_TYPE_TABLECELL)
    \'  Call rtItem.BeginInsert(rtnav)
    Call rtItem.EndInsert
    Call rtTable.AddRow()

    Call doc.Save(True, True)
    Call uidoc.Close
    Call ws.EditDocument(True, doc)
    Но при отладке навигатор не находит уже существующую таблицу в rt-поле. Выдает что переменная rtTable не проинициализирована. Может кто сталкивался, подскажите.
     
  2. ty3uk

    ty3uk Well-Known Member

    Регистрация:
    31 мар 2008
    Сообщения:
    169
    Симпатии:
    0
    попробуйте сделать на queryopen. И документ берите не из воркспейса, а из Source queryopen-а
    Ричтекст сложное поле, вот так, просто, с ним может не получиться.
     
  3. Lehandr

    Lehandr Member

    Регистрация:
    2 авг 2013
    Сообщения:
    9
    Симпатии:
    0
    Проблема не с созданием таблицы. А с добавлением в неё строк после повторного открытия документа.
     
  4. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    Код ниже спокойно отработал.
    Слегка переделал, так как зацикливалось открытие документа и использовать двумерный массив там где можно обойтись одномерным...
    Учтите, лимит строк в таблице = 255, так что это не вечно.
    Код (LotusScript):
    Sub Postopen(Source As Notesuidocument)
    On Error Goto handler
    Const FuncName = {Sub "" }
    Dim ErrStr As String

    Dim sess As New NotesSession
    Dim ws As New NotesUIWorkspace
    Dim uidoc As NotesUIDocument
    Dim mytext(3) As Variant
    Set uidoc=Source
    Set doccur=uidoc.Document

    If uidoc.IsNewDoc Then
    Set rtItem=New NotesRichTextItem(doccur, "tableForm")
    Set rtStyle=sess.CreateRichTextStyle
    Call rtItem.AppendTable(2,4)
    rtStyle.Bold=True
    Set rtnav=rtItem.CreateNavigator
    Set rtTable=rtnav.GetFirstElement(RTELEM_TYPE_TABLE)
    Set rtnav=rtItem.CreateNavigator
    Call rtnav.FindFirstElement(RTELEM_TYPE_TABLECELL)
    mytext(0) = "Наименование показателей, ед. измерений"
    mytext(1) = "НД на методы испытаний"
    mytext(2) = "Норма по НД"
    mytext(3) = "Фактическое значение"

    For i=0 To 3
    Call rtItem.BeginInsert(rtnav)
    Call rtItem.AppendStyle(rtStyle)
    Call rtItem.AppendText(mytext(i))
    Call rtItem.EndInsert
    Call rtnav.FindNextElement(RTELEM_TYPE_TABLECELL)
    Next


    Call doccur.Save(True, True)
    Call uidoc.Close(True)
    Call ws.EditDocument(True, doccur)
    Else
    If doccur.getitemvalue("no")(0) = "1" Then Exit Sub
    If uidoc.EditMode=False Then uidoc.EditMode=True

    Set rtItem=doccur.GetFirstItem("tableForm")'Получаю доступ к существующему rt-полю
    Set rtnav=rtItem.CreateNavigator()
    ' Set rtTable = rtnav.GetElement
    Set rtTable=rtnav.GetFirstElement(RTELEM_TYPE_TABLE)
    Set rtnav=rtItem.CreateNavigator()
    Call rtnav.FindLastElement(RTELEM_TYPE_TABLECELL)
    ' Call rtItem.BeginInsert(rtnav)
    Call rtItem.EndInsert
    Call rtTable.AddRow()
    Call doccur.replaceitemvalue("no","1")
    Call doccur.Save(True, True)
    Call uidoc.Close
    Call ws.EditDocument(True, doccur)
    End If
    Goto Endh
    handler:
    ErrStr = DESIGN & ", " & FuncName & ": " & Err &", в стр " & Erl & nLine & Error$
    Msgbox ErrStr
    Resume endh
    Endh:
    End Sub
     
  5. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    если создавать несколько строк - создавайте сразу (а не по одной)
     
  6. Lehandr

    Lehandr Member

    Регистрация:
    2 авг 2013
    Сообщения:
    9
    Симпатии:
    0
    Спасибо savl!
    Это код на создание таблицы и добавление строки. Но мне надо немного другое. После того как пользователь создал документ, поработал с ним, закрыл его. По прошествии некоторого времени он его снова открывает и хочет добавить строку(-и) к этой таблице. Вот тут у меня и не получается, почему-то навигатор не находит таблицу в rt-поле.
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"код"</div></div><div class="sp-body"><div class="sp-content">
    Код (LotusScript):
    Sub Click(Source As Button)
    Dim ws As New NotesUIWorkspace
    Dim uidoc As NotesUIDocument
    Dim doc As NotesDocument
    Dim rtItem As NotesRichTextItem
    Dim rtTable As NotesRichTextTable
    Dim rtnav As NotesRichTextNavigator

    Set uidoc=ws.CurrentDocument
    Set doc=uidoc.Document

    If uidoc.EditMode=False Then uidoc.EditMode=True
    Set rtItem=doc.GetFirstItem("tableForm")'Получаю доступ к существующему rt-полю
    Call doc.Save(True, False)
    Set rtnav=rtItem.CreateNavigator()
    Set rtTable=rtnav.GetFirstElement(RTELEM_TYPE_TABLE) [b][color="#FF0000"]'Вот тут в отладчике rtTable почему-то не инициализируется[/color][/b]
    Set rtnav=rtItem.CreateNavigator()
    Call rtnav.FindLastElement(RTELEM_TYPE_TABLECELL)
    Call rtItem.BeginInsert(rtnav)
    Call rtItem.EndInsert
    Call rtTable.AddRow()

    Call doc.Save(True, True)
    Call uidoc.Close
    Call ws.EditDocument(True, doc)

    End Sub
    [highlight=yellow]код надо оборачивать тегами - свернутый текст и код[/highlight]
     
  7. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    Lehandr
    аа, точняк, по кнопке.
    вот такой отработал без ошибок, клиент Revision 20130309.0942 (Release 9.0)
    Код (LotusScript):
    Sub Click(Source As Button)
    On Error Goto handler
    Const FuncName = {Sub "" }
    Dim ErrStr As String

    Dim ws As New NotesUIWorkspace

    If uidoc.EditMode=False Then uidoc.EditMode=True

    Set rtItem=doccur.GetFirstItem("tableForm")'Получаю доступ к существующему rt-полю
    Set rtnav=rtItem.CreateNavigator()
    ' Set rtTable = rtnav.GetElement
    Set rtTable=rtnav.GetFirstElement(RTELEM_TYPE_TABLE)
    '   Set rtnav=rtItem.CreateNavigator()
    Call rtnav.FindLastElement(RTELEM_TYPE_TABLECELL)
    ' Call rtItem.BeginInsert(rtnav)
    '   Call rtItem.EndInsert
    Call rtTable.AddRow()
    Call doccur.Save(True, True)
    doccur.ReplaceItemValue("SaveOptions","0").savetodisk = False
    Call uidoc.Close
    Call ws.EditDocument(True, doccur)

    Goto Endh
    handler:
    ErrStr = DESIGN & ", " & FuncName & ": " & Err &", в стр " & Erl & nLine & Error$
    Msgbox ErrStr
    Resume endh
    Endh:
    End Sub
    Зачем 2 раза создавать навигатор я так и не понял...
     
  8. Lehandr

    Lehandr Member

    Регистрация:
    2 авг 2013
    Сообщения:
    9
    Симпатии:
    0
    Ответ msgbox - Sub"": 183, в стр 8 Объект Variant не содержит объектов. Редакция 20131022.0932 (Release 9.0.1)

    Добавлено:
    Ответ msgbox - Sub"": 183, в стр 8 Объект Variant не содержит объектов. Редакция 20131022.0932 (Release 9.0.1)
     
  9. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    в моем коде, 8-я строка это If uidoc.EditMode=False Then uidoc.EditMode=True
    у меня глобально объявлено 2 переменных uidoc и doccur
    Определяю их в postOpen
    Код (LotusScript):
        Set uidoc=Source
    Set doccur=uidoc.Document
     
  10. Lehandr

    Lehandr Member

    Регистрация:
    2 авг 2013
    Сообщения:
    9
    Симпатии:
    0
    Да, сам что-то ступил. Но проблема осталось в следующем. При добавлении строк в пустую таблицу - все работает ОК. Но если заполнить любую ячейку текстом - возникает две проблемы:
    1. Текст не сохраняется (savetodisk="0"). Помогает только переоткрытие документа вручную.
    2. При заполненной любой ячейки таблицы, новые строки не добавляются:
    Ответ msgbox - Sub"": 183, в стр 18 Объект Variant не содержит объектов. Редакция 20131022.0932 (Release 9.0.1)
     
  11. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    Ну решается просто: либо сохранить перед добавлением строки руками, либо кодом, затем переполучить документ
    Код (LotusScript):
        If uidoc.EditMode=False Then uidoc.EditMode=True
    Call uidoc.Save
    Set doccur = uidoc.Document
    Ошибку с таблицей повторить не смог, все равно добавляет без проблем.
    Есть возможность проверить на другой версии?

    Добавлено: Проверил в версии 7.0.1, отработало без ошибок.
     
  12. Lehandr

    Lehandr Member

    Регистрация:
    2 авг 2013
    Сообщения:
    9
    Симпатии:
    0
    Спасибо еще раз!
    У меня упорно выдает rtTable - не инициализировано, в случаях когда открываю документ в состоянии с уже имеющейся таблицей и
    заполненной ячейкой и я хочу добавить еще строки. Возможно проблема из-за 9-го сервера. Завтра протестирую на 8.5.3.
     
  13. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    770
    Симпатии:
    50
    Если таблица вам нужна только для отображения данных, попробуйте ComputedText c HTML таблицей. Гораздо удобнее в плане программирования.
     
  14. Lehandr

    Lehandr Member

    Регистрация:
    2 авг 2013
    Сообщения:
    9
    Симпатии:
    0
    Добрый день!
    Можете поподробнее рассказать алгоритм вставки и работы с HTML таблицей в rt-поле?
     
  15. Lehandr

    Lehandr Member

    Регистрация:
    2 авг 2013
    Сообщения:
    9
    Симпатии:
    0
    Все, разобрался. Дело было в том что rt-поле само находилось в таблице и навигатор естественно находил внешнюю таблицу (вернее не находил вообще).
     
  16. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    Хм... интересно, но странно, так как сам навигатор создается из RT поля, а не из документа.
    UPD: таки да, так оно и есть. Поразительно.
     
  17. alexas1

    alexas1 Lotus team
    Lotus team

    Регистрация:
    10 апр 2014
    Сообщения:
    562
    Симпатии:
    214
    Нотус ограниченно поддерживает nested-tables через LS.
    К вложенной таблице можно получить доступ, но её ячейки будут принадлежать внешней, с совсем не очевидной адрессацией.
     
  18. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    alexas1
    Дело не во вложенной таблице.
    Навигатор создается в RT-поле, то есть бегать он должен только по RT-полю, что хелп и пишет везде.
    В нашем случае получается, что если RT-поле находится внутри таблицы на форме, то навигатор находит именно эту таблицу, хотя она ВНЕ RT-поля и его частью не является.
    По логике он должен её игнорировать и находить только то, что внутри RT-поля.
    Однако, у разработчиков, видимо, было свое мнение на этот счет.

    Добавлено: Впрочем... если открыть элемент дизайна тем же ScanEz, то мы увидим там поле $Body, которое является RТ-полем и фактически хранит в себе структуру формы.
    Исходя из этого, получаем, что у нас все же баг навигатором, а лезет он из-за архитектуры самого LND.
     
  19. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    770
    Симпатии:
    50
    RT-поле тут не нужно.
    1. Берём Computed Text, кладём его в нужное место на форме, не забываем отметить как Pass-Thru HTML.
    2. Допустим на форме есть multivalue поле Values, содержащее данные, которые мы хотим отобразить в таблице. В формулу Computed Text пишем следующее:
    Код (Text):
    table:="<table><tr><th>Заголовок</th><tr>";
    @For(x:=1;x<=@Elements(Values);x:=x+1;table:=table+"<tr><td>"+Values[x]+"</td></tr>");
    table:=table+"</table>";
    table
    Можно добавить CSS.
    Есть только проблема (как и с RichText), что такой Computed Text вычисляется только при открытии формы, т.е. после редактирования поля Values, что бы перерисовать таблицу надо переоткрыть документ. Либо показывать такую таблицу в диалоговом окне по кнопке, например "история обработки документа" и т.п.
     
  20. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Да... вечные танцы с бубнами.
    А кто подскажет как изменить выравнивание какой-нибудь строки в таблице или определенной ячейке?
     
Загрузка...

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