Получение списка всех полей формы

Eugen

Well-known member
22.03.2012
177
0
#1
День добрый.
Возникла необходимость держать под рукой список всех полей формы. Можно ли его как то получить, а еще лучше распечатать?
 

doka

Well-known member
18.02.2010
118
0
#2
Создалось 2 темы, отвечу сюда.

doc.Items возвращает массив полей. Через цикл получаешь название каждого поля
 

Eugen

Well-known member
22.03.2012
177
0
#7
День добрый. Дабы не плодить тем, спрошу тут.
Возникла необходимость проверить все поля формы на непустоту, и если поле пусто прописать туда значение EMPTY. Что лучше использовать NotesForm.Fields или NotesDocument.Items? Как это потом передать в массив, ибо при все моих попытка просто приравнять компилятор ругается.
 

Kizarek86

Lotus team
20.07.2007
864
4
#8
NotesDocument.Items - бегает по всем полям в документе.
NotesForm.Fields - по всем полям формы.

документ и форма это совершенно разные штуки, так надо выбрать от задачи...
 

Eugen

Well-known member
22.03.2012
177
0
#9
Да, видимо неправильно выразился.
Надо проверить поля текущего документа на непустоту. Т.е. мне нужен NotesDocument.Items? А как передать его в массив?
 

savl

Lotus team
28.10.2011
2 131
102
#10
Контекст какой? при сохранении? или в агенте для поиска отбора?
 

Eugen

Well-known member
22.03.2012
177
0
#11
Этот документ после сохранения будет копироваться агентом в другую базу.
 

erdi

Well-known member
20.08.2008
265
17
#12
Код:
Dim doc As NotesDocument

Forall i In doc.Items
Messagebox( i.Name )
End Forall
Код:
Dim session As New NotesSession
Dim db As NotesDatabase
Set db = session.CurrentDatabase
Forall form In db.Forms
Forall field In form.Fields
fieldCount = fieldCount + 1
msgString = msgString & Chr(10) & "	 " & field
End Forall
Messagebox form.Name & " has " & fieldCount & " field(s):" & Chr(10) & msgString
End If
Exit Sub
End If
End Forall
 

savl

Lotus team
28.10.2011
2 131
102
#13
Eugen
Я сомневаюсь, что критерии копирования заключаются в проверке полей на EMPTY...
Перебирать можно через Forall, как указал erdi.
Лично я бы вывел необходимые критерии вбил бы их в список и делал Forall по этому списку.
Полей в документе может быть реально много, а критериев обычно меньше.
 

Eugen

Well-known member
22.03.2012
177
0
#14
Мне это нужно для выгрузки в xml. Скопированный документ впоследствии будет выгружен в xml и трансформирован с помощью XSLT для передачи в веб-сервис. А чтобы веб-сервис схавал мою xml, она должна соответствовать схеме, согласно которой вместо пустых значений должно стоять "EMPTY". Т.е. есть база №1 где хранится оригинал документа, и есть база №2, в которую он должен быть скопирован уже проставленным EMPTY.


Добавлено: PS: как то запутанно объяснил, но не представляю как объяснить иначе)
 

Eugen

Well-known member
22.03.2012
177
0
#15
Пробую так, но на строке itemval=doc.Getitemvalue(doc.Items(i)) выдает Type mismatch
Код:
	Dim w As New NotesUIWorkspace
Dim doc As NotesDocument
Dim itemval As string
Dim i As Integer

Set doc=w.Currentdocument.Document

ForAll item In doc.Items
i=i+1
itemval=doc.Getitemvalue(doc.Items(i))
If itemval="" Then
itemval="EMPTY"
End If
End ForAll
 

savl

Lotus team
28.10.2011
2 131
102
#16
Код:
Dim w As New NotesUIWorkspace
Dim doc As NotesDocument
Dim itemval As Variant
Dim i As Integer

Set doc=w.Currentdocument.Document

ForAll item In doc.Items
i=i+1
itemval=doc.Getitemvalue(Item.Name)
itemval = Fulltrim(itemval)
If itemval(0)="" Then
itemval="EMPTY"
End If
End ForAll
З.Ы. не проверял
 

Eugen

Well-known member
22.03.2012
177
0
#17
Код:
Dim w As New NotesUIWorkspace
Dim doc As NotesDocument
Dim itemval As Variant
Dim i As Integer

Set doc=w.Currentdocument.Document

ForAll item In doc.Items
i=i+1
itemval=doc.Getitemvalue(Item.Name)
itemval = Fulltrim(itemval)
If itemval(0)="" Then
itemval="EMPTY"
End If
End ForAll
З.Ы. не проверял
Спасибо, заработало. Только чуть дописал:
Код:
If itemval(0)="" Then
itemval="EMPTY"
Set item = doc.ReplaceItemValue(Item.Name, itemval)
End If
 

Kizarek86

Lotus team
20.07.2007
864
4
#18
капец весело тут у вас...
так то у поля тип есть...

копайте NotesItem class.



Добавлено:
Спасибо, заработало. Только чуть дописал:
Код:
If itemval(0)="" Then
itemval="EMPTY"
Set item = doc.ReplaceItemValue(Item.Name, itemval)
End If
А если поле будет многозначным у которого первое значение пустое а 2..5.. не пустые?
Ваш кож выдаст ошибку если наткнется на поле с типом даты/суммы/...
 

savl

Lotus team
28.10.2011
2 131
102
#19
kizarek
да я не спорю, RT с картинкой так тоже не проверить (вроде как)
для многозначных Fulltrim должен помочь
Eugen
а вот так
Код:
Set item = doc.ReplaceItemValue(Item.Name, itemval)
я бы не делал, лучше старое значение не заменять.
В общем, надо продумать всю задачу, надо ли все поля грузить, какие типы.
Сходу решение есть, но оно некорректно и не оптимально.

Не просто так спрашивал контекст задачи, тот же xml можно и руками создавать, а не генерить стандартными методами.
И схема тогда измениться может и файлы xml будут меньшим размером.
 

Eugen

Well-known member
22.03.2012
177
0
#20
Понятно, что это не конечное решение. Буду "допиливать"... Всем спасибо.