Excel. Доступ к атрибутам документов Lotus Notes

Г

Гринго

Добрый день


Помогите решить следующую задачу. Не являюсь программистом Lotus Notes, но хотел бы решить проблему получения реквизитов документов из БД Lotus

Есть файл excel в котором построчно сохраняются номера документов из БД Lotus Notes (заявок на сервис). Номера заявок:

232
346
1236
...
Список заявок весьма большой (сотни строк).

В Lotus Notes есть БД указанных заявок (содержит несколько сотен тысяч элементов). Требуется периодически проверять статус заявок из файла excel (в работе, выполнены, закрыты и т.п.). Сейчас эта проверка делается путем открытия Lotus Notes, базы данных заявок, ручного поиска документа по заданному номеру, открытию документа и просмотр статуса – длительная процедура, от которой хотелось бы уйти.

Как хотелось бы решить задачу – написать скрипт на VBA (Excel, доступа к среде программирования Lotus Notes нет), который последовательно перебирает номера заявок, используя объектную модель Lotus получает доступ к указанной базе Lotus Notes и по номеру заявки получает доступ к указанному документу и проверяет наличие заданного реквизита (Статус заявки). Собственно, вопросы:

1. Как получить ссылку на определенный документ из Lotus Notes по значению одного из его реквизитов (номер)

2. Определенная альтернатива – если в excel сохранена гиперссылка на конкретный документ из БД Lotus Notes, как по этой гиперссылке получить ссылку (в программе) на конкретный документ Lotus Notes?
 

garrick

Lotus Team
26.10.2009
1 367
152
BIT
364
  1. А зачем вам вообще Excel? Почему нельзя всю необходимую работу с заявками сделать в Lotus Notes?
  2. Если не знаете как работает Lotus Notes, не знаете внутреннего устройства базы (имена полей, представлений, их структуру и т.п.), лучше даже не беритесь за эту работу.
  3. Domino Designer можно бесплатно скачать на сайте IBM, в его хелпе есть вся необходимая для вас информация.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
Как хотелось бы решить задачу – написать скрипт на VBA (Excel, доступа к среде программирования Lotus Notes нет)
дык поставьте дизайнер - он бесплатный
1. Как получить ссылку на определенный документ из Lotus Notes по значению одного из его реквизитов (номер)
получение по ключу (читайте хэлп дизайнера нотус - в тырнетах полно ссылок на этот хэлп)
2. Определенная альтернатива – если в excel сохранена гиперссылка на конкретный документ из БД Lotus Notes, как по этой гиперссылке получить ссылку (в программе) на конкретный документ Lotus Notes?
в конце ссылки - UNID - он и есть ссылка на документ
формат URL для нотус - тот же хэлп
 
Г

Гринго

Спасибо за ответы
Список заявок в excel-файле - жесткое требование заказчика. Данный список рассылается многим пользователям внутри компании, для контроля статуса заявок (ответственных за их исполнение), при этом почтовая программа в компании другая (опять же жесткое требование заказчика). Установка ПО жестко регламентирована со стороны IT-службы, а макрос должен работать у любого конечного пользователя (не программиста) из группы контроля, у кого есть установленный Excel и Lotus в системе.

Спасибо за ссылку на хелп дизайнера - прочитаю

Имена БД, имя представления известно. Доступ и работу с Lotus Notes из Excel планируется организовать через создание экземпляров приложения Lotus Notes (CreateObject, GetObject) - лишь бы объектная модель Lotus позволяла так работать
Опыт автоматизации и минимизации ручной работы и связи данных из разных источников, агрегации у меня есть, поэтому, уверен, что данная задача имеет решение

Буду признателен, если есть что добавить
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
Список заявок в excel-файле - жесткое требование заказчика.
никак не связано с программированием под LDN
Данный список рассылается многим пользователям внутри компании, для контроля статуса заявок (ответственных за их исполнение), при этом почтовая программа в компании другая (опять же жесткое требование заказчика).
абсолютно никак не мешает программировать в LDN, есть домино - есть возможность рассылок в др. почтовую систему
Установка ПО жестко регламентирована со стороны IT-службы, а макрос должен работать у любого конечного пользователя (не программиста) из группы контроля, у кого есть установленный Excel и Lotus в системе.
а вот работоспобность макроса, при такой постановке, маловероятный вариант (вернее- сделать можно, грабли собирать будете регулярно)
поэтому, уверен, что данная задача имеет решение
да - имеет - писать java с библиотекой POI, запускать на сервере (т.е. библиотека копируется на сервер LDN. Даже в случае огромных выборок - тормоза будут меньшими, чем при использовании COM объекта из MSO (кот. может вовсе забить доступную память)
какой бы не была массовая инсталяция LDN - отличия будут, т.к. могут отличаться групповые политики и настройки безопасности, добавим сюда изменения в безопасности, во всяких МС патчах (как пример - недавняя история, )
и как правильно отметил @garrick - написать без ошибок и кастылей выгрузку из LDN, для большого кол-ва документов, может спец. В вашем варианте, для еще через COM - это будет мучительный и долгий процесс (да и ломаться, потом, будет регулярно)

Логика из ТЗ извращена до наоборот (подгоняли под низкий уровень писателей, на VBA, видать) и следовать ей, буквально - это потеря времени и сил
Вариант, описанный мной - не требует, вовсе, Excel, и будет работать на серверах, стало-быть - будет меньше "особенностей"
 
Последнее редактирование:

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
вспомнил, тут...
у домины вполне себе есть способ общения без KOM и называется он
для того кто "привык" в VBA - "берет в руки" COM для работы с хттп и...
 

garrick

Lotus Team
26.10.2009
1 367
152
BIT
364
Предлагаю построить в Notes вьюху, отображающую всю необходимую информацию по заявкам, открыть к ней доступ по HTTP, а в Excel воткнуть URL этой вьюхи. ... а можно даже и не "втыкать" и чтобы посмотреть информацию по заявкам, ни Notes, ни даже Excel не будет нужен.
 
Г

Гринго

Всем спасибо за критику и предложения, 2@savl - особенно. Реализовал, работает, достаточно шустро.
Да, не идеальное решение, его невозможно масштабировать, но такой задачи и не стоит. Даже в текущей версии это сэкономит десятки человеко-часов в месяц - за счет того, что не придется вручную открывать каждую заявку в Lotus для просмотра значений для определенных полей. Есть отдельные моменты, которые реализованы "криво", но пока не нашел, как обойти это ограничение, может подскажете

Код:
Sub DemandParser()

  Dim oSession As Object
  Dim oDB As Object
  Dim oNotesView As Variant
  Dim oColumn As Variant
  Dim doc As Object
  Dim oItems As Variant
  Dim oItem As Variant

  Dim lngCounter As Long, lngFResult As Long, lngRow As Long
  Set oSheet = ThisWorkbook.Worksheets("Data")
  lngRow = oSheet.Cells(1, 3).End(xlDown).Row
  If lngRow > 1000000 Then
     MsgBox "Нет данных для анализа!"
     Exit Sub
  End If
  Set oSession = CreateObject("Notes.NotesSession")
  Set oDB = oSession.GetDatabase("<servername>", "<DBName>")
  Set oNotesView = oDB.GetView("All")
  ' при выполнении следующей строки выдается ошибка, приходится перебирать элементы коллекции
  'Set oColumn = oNotesView.Columns(5)
  For Each oColumn In oNotesView.Columns
     If oColumn.ItemName = "DemandNumber" Then
          oColumn.IsSorted = True
          Exit For
     End If
  Next oColumn
  For lngCounter = 2 To lngRow
    Application.StatusBar = "Обработка строки " & CStr(lngCounter) & " из " & CStr(lngRow)
 
    sTTNumber = Left(oSheet.Cells(lngCounter, 21).Value, 6)
 
    If IsNumeric(sTTNumber) Then
       sSearchString = Replace("[DemandNumber] = {DemandNumber}", "{DemandNumber}", sTTNumber)
       lngFResult = oNotesView.FTSearch(sSearchString)
       If lngFResult = 0 Then
          oSheet.Cells(lngCounter, 24).Value = "!!! Заявка не найдена"
       Else
          Set doc = oNotesView.GetFirstDocument
       
          '
          ' здесь реализуется соответствующая обработка
          '
          ' как получить первое значение? - аналогично ситуации выше, работает через перебор элементов коллекции
          oItems = doc.GetItemValue("DemandNumber")
          For Each oItem In oItems
           
              Exit For
          Next oItem
     
     
       End If
    End If
  Next
  Application.StatusBar = ""
  MsgBox "Готово!"
  Set doc = Nothing
  Set oNotesView = Nothing
  Set oDB = Nothing
  Set oSession = Nothing
End Sub
 
Последнее редактирование модератором:

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
' при выполнении следующей строки выдается ошибка, приходится перебирать элементы коллекции
'Set oColumn = oNotesView.Columns(5)
зачем это? (сортировать колонку из кода)
lngFResult = oNotesView.FTSearch(sSearchString)
вам предложили почитать дизайнер хэлп, но не для поиска схожего с SQL
LDN - NoSQL БД
в нотусе, для поиска ключей, используют ключевую колонку, для чего - создают вьюшку с сортированной колонкой, по ключу (первую, можно больше одной колонки - но это др. история)
получать документ - это очень накладно для памяти и времени
во вьюшке (вернее в выборке по ключу - NotesViewEntryCollection) есть NotesViewEntry , а у него ColumnValues (типа Variant - массив значений, по колонкам)
т.е. создается спец. вьюшка, с нужной ключевой колонкой (сортированной) и колонками для нужных значенией
 
Последнее редактирование:

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
...но тут тоже есть тонкости, которые могут вынести мозг человеку, который не в теме и при том не читающий хелп. Я же говорил "уметь надо".
оно понятно, получается ТС сочиняет велосипед, с кривыми колесами, при том что есть легальные методы взаимодействия с платформой - через хттп
безо всяких "кривых" COM
но как я уже не раз отмечал - мышление похаченное использованием windows трудно направить в "нужное" русло
 
Г

Гринго

Ситуацию нужно рассматривать с разных сторон и понимать задачу, которую просят помочь решить. Лучшее решение не всегда выигрывает у просто хорошего. Я не писал всю ситуацию, чтобы не засорять топик, но возможно, это была моя ошибка. Мне нужно простое прикладное решение, работающее - для себя и моих сотрудников. Также им поделюсь с коллегами. Не требуется промышленное "железное" решение - Lotus Notes живет в компании до конца этого года, потом будет совсем другое ПО для работы с заявками и совсем другая процедура работы с ними и текущее решение мы спокойно выкинем на свалку. На его создание я суммарно потратил 4 часа своего чистого времени.

За счет текущей, пусть "кривой", не оптимальной реализации экономия времени получилась за одну итерацию - в 180 раз (с 30 минут ручным способом до 10 секунд данным решением - обработка 170 позиций). Таких итераций - около 10 в месяц по моему направлению. Оптимизировать работу одной итерации из текущих 10 секунд до 1 секунды (условно) - это дополнительно к уже полученной экономии в 29 мин. 50 секунд добавить еще 9 секунд - с моей точки зрения, овчинка выделки не стоит.
Для этого (справедливо отмечено) действительно пришлось бы серьезно изучить документацию к Lotus, классы, проштудировать форумы. Если бы я был программистом (это уже в прошлом) - безусловно, это то, с чего бы я начал. Но на это бы у меня ушло совсем другое время, которого сейчас у меня не сказать, что много и кто бы тогда делал остальную мою работу:)?.

Менять текущий процесс работы с заявками (который с изъянами - не спорю) - нет смысла, т.к. он и так изменится в январе. На изменение текущего, на согласования, доработки уйдет уже не 4 часа, и потребует большего количества вовлеченных...

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

В любом случае, спасибо за конструктивную критику и советы.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
Не требуется промышленное "железное" решение - Lotus Notes живет в компании до конца этого года, потом будет совсем другое ПО для работы с заявками и совсем другая процедура работы с ними и текущее решение мы спокойно выкинем на свалку.
оно и не требовалось, в варианте с http...
просто распарсить xml/json
слезать с LDN (вот даже интересно - на что?) достаточно непростой процесс, почему-то мне кажется - заявки там не единственная БД
у нас, в организации, уж клялись уйти от домино раз 100500, прошло овер 15лет (почта давно уже на чанге)
и ШП (Share Point) разные решения пихали (тоже пытались для документ-процесса пристроить)..., но юзеры! (именно) эти убожественые решения завернули
Нам рассказывали как придет велики SAP - и будет фсё... , ога - в тысячи раз выросло кол-во эхелей на файлопомойке (уже засрали 6Тб)
Есть гейроаейский спец. кот. "доказал" - 1С более затратна (это для нашего-то законодательство), чем SAP, на секунду - внедрение решения на SAP, в нашей стране, уже обошлось (приблизительно) десятки лярдов грина

не... - разумеется, "назло кондуктору - возьму билет, сойду с трамвая, пойду пешком", могут сделать "эффективные манагеры"
эффект от этого тоже известен - велосипедные файлы с макросами и хитровынебанными формулами заполняют файло-помойки
этот путь, у нас в компании, уже проходили не раз
но как говориться - время идет, а кол-во дураков только растет... ;)
а вам - успехов, только стоило ли с вопросами по VBA приходить сюда ? ;)
 
  • Нравится
Реакции: magistr
Г

Гринго

2@lmike:
SAP - тема отдельного разговора, в том виде, в котором его могут внедрить. Действительно, количество с excel-файлов с ним растет на порядок, через них пытаются закрывать дыры, которые не покрываются функционалом данной ERP. Самое интересно, что при внедрении SAP одним из аргументов приводилось то, что "мы откажемся от большого количества excel-файлов, которые у нас есть".

Куда стоило обращаться тогда? На какой форум? :)

А в целом с нестандартной обработкой относительно небольшого объема данных лучше excel никто не справится (имхо). И гибкость высокая, формулы\инструменты, возможности автоматизации (макросы) - широкие. Если решение требуется стандартное\масштабированное - то тут excel проигрывает конкретным решениям.

P.S. Решение уже проверили у других пользователей, работает - для них шок, что оказывается, такое можно вообще возможно было реализовать. БД в LDN заявок реализовывала сторонняя компания еще в 2006 году, наши IT ее только поддерживают в рабочем состоянии, доработок никаких не делают, технической документации по полям не было. Так что я результатом доволен, с учетом того, что приступал к задаче ничего не зная об объектах LDN и о внутреннем устройстве данной БД в частности.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
не зная об объектах LDN и о внутреннем устройстве данной БД в частности.
знать пришлось - т.к. COM объекты именно к этому и привязывают, а вот распарсить ответ от http сервера LDN - вполне понятный вариант
ибо там текст
и вы только ради этого купили LDN (1 БД)?
я вам больше скажу - есть готовое решение на LDN - называется, единственная "засада" - разработчики на украине, т.е. потенциально могут быть сложности с закупкой ПО (для России, на сайте сказано - для резидентов Украины)
про - на что менять - вы так и не сказали ;)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
А в целом с нестандартной обработкой
а вот для этого и есть построение архитектуры, чтобы не было (минимизировать) нестандартного
а "здесь" получается как жить на стройке - оно конечно можно, но...
и вот в чем для меня загадка...
существуют репортинговые системы (и бесплатные), есть ИТ отдел - неужто сложно построить процесс, чтобы делать все через них?!
когда "каждая кухарка" будет..., т.е. - каждый должен заниматься своими обязанностями (прямыми), а не изучением VBA, Excel, Word и т.п.
и самое смешное - везде встречаются требования - уметь пользоваться Word и Excel
Именно эти инструменты насаждаются, в то время как "никто" (>80%) ими пользоваться не умеют (и в первую голову - руководители)
 
Последнее редактирование:
Мы в соцсетях:

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