преобразование типов данных

  • Автор темы nadezdaMP
  • Дата начала
N

nadezdaMP

Всем доброе утро!!!
Есть представление с двумя столбцами: имя и адрес электронной почты.
Есть форма, на ней поле, в котором пользователь указывает имя. Нужно проверить, если такое имя содержится в представлении, то заменить указанное имя адресом электронной почты из этого же представления.
Считать имя из формы можно, получить данные из представления тоже, но как проверить - содержится имя в этом представлении или нет?? и заменить на е-майл?? помогите пожалуйста, вот часть работающего скрипта

Dim s As New notessession
Dim db As notesdatabase
Dim doc As NotesDocument
Dim view As NotesView

Dim entry As NotesViewEntry
Dim nav As NotesViewNavigator
Dim entrylist ( 1 To 10) As Variant

' считала из поля на форме
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim dfield As Variant
Set uidoc = ws.CurrentDocument
dfield = uidoc.FieldGetText("field")

Set db = s.CurrentDatabase
Set view = db.GetView("InternetAddresses")
Set nav = view.CreateViewNav
Set entry = nav.GetFirst
' получила из представления все данные
counter% = 1
While Not (entry Is Nothing)
curr = entry.ColumnValues
entrylist (counter%) = curr
Set entry = nav.GetNext(entry)
counter% = counter% +1
Wend

а проверка не получается!!
хотя бы скажите как преобразовать получившееся entrylist (counter%) в обычную строку!!!
 
D

divankin

Работа над ошибками

1. Не рекомендуется получать значение поля через NotesUIDocument.FieldGetText. Эта функция возвращает текст вне зависимости от количества значений в поле и их типа. Лучше не привыкать к ней и использовать
Dim doc As NotesDocument

Set doc = uidoc.Document
dfield = doc.GetItemValue("field")(0)

Обратите внимание на последние скобочки. GetItemValue всегда возвращает массив даже для полей с одним значением, и для получения первого и единственного элемента в вашем случае надо брать первое значение в массиве.

2. notesViewEntry.ColumnValues возвращает массив. Поэтому вам нужно вспомнить, в какой колонке находится нужное вам значение, и взять значение с соответствующим индексом, помня, что в большинстве массивов в Лотусе нумерация начинается с нуля. notesViewEntry.ColumnValues(0) возвращает значение в первой колонке.

3. Однако все сказанное в пункте 2 пригодится вам несколько позже, потому что вы неправильно решаете эту задачу.
Нужно отредактировать вьюшку InternetAddresses и включить сортировку у столбца с именами. Не нужно использовать NotesViewNavigator. Используем метод, возвращающий документ по ключу в представлении.
Set personDoc = View.GetDocumentByKey(dfield)
Print "Адрес: " + personDoc.GetItemValue("сюда подставить поле, содержащее е-мейл")(0)
 
N

nadezdaMP

все сделала!!! спасибо всем за подробные обьяснения!!!! =)
 
N

nadezdaMP

код замечательно отрабатывает на созданной мной новой форме - выбирает имена пользователей из всех адресных книг,
из них все имена пользователей, которые находятся в локальной адресной книге, заменяются на их адрес электронной почты,

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

вот код, обьясните кто знает что не так пожалуйста

Sub Click(Source As Button)

Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim dfield As Variant
Dim docform As NotesDocument
Dim docview As NotesDocument
Set uidoc = ws.CurrentDocument
Set docform = uidoc.Document
dfield = docform.GetItemValue("CopyTo_Address")(0)
Dim session As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Set db = session.GetDatabase( "", "names.nsf", False)
Set view = db.GetView ("My Contacts" )
Dim resvalue, value As Variant

Dim spstr As String
Dim splitstr As Variant
splitstr = Split ( dfield, "; ")
Dim arr, arr1 As Variant
Dim resi, resf As Variant
Forall i In splitstr
arr1 = i
arr = Split ( i, " ")
Forall j In arr
resi = j
Exit Forall
End Forall
Forall j In arr
resf = j
End Forall

dfield = resf + ", " + resi
Set docview = view.GetDocumentByKey (dfield, True )
If docview Is Nothing Then
resvalue = resvalue + arr1 + ","
Else
value = docview.GetItemValue ("MailAddress")(0)
resvalue = resvalue + value + ","
End If
End Forall
Call docform.ReplaceItemValue("CopyTo_Address", resvalue)
Call docform.Save( False, True )
End Sub
 
D

divankin

1. Поле CopyTo_Address имеет галочку Allow multiple values?
Вы туда вводите много имен?

Если оба да, то для перебора всех имен используйте Forall по массиву docform.GetItemValue("CopyTo_Address")

2. А что должен делать данный код?
Forall j In arr
resi = j
Exit Forall
End Forall
Forall j In arr
resf = j
End Forall
 
N

nadezdaMP

В предаставлении My Contacts все имена хранятся в формате "фамилия,<пробел>имя"
в первом цикле берется имя а во втором фамилия
dfield = resf + ", " + resi - формирую ключ =)
Если оба да, то для перебора всех имен используйте Forall по массиву docform.GetItemValue("CopyTo_Address")
это как - там же одна строка хранится -ее я как раз разбиваю split и получаю массив имен
 
D

divankin

Как все запущено:)

1. В Лотусе поля могут иметь как одно значение, так и много. На форме можно указать, что весь текст, введенный в поле, нужно считать как множество значений, разделенных запятыми с помощью галки "Allow multiple values" под названием поля в свойствах поля. На третьей вкладке свойств поля можно указать и другие возможные разделители множественных значений.
Когда по логике в поле должно не одно значение, а много, то нужно поле объявлять многозначным, а не брать его значение и делать сплит.

Dim addressArray as Variant
addressArray = docform.GetItemValue("CopyTo_Address")

Forall address in addressArray
' Код обработки одного адреса
End Forall

2. Кажется, вы так и не поняли как получить значение с конкретным индексом из массива в Лотус.
В синтаксисе используются не квадратные скобки, как в других языках, а круглые.
В Лотус нумерация всех массивов, если явно не установлено другое, начинается с нуля.
Есть в Лотус две функции получения нижней и верхней границ массива соответсвенно LBound и UBound
Так что получение первого элемента массива в вашем случае имени человека, будет таким resi = arr(0) или resi = arr(LBound(arr))
А последнего, resf = arr(UBound(arr))
 
N

nadezdaMP

спасибо за дельные советы, теперь знаю) я пока в лотусе новичок =)
код исправила =)
 
Мы в соцсетях:

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