Диалоги Lotus developers

  • Автор темы Vagor.ini
  • Дата начала
Статус
Закрыто для дальнейших ответов.
V

Vagor.ini

Топик для вопросов и ответов связанных с Lotus продуктами, не требующие длительных рассуждений и отдельных тем.
 
O

osmor

Доброго времени суток, ALL
Хочу сделать базку (многопользовательскую) в которой нужны напоминания как в календаре пользовательской почтоыой базу. Обнаружил, что EnableAlarms и вообще все что связано с Alarm работает только с почтовой базой клиента.
Как сделать? Пихать напоминания в почтовый файл? А если нужно нескольким пользователям?
Запускать агента по базе каждую минуту?
И вообще может кто расскажет как рабоатет напоминание, если все методы относятся к UIWorkspace, но тем не менне все работает когда я почтовыю зазу не открываю ...
В общем любые идеи, комментарии, ссылки и направления движения приму с благодарностью. :)
Спасибо.
 
G

Gogan.exe

Люди, у меня тут задача, но как решить – не знаю.
В общем, есть база документов. Среди прочих полей, есть в каждом документе и поле «Дата». В базе этой тысячи и тысячи документов.
Задача такова: Сделать Form c Embedded view. То есть форма призвана выводить доки только по данной дате (иначе нагрузка на сервак бешеная). В форме этой нужно поле: «за какую дату», кнопочка: «вывести» и, собственно, вид. Но что-то не хватает мне моих знаний…
Кто мне может помочь?
 
V

Veselinka

Gogan.exe - постановка задачи немного расплывчатая, но яотвечу на то как я ее поняла, а если поняла не правильно - ты потом поясни.

То есть есть документа А, открывающийся по форме А.
В Форме А есть встроенная вьюха. В этой вьюхе надо показывать документы за определенную дату, которая указана в документе А.
Если постановка такая, то:
1. Вьюха, в ней 1 колонка категоризована по например @text(@day(date))+"."+ @text(@month(Date)) + "." + @text(@Year(Date))
У вьюхи с свойствах вью, НЕ должно стоять Collapse when first opened, а то она будет свернута и в форме документов видно не будет.

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

В форме вставляешь эту вьюху и делаешь видимость single category - аналогичное преобразование даты в твоем документе.

В результате - вьюха не будет перестраиваться на сервере каждый раз, так как в формуле селекции не будет даты.
Если ты захочешь дату в поле сделать редактируемой - то есть ее можно менять и надо перегружать категорию, - то тебе придется нарисовать в форме еще кнопку рефреш, которая будет брать IUdocument, закрывать его, предварительно сохранив и потом переоткрывать. Для избавления от диалогов сохранения используй поле SaveOptions="1" | "0"
 
V

Veselinka

osmor
Я подумаю, сходу не могу ничего сказать - просто не пробовала с такой задачей работать.
 
V

Veselinka

osmor - вот что припомнила - это может задать напрвление движения:
даемон, которому ставится задача на выдачу алармов - крутиться на клиенте и на клиенте же ему ставится задача. То есть ты не сможешь с сервера ее поставить нескольким пользователям скорее всего. Можно попробовать например уентрализовано присылать уведомления (например встреча или еще какое-нибудь, которое они сами в календарь на аларм ставить будут)
 
G

Gogan.exe

Veselinka
Хех, тебе показалась расплывчатой постановка задачи, а мне твой ответ. Я постараюсь перефразировать и уточнить:
Есть коллекция документов созданных по форме «А». Их имеются тысячи и тысячи.
Задача – вывести все документы созданные по форме «А» через вид, дав предварительно возможность пользователю указать дату. То есть, пользователь говорит «Дай мне все документы из той коллекции, которые имеют в поле Дата вот такое значение _____ и задает значение.
Я решил, что проще будет создать форму «Б», в которой будет 3 элемента. Поле «Дата» (документы за какую дату хочет увидеть пользователь). Ембайдед вью, в котором будет выводиться список нужных документов и кнопка «Вывести» (по нажатию, на которой во вставленном view будут появляться доки по дате указанной в поле «Дата»). Теперь яснее? Надеюсь, что да.
Сложность в том, что я просто не знаю как задать формулу отбора уже _после_ того, как форма «Б» загружена и передать через кнопку эту выборку на вьюшку....
 
O

osmor

Veselinka, спасибо
т.е. я так понял нужно каждому в его локальную базу алармы писать?
только наверное пока они мою базу не откроют, новые алармы к ним не запишутся... если только агенту не дать доступа к почтовым базам пользователей...
А кстати вопрос эти алармы они где хранятся?
Нашел в коде календаря такую веШчь
Код:
' User is turning on alarm
Call note.replaceitemvalue("$Alarm",1) ' System flag
но поля $Alarm не нашел ...
еще нашел в библиотеках класс CSEventNotes откуда в общем-то и вызывается диалог аларма, в нем строчка:

Код:
nresult = m_ws.DialogBox("AlarmOptions",True,True,,,, Not(Me.m_uidoc.editmode) ,m_strtable.GetString(ALARM_TITLE, Null),note, True)
но формы "AlarmOptions" не нашел...
Я не силен в премудростях пограммирования под LOTUS, я думал если формы вызывается она должна быть в этой базе....
в общем завяз, код класса читаю вроде все понятно, но откуда формы берутся и где все это сохраняется?
да забыл LD 6.5.1
 
V

Veselinka

Gogan.exe

В предыдущем ответе расписала просто верхнеуровневую концепцию.
Если нужно более подробно то:

По сути все кроме кнопки "Отобразить" - тривиально. В ней нетривиально только то, что тебе на ней надо:
dim ws as new NotesUIWorkspace
set uidoc=ws.currentdocument
set doc=uidoc.document

doc.date=date_
call doc.computewithform(0,0)
mode=uidoc.editmode

здесь мы откудато взяли дату и вставили ее в поле формы, потом форму пересчитали
а дальше надо документ переоткрыть, иначе вьюха эмбеднутая не пересчитается:
doc.saveoptions="0"
call doc.save(true,true)

set db=doc.parentDatabase
call uidoc.save
unid=doc.universalid
call uidoc.close

set doc=db.GetdocumentyUNID(unid)
call ws.editdocument(mode,doc)


Но при этом подходе у тебя в базе будут плодиться документы, которые имеют смысл только как результат просмотра. А они нужны? Или может быть их например просто упорядочить?
То есть завести по одному документу на каждый день?
Тогда с момента создания первого документа по форме А и до настоящег периода (период может быть другим и зависит от конкретной модели данных документов А) надо сгенерить документы Б по одному на каждую дату. И потом раз в сутки ночью генерить новый. А пользователя спрашивать диалог даты ДО открытия формы. И открывать документ на дату.

А еще при этом подходе и документы генерить не надо - просто выдават диалог с вопросом даты, а потом создавать новый документ по форме Б, вводить в него дату и открывать его в рабочей области. Сохранять его не надо.
 
G

Gogan.exe

Смысл создавать документы? Я думал в «квери опен» запхнуть вопрос о дате с полем «Дата». А потом открывать уже вьюшку где Select (Form = Blah) : (DateInsideDoc = Дата).
Форму и ембадед – это только как вариатн, смысл просто сделать отбор прежде чем вывести список доков.
 
I

Isk

Veselinka А нельзя создать форму с полем для формулы как при полнотекстном поиске?
 
V

Veselinka

Gogan.exe

Если ты внимательно почитаешь, что я писала, то тебе этот вариант и был предложен. Только лучше не на queryopen, у тебя на этом событии НЕ БУДЕТ еще полей если документ новый, а если на постопен, то вьюха не посчитается как надо. Поэтому надо делать как я сказала - то есть заполнять документ в кнопке и потом открывать с уже заполненными полями.

Варианты с генерацией документов были предложены в силу того как ты сформулировал use case:
"...Я решил, что проще будет создать форму «Б», в которой будет 3 элемента. Поле «Дата» (документы за какую дату хочет увидеть пользователь). Ембайдед вью, в котором будет выводиться список нужных документов и кнопка «Вывести» (по нажатию, на которой во вставленном view будут появляться доки по дате указанной в поле «Дата»)..."
-тут совершенно однозначно оговорена кнопка "вывести" - работу которой ты не сможешь сделать без сохранения документа в базе. Кроме того из нее логически также следует, что поле дата будет меняться прямо в форме (иначе бы кнопка просто не понадобилась - просто загружать сразу документ 1 раз по неизменной дате и все). Так что "...Смысл создавать документы?..." является прямым следствием из описанного тобой Use case-а. При модификации Use case-а - как я говорила - диалог, потом открытие формы - такая необходимость отпадает.

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

nor

Gogan.exe
все неправильно ты делаешь, мне кажется... коряво как-то... сделай лучше нормальное категоризированое представление, в котором отображаются документы по дате и пользуйся им на здоровье...
или лучше на твоей форме, которая служит для составления отчета, в объект embedded view загружай не view, а folder... почему? да потому что в десять раз проще найденные документы поместить в папку, чем писать изощреные скрипты для отбора документов в представлении в зависимости условия... каждый раз документы в папке, которые остались от предыдущего поиска нужно убирать (не путать с удалять) - это просто и логично
ну и на худой конец, как ты задумал изначально, есть в классе NotesView свойство SelectionFormula - именно то, что тебе и нужно - это свойство управляет формулой отбора представления... при этом документ, который используется для составления отчета не обязательно сохранять (и ничего лишнего накапливаться не будет, как ты переживал), ты ведь не сохраняешь диалоговые сообщения MessageBox... :)


Veselinka
для отображения изменений в объекте embedded view не нужно закрывать и переоткрывать текущий документ - нужно обновить само представление (или папку), которое внедрено в форму...


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

__________________________________
у меня вот квартиру обокрали и с работы одной уволили (банкрот фирмы) :( - жизнь кажется полным г..м, потому что я лишился своего компа, моего архива текущей работы и выхода в инет... - 3 недели пропали... все заново делать у меня руки не подымаются...


как прошла встреча 3-го числа?
 
N

nor

Gogan.exe
(дополнение предыдущего сообщения)
искать документы по условию нужно методом Search или FTSearch класса NotesDatabase, могу привести парочку примеров, потому как сначала (новичкам то есть) трудно писать строки отбора для этих методов...
 
O

osmor

nor
Спасибо и ... сочувствую :(
Я не пытался содрать код... поскольку я чайник, то пытаюсь учится всеми возможными способами одним из основных является как раз анализ имеющихся кодов и баз. Пытаясь понять как алармы сделаны профессионалами, столкнулся с тем что вызываются формы и поля которых я не нашел (см. предыдущий топик).
Тот способ который Вы описали алгоритмически понятен, но для меня пока совершенно не выполним (я уже сказал что я чайник...)
"при помощи серверных классов" - это куда копать? Ключевые слова скажите...
В общем понял, похоже задача мне пока не по зубам. Пока обойдусь рассылкой писем, и буду расти над собой :)
Еще раз спасибо.
 
G

Gogan.exe

nor отбор документов для меня - не проблема. Проблема в том, что условия отбора должны задаваться пользователем _перед_ тем как произойдет вывод.
 
G

Gogan.exe

У меня возник вопросец, как реализовать следующее:
В базе «А» имеется список имя – телефон (в одной колонке имя, в другой телефон).
В базе «Б» имеется форма, в которой среди прочих есть поле «Имя» и поле «Телефон». Нужно предоставить пользователю возможность один раз выбрать строку из вида базы «А» и в базе «Б» эти два поля заполняются автоматом.
Можно сделать выбор для каждого по одиночке из того списка через dialog list field type (сначала выбрать телефон, затем имя). Но можно воспользоваться и @PickList. Вопрос в том, как может мне помочь @PickList? Там выбор тоже идет по одному элементу за раз? И еще, @PickList мне выдает ошибку «Entry not in design list” что это значит?
 
G

Gogan.exe

Наро, на пмощь! Я сейчас свихнусь! В чем у меня ошибка?

FIELD issave := issave;

@SetField("issave";"1");

@If(НомерЗапирски != "" &
Подразделение != "";
@True; @SetField("issave"; "0"));

@If(Тип1 != "" &
Наименование1 != "" &
Колличество1 != ""; @True; @SetField("issave"; "0"));

@If(Тип2 !="";
@If(Наименование2 != "" &
Колличество2 != "";
@True; @SetField("issave"; "0"));@True);

@If(Тип3 !="";
@If(Наименование3 != "" &
Колличество3 != "";
@True; @SetField("issave"; "0"));@True);

@If(Тип4 !="";
@If(Наименование4 != "" &
Колличество4 != "";
@True; @SetField("issave"; "0"));@True);

@If(Тип5 !="";
@If(Наименование5 != "" &
Колличество5 != "";
@True; @SetField("issave"; "0"));@True);

@If(Тип6 !="";
@If(Наименование6 != "" &
Колличество6 != "";
@True; @SetField("issave"; "0"));@True);

@If(Тип7 !="";
@If(Наименование7 != "" &
Колличество7 != "";
@True; @SetField("issave"; "0"));@True);

@If(issave = "1" ;@Command([FileSave]);@Prompt([OK];"Не все поля заполнены";"Заполните все поля обязательные к заполнению"))

Этот код должен проверять, заполнены ли все поля. Если да - сохранать док, если нет - говорить, чтобы заполнели. "НомерЗапирски" - это не опечатка. issave - это невидимое поле, которое хранит 0 - если логика нашла незаполненое поле, или 1 если все поля заполнены.
Тип1,Наименование1,Колличество1, НомерЗапирски, Подразделение, должны быть заполнены всегда. Остальные поля должны быть заполнены, если заполнено соответствующее поле ТИП. Проблемма в том, что как бы не заполнял я поля - сохранение не происходит.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

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