1. Спонсор публикаций Marketplace codeby. Сервис, который так долго ждали. При расчетах используем биткоин. Первый товар уже в продаже: Консультация на тему ИБ от Ondrik8

    Скрыть объявление
  2. Спонсор публикаций Marketplace codeby. Сервис, который так долго ждали. При расчетах используем биткоин. Второй товар маркетплейса: Надёжная обфускация вашей программы от PingVinich

    Скрыть объявление

Планирование ресурсов

Тема в разделе "Lotus - Программирование", создана пользователем soleil, 12 фев 2010.

  1. soleil

    soleil Гость

    Репутация:
    0
    Создаю систему управления проектами. Есть формы Задача и Ресурс. Необходимо реализовать возможность назначения задаче определенных ресурсов в зависимости от того доступны они или нет в данное время.
    Как вариант, я нашла объект группового планирования, но, прочитав определение из книги Полякова:

    Объект группового планирования (Scheduler) предназначен для создания на форме графического
    интерфейса, позволяющего наглядно определять наличие свободного времени у сотрудников из адресной
    книги, на основании записей о мероприятиях в почтовых БД пользователей,


    я пришла к выводу, что для моих целей данный объект не подходит. Правильно ли я полагаю? Или все-таки как-то можно его прикрутить?
     
  2. Klido

    Klido Гость

    Репутация:
    0
    за это - орден красной звезды :maybe:
    MS Projects уже не в моде? В нем ресурсы, в лотусе - задачи...

    Стандартное средство планирования ресурсов? Там есть наверняка 80% того, что надо.... Привязаться к ней...
     
  3. soleil

    soleil Гость

    Репутация:
    0
    К сожалению, не понимаю о чем речь. Не могли бы Вы пояснить?
    Я хотела бы уточнить: реализовывать возможность назначения задаче ресурсов очень сложно и поэтому следует воспользоваться объектом Scheduler?
     
  4. Klido

    Klido Гость

    Репутация:
    0
    в домино есть стандартное средство - резервирование ресурсов

    как оно привязано к документам (в нашем случае задачам) можно посмотреть на примере документа собрание (там выбор помещения)
     
  5. soleil

    soleil Гость

    Репутация:
    0
    Немного поразбиралась с планировщиком.
    У меня есть форма с Embedded Scheduler на форме есть кнопка, которая показывает пиклист, я выбираю нужные мне ресурсы, записываю их в поле, а затем это поле указываю в Resource Items. Ресурсы появляются в планировщике, но о них нет информации, когда они заняты, а когда свободны. Я бы хотела в документе ресурса прописывать интервал времени когда он занят и затем сделать так, чтобы планироващик считывал из этого поля информацию о доступности/занятости.

    И где же в Embedded Scheduler находится то чудное место, где можно указать доступность/занятость ресурса (как раскрасить эти клеточки)?busytime.nsf как-то участвует в этом?
    Открыла форму _CalendarEntry (Appointment), посмотрела, но там даже не заполнены свойства Resource Items, Rooms Items, Required People Items, Optional People Items, и как планировщик связан с документами ресурсов не понятно.
    И еще, в коде постоянно мелькает CSEventObj, что это такое?
     
  6. Klido

    Klido Гость

    Репутация:
    0
    ну CSEventObj - это Календар-Шедуллер-Эвент-Объект :)
    ну так не форма, а в документе - там достаточно просто видно как оно рождается....
     
  7. soleil

    soleil Гость

    Репутация:
    0
    Разбираю стандартное резервирование ресурсов.
    При резервировании ресурса, он добавляется в планировщик, но не отображается время доступности, полностью вся шкала заполняется цветом об отсутствии информации.
    Откуда шедулер берет эту информацию нигде не видно. Заранее спасибо за помощь.
     
  8. VladSh

    VladSh начинающий
    Lotus team

    Репутация:
    0
    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    soleil, не знаю как в стандартном планировании ресурсов, но в почте он берёт инфу из почтовых баз, из запланированных там доков. Цвет об отсутствии информации был при отсутствии доступа к некоторым почтовым базам пользователей, и если почтовая база находится на другом сервере, т.к. нормальное планирование ресурсов возможно в пределах одного сервера.

    P.S. Когда-то давно дурью маялся /требуются стальные нервы :trash:/, хотя может поможет... ;)
     
  9. soleil

    soleil Гость

    Репутация:
    0
    Добавлено:
    VladSh, спасибо за ссылку. Разбираюсь, но с учетом того, что я новичок это малоэффективно, сложно для меня все это.

    Klido говорит, что все просто.

    Неужели никак нельзя по простому сделать:
    в документе ресурсы сделать поля с временем занятости-доступности, а потом каким-то образом их в шедулер подставлять...
     
  10. VladSh

    VladSh начинающий
    Lotus team

    Репутация:
    0
    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Можно :(
    Как я писал в том постинге, на который давал ссылку, сначала изучаем теорию (книга "Разработка приложений в Domino Designer R7" - там расписано какие поля и куда подставлять) + открыть в почтовом ящике подформу "(InviteeCheckSchedules)", там это всё уже сделано! И разбираться...
     
  11. soleil

    soleil Гость

    Репутация:
    0
    Книгу читала раз десять, там целых три страницы про шедулер написано.
    У меня сейчас в шедулер названия ресурсов подставляются нормально, для этого просто нужно одно поле. это понятно. даже градусник двигается и время на форме изменятся, с этим я тоже разобралась.
    И где же то место, где прописывается время занятости? раз он добавляет ресурс в планировщик и говорит, что нет информации, значит он куда-то смотрит, где-то проверяет!?Мне не надо, чтобы шедулер обращался в почтовую базу, пусть смотрит в моей........
    Посмотрела на эту форму, ничего нового для себя не открыла, там нет ответа мой вопрос. По ссылке Вы очень большое исследование сделали, возможно, профессионал и разберется, но в этих множествах скриптов я запуталась.
    VladSh и Klido, пожалуйста, подскажите, помогите.

    Вот здесь человек задает вопрос такой же как и у меня. Но ответ на него: посмотреть 2 базы в sandbox (в которых даже шедулер не используется) и поиск, что тоже не дает особых результатов.
     
  12. VladSh

    VladSh начинающий
    Lotus team

    Репутация:
    0
    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Mitka дал ссылку на доку (первая ссылка), где расписано как работает резервирование Ресурсов. Думаю, лучше это знать, чем нет.
    Время занятости прописывается в системной базе данных busytime.nsf. Где то место, где происходит прописывание в почтовой базе я сейчас не помню. Вспоминать не хочется (я тогда убил где-то пару недель, постоянно гоняя в отладчике, чтобы разобраться как и что вызывается), да это и не важно сейчас.
    Важно понять механизм.
    Я сначала на пользовательском уровне изучил как механизм резервирования работает в почтовой базе, где создаются документы...

    В кратце, как это работает в почтовой базе: секретарь выбирает чела в планировщике и отправляет ему "приглашение", в почтовой базе этого чела создаётся определённый документ, на который натравливается определённый код. После вызова кода время резервируется в busytime.nsf.

    По культурному планировать время из своей базы у меня так и не получилось, поэтому я был вынужден создавать док в базе пользователя программно (надо иметь доступ на создание документов), предварительно методом научного тыка изучив какие айтемы он содержит.
    Код (это моя выжимка из всего того бреда, что есть в почтовом ящике):
    Код (Text):
    Const CALENDAR_EVENT = 1
    Const TASK_EVENT = 2
    Const RESOURCE_EVENT = 3

    Sub UpdateBusyTimeInfo(ND As NotesDocument, nEventType As Integer)
    'Проводка Notice-документов, т.е. запросов на подтверждение

    Dim BEobject As Variant         ' Back-End Object

    If (nEventType = RESOURCE_EVENT) Then
    Set BEobject = New NotesCSReservationDocument()
    Else
    Set BEobject = New NotesCSEventParticipantDocument(nEventType)             
    End If

    'Инициализация!!!
    Call BEobject.Init(ND, 128)

    Call BEobject.PrepareToSave(1)

    ' update busytime so that your busytime reflects the change
    ' if we're accepting a reschedule, then update busytime on the parent/instance note, not this note
    ' this is a calendar entry check the note to see if we need to update busytime
    'Call BEobject.UpdateBusyTimeInfo(1)

    Call BEobject.ActionHandler(ORS_MSGTYPE_CONFIRMATION, 1, 0)

    Call BEobject.MarkTempItems
    End Sub
    Если планируется использовать этот код в своей базе, то необходимо из почтового ящика скопировать к себе библиотеки TIMEUtilities и Common.
    Дело в том, что планировщику не скажешь где смотреть... во всяком случае я не нашёл таких настроек на сервере. Было бы здорово, конечно, подсунуть какую-нибудь свою базу... Думаю, это одна причина по которой Klido выдаёт ордена :ya_lamo: Планировщик может просматривать почтовые ящики пользователей, а также стандартную базу Ресурсов.

    А ещё орден выдаётся за то, чтобы планировать из своей базы данных, а это, как я понял, полноценно невозможно, т.к. BEobject требует профайл пользователя. Можно сделать только обходным путём, как я описал выше.

    Итого, что бы я делал в Вашей ситуации - шёл по аналогии:
    - создал бы стандартную базу Ресурсов и настроил её (если узнаете как это делается, чтобы шедулер по ней работал, то буду благодарен, - я просто с Ресурсами никогда не работал...).
    - научился бы пользоваться ей (резервировать ресурсы) вручную.
    Заодно посмотрел, какой документ создаётся при запросе на резервирование; изучил бы его айтемы.
    - попытался бы извне (со своей БД) создать этот док программно и натравить на него код, который я давал выше.
    Где-то так.
     
  13. Klido

    Klido Гость

    Репутация:
    0
    причем может просматривать, если не включена переадресация почты... т.е. если почта юзается внешняя - прощай все стандартные возможности планирования и прочего :ya_lamo:
     
  14. soleil

    soleil Гость

    Репутация:
    0
    Ну почему все так сложно! :ya_lamo:
    VladSh, спасибо за внимание к моей проблеме и подробные рекомендации.
    Ладно, буду разбираться.
     
  15. VladSh

    VladSh начинающий
    Lotus team

    Репутация:
    0
    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    soleil, всегда рад :ya_lamo:
    Потому что IBM ... гм, специфическая организация... А сейчас (с тех пор как Domino не считается платформой для СЭД) они продвигают её как почтовую систему. Для почты и стандартного планирования ресурсов этого функционала вполне достаточно, а вот шаг вправо / шаг влево...
    Дело в том, что они код базовых классов, от которых получается объект BEobject, скрыли lss-ками. Зачем - непонятно.. может быть деньги хотели когда-то брать за внедрение своих продуктов; "Дело ясное, что дело тёмное..." ©.
    Когда-то, было время, я хотел импортнуть код в библу и чуток откорректировать, чтобы он работал из разных баз...))) Но открытого кода нет :(
    Как будет время, попробую надавить через IdeaJam. Но если что-то от них и будет, то оно будет очень нескоро...

    А пока надо колупать самой))
    И начал бы я отсюда:
    Если что-то будет получаться или НЕ получаться, пишите, глядишь и разберёмся ;)
     
  16. Klido

    Klido Гость

    Репутация:
    0
    кстати, за отстутствием лотусиной почты и, как следствие, работающей задачи шедуллера не могу под вэбом посмотреть - групповые календари под в нормальной ситуации работают? хватает делегирования доступа к календарю для отображения хотя бы свободного времени именно в режиме вэб-почты?
    ещё в 8.х появилось в районе групповых календарей фишка "Отображение календарей" - я от радости решил, что наконец оно покажет разноцветно нечто вроде суммированного календаря, однако просто открываются в каком-то кривом виде клаендари тех, кого туда добавить (даже при наличии менеджерских прав на все базы) - это так и есть? просто более красивый доступ к чужим календарям? опять надо искусственно делать слияние записей для реально группового видения?
     
  17. soleil

    soleil Гость

    Репутация:
    0
    Как только я набралась смелости продолжать разбираться с шедулером, у меня сразу возник вопрос.
    Я добавляю в планировщик людей из адресной книги, ресурсы, помещения (из базы "Резервирование ресурсов"). Их время занятости/доступности отображается нормально в планировщике (нет никаких тайных no info).
    Что нужно сделать, чтобы время людей и ресурсов зарезервировалось в базе busytime при сохранении?
    Или это какой-то наисложнейший код, который мне не удалось найти в запутанном коде стандартной базы?
     
  18. VladSh

    VladSh начинающий
    Lotus team

    Репутация:
    0
    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    soleil
    Если создаёте из почтовой базы, то... точно не помню, вроде нужно отправить приглашения.
    Если создаёте из другой (своей) БД, то программно создать документы в почтовых базах юзеров и натравить на них код... впрочем, об этом я писал здесь; и код же тоже там есть!

    P.S. Если хотите, чтобы резервировалось при сохранении, то значит надо делать всё вышесказанное при сохранении.
    Возможно, ещё придётся обрабатывать ситуацию одновременного запроса на резервирование... Т.е. у кого-то операция пройдёт (тот, кто был быстрее), а у кого-то нет.. Бывает так, что выбрал 5 пользователей, 4 из них удалось запланировать, а 1 - нет, т.к. в это время уже кто-то другой зарезервировал это время.
     
  19. soleil

    soleil Гость

    Репутация:
    0
    VladSh, возможно я чего-то недопонимаю. До последнего Вашего топика я думала так:
    В моей базе есть форма с планировщиком. Я добавляю туда людей из адресной книги (их время занятости и доступности отображается). Я выбираю интервал для резервирования. Затем при сохранении создается документ (или изменяется уже существующий документ) в базе busytime.nsf и с помощью вышеописанного кода резервируется время.

    Теперь я думаю так:
    Создается какой-то документ в почтовой базе пользователя, затем используется вышеописанный код, который и создает/изменяет документ (время занятости пользователя) в базе busytime.nsf

    а как это сделать?

    В общем, я запуталась.
     
  20. VladSh

    VladSh начинающий
    Lotus team

    Репутация:
    0
    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    При сохранении ничего не создаётся, т.к. на Вашей форме нет никакого кода сохранения.
    Ну да, примерно так и есть.
    Я об этом и говорил:
    "Приглашение" - это и есть тот док, который надо создавать в почтовой базе пользователя.
    а также:
    Ну не хотите Вы экспериментировать :) , типа вот так:
    Без понимания механизма можно получить код, но легче от этого не будет.

    Ещё раз, как это работает.
    При использовании планировщика в почте, после выбора пользователя отрабатывает код, который отправляет приглашение пользователю, т.е. фактически в почтовой базе пользователя, которого выбрали, создаётся документ (он туда попадает с помощью роутера). Пользователь, принимая приглашение, изменяет "статус" документа и он попадает в вид, просматриваемый задачей Sched и объектом Scheduler, т.е. при наличии этого документа в определённом виде объект Scheduler и показывает нам, что врямя, указанное в этом документе, занято. Т.е. объект Scheduler на самом деле просматривает почтовые базы пользователей и уже по ним определяет, какое время свободно, а какое занято, и показывает нам результат разными цветами.
    Нам же не нужно:
    - планировать из почтовой базы, нам нужно планировать из своей;
    - чтобы пользователь что-то подтверждал,
    для этого необходимо создать документ в почтовой базе пользователя программно с определёнными "флагами", т.е. чтобы документ уже был сразу подтверждённым!

    Создать док программно можно, например, так:
    Код (Text):
    Static Function CreateNote(ND_Source As NotesDocument) As NotesDocument
    Dim ND As NotesDocument

    'Здесь подключаемся к почтовой БД пользователя, т.е. по ND_Source.RequiredAttendees(0) получаем NDB_Mail
    '...
    Set ND = NDB_Mail.CreateDocument

    'Нужно создавать отдельные Notice для:
    'RequiredAttendees  Data Type: Text, Field Flags: SUMMARY NAMES; содержит имена персон, обязательных на данном мероприятии
    'RoomToReserve      Data Type: Text, Field Flags: SUMMARY NAMES; содержит имена помещений
    'Resources          Data Type: Text, Field Flags: SUMMARY NAMES; содержит имена ресурсов
    'здесь жёстко забито только для персон; в идеале нужно переписать код, чтобы он был более настраиваем
    Call ND.ReplaceItemValue("RequiredAttendees", ND_Source.RequiredAttendees)

    Call ND.ReplaceItemValue("StartDate", ND_Source.StartDate)
    Call ND.ReplaceItemValue("StartTime", ND_Source.StartTime)
    Call ND.ReplaceItemValue("StartDateTime", ND_Source.StartDateTime)
    Call ND.ReplaceItemValue("StartTimeZone", ND_Source.StartTimeZone)
    Call ND.ReplaceItemValue("EndDate", ND_Source.EndDate)
    Call ND.ReplaceItemValue("EndTime", ND_Source.EndTime)
    Call ND.ReplaceItemValue("EndDateTime", ND_Source.EndDateTime)
    Call ND.ReplaceItemValue("EndTimeZone", ND_Source.EndTimeZone)

    Call Prepare(ND_Source, ND)

    Call ND.Save(True, True)
    Set CreateNote = ND
    End Function

    Sub Prepare(ND_Source As NotesDocument, ND As NotesDocument)
    'Вгоняем недостающие поля

    Call ND.ReplaceItemValue("CalendarDateTime", ND_Source.StartDateTime)

    Call ND.ReplaceItemValue("Form", "Notice")
    Call ND.ReplaceItemValue("NoticeType", "N")
    Call ND.ReplaceItemValue("AppointmentType", "3")
    Call ND.ReplaceItemValue("APPTUNID", Cstr(ND.UniversalID))
    Call ND.ReplaceItemValue("$Orig", ND.UniversalID)
    Call ND.ReplaceItemValue("$CSVersion", "2")
    Call ND.ReplaceItemValue("$CSFlags", "w")
    Call ND.ReplaceItemValue("$PublicAccess", "1")
    Call ND.ReplaceItemValue("$ExpandGroups", "3")

    Call ND.ReplaceItemValue("Repeats", "")
    Call ND.ReplaceItemValue("OrgTable", "C0")
    Call ND.ReplaceItemValue("OrgState", "0")

    Call ND.ReplaceItemValue("Chair", NS.UserName)
    Call ND.ReplaceItemValue("Owner", NS.UserName)

    'жёстко забито для персон
    Call ND.ReplaceItemValue("$BusyName", ND_Source.RequiredAttendees(0))

    Call ND.ReplaceItemValue("$BusyPriority", 1)

    Call ND.ReplaceItemValue("SequenceNum", 1)
    Call ND.ReplaceItemValue("UpdateSeq", 1)
    Call ND.ReplaceItemValue("StorageRequiredNames", "1")

    Call ND.ReplaceItemValue("BookFreeTime", "0")

    End Sub

    'Пример использования:
    Function Reserve(ND_Source As NotesDocument) As Boolean
    'ND_Source - документ в нашей базе, в котором мы выбирали пользователей с Scheduler'ом
    On Error Goto ErrH
    Dim ND As NotesDocument

    'Проверка на "свободность" с помощью IsScheduleTimeFree(ND_Source)

    'Для юзеров
    Set ND = CreateNote(ND_Source)
    If ND Is Nothing Then Exit Function
    Call UpdateBusyTimeInfo(ND, CALENDAR_EVENT)

    'По идее для ресурсов
    'Set ND = CreateNote(ND_Source)
    'If ND Is Nothing Then Exit Function
    'Call UpdateBusyTimeInfo(ND, RESOURCE_EVENT)

    Reserve = True
    Exit Function

    ErrH:
    'Обработка ошибок
    Exit Function
    End Function
     
Загрузка...

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