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

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

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

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

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

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

  • Автор темы Lehandr
  • Дата начала
L

Lehandr

Доброго дня!
При создании документа на событии 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">
Код:
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">
Код:
	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 не проинициализирована. Может кто сталкивался, подскажите.
 
T

ty3uk

попробуйте сделать на queryopen. И документ берите не из воркспейса, а из Source queryopen-а
Ричтекст сложное поле, вот так, просто, с ним может не получиться.
 
L

Lehandr

попробуйте сделать на queryopen. И документ берите не из воркспейса, а из Source queryopen-а
Ричтекст сложное поле, вот так, просто, с ним может не получиться.
Проблема не с созданием таблицы. А с добавлением в неё строк после повторного открытия документа.
 

savl

Lotus Team
28.10.2011
2 591
309
BIT
138
Код ниже спокойно отработал.
Слегка переделал, так как зацикливалось открытие документа и использовать двумерный массив там где можно обойтись одномерным...
Учтите, лимит строк в таблице = 255, так что это не вечно.
Код:
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
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 927
608
BIT
150
если создавать несколько строк - создавайте сразу (а не по одной)
 
L

Lehandr

Код ниже спокойно отработал.
Слегка переделал, так как зацикливалось открытие документа и использовать двумерный массив там где можно обойтись одномерным...
Учтите, лимит строк в таблице = 255, так что это не вечно.
Код:
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
Спасибо 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">
Код:
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]
 

savl

Lotus Team
28.10.2011
2 591
309
BIT
138
Lehandr
аа, точняк, по кнопке.
вот такой отработал без ошибок, клиент Revision 20130309.0942 (Release 9.0)
Код:
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 раза создавать навигатор я так и не понял...
 
L

Lehandr

Lehandr
аа, точняк, по кнопке.
вот такой отработал без ошибок, клиент Revision 20130309.0942 (Release 9.0)
Код:
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 раза создавать навигатор я так и не понял...
Ответ msgbox - Sub"": 183, в стр 8 Объект Variant не содержит объектов. Редакция 20131022.0932 (Release 9.0.1)

Добавлено:
Lehandr
аа, точняк, по кнопке.
вот такой отработал без ошибок, клиент Revision 20130309.0942 (Release 9.0)
Код:
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 раза создавать навигатор я так и не понял...
Ответ msgbox - Sub"": 183, в стр 8 Объект Variant не содержит объектов. Редакция 20131022.0932 (Release 9.0.1)
 

savl

Lotus Team
28.10.2011
2 591
309
BIT
138
в моем коде, 8-я строка это If uidoc.EditMode=False Then uidoc.EditMode=True
у меня глобально объявлено 2 переменных uidoc и doccur
Определяю их в postOpen
Код:
	Set uidoc=Source
Set doccur=uidoc.Document
 
L

Lehandr

в моем коде, 8-я строка это If uidoc.EditMode=False Then uidoc.EditMode=True
у меня глобально объявлено 2 переменных uidoc и doccur
Определяю их в postOpen
Код:
	Set uidoc=Source
Set doccur=uidoc.Document
Да, сам что-то ступил. Но проблема осталось в следующем. При добавлении строк в пустую таблицу - все работает ОК. Но если заполнить любую ячейку текстом - возникает две проблемы:
1. Текст не сохраняется (savetodisk="0"). Помогает только переоткрытие документа вручную.
2. При заполненной любой ячейки таблицы, новые строки не добавляются:
Ответ msgbox - Sub"": 183, в стр 18 Объект Variant не содержит объектов. Редакция 20131022.0932 (Release 9.0.1)
 

savl

Lotus Team
28.10.2011
2 591
309
BIT
138
1. Текст не сохраняется (savetodisk="0"). Помогает только переоткрытие документа вручную.
Ну решается просто: либо сохранить перед добавлением строки руками, либо кодом, затем переполучить документ
Код:
	If uidoc.EditMode=False Then uidoc.EditMode=True
Call uidoc.Save
Set doccur = uidoc.Document
Ошибку с таблицей повторить не смог, все равно добавляет без проблем.
Есть возможность проверить на другой версии?

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

Lehandr

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

Добавлено: Проверил в версии 7.0.1, отработало без ошибок.
Спасибо еще раз!
У меня упорно выдает rtTable - не инициализировано, в случаях когда открываю документ в состоянии с уже имеющейся таблицей и
заполненной ячейкой и я хочу добавить еще строки. Возможно проблема из-за 9-го сервера. Завтра протестирую на 8.5.3.
 
L

Lehandr

Если таблица вам нужна только для отображения данных, попробуйте ComputedText c HTML таблицей. Гораздо удобнее в плане программирования.
Добрый день!
Можете поподробнее рассказать алгоритм вставки и работы с HTML таблицей в rt-поле?
 
L

Lehandr

Спасибо еще раз!
У меня упорно выдает rtTable - не инициализировано, в случаях когда открываю документ в состоянии с уже имеющейся таблицей и
заполненной ячейкой и я хочу добавить еще строки. Возможно проблема из-за 9-го сервера. Завтра протестирую на 8.5.3.
Все, разобрался. Дело было в том что rt-поле само находилось в таблице и навигатор естественно находил внешнюю таблицу (вернее не находил вообще).
 

savl

Lotus Team
28.10.2011
2 591
309
BIT
138
Дело было в том что rt-поле само находилось в таблице и навигатор естественно находил внешнюю таблицу
Хм... интересно, но странно, так как сам навигатор создается из RT поля, а не из документа.
UPD: таки да, так оно и есть. Поразительно.
 

savl

Lotus Team
28.10.2011
2 591
309
BIT
138
alexas1
Дело не во вложенной таблице.
Навигатор создается в RT-поле, то есть бегать он должен только по RT-полю, что хелп и пишет везде.
В нашем случае получается, что если RT-поле находится внутри таблицы на форме, то навигатор находит именно эту таблицу, хотя она ВНЕ RT-поля и его частью не является.
По логике он должен её игнорировать и находить только то, что внутри RT-поля.
Однако, у разработчиков, видимо, было свое мнение на этот счет.

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

garrick

Lotus Team
26.10.2009
1 342
150
BIT
128
Добрый день!
Можете поподробнее рассказать алгоритм вставки и работы с HTML таблицей в rt-поле?
RT-поле тут не нужно.
1. Берём Computed Text, кладём его в нужное место на форме, не забываем отметить как Pass-Thru HTML.
2. Допустим на форме есть multivalue поле Values, содержащее данные, которые мы хотим отобразить в таблице. В формулу Computed 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, что бы перерисовать таблицу надо переоткрыть документ. Либо показывать такую таблицу в диалоговом окне по кнопке, например "история обработки документа" и т.п.
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Да... вечные танцы с бубнами.
А кто подскажет как изменить выравнивание какой-нибудь строки в таблице или определенной ячейке?
 
Мы в соцсетях:

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