• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

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

Eugen

Green Team
22.03.2012
210
1
BIT
1
День добрый.
Возникла необходимость держать под рукой список всех полей формы. Можно ли его как то получить, а еще лучше распечатать?
 
D

doka

Создалось 2 темы, отвечу сюда.

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

nvyush

Код:
Set nForm = notesDatabase.GetForm( name$ )
msgbox(join(nForm.Fields, {
}))
 

Eugen

Green Team
22.03.2012
210
1
BIT
1
День добрый. Дабы не плодить тем, спрошу тут.
Возникла необходимость проверить все поля формы на непустоту, и если поле пусто прописать туда значение EMPTY. Что лучше использовать NotesForm.Fields или NotesDocument.Items? Как это потом передать в массив, ибо при все моих попытка просто приравнять компилятор ругается.
 

Kizarek86

Green Team
20.07.2007
871
7
BIT
37
NotesDocument.Items - бегает по всем полям в документе.
NotesForm.Fields - по всем полям формы.

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

Eugen

Green Team
22.03.2012
210
1
BIT
1
Да, видимо неправильно выразился.
Надо проверить поля текущего документа на непустоту. Т.е. мне нужен NotesDocument.Items? А как передать его в массив?
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
177
Контекст какой? при сохранении? или в агенте для поиска отбора?
 

Eugen

Green Team
22.03.2012
210
1
BIT
1
Этот документ после сохранения будет копироваться агентом в другую базу.
 

erdi

Green Team
20.08.2008
264
17
BIT
0
Код:
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 597
310
BIT
177
Eugen
Я сомневаюсь, что критерии копирования заключаются в проверке полей на EMPTY...
Перебирать можно через Forall, как указал erdi.
Лично я бы вывел необходимые критерии вбил бы их в список и делал Forall по этому списку.
Полей в документе может быть реально много, а критериев обычно меньше.
 

Eugen

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


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

Eugen

Green Team
22.03.2012
210
1
BIT
1
Пробую так, но на строке 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 597
310
BIT
177
Код:
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

Green Team
22.03.2012
210
1
BIT
1
Код:
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

Green Team
20.07.2007
871
7
BIT
37
капец весело тут у вас...
так то у поля тип есть...

копайте 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 597
310
BIT
177
kizarek
да я не спорю, RT с картинкой так тоже не проверить (вроде как)
для многозначных Fulltrim должен помочь
Eugen
а вот так
Код:
Set item = doc.ReplaceItemValue(Item.Name, itemval)
я бы не делал, лучше старое значение не заменять.
В общем, надо продумать всю задачу, надо ли все поля грузить, какие типы.
Сходу решение есть, но оно некорректно и не оптимально.

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

Eugen

Green Team
22.03.2012
210
1
BIT
1
Понятно, что это не конечное решение. Буду "допиливать"... Всем спасибо.
 
Мы в соцсетях:

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