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

Тема в разделе "Lotus - Программирование", создана пользователем Гринго, 14 авг 2016.

  1. Гринго

    Гринго Member

    Регистрация:
    13 авг 2016
    Сообщения:
    12
    Симпатии:
    0
    Добрый день


    Помогите решить следующую задачу. Не являюсь программистом 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?
     
  2. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    773
    Симпатии:
    52
    1. А зачем вам вообще Excel? Почему нельзя всю необходимую работу с заявками сделать в Lotus Notes?
    2. Если не знаете как работает Lotus Notes, не знаете внутреннего устройства базы (имена полей, представлений, их структуру и т.п.), лучше даже не беритесь за эту работу.
    3. Domino Designer можно бесплатно скачать на сайте IBM, в его хелпе есть вся необходимая для вас информация.
     
  3. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    дык поставьте дизайнер - он бесплатный
    получение по ключу (читайте хэлп дизайнера нотус - в тырнетах полно ссылок на этот хэлп)
    в конце ссылки - UNID - он и есть ссылка на документ
    формат URL для нотус - тот же хэлп
     
  4. Гринго

    Гринго Member

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

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

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

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

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
  6. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    никак не связано с программированием под LDN
    абсолютно никак не мешает программировать в LDN, есть домино - есть возможность рассылок в др. почтовую систему
    а вот работоспобность макроса, при такой постановке, маловероятный вариант (вернее- сделать можно, грабли собирать будете регулярно)
    да - имеет - писать java с библиотекой POI, запускать на сервере (т.е. библиотека копируется на сервер LDN. Даже в случае огромных выборок - тормоза будут меньшими, чем при использовании COM объекта из MSO (кот. может вовсе забить доступную память)
    какой бы не была массовая инсталяция LDN - отличия будут, т.к. могут отличаться групповые политики и настройки безопасности, добавим сюда изменения в безопасности, во всяких МС патчах (как пример - недавняя история, описанная на хабре)
    и как правильно отметил @garrick - написать без ошибок и кастылей выгрузку из LDN, для большого кол-ва документов, может спец. В вашем варианте, для еще через COM - это будет мучительный и долгий процесс (да и ломаться, потом, будет регулярно)

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

    Гринго Member

    Регистрация:
    13 авг 2016
    Сообщения:
    12
    Симпатии:
    0
    @savl - спасибо!
     
  8. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    вспомнил, тут...
    у домины вполне себе есть способ общения без KOM и называется он Domino Data Service
    для того кто "привык" в VBA - "берет в руки" COM для работы с хттп и...
     
  9. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    773
    Симпатии:
    52
    Предлагаю построить в Notes вьюху, отображающую всю необходимую информацию по заявкам, открыть к ней доступ по HTTP, а в Excel воткнуть URL этой вьюхи. ... а можно даже и не "втыкать" и чтобы посмотреть информацию по заявкам, ни Notes, ни даже Excel не будет нужен.
     
  10. Гринго

    Гринго Member

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

    Код (LotusScript):
    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
     
    #10 Гринго, 16 авг 2016
    Последнее редактирование модератором: 16 авг 2016
  11. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    зачем это? (сортировать колонку из кода)
    вам предложили почитать дизайнер хэлп, но не для поиска схожего с SQL
    LDN - NoSQL БД
    в нотусе, для поиска ключей, используют ключевую колонку, для чего - создают вьюшку с сортированной колонкой, по ключу (первую, можно больше одной колонки - но это др. история)
    получать документ - это очень накладно для памяти и времени
    во вьюшке (вернее в выборке по ключу - NotesViewEntryCollection) есть NotesViewEntry , а у него ColumnValues (типа Variant - массив значений, по колонкам)
    т.е. создается спец. вьюшка, с нужной ключевой колонкой (сортированной) и колонками для нужных значенией
     
    #11 lmike, 16 авг 2016
    Последнее редактирование: 16 авг 2016
  12. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    всегда выдает массив (даже если там одно значение), нулевым элементом будет первое значение doc.GetItemValue("DemandNumber")(0)
    НО не делайте так (причина - выше)
     
  13. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    773
    Симпатии:
    52
    ...но тут тоже есть тонкости, которые могут вынести мозг человеку, который не в теме и при том не читающий хелп. Я же говорил "уметь надо".
     
  14. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    оно понятно, получается ТС сочиняет велосипед, с кривыми колесами, при том что есть легальные методы взаимодействия с платформой - через хттп
    безо всяких "кривых" COM
    но как я уже не раз отмечал - мышление похаченное использованием windows трудно направить в "нужное" русло
     
  15. Гринго

    Гринго Member

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

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

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

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

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    оно и не требовалось, в варианте с http...
    просто распарсить xml/json
    слезать с LDN (вот даже интересно - на что?) достаточно непростой процесс, почему-то мне кажется - заявки там не единственная БД
    у нас, в организации, уж клялись уйти от домино раз 100500, прошло овер 15лет (почта давно уже на чанге)
    и ШП (Share Point) разные решения пихали (тоже пытались для документ-процесса пристроить)..., но юзеры! (именно) эти убожественые решения завернули
    Нам рассказывали как придет велики SAP - и будет фсё... , ога - в тысячи раз выросло кол-во эхелей на файлопомойке (уже засрали 6Тб)
    Есть гейроаейский спец. кот. "доказал" - 1С более затратна (это для нашего-то законодательство), чем SAP, на секунду - внедрение решения на SAP, в нашей стране, уже обошлось (приблизительно) десятки лярдов грина

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

    Гринго Member

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

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

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

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    гугл VBA lotus notes field
     
    #18 lmike, 17 авг 2016
    Последнее редактирование: 17 авг 2016
  19. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    знать пришлось - т.к. COM объекты именно к этому и привязывают, а вот распарсить ответ от http сервера LDN - вполне понятный вариант
    ибо там текст
    и вы только ради этого купили LDN (1 БД)?
    я вам больше скажу - есть готовое решение на LDN - XPD называется, единственная "засада" - разработчики на украине, т.е. потенциально могут быть сложности с закупкой ПО (для России, на сайте сказано - для резидентов Украины)
    про - на что менять - вы так и не сказали ;)
     
  20. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    а вот для этого и есть построение архитектуры, чтобы не было (минимизировать) нестандартного
    а "здесь" получается как жить на стройке - оно конечно можно, но...
    и вот в чем для меня загадка...
    существуют репортинговые системы (и бесплатные), есть ИТ отдел - неужто сложно построить процесс, чтобы делать все через них?!
    когда "каждая кухарка" будет..., т.е. - каждый должен заниматься своими обязанностями (прямыми), а не изучением VBA, Excel, Word и т.п.
    и самое смешное - везде встречаются требования - уметь пользоваться Word и Excel
    Именно эти инструменты насаждаются, в то время как "никто" (>80%) ими пользоваться не умеют (и в первую голову - руководители)
     
    #20 lmike, 17 авг 2016
    Последнее редактирование: 17 авг 2016
Загрузка...

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