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

Тема в разделе "Lotus - Программирование", создана пользователем nadezdaMP, 13 авг 2009.

  1. nadezdaMP

    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%) в обычную строку!!!
     
  2. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Смотри notesView.GetDocumenByKey.
     
  3. divankin

    divankin Senjor developer

    Регистрация:
    13 авг 2009
    Сообщения:
    182
    Симпатии:
    0
    Работа над ошибками

    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)
     
  4. nadezdaMP

    nadezdaMP Гость

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

    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
     
  6. divankin

    divankin Senjor developer

    Регистрация:
    13 авг 2009
    Сообщения:
    182
    Симпатии:
    0
    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
     
  7. nadezdaMP

    nadezdaMP Гость

    В предаставлении My Contacts все имена хранятся в формате "фамилия,<пробел>имя"
    в первом цикле берется имя а во втором фамилия
    dfield = resf + ", " + resi - формирую ключ =)
    это как - там же одна строка хранится -ее я как раз разбиваю split и получаю массив имен
     
  8. divankin

    divankin Senjor developer

    Регистрация:
    13 авг 2009
    Сообщения:
    182
    Симпатии:
    0
    Как все запущено:)

    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))
     
  9. nadezdaMP

    nadezdaMP Гость

    спасибо за дельные советы, теперь знаю) я пока в лотусе новичок =)
    код исправила =)
     
Загрузка...
Похожие Темы - преобразование типов данных
  1. phantom76
    Ответов:
    11
    Просмотров:
    3.705
  2. WolfEater
    Ответов:
    0
    Просмотров:
    778
  3. jager
    Ответов:
    1
    Просмотров:
    1.295
  4. PahaStar
    Ответов:
    0
    Просмотров:
    985
  5. PahaStar
    Ответов:
    0
    Просмотров:
    845

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