• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы soleil
  • Дата начала
S

soleil

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

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


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

Klido

Необходимо реализовать возможность назначения задаче определенных ресурсов в зависимости от того доступны они или нет в данное время.
за это - орден красной звезды :maybe:
MS Projects уже не в моде? В нем ресурсы, в лотусе - задачи...

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

soleil

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

Klido

в домино есть стандартное средство - резервирование ресурсов

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

soleil

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

И где же в Embedded Scheduler находится то чудное место, где можно указать доступность/занятость ресурса (как раскрасить эти клеточки)?busytime.nsf как-то участвует в этом?
в домино есть стандартное средство - резервирование ресурсов

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

Открыла форму _CalendarEntry (Appointment), посмотрела, но там даже не заполнены свойства Resource Items, Rooms Items, Required People Items, Optional People Items, и как планировщик связан с документами ресурсов не понятно.
И еще, в коде постоянно мелькает CSEventObj, что это такое?
 
S

soleil

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

VladSh

начинающий
Lotus Team
11.12.2009
1 783
157
BIT
55
soleil, не знаю как в стандартном планировании ресурсов, но в почте он берёт инфу из почтовых баз, из запланированных там доков. Цвет об отсутствии информации был при отсутствии доступа к некоторым почтовым базам пользователей, и если почтовая база находится на другом сервере, т.к. нормальное планирование ресурсов возможно в пределах одного сервера.

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

soleil

Добавлено:
P.S. Когда-то давно дурью маялся /требуются стальные нервы biggrin.gif/, хотя может поможет... wink.gif
VladSh, спасибо за ссылку. Разбираюсь, но с учетом того, что я новичок это малоэффективно, сложно для меня все это.

ну так не форма, а в документе - там достаточно просто видно как оно рождается....
Klido говорит, что все просто.

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

VladSh

начинающий
Lotus Team
11.12.2009
1 783
157
BIT
55
Неужели никак нельзя по простому сделать:
в документе ресурсы сделать поля с временем занятости-доступности, а потом каким-то образом их в шедулер подставлять...
Можно :(
Как я писал в том постинге, на который давал ссылку, сначала изучаем теорию (книга "Разработка приложений в Domino Designer R7" - там расписано какие поля и куда подставлять) + открыть в почтовом ящике подформу "(InviteeCheckSchedules)", там это всё уже сделано! И разбираться...
 
S

soleil

Книгу читала раз десять, там целых три страницы про шедулер написано.
У меня сейчас в шедулер названия ресурсов подставляются нормально, для этого просто нужно одно поле. это понятно. даже градусник двигается и время на форме изменятся, с этим я тоже разобралась.
И где же то место, где прописывается время занятости? раз он добавляет ресурс в планировщик и говорит, что нет информации, значит он куда-то смотрит, где-то проверяет!?Мне не надо, чтобы шедулер обращался в почтовую базу, пусть смотрит в моей........
открыть в почтовом ящике подформу "(InviteeCheckSchedules)", там это всё уже сделано!

Посмотрела на эту форму, ничего нового для себя не открыла, там нет ответа мой вопрос. По ссылке Вы очень большое исследование сделали, возможно, профессионал и разберется, но в этих множествах скриптов я запуталась.
VladSh и Klido, пожалуйста, подскажите, помогите.

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

VladSh

начинающий
Lotus Team
11.12.2009
1 783
157
BIT
55
человек задает вопрос такой же как и у меня. Но ответ на него: посмотреть 2 базы в sandbox (в которых даже шедулер не используется) и поиск, что тоже не дает особых результатов.
Mitka дал ссылку на доку (первая ссылка), где расписано как работает резервирование Ресурсов. Думаю, лучше это знать, чем нет.
И где же то место, где прописывается время занятости?
Время занятости прописывается в системной базе данных busytime.nsf. Где то место, где происходит прописывание в почтовой базе я сейчас не помню. Вспоминать не хочется (я тогда убил где-то пару недель, постоянно гоняя в отладчике, чтобы разобраться как и что вызывается), да это и не важно сейчас.
Важно понять механизм.
Я сначала на пользовательском уровне изучил как механизм резервирования работает в почтовой базе, где создаются документы...

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

По культурному планировать время из своей базы у меня так и не получилось, поэтому я был вынужден создавать док в базе пользователя программно (надо иметь доступ на создание документов), предварительно методом научного тыка изучив какие айтемы он содержит.
Код (это моя выжимка из всего того бреда, что есть в почтовом ящике):
Код:
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 требует профайл пользователя. Можно сделать только обходным путём, как я описал выше.

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

Klido

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

soleil

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

VladSh

начинающий
Lotus Team
11.12.2009
1 783
157
BIT
55
soleil, всегда рад :ya_lamo:
Ну почему все так сложно! :)
Потому что IBM ... гм, специфическая организация... А сейчас (с тех пор как Domino не считается платформой для СЭД) они продвигают её как почтовую систему. Для почты и стандартного планирования ресурсов этого функционала вполне достаточно, а вот шаг вправо / шаг влево...
Дело в том, что они код базовых классов, от которых получается объект BEobject, скрыли lss-ками. Зачем - непонятно.. может быть деньги хотели когда-то брать за внедрение своих продуктов; "Дело ясное, что дело тёмное..." ©.
Когда-то, было время, я хотел импортнуть код в библу и чуток откорректировать, чтобы он работал из разных баз...))) Но открытого кода нет :(
Как будет время, попробую надавить через . Но если что-то от них и будет, то оно будет очень нескоро...

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

Klido

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

soleil

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

VladSh

начинающий
Lotus Team
11.12.2009
1 783
157
BIT
55
soleil
Если создаёте из почтовой базы, то... точно не помню, вроде нужно отправить приглашения.
Если создаёте из другой (своей) БД, то программно создать документы в почтовых базах юзеров и натравить на них код... впрочем, об этом я писал здесь; и код же тоже там есть!

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

soleil

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

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

программно создать документы в почтовых базах юзеров
а как это сделать?

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

VladSh

начинающий
Lotus Team
11.12.2009
1 783
157
BIT
55
В моей базе есть форма с планировщиком. Я добавляю туда людей из адресной книги (их время занятости и доступности отображается). Я выбираю интервал для резервирования. Затем при сохранении создается документ (или изменяется уже существующий документ)
При сохранении ничего не создаётся, т.к. на Вашей форме нет никакого кода сохранения.
Создается какой-то документ в почтовой базе пользователя, затем используется вышеописанный код, который и создает/изменяет документ (время занятости пользователя) в базе busytime.nsf
Ну да, примерно так и есть.
Я об этом и говорил:
В кратце, как это работает в почтовой базе: секретарь выбирает чела в планировщике и отправляет ему "приглашение", в почтовой базе этого чела создаётся определённый документ, на который натравливается определённый код. После вызова кода время резервируется в busytime.nsf.
"Приглашение" - это и есть тот док, который надо создавать в почтовой базе пользователя.
а также:
По культурному планировать время из своей базы у меня так и не получилось, поэтому я был вынужден создавать док в базе пользователя программно (надо иметь доступ на создание документов), предварительно методом научного тыка изучив какие айтемы он содержит.
программно создать документы в почтовых базах юзеров
а как это сделать?
Ну не хотите Вы экспериментировать :) , типа вот так:
Важно понять механизм.
Я сначала на пользовательском уровне изучил как механизм резервирования работает в почтовой базе, где создаются документы...

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

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

Создать док программно можно, например, так:
Код:
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
 
Мы в соцсетях:

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