Возможен ли такой Picklist?

Gor

Well-Known Member
#1
Опишу ситуацию. Есть документ в котором есть поля табельный номер и ФИО. А необходимо реализовать следующее: нужно отсылать письма пользователям из Actiona на вьюхе. Причём нужен некий своеобразный Picklist (для списка из выбранных пользователей). Не стандартный в котором в левой части отображаются пользователи почтовой системы и при нажатии двойного щелчка мышки или кнопки добавить переносит пользователя в правое окошко при выборе ещё одного пользоваателя из левой части добавление уже идёт в существующий список ранее выбранных пользователей (адресная книга), а хотелось бы сделать так чтобы в левой части отображались табельные номера и при предположим нажатия кнопки добавить в правую часть добавлялась бы уже ФИО (причём именно добавлялась по аналогу адресной к уже выбранным записям)? Возможно ли это вообще реализовать и хотя какие могут здесь быть пути решения? Заранее спасибо за ответы
 
E

Elena Nefedova

Гость
#2
а хотелось бы сделать так чтобы в левой части отображались табельные номера и при предположим нажатия кнопки добавить в правую часть добавлялась бы уже ФИО (причём именно добавлялась по аналогу адресной к уже выбранным записям)? Возможно ли это вообще реализовать и хотя какие могут здесь быть пути решения?
1) В форму встроить вьюху с документами персон - их номера табельные и все, что нужно; у внедренной вьюхи должны стоять флаги "show selection bar" и "show view action"
2) Во вьюху добавить Action: @Command([RunAgent];...
3) Для св-ва Target в агенте установить None
В этом случае мы, с одной стороны, можем получить агентом все выделенные документы во вьюхе
Код:
Function get_unprocessed_ui(sess As NotesSession, wsp As NotesUIWorkspace) As NotesDocumentCollection
' Created by Elena Nefedova, Fors-Banking Systems
If sess Is Nothing Then Set sess = New NotesSession
If wsp Is Nothing Then Set wsp = New NotesUIWorkspace
Dim uiview As NotesUIView, caret As NotesDocument
Dim db As NotesDatabase, col As NotesDocumentCollection
Dim s_caret_note_id$
Set db = sess.CurrentDatabase
Set uiview = wsp.CurrentView
' Получение коллекции для обработки
Set col = uiview.Documents
If col.Count = 0 Then
s_caret_note_id = uiview.CaretNoteID
If s_caret_note_id <> "" And s_caret_note_id <> "0" Then
Set caret = db.GetDocumentByID(s_caret_note_id)
End If
If caret Is Nothing Then
Msgbox "Необходимо выделить документы явным образом!"
Goto EndLab
Else
Call col.AddDocument(caret)
End If
End If
EndLab:
Set get_unprocessed_ui = col
Exit Function
ErrLab:
Goto EndLab
Set col = Nothing
End Function
с другой же стороны, можем получить доступ к текущему открытому документу
Код:
	Dim ws As New NotesUIWorkspace
Dim uid As NotesUIDocument
Set uid = ws.CurrentDocument ' не забудем проверить, существует uid или Nothing
Добавление списка в конец поля осуществляется при помощи ArrayAppend, ArrayUnique, ReplaceItemValue
Для UI-документа есть FieldAppendText, но надо следить, какие используем разделители значений, а также, используются ли в поле списки выбора с подстановкой

Можно делать это и в обычном режиме, и в диалоге.
 

Gor

Well-Known Member
#3
спасибо за развёрнутый ответ! действительно это вариант. ещё небольшой вопрос есть! что то я туплю повесил на сабформу Layout и на Layoutе кнопку. На кнопке скриптовый код, когда в дебагер захожу
он реагирует когда вызываю сабформу, а вот когда нажимаю на кнопку на Layoutе дебаггер почему то не срабатывает( ? хотя если на кнопку мессагу кинуть мессагу показывает, а вот в дебагер не заходит?
 
E

Elena Nefedova

Гость
#4
повесил на сабформу Layout и на Layoutе кнопку. На кнопке скриптовый код, когда в дебагер захожу
он реагирует когда вызываю сабформу, а вот когда нажимаю на кнопку на Layoutе дебаггер почему то не срабатывает( ? хотя если на кнопку мессагу кинуть мессагу показывает, а вот в дебагер не заходит?
Да нет, должно все работать.
Надо поставить Stop в коде этой кнопки и посмотреть.
Может, еще дебаггер не в том контексте включается.
 
A

Axel

Гость
#5
Еще вариант: более простой на мой взгляд (если надо с левой стороны отображать только табельные номера).

Опять же форма, на нее кладешь одно поле нескрытое, которое проинициализировано табельными номерами, а другое скрытое с соответствующими ФИО (оба поля мультивэлью). Рисуешь кнопучку как в стандартном выборе адресатов ( -> ) а на нее пишешь "поместить значение(я) с соответствующим(и) индексом(и)". То есть индексы берешь из нескрытого поля, а значения из скрытого.

Если заинтересовался, и есть непонятки, пиши, более полдробно опишу. <_<
 

Gor

Well-Known Member
#6
Для: Axel
не совсем понял
Ну предположим поля оба мультивэлью...
А как же ты из скрытого поля возьмёшь значения?? На этом же скрытом поле @DbColumn(откуда он фио и берёт) и к примеру ели ты его попробуешь с инициализировать GetText ом к примеруето поле то он в значении Value ничего не покажет? Значения наверно из поля не возьмёшь на котором лукап или колумн висит если бы оно текстовое было бы и уже заполненное то другое дело...
Или как то по другому? может я чего не понял?... :)
Сам сейчас стал делать несколько по другому... Сделал поле обычное текстовое которое бы с клавы вводилось(под инвентарные номера), сделал кнопочку добавить, по нажатию на кнопку создаю коллекцию нужной вьюхи с нужными доками
под табельные номера и оттуда же хочу и вытащить соответствующему табельному соответствующую фамилию, предварительно считав табельный который пользователь с клавы ввёл. ну может проще можно?
 

Gor

Well-Known Member
#8
чёто туплю наверно опять....может конец рабочего дня сказывается....
вот я создал скрытое поле(proba3) на нём формула выбора по колонке @dbcolumn
Сейчас по кнопке пытаюсь вытащить оттуда значения таким образом
Код:
Set uidoc = ws.CurrentDocument

Dim doc3 As NotesDocument
Set doc3 = uidoc.Document
q = doc3.GetItemValue("proba3")(0)
И значение пустое в поле proba3 после getitemvalue в переменной точнее
ну чего не так ? это ж bg уже? иди млин не знаю)


надо наверно домой уже идти :)
 

Gor

Well-Known Member
#10
Для: Axel
Да всё достаточно просто оказалось! не ожидал)
вчера уже доки перебирал, сравнивал табельный считанный с реальным табельным вытаскивал оттуда
потом фамилию)) итд итп) получилось очень коряво 3000 доков перебрать и вытащить нужное) отрабатывалось секунд 20)
Спасиб большое за пример!
 

Gor

Well-Known Member
#11
Для: Axel
Поторопился! Не всё видимо так просто оказадось((
Столкнулся со следующей проблемкой видимо поле очень маленькое для всех моих записей :)

ошибка - Field is too large (32k) or View's column & selection formulas are too large

У меня доков с фамилиями и табельными около 3000
Ну что видимо придётся оставлять прошлый мой вариант доки перебирать вытаскивать всё нужное оттуда(( итд итп
вот так (
это код на кнопке --> (Add)
Код:
Dim session As New NotesSession
Dim db As NotesDatabase
Dim idb As NotesDatabase
Dim id As Variant
Dim doc, doc1 As NotesDocument
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim view As NotesView
Dim p As String

Set ws = New NotesUIWorkspace
Set idb = session.GetDatabase("SRVCLST1", "INFO.nsf", False)

Set db = session.CurrentDatabase
Set uidoc = ws.CurrentDocument

p = uidoc.FieldGetText( "proba1" )

Set view = idb.GetView("TabNOM") 
Set doc = view.GetFirstDocument()
While Not (doc Is Nothing)
If doc.IDN(0) = p Then 
s = doc.FIO 
Goto Loopyt 
End If

Set doc = view.GetNextDocument(doc)
Wend
Loopyt:
Dim q As String
q = uidoc.FieldGetText( "proba2" )
Call uidoc.FieldSetText( "proba2",q + Chr(10) + s(0))
а под ФИО придётся наверно массив делать...
чтобы один раз он подгрузился а потом уже в нём работу вёл чтобы к бд на сервер другой не обращаться... :( УЖОС!
Хотя мож и есть проще решение....
 
A

Axel

Гость
#12
Для: Gor
Да, если значений много, то через поля с дблукапами не пройдет.
Это ограничение Лотуса на 64к уже порядком поднадоело....

Так что придется тебе твоим методом...

<!--QuoteBegin-Gor+20:07:2006, 18:03 -->
<span class="vbquote">(Gor @ 20:07:2006, 18:03 )</span><!--QuoteEBegin-->While Not (doc Is Nothing)
If doc.IDN(0) = p Then
s = doc.FIO
Goto Loopyt
End If

Set doc = view.GetNextDocument(doc)
Wend
[snapback]40501" rel="nofollow" target="_blank[/snapback]​
[/quote]

Тока цикл убери а вместо него поставь получение документа через view.GetDocumentByKey(таб.номер, True)..... :D
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
2
36
Россия, Калуга
#13
А чем @PickList( [CUSTOM] : [SINGLE] ; server : file ; view ; title ; prompt ; column ; categoryname ) не подходит ? Имхо, самое то. И никаких ограничений.
 
A

Axel

Гость
#14
Для: Medevic

<!--QuoteBegin-Gor+14:07:2006, 05:42 -->
<span class="vbquote">(Gor @ 14:07:2006, 05:42 )</span><!--QuoteEBegin-->а хотелось бы сделать так чтобы в левой части отображались табельные номера и при предположим нажатия кнопки добавить в правую часть добавлялась бы уже ФИО (причём именно добавлялась по аналогу адресной к уже выбранным записям)
[snapback]40112" rel="nofollow" target="_blank[/snapback]​
[/quote]

Вот собственно из-за этого и сыр-бор. А так @PickList на самом деле хорошее решение (тока Gor-у скорее скриптовый аналог пиклиста нужен будет
stringArray = notesUIWorkspace.PickListStrings( type% [, multipleSelection ], server$, databaseFileName$, viewName$, title$, prompt$, column% [, categoryname$ ] ) :D
 

Gor

Well-Known Member
#15
Для: Axel
view.GetDocumentByKey(таб.номер, True) чего то я им никогда не пользовался...хотя странно это
Вот блин)) :)
И я до этого недогнал))))))))))))
Самое смешное что я уже написал массив под табельные и фамилии чтобы он под это дело грузился при инициализации PickLista)))))))))) :P ржунимагу)
Пасиб!
Ещё маленький вопросик!!
Возможно ли вообще как нибудь проверить имея в наличии в поле имя и фамилию
есть ли у него почтовый ящик в лотусе или нет?
Проверка по адресной книге какая нибудь или чёто ещё есть?