itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent =...

389
Lotus Domino R. 5; @-(popjttyjibi, LotusScript, ecmpoennbie KJIOCCH LotusScript u Java 501 while (agents.hasMoreElements()) { Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) { case Agent. TARGET ALL__DOCS: tq = "all docs"; break; case Agent.TARGET_ALL_DOCS IN VIEW: tg =• "all docs in view"; break; case Agent.. TARGET_NEW_ DOCS : tg = "new docs"; break; case Agent .TARGET_NEW_OR_MODIFIED DOCS.-tg = "new or modif docs"; break; case Agent.TARGET_NONE: tg ---- "-none"; break; case Agent.TARGET_SELECTED_DOCS: tg = "selected docs"; break; case Agent.TARGET_UNREAD_DOCS_iN VIEW: tg =- "unread docs in view";break; default: tg = "unknown"; break; i switch (agent.getTrigger()) { case Agent. .TRIGGER_AFTER_MAIL_DELTVERY: tr=--"after mail deliv"; break; case Agent.TRIGGER_BEFORE_MAIL_DELIVERY: tr="before new mail"; break; case Agent.TRIGGER_DOC_PASTED: tr="document pasted"; break; case Agent.TRIGGER DOC_UPDATE: tr="document updated"; break; case Agent.TRIGGER_MANUAL: tr="manual"; break; case Agent.TRIGGER_NONE: tr="none"; break; case Agent.TRIGGER_SCHEDULED: tr="scheduled"; break; } System.out.println(agent.getName () + ": target; is " + agent. getTarget () + " - " + tg + "; trigger is " + agent.getTrigger() + " - " + tr ); } A CBoftcTBO Query - «3anpoc JIJIH oxSopa ofipaGaTtiBaeMMx areHTOM flOKyivieHTOB» LotusScript: queryS = notesAgent.Query Java: Siring query = Agent.getQueryQ TCKCT sanpoca (THO String), wcnoJibsyeMoro arenroM OTH ox6opa o6pa6aTbmaeMbix HM AOKVMeHTOE H onpeflejjeHHoro B OKHC OocTpoHTejia arenxoB KHOHKOH Add Search. ECJIH ana arenxa ne DBIJI onpe.ne.neH sanpoc KHOHKOH Add Search, CBOHCTBO B03Bpainaex nycxyto cxpOKy, fla>Ke ecjiH areux, HanHcaHHbiH c npHMeneHHCM @-cj)opMyji, caM ox6Hpaex o6pa6axbiBaeMbie HM flOKyMCHXbi onepaxopoM SELECT HJIH oxSop o6pa6axwBaeMbix flOKyMeHxoB BbinojiHaexca areHXOM cpeflcxBaMH LotusScript HJIH Java. rtpmviep. CKpunr nojiyiaer (j>opMyjiy oxDopa areHxa c H33BaHneM Cleansing Agent. Dim session As New NotesSession Dim db As NotesDatabase Dim agent As NotesAgent Set db = session.CurrentDatabase Dim selection As String agentList = db.Agents Forall a In agentList If ( a.Name = "Cleansing Agent" ) Then Set agent = a End If End Forall selection = agent.Query Bo3Mo»eHbi cjieayiomHe pe^yjibraxbi. ECJIH arem o6pa6axbiBaex TOJIBKO zioKyMenrbi, coflep/Kaiune C;IOBO "tulip" (nojibnaH), CBOHCTBO Quer>' Bepnex ("tulip").

Transcript of itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent =...

Page 1: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5; @-(popjttyjibi, LotusScript, ecmpoennbie KJIOCCH LotusScript u Java 501

while (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case Agent. TARGET ALL__DOCS: tq = "all docs"; break;case Agent.TARGET_ALL_DOCS IN VIEW: tg =• "all docs in view"; break;case Agent.. TARGET_NEW_ DOCS : tg = "new docs"; break;case Agent .TARGET_NEW_OR_MODIFIED DOCS.-tg = "new or modif docs"; break;case Agent.TARGET_NONE: tg ---- "-none"; break;case Agent.TARGET_SELECTED_DOCS: tg = "selected docs"; break;case Agent.TARGET_UNREAD_DOCS_iN VIEW: tg =- "unread docs in view";break;default: tg = "unknown"; break;iswitch (agent.getTrigger()) {case Agent. .TRIGGER_AFTER_MAIL_DELTVERY: tr=--"after mail deliv"; break;case Agent.TRIGGER_BEFORE_MAIL_DELIVERY: tr="before new mail"; break;case Agent.TRIGGER_DOC_PASTED: tr="document pasted"; break;case Agent.TRIGGER DOC_UPDATE: • tr="document updated"; break;case Agent.TRIGGER_MANUAL: tr="manual"; break;case Agent.TRIGGER_NONE: tr="none"; break;case Agent.TRIGGER_SCHEDULED: tr="scheduled"; break;}System.out.println(agent.getName () +

": target; is " + agent. getTarget () + " - " + tg +"; trigger is " + agent.getTrigger() + " - " + tr );

}A

CBoftcTBO Query - «3anpoc JIJIH oxSopa ofipaGaTtiBaeMMx areHTOM flOKyivieHTOB»LotusScript: queryS = notesAgent.Query

Java: Siring query = Agent.getQueryQ

TCKCT sanpoca (THO String), wcnoJibsyeMoro arenroM OTH ox6opa o6pa6aTbmaeMbix HM AOKVMeHTOE H onpeflejjeHHoro B OKHC OocTpoHTejia arenxoB KHOHKOH Add Search. ECJIH ana arenxa ne DBIJI onpe.ne.neH sanpoc KHOHKOH Add Search, CBOHCTBO B03Bpainaex nycxyto cxpOKy, fla>Ke ecjiH areux, HanHcaHHbiH c npHMeneHHCM @-cj)opMyji, caM ox6Hpaex o6pa6axbiBaeMbie HM flOKyMCHXbi onepaxopoM SELECT HJIH oxSop o6pa6axwBaeMbix flOKyMeHxoB BbinojiHaexca areHXOM cpeflcxBaMH LotusScript HJIH Java.

rtpmviep. CKpunr nojiyiaer (j>opMyjiy oxDopa areHxa c H33BaHneM Cleansing Agent.

Dim session As New NotesSessionDim db As NotesDatabaseDim agent As NotesAgent • •Set db = session.CurrentDatabaseDim selection As StringagentList = db.AgentsForall a In agentListIf ( a.Name = "Cleansing Agent" ) Then Set agent = a

End If End Forall selection = agent.Query

Bo3Mo»eHbi cjieayiomHe pe^yjibraxbi.

• ECJIH arem o6pa6axbiBaex TOJIBKO zioKyMenrbi, coflep/Kaiune C;IOBO "tulip" (nojibnaH), CBOHCTBO Quer>' Bepnex ("tulip").

© InterTrust Co. Tea. (095) 9567928

Page 2: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

502 Встроенные массы LotusScript u Java

• Если агент обрабатывает только документы, содержащие слово "tulip" и созданные позже 18сентября 1998 года, свойство вернет ("tulip") AND ((_CreatioriDatej > 18.09.98).

• Если обрабатываются только документы формы Response, вернется (((Formj="Response")).• Если обрабатываются только документы формы Response, содержащие фразу "green

mustard" (зеленая горчица) в поле Subject, будет возвращено ((iForml="Response")) AND([Subject] CONTAINS (green mustard)).

© Свойство HasRimSkiceModified - «выполнялся ли агент хотя бы раз после его последней модификации»LotusScript: flog — nofei^gen/.HasRunSinceModified

Возвращает true, если агент выполнялся хотя бы раз после последней модификации, или false, если не выполнялся.

Свойство LastRun • «Б'ремя последнего выполнения агента»

LotusScript: date V~ notesAgent.ljasiRuit

Java: DaleTime date = Agent.geiLasiRnnQ

Возвращает дату-время последнего выполнения агента (в LotusScript •- Variant of type DATE, в Java - объект класса DateTime). Если агент ранее не выполнялся, в LotusScript возвращается 30.12.! 899 (версии 4.x) или 0:00:00 (версия 5.0), а в Java - null.

Пример 1. Java-агент для каждого агента текущей базы выводит дату и время его последнего запуска или сообщение о том, что агент еще не запускался.

import j ava,util.Vector;// Agent/LastRimDatabase db ~ agentContext . getCurrentDataba.se ();Vector agents = db.getAgents();for (int. i — 0; i < agents. size (} ; i-t-+)}t

Agent agent = (Agent)agents.elementAt(i); DateTime date = agent.getLastRun(); vif (date.getDateOnly(} != null)

System, out .println ( "Agent " + agent. get.Name () +•" last, ran on " + date. getDateOnly ( ) + •?" at " + date.getTimeOniy());

elseSystem.out.println("Agent " + agent.getName() +

" hasn't run yet:"); \

Пример 2. Если скрипт выясняет, что индекс полнотекстового поиска текущей базы в последний раз обновлялся ранее времени последнего запуска текущего агента, он обновляет индекс.

Dim session As New NotesSessionDim agent As NotesAgentDim db As NotesDatabaseSet agent = session.CurrentAgentSet db = session.CurrentDatabaseIf ( db.LastFTIndexed < agent.LastRun ) Then

Call db.UpdateFTIndex( False ) End If

© InterTrust Co. Тел. (095) 9567928

Page 3: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 503

3.11.2. Методы

Метод save - «сохранить изменения в базе»LotusScript: Call notesAgenl.sa\e

Java: void Agent.saveQСохраняет в базе изменения, выполненные в объекте [NotesJAgent. Должен вызываться

после изменения значений свойств ServerName и (или) Enabled, иначе эти изменения будут «утеряны». Предполагает наличие соответствующего доступа к базе и агенту.

Метод run - «выполнить агента»LotusScript: Call nolesAgent.run

Java: void Agent.run()

Метод run выполняет агента, к которому применяется метод, «локально». Это означает, что если запуск агента выполнен из агента, выполняемого на станции, то и вызванный агент будет выполняться станцией. Если же запуск агента выполнен из агента, выполняемого сервером, то и вызванный агент будет выполняться сервером. Однако «удаленные» (ПОР) вызовы составляют исключение из этого правила - агент, запуск которого инициирован методом run, выполняется сервером.

Вы не должны запускать агентов рекурсивно. «Стандартный вывод» вызванного агента направляется в базу log.nsf. Пользователь не может интерактивно работать непосредственно с вызванным агентом. В LotusScript вызываемый агент «не должен» пользоваться свойствами и методами классов «переднего плана» (Ш), и, кроме прочего, невозможна трассировка вызванного агента в отладчике.

Метод runOnServer - «выполнить агента на сервере»

LotusScript: status% - notesAgenf.runQnScrverQ

Java: int status - Agent.runOnServer()В отличие от метода run, метод runOnServer выполняет агента, к которому применяется

метод, на сервере, «несущем» базу, содержащую агента. При этом вызов должен производиться со станции, но база, содержащая вызываемого агента, должна находиться на сервере.

Метод runOnServer возвращает статус завершения вызванного агента. Статус равен О, если агент завершился без ошибок, и отличен от нуля, если имели место ошибки.

Недопустимо использовать метод runOnServer в агентах, автоматически запускаемых сервером - в таких случаях должен использоваться метод run. При «удаленных» (ПОР) вызовах метод runOnServer эквивалентен методу run - вызванный агент выполняется сервером.

Метод remove - '«удалить агента» .. . . . '• ;> : . ; • . . • : . : . : ...... • . . • . . . . . .LotusScript: Call notesAgent.remave

Java: void Agent. removeQ

Удаляет агента из базы. После вызова метода объект класса [Notes]Agent сразу получает значение Nothing/null, а его свойства и методы становятся недоступны.

Вам придется «обновить вид агентов» из интерфейса Notes, чтобы «визуально обнаружить», что агент был действительно удален. Отметим, что можно даже удалить агента во время его выполнения.

© InterTrust Со. Тел. (095) 9567928

Page 4: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

504 Встроенные классы LotusScript и Java

Пример 1. Java-агент удаляет агента CalculateTotals в текущей базе.

import java.util.Vector;// Agent/removeDatabase db = agentContext.getCurrentDatabase();Vector agents = db.getAgents();int count = agents.size(); int i;System.out.println("Agents in database:");for (i •-•-• 0; i<count; i + +){

Agent, agent = (Agent) agents . elementAt ( i );String name = agent.getName();if (name —= null) name = "No name";if (name . compareTo ( "CalculateTotals" ) --= 0)/

agent.remove{);System.cut.println("agent found and deleted");break;

}) iif (i == count) System.out.print In("agent not found");

Пример 2. «Самоуничтожающийся» агент. Когда этот агент завершится, его уже ие станет в базе.

' Self-destructing agent created 08/18/95 by N. AllenDim session As New NotesSessionDim agent As NotesAgentSet agent = session. Current-AgentCall agent.Remove

Пример З. Скрипт кнопки находит в текущей базе, агентов, владельцем которых является текущий пользователь и выполнение которых запрещено. У пользователя запрашивается подтверждение на удаление сразу всех таких агентов. Если разрешение получено, агенты удаляются.

Sub Click(Source As Button)Dim session As New NotesSessionDim db As NotesDatabaseDim agentArray( 1 To 10 ) As NotesAgentDim count As IntegerDim r As String .Set db = session.CurrentDatabasecount = 0' находим агентов, владельцем которых является текущий'' пользователь и выполнение которых запрещеноForall a In db.AgentsIf ( a. Owner -" session. UserName ) AndNot ( a.IsEnabled ) Then count

= count + 1 -Set agentArray( count ) = a

End IfEnd Forall . ,r = Inputbox$( "Вы имеете " & count &

" агентов, выполнение которых запрещено. Удалить их?" ) If ( r = "yes" ) Or ( r - "у" ) Then

' удаляем всех агентов из массива agentArrayForall b In agentArray .Call b.Remove

End E'orallEnd If . . .

End Sllb

© InterTrust Co, Тел. (095) 9567928

Page 5: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 505

3.12. «Форма» - класс [NotesJFormОбъект этого класса представляет форму. Свойства класса [NotesJForm позволяют

«узнать» название формы и ее алиасы, проверить, является ли форма субформой, получить список имен содержащихся в форме полей, манипулировать содержимым специальных полей формы SFormUsers («кто» может создавать документы по форме») и $Readers («кто будет видеть созданные по этой форме документы»). Единственный метод класса служит для удаления формы из базы.

«Контейнерная иерархия»

LotusScript NotesDatabase —> NotesForm

Java Database —> Form —> Database

Как в LotusScript, так и в Java получить объект класса [Notes]Form можно двумя способами. Если известно имя формы, объект, представляющий форму, получают методом getForm класса [Notes]Database. Если необходим доступ ко всем формам базы, используют свойство Forms класса [NotesjDatabase.

3.12.1. Свойства и метод

Свойство Parent - «родитель»Java: Database db ~ Form.getParentO

Возвращает объект класса Database, представляющий базу, в которой определена форма.

Свойство Name - «название формы»

LotusScript: formName$ = notes For т.^яте

Java: String formName - Form.getNameQ

Возвращает «первое» название формы (тип String).

Пример. Java-агент выводит имена всех форм, имеющихся в текущей базе.

import j ava.uti1.Vector;/'/ Form/NameDatabase db = agentContext,getCurrentDatabase();Vector forms = db.getForms();System, out .printIn ( "\"" f db , get.Title () +

"\" has " + forms.size О + " forms:"); for (int i=0; i < forrns . size () ; i-n-} {

Form form = (Form)forms.elementAt{i);System.out.println(" " + form.getName()}; }

Свойство Aliases - «алиасы формы» . ::. •.:;::;,:':. • • :: :; v ... :: '.... .. . '..'.

'.'•'.; ;....::'.'...''

LotusScript: stringArray = notesForm.Aliases

Java: java.util. Vector aliases = Forwz.getAliasesQ

© InterTrust Co. Тел. (095) 9567928

Page 6: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

506 Встроенные классы LotusScript и Java

Возвращает «массив» всех алиасов формы (не включая «первое» название формы). В LotusScript это действительно массив с элементами тина String, в Java - объект Java.util. Vector с элементами типа String. Случай, когда форма не имеет ни одного алиаса (только «первое» название), в LotusScript «проверяют» с помощью IsEmpty, а в Java - по количеству элементов в «векторе» - свойством size.

Пример. Скрипт запрашивает имя формы из текущей базы и выводит информацию об алиасах этой формы.

Dim session As New NotesSessionDim db As NotesDatabaseSet db - session.CurrentDatabaseformNameln = Lease(Inputbox{"Name of form?"))Forall form In db.Forms

If Lease(form.Name) — formNameln Then If Isempty(form.Aliases) Then

Messagebox form.Name & " has no aliases" Else

alCount =0msgString = "" #

Forall al In form.Aliases alCount - alCount + 1msgString = msgString & Chr(lO) & " " & al

End E'orall Messagebox form.Name & " has " & alCount &" alias (es):" & Chr(lO) & msgString End If Exit Sub

End If End Forall Messagebox "The form """ & formNameln & """ does not exist"

Свойство IsSubForm -«является ли субформой»LotusScript: flag = notesFormAsSubForm

Java: boolean flag ~ /o/re.isSubFormQ

Возвращает true, если форма является субформой, или false, если нет.

Свойство Fields - «имена полей формы»

LotusScript: stringArray — notesForm.Fields

J ava: Java. util. Vector fieldNames - Forw.getFieldsQ

Возвращает «массив» с именами всех полей форм.ы. В LotusScript это действительно массив с элементами типа String, в Java - объект java.util.Vector с элементами типа String. Случай, когда форма не имеет ни одного поля, в LotusScript «распознают» с помощью IsEmpty, а в Java свойством size - по нулевому количеству элементов в «векторе».

Свойство Form Users - «кто может создавать документы но форме» LotusScript: stringArray — notesForm.FormUsers

nolesForm.Form Users = stringArrayOrString

Java: Java. util. Vector form Users ~ Fw/w.getFormUsersO

void Form.$etForm\Jsers(java, util. Vector form Users)

© InterTrust Co. Тел. (095) 9567928

Page 7: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R, 5: (атформулы, LotusScript, встроенные массы LotusScript и Java 507

Возвращает «массив» имен, содержащийся в поле $FormUsers формы. Субъекты, перечисленные в поле SFonnUsers, имеют право создавать документы по этой форме. В LotusScript это действительно массив с элементами типа String, в Java - объект java.util.Vector с элементами типа String. Случай, когда форма не имеет ограничений на создание документов по ней, в LotusScript «проверяют» с помощью IsEmpty, а в Java - по количеству элементов в «векторе» - свойством size. Установка значения свойства сразу же влечет замену содержимого поля SFormUsers в находящейся в базе форме.

Свойство ProtectUsers - «поведение поля SFormUsers при репликациях» LotusScript: flag - notesFo/"/w.ProtectUsers

notesForm.ProtectUsers =flag

Java: boolean flag = Forw.isProtectlJsers()

void Forni.setProtecti3sers(booleanflag)

Значение true «запрещает» изменять содержимое поля SFormUsers при репликациях, false - «разрешает» его изменять.

Пример. Скрипт запрашивает имя формы из текущей базы, затем список имен пользователей, которым разрешается создавать документы по этой форме, а после этого заменяет содержимое поля SFormUsers и «запрещает» изменять его при репликациях.

Dim session As New NotesSessionDim newFormUsers(0 To 63) As StringDim formUser As StringDim db As NotesDatabaseSet db =; session.CurrentDatabaseDim. form As NotesFormSet form = db.GetFormfInputbox("Name of form?"})n = 0formUser = Inputbox("Name of form user?")Do While formUser <> ""

newFormUsers(n) = formUserformUser = Inputbox("Name of formUser?")n = n + 1

Loopform.FormUsers = newFormUsers

'!

form.ProtectUsers = True

Свойство Readers - «кто «видит» документы,, созданные по форме»

LotusScript: stringArray = notes Form.Residers

notes Form.Readers = stringArrayOrString

Java: java.util. Vector formReadera — Form.getReadersQ

void For/w.setReaders(/ava. util. Vector formReaders)

Возвращает «массив» имен, содержащийся в поле $Readers формы. В LotusScript это действительно массив с элементами типа String, в Java - объект java.util. Vector с элементами типа String. Субъекты, перечисленные в поле SReaders, имеют право «видеть» документы, созданные по этой форме, что достигается автоматическим копированием поля SReaders из формы в создаваемый документ. Случай, когда форма не имеет ограничений на доступ к созданным по ней документам, в LotusScript «проверяют» с помощью IsEmpty, а в Java - по нулевому количеству элементов в «векторе» - свойством size. Установка значения свойства сразу же влечет замену содержимого поля SReaders в находящейся в базе форме.

© InterTrust Co. Тел. (095) 9567928

Page 8: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

508 Встроенные классы LotusScript и Java

Свойство IsProtectReaders - «поведение поля SReaders при репликациях» LotusScript: flag ~ «otoForm.ProtectReaders

ио/ел'/brw.ProtectReaders -flag

Java: boolean flag = Forw/.isProtectReadersQ

void Forni.seiProtectReader&(boolean flag)

Значение true «запрещает» изменять содержимое поля SReaders этой формы прирепликациях, false - «разрешает» изменять. . •

Пример. Java-агент получает имя формы из своего «поля комментариев», находит эту форму в текущей базе, выводит список имен пользователей, которым разрешается «видеть» созданные по форме документы, после чего добавляет в поле SReaders имя текущего пользователя и «запрещает» при возможных последующих репликациях изменять поле SReaders.

import java.util.Vector;// Form/ReadersAgent agent = aqentContext.getCurrentAgent();Database db = agentCoritext . getCurrentDatabase ( } ;Form form =• db . get Form (agent. getComment. ());Vector readers = form.getReaders() ;.if (readers . size () != 0}{

System.out.println("$Readers for " + form.getName());for (int. j=0; j < readers. size (); j+4)

System.out.println(" " + readers.elementAt(j)); Ielse

System.out.println("No $Readers for'" + form.getName());

readers.addElement(session.getUserName()}; form.setReaders(readers); form.setProtectReaders(true);System.out.println(session.getUserName() + " added");

Метод remove - «удалить форму» • '....;• • . . . : . : . : . - ' . . -. .^-. . . . . . . • • • • •LotusScript: Call notesForm.remove

Java: void Form.remo\e()

Удаляет форму из базы.

О InterTrust Со. Тел, (095) 9567928

Page 9: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 509

3.13. «Вид или папка» - класс [NotesjViewПредставляет вид (view) или папку (folder) в базе данных и обеспечивает доступ к

содержащимся в виде или папке «строкам вида», «столбцам вида» и документам.

Свойства объекта класса [NotesjView позволяют определить название и алиасы вида или папки, время его создания и последней модификации, количество столбцов и строк на верхнем уровне вида, характеристики отображения вида на экране, управлять доступом пользователей к виду, выяснить, представляет ли этот объект вид или папку, является ли он видом по умолчанию, является общим или частным, категоризирован ли он, является ли «календарным», поддерживает ли иерархию ответных документов и проверку конфликтов. Свойства также позволяю! получить массив объектов класса [NotesJViewColumn, представляющих все столбцы этого вида или панки, и коллекцию «строк вида» - объектов класса [Notes]ViewEntry, соответствующих содержащимся в виде или папке документам.

Методы объекта класса [NotesjView прежде всего позволяют программисту свободно осуществлять навигацию по документам из вида или папки (просмотр документов в произвольном порядке - по номеру документа в виде, последовательный просмотр всех документов от начала к концу вида или в обратном направлении, последовательный просмотр только документов на одном и том же уровне иерархии от начала к концу вида или в обратном направлении, нахождение документа-ответа для заданного родительского документа, нахождение документа-родителя для заданного документа-ответа, нахождение документа по ключам из отсортированных столбцов вида). Методы поиска документов или строк вида по ключам позволяют эффективно находить в виде документы, строки вида или их коллекции. Метод FTSearch позволяет выполнить по виду запрос полнотекстового поиска и «наложить на вид соответствующую результатам запроса фильтрацию» - после этого программист «может заняться просмотром» только отобранных по запросу документов, а метод clear - «снять с вида ранее наложенную фильтрацию». Методы создания «навигаторов по виду» позволяют создавать объекты класса [NotesjViewNavigator, содержащие все или только некоторое подмножество строк из вида и позволяющие эффективно осуществлять навигацию по представляемому объектом подмножеству строк. Наконец, имеются методы для обновления вида и удаления вида из базы.

«Контейнерная иерархия»

LotusScript NotesDatabase -> NotesView -> NotesDocument "NotesUIView NotesViewColumn NotesViewEntry NotesViewEntryCollection N otes V iewNa v i gator NotesDatabase Java Database _> View — > Document DateTime ViewColumn ViewEntry ViewEntryCol lection ViewNavigator | Database

Доступ к виду или папке наиболее часто получают через содержащий их объект класса [Notes]Database. При этом возможны два пути:• если известно имя или синоним вида или папки, можно использовать метод getView

класса [Notes]Database для получения нужного объекта класса [Notes]View;

> InterTrust Co. Тел. (095) 9567928

Page 10: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

510 Встроенные классы LotusScript u Java

• для доступа ко всем видам или папкам в базе можно использовать ее свойство Views,возвращающее массив объектов класса [Notes]View, представляющих все виды илипапки в базе.

Из документа (объекта класса [NotesJDocument) доступ к виду может быть получен с помощью свойства ParentView.

Из открытого в пользовательском интерфейсе вида (объекта класса NotesUlView) доступ к виду может быть получен с помощью свойства View (только LotusScript).

Если выполнение осуществляется на сервере, объект класса [Notes]View может представлять только общий (public) вид или папку в базе. Если выполнение происходит на станции, объект класса NotesView может представлять как общий, так и личный (private) вид или папку (личные виды и папки хранятся не в базе, а в файле DESKTOP.DSK, находящемся на станции).

Использование объекта класса [NotesjView для доступа к документам более предпочтительно по сравнению с использованием для доступа к документам объекта класса [Notes jDocumentCollection в следующих случаях:• вид (папка) в базе содержит все те документы, которые необходимо найти и обработать;* необходима навигация по иерархии ответных документов;• необходим наиболее быстрый доступ к документам;* требуется поиск документа в виде (папке) по ключам;* желателен доступ к документам в том порядке, который определен этим видом (папкой).

Пример 1. Скрипт получает доступ к виду Category.Dim db As New NotesDatabase ( "Server/Acme/RU", "TESTSYbase. nsf" )Dim view As NotesViewSet view = db.GetView( "Category" )

Пример 2. Java-агент получает доступ к «скрытому» виду.

// (Your code goes here;)Database db = session.getDatabase("Server/Acme/RU", "TESTS\\base.nsf" ) ;View view = db.getView{"($A11)");

Для краткости в дальнейшем будем употреблять только термин «вид», подразумевая при этом, что все сказанное имеет равное отношение и к «папке».

3.13.1. Свойства

Свойство Parent - «родитель» ; . . . ; . ; . . : • ' . . . . . . . ; - . . ; • . , • .

LotusScript: Set notesDalabase = notes F/ew.Parent

Java: Database db = F/ew.getParentQ

Возвращает объект класса [NotesJDatabase, в котором определен данный вид.

Свойство Created - «время создания» : .. ... • : . . •••• •• . . : : ' . : •'..: .LotusScript: date У = notes F/evf.CreatedJava: DateTime date = F/evv.getCreatedQ

Время создания вида (в LotusScript - Variant of type DATE, в Java - объект класса DateTime).

© InterTrust Co. Тем. (095) 9567928

Page 11: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 511

0 Свойство IsModified - «был ли модифицирован» • ч

LotusScript: flag ~ notes F/ew.IsModified •'•'•• " .• •• •'

Java: boolean flag = F;evi .isModifiedQ

Возвращает true, если вид модифицировался после момента времени добавления в данную базу, или false, если нет.

Свойство LastModified - «время модификации» ;,;-,.•••...-•• ...;,.•:.,......••:: . , •:..LotusScript: date V = notes F«;w.LastM edified

Java: DateTime date = Fz'ew.get.LastModified()

Время последней модификации вида в данной базе (в LotusScript - Variant of type DATE, в Java - объект класса DateTime).

Puc. 3.25 Закладка Information окна свойств вида как элемента дизайна

Пример. Java-агент выводит названия и времена создания и модификации видов и папок базы. В частности, для вида ($А11), свойства которого приведены на Рис. 3.25, агент выводит строку ($А!1) created on 08.09.97 17:13:27 ZE3 & last modified on 27.05.99 09:55:36 ZE3 .

import Java.util.Vector;// Java-View/isModifledDatabase db = agentContext.getCurrentDatabase();Vector views = db.getViews();for (int i=0; i < views.size{); i++) • '{

View view = (View)views.elementAt(i};System.out.print(view.getName() + " created on " + view.getCreated());if (view.isModifled{))

System.out.println(" & last modified on " + view.getLastModifled()); зе System.out.println(view,getName() + " & not modified");

Page 12: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Рис. 3.26 Название и aiiuac в окне свойств вида в Domino Designer

Для получения алиасов «нового стиля» используется свойство Aliases. Однако алиасы «старого стиля, записанные через вертикальную черту после названия вида», возвращаются как часть названия вида.

Свойство Aliases - «алиасы» : -••:.•;..:••-...•..-.: • • - • .: :>, :-•-.•-'., -- : . . ,: ....... .. •.-,LotusScript: aliases = notes F/evv.Aliases

Java: Java. util. Vector aliases = F/ew.getAIiases()

«Массив» алиасов вида. В LotusScript это массив строк - Array of strings, в Java - объект класса Java.util.Vector с элементами типа String. «Массив» содержит все алиасы, но не содержит названия вида. Например, в ситуации, приведенной на Рис. 3.26, единственным элементом «массива» будет строка "PRINT". Случай, когда вид не имеет алиасов, в LotusScript распознается с помощью IsEmpty, а в Java - по нулевому количеству элементов в «векторе», возвращаемому его свойством size.

Свойство UniversallD - «UNID вида» . : :...:... •.. . . . . . . . . . . . . . . •••LotusScript: unid$= notes F/ew.UaiversaIID

Java: String String = F/ew.getUniversallDOВозвращает универсальный идентификатор (UNID) данного вида (тип String). Он

представляет собой 32-символьную комбинацию букв и цифр, уникально идентифицирующую этот вид во всех репликах базы.

Свойство IsDefaultView - «вид но умолчанию»

LotusScript: flag = notes F/ewJsDefauitView

Java: boolean flag ~ F/ew.isDefaultView()

Возвращает true, если данный вид в базе является видом по умолчанию (default view), или false в противном случае.

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

Dim session As New NotesSessionDim db As NotesDatabaseDim view As NotesViewSet db = session.CurrentDatabaseForall v In db.Views

If v.IsDefaultView Then Set view := v

© InterTrust Co. Тел. (095) 9567928

512 Встроенные классы

Page 13: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Loius Domino R. 5: @гформулы, LotusScript, встроенные классы LotusScript и Java 513

E n d I f - . - \ • : • < - . - ' < г.-"-- .•;.-.-.•- - •.--- .- • • • • .. - . - • • 'End ForallMessagebox "View name; " & view.Name . - , • - . .If Not Isempty(view.Aliases) Then . .

Forall aliass In view.AliasesMessagebox "Alias: " & aliass . .. . - . •

End Forall . •• •End If

Пример 2. Java-агент выполняет то же самое, что и скрипт в предыдущем примере.

im por t j a va .u t i i .Vec to r ;// Java-View/isDefaultViewDatabase db = agentContext.getCurrentDatabase ();Vector views = db.getViews(};for (int 1=0; i < views.size(); i + +){

View view = (View)views.elementAt(i);if (view.isDefaultView()){

System.out.println("The default view is \"" +view,getName () + "\" " ) ; Vector

aliases = view.getAliases(); if (aliases. size () ===== 0)

System.out.println(view.getName() + " has no aliases"); else if (aliases.size () == 1)

System. x>ut .println (view . getName () +• " has 1 alias"); else

System.out.print In(view.getName() + " has " + 'aliases,size() + " aliases");

for (int j=0; joliases . size () ; j++)System.out.print In("\t" + aliases.elementAt(j) ) ; }

break;}} '

Свойство IsFolder - «папка»LotusScript: flag = notes F/ew.IsFoIder

Java: boolean flag- F/'ew.isFolder()

Возвращает true, если данный объект представляет папку (folder), или false, если онпредставляет вид (view).

*

© Свойство IsPrivate - «частный» ::.':.-:': • ' • •"• : • : ""."•" • ,....;:'" • ". • • ..;..'.'.'LotusScript: flag = notes F/ew.IsPrivateJava: boolean flag = F/ew.isPrivate()Возвращает true, если данный объект представляет частный (private) вид, или false в

противном случае.

© Свойство IsCategorized - «катетеризированный»LotusScript: flag = notes•F«?w.IsCategorized

Java: boolean flag = F/'ew.isCategorized()

Возвращает true, если данный вид является категоризированным, или false, если нет.

© InterTrust Со. Тел. (095) 9567928

Page 14: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

514 Встроенные классы LotusScript u Java

© Свойство IsHierarchical - «поддерживает иерархию ответных документов»

LotusScript: flag - ио/еу F/ew.IsHierarchical

Java: boolean flag = F/ew.isHierarchicalQ

Возвращает true, если данный вид поддерживает иерархию ответных документов (в окне свойств вида выбрана опция Shows response documents in a hierarchy), или false, если нет.

Свойство IsCalendar - «календарный»

LotusScript: flag - «ofesF/ew.IsCalendar

Java: boolean flag- F/evs'.isCalendarQ

Возвращает true, если данный вид является «календарным» (calendar view), или false, если это «стандартный» вид.

@ Свойство JsConflict - «поддерживает ли проверку конфликтов»

LotusScript: flag = notes F/Vw.IsConflict

Java: boolean flag = K/ew.isConflictQВозвращает true, если данный вид поддерживает проверку конфликтов (enabled for

conflict checking), или false, если нет.

Свойство Readers - «содержимое ноля SReaders вида». . . . .:. . . : : ... ...LotusScript: stringArray = notesView. Readers

ш/evF/eiv.Readers = stringArrayOrString

Java: java.util. Vector viewReaders — F/tm>.getReaders()

void F/ew.setReaders(/avtf. util. Vector viewReaders)

«Массив» имен, содержащийся в поле SReaders вида. Субъекты, перечисленные в поле SReaders, имеют право открыть этот вид. В LotusScript это действительно массив с элементами типа String, в Java - объект java.util. Vector с элементами типа String. Случай, когда вид не имеет ограничений по доступу (нет поля SReaders), в LotusScript «проверяют» с помощью IsEmpty, а в Java - свойством size - по нулевому количеству элементов в «векторе». Установка значения для свойства сразу же влечет создание или замену содержимого поля SReaders в содержащемся в базе виде, а установка свойства в значение ""/null - удаление из вида поля SReaders.

Учтите, что защита вида полем SReaders, вообще говоря, не означает защиты содержащихся в виде документов. Если сами документы дополнительно не защищены, то субъект, имя которого явно, через группу или назначением на роль не содержится в поле SReaders вида, не получит доступа к этому виду, но во многих случаях сможет создать новый собственный вид, содержащий необходимые документы.

Свойство IsProtectReaders - «не изменять поле SReaders при репликациях»

LotusScript: flag = notes F/ew.ProtectReaders

«otoF/ew.ProtectReaders = flag

Java: boolean flag- F/ew.isProteetReadersO

void F/'<?w.setProtectReaders(Јoo/eaw flag)

© InterTrust Co. Тел. (095) 9567928

Page 15: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @гформулы, LotusScript, встроенные классы LotusScript и Java 515

Значение true «запрещает» изменять содержимое поля $Readers при репликациях, false -«разрешает» изменять.

Свойство AutoUpdate - «автоматическое обновление» LotusScript: flag - «ofesF/ew.AutoUpdate

notes F/t'w.AutoUpdate -flag

Java: boolean flag = FiVwasAutoUpdateQ

void F/'ew.setAutoUpdate(6oo/eaw flag)

True (значение по умолчанию в LotusScript и при «локальных» вызовах в Java) означает, что в объекте класса [Notes]View, представляющем этот вид, должны автоматически выполняться изменения, если происходят изменения в индексе вида базы. Эти изменения происходят в моменты вызова для этого объекта методов навигации по виду, False (значение по умолчанию при «удаленных» вызовах в Java) означает, что такое автоматическое обновление вообще не должно выполняться.

Часто агент или приложение, начиная обрабатывать документы из вида «в цикле один за другим», вносит в эти документы некоторые изменения - изменяет значения их полей. Изменения, внесенные в только что обработанный документ, могут влиять на порядок следования документов в виде (порядок сортировки). Если свойство AutoUpdate = true, во-первых,, при переходе к следующему (в объекте класса [NotesJView) обрабатываемому документу возможна неопределенность, поскольку после изменения текущего документа уже непосредственно перед переходом к следующему объект [Notes]View успевает автоматически измениться. Во-вторых, во время работы агента или приложения сервер или станция Domino выполняют не всегда целесообразную работу «по согласованию» индекса вида и объекта [NotesjView. Поэтому в таких случаях «перед входом в цикл» обработки документов имеет смысл установить значение свойства AutoUpdate равным false. Это позволит сократить время выполнения и избежать проблем при переходе к следующем)' документу.

Значение свойства (true или false) прямого влияния на физическую регенерацию «изображения части вида» на экране у пользователя не оказывает,

Пример 1. В базе имеется вид, категоризированный по значению поля Categories. Скрипт события Queryrecalc этого вида должен изменять значение поля Categories - в данном случае к прежнему значению «добавляется» "О". Чтобы избежать проблем с переходом к следующему документу и ненужных попыток согласования объекта "NotesView с индексом вида в процессе работы скрипта, свойство AutoUpdate «перед циклом» установлено равным False.

Sub Queryrecalc(Source As Notesuiview, Continue As Variant) Dim view As NotesView Dim doc As NotesDocument Set view •-- Source. View view.AutoUpdate = False Set doc = view. GetF'irstDocument Do While Not doc Is Nothing

Call doc.ReplaceltemValue("Categories", doc.Categories(0) & "0")Call doc.Save(True, False) i

Set doc = view. GetNextDocurnent (doc)LoopEnd Sub ' '

Свойство Columns - «массив столбцов»LotusScript: notesViewColumnArray = notesView.Columns

© InterTrust Co. Тел. (095) 9567928

Page 16: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

516 Встроенные классы LotusScript и Java

Java: Java. util. Vector columns — Kz'ew.getColumnsQ

Возвращает «массив» столбцов вида. В LotusScript это массив объектов класса NotesViewColumns (Array of NotesViewColumns), в Java - объект класса java.util.Vector, элементы которого являются объектами класса ViewColumn. Элементы в «массиве» следуют в порядке расположения столбцов в виде - слева направо. Объект, представляющий первый столбец, имеет4 в массиве индекс 0.

Пример 1. Скрипт выводи! названия столбцов вида базы. Для получения названия столбца используется свойство Title класса NotesViewColurnn. , ,

Dim session As New NotesSessionDim db As NotesDatabaseSet db =• session. CurrentDatabaseDim view As NotesViewDim cols As Variant !

Set. view = db.GetViewf "By Date\Ascending By Main Topic" )cols = view.columnsForall с In colsMessagebox ( c.Title )

End Forall

Пример 2. Аналогичную операцию выполняет Java-агент.import Java.util.Vector;// Java-View/getColumnsDatabase db ~ agentContext.getCurrentDatabase();View view ==- db . getView ( "By Category");Vector columns = view.getColumns();for (int. i=0; i < columns. size (); i++)(

ViewColumn column = (ViewColumn)columns.elementAt(i);if (column.getTitle() == null) System,out.println("No title");else System.out.println(column.getTitle());

}

© Свойство TopLevelEntryCount - «количество строк на верхнем уровне»

LotusScript: count% ~- яо/ея Fzew.TopLevelEntryCount•?

Java: int count — F/ew.getTopLevelEntryCountO

Возвращает количество строк на «верхнем» уровне вида. Если вид категоризирован, этоколичество категорий первого уровня в виде плюс единица, если вид содержит «итого:».

© Свойство AHEntries - «коллекция строк вида, соответствующихдокументам» . ;:.••:... ..

LotusScript: notesViewEntryCollection - «ofeyF/'evt'.getAilEntries

Java: ViewEntryCoUection collection = K/ew.getAllEntries()

Возвращает коллекцию (объект класса [Notes]ViewEntryCoUection) содержащихся в виде строк (объектов класса [Notes] ViewEntry), соответствующих документам. Строки, соответствующие категориям и «итого:», в эту коллекцию не включаются. Если на вид была предварительно наложена фильтрация (методом FTSearch), коллекция содержит только строки вида, соответствующие «отфильтрованным» документам. Строки вида в коллекции расположены в том же порядке, как они были представлены в виде.

Пример. Для категоризированного вида ($А11) следующий скрипт может вывести в диалоговых окнах «TopLevelEntryCount := 6» и «The number of cat/doc/total in the ($A11) is 0/42/0».

© InterTrust Co. Ten. (095) 9567928

Page 17: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные массы LotusScript и Java 517

Dim session As New NotesSessionDim db As NotesDatabaseDim view As NotesViewDim vecoll As NotesViewEntryCollectionDim entry As NotesViewEntry : -Dim c, d, t As IntegerSet db == session. Current.DatabaseSet view = db.GetView("($A11)")Msgbox "TopLevelEntryCount = " & view.TopLevelEntryCouritSet vecoll = view.AllEntries.Set entry = vecoll.GetFirstEntryс = Оd = 0 • • - - - •t = 0While; Not (entry Is Nothing)

If (entry.IsCategory) Then с = с + 1

End IfIf (entry.IsDocument) Then d

••= d + 1End IfIf (entry.IsTotal) Then t

= t + 1End If • • • 'Set entry -- vecoJ.l. GetNextEntry (entry) Wend Msgbox "The number of

cat/doc/total in the " & view.Name & " is " _& Cstr(c) & " " & Cstr(d) & " " & Cstr(t)

End Sub

© Свойство BackgroundCoIor - «цвет фона»LotusScript: color% := notes F/w.BackgroiiiidColor

Java: hit color — F;ew.getBackgrouridCoIor()

Возвращает цвет фона вида. Цвет задается константами типа Integer/int:• COLOR BLACK/RichTextStyle.COLOR BLACK,• COLORJ3LUE/ RichTextStyle.COLOR_BLUE, '• COLOR CYAN / RichTextStyIe.COLOR_CYAN,• COLOR_DARK_BLUE / RichTextStyle.COLOR_DARK_BLUE,• COLOR_DARK_CYAN / RichTextStyle.COLOR, DARK^CYAN,• COLOR_DARK_GREEN / RichTextStyIe.COLOR_DARK_GREEN,• COLOR_DARK_MAGENTA / RichTextStyle.COLOR_DARK_MAGENTA,• COLOR DARK RED / RichTextStyle.COLOR_DARK_RED,• COLOR_DARK__YELLOW / RichTextStyle.COLOR_DARK_YELLOW,• COLOR^GRAY / RichTextStyie.COLOR_GRAY,• COLOR_GREEN / RichTextStyIe.COLOR_GREEN,• COLOR JJGHTJ3RAY / RichTextStyle.COLOR_LIGHT_GRAY,• COLORJV1AGENTA / RichTextStyle.COLOR_MAGENTA,• COLOR_RED / RichTextStyle.COLOR_RED,• COLOR WHITE / RichTextStyle.COLOR_WHlTE,• COLOR YELLOW / RichTextStyle.COLOR_YELLOW.

© InterTrust Co. Ten. (095) 9567928

Page 18: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

518 Встроенные классы LotusScript u Java

Э т и ж е к о н с т а н т ы и с п о л ь з у ю т с я в к а ч е с т в е з н а ч е н и й с в о й с т в [Notes]ViewColumn.FontColor и [NotesJRichTextStyle.NotesColor.

© Свойство CoIumnCount - «количество колонок»LotusScript: colCount% = notesView.ColumnCount

Java: int coICount = F/ew.getCoiumnCount()Возвращает количество колонок в виде.

© Свойство HeaderLines - «количество линий в заголовке»LotusScript: headLinCount% ~ notesF/ew.HeaderLinesJava: int headLinCount = F/ew.getHeaderLines()

Возвращает количество «линий» в заголовке вида.

© Свойство RowLines - «количество линий в строке вида»LotusScript: rowLinCount% = «ofesF'/ew.Row.Lines

Java: int rowLinCounl — F/ew.getRowLinesQ

Возвращает количество «линий» в каждой строке вида.

© Свойство Spacing - «интервал между строками вида». : • •••-.-... '•"' '

LotusScript: spacing% ~- notesView.Spacmg

Java: int spacing = F/<?w.getSpacmg()Возвращает интервал между строками вида. Величина интервала задается константой

типа Integer/int:

• SPACING SINGLE / View.SPACING_SINGLE,• SPACING_ONE_POINT_25 / View.SPACING_ONE_POINT_25,• SPAC!NG_ONE_POINT_50 / View.SPAClNG_.ONE_POINT__50,» SPACING_ONE_POINT_75 / View.SPAClNG_ONEJPOINT_75,« SPACING DOUBLE/View.SPACING DOUBLE.

3,13.2. Методы навигации по документам вида

Метод getFirstDocument - «первый документ вида»LotusScript: Set notesDocument — notes F/ew.getFirstDocument

Java: Document doc -~ F/evi'.getFirstl)ocument()

Возвращает первый документ в данном виде или Nothing/null, если вид пуст.

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

Пример 1. Скрипт находит в базе - почтовом ящике - вид All By Category и выбирает из него первый документ.

(© InterTrust Гп ТРИ f(IQ4) QIAJQJR

Page 19: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: (ai-формулы, LotusScript, встроенные классы LotusScript и Java 519

Dim db As New NotesDatabase( "Server/Acrne/RU", "mail\cbanner.nsf" )Dim view As NotesView • - . - . . •Dim doc As NotesDocumentSet view — db.GetView( "All by Category" )Set doc = view.GetFirstDocument '"'

Метод getNextDocument - «следующий документ из вида» :LotusScript: Set notesDocument ~ notes F/ew.getNextDocutnent( currentDocument)

Java: Document doc = View.geiNexiDocument(Document current Doc)

Возвращает для заданного параметром документа следующий непосредственно за ним в данном виде документ или Nothing/null, если такового нет. При этом не принимается во внимание тип документа (главный документ, ответный или «ответ на ответ»).

Метод getLastDocument - «последний документ вида» . . . . . . . .,.-.:.. • . ..LotusScript: Set notesDocument = notes Pfew.getLastDocumentJava: Document doc = F/ew.getLastDocument()

Возвращает последний документ в данном виде.

Метод getPrevDocument - «предыдущий документ из вида» • • •: :. .'..' " • " • .:'

LotusScript: Set notesDocument = wotes F/ew.getPrevDocunient( currentDocument)

Java: Document doc = F/eH'.getPrevDocument(/)ocw/w<?«f current Doc)

Для заданного документа возвращает непосредственно предшествующий ему в данном виде документ, или Nothing/null, если такового нет.

Пример. Java-агент «просматривает» вид <<от конца к началу» и для каждого документа выводит содержимое его поля Subject.

// Java-View/getLastPrevDatabase db = agentContext.getCurrentDatabase();View view = db.getView("By Category");System.out.prantln("***By Category view - all documents in reverse***");Document doc = view,getLastDocument();while (doc != null)i

System,out.printIn("\t" + doc.getltemValueString("Subject"));doc = view.getPrevDocument(doc);

}

Метод getNextSibling - «следующий на том же уровне документ из вида»

LotusScript: Set notesDocument = notes F/ew.getNextSibling( notesDocument )

Java: Document doc = View.geiNe\tSibling(Document currentDoc)

Для заданного параметром документа возвращает непосредственно следующий за ним в данном виде на том же уровне документ (sibling - брат или сестра - находятся на одном уровне в генеалогическом дереве). Два документа находятся на одном и том же уровне, если они оба - главные документы, оба являются документами-ответами одного и того же родителя или оба находятся в одной категории категоризированного вида. Если метод применяется к главному документу - возвращается следующий в виде главный документ; если метод применяется к документу-ответу - возвращается следующий документ-ответ того

© InterTrust Со. Тел. (095) 9567928

Page 20: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

520 Встроенные классы LotusScript и Java

же самого документа-родителя. Когда метод применяется к последнему в виде главному документу, возвращается Nothing/null. Аналогично, когда метод применяется к последнему документу-ответу на некоторый документ, возвращается Nothing/null.

Метод getNextSibling может использоваться для:• перемещения на следующий главный документ, пропуская его документы-ответы;• просмотра документов-ответов заданного документа-родителя (с использованием

getChild для поиска первого документа-ответа);• просмотра документов типа «ответ на ответ» для заданного документа-родителя (с

использованием getChild для поиска первого документа типа «ответ на ответ»).

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

Пример 1. Скрипт находит второй главный документ в виде базы, пропуская все документы-ответы первого главного документа.Dim db As New MotesDatabase( "Server/Acme/RU", "buddy.nsf" )Dim view As MotesViewDim firstMainDoc As NotesDocurnentDim secondMainDoc As NotesDocumentSet view = db.Get.View( "Main View" )Set. firstMainDoc = view.GetFirstDocumentSet secondMainDoc = view.GetNextSibling( firstMainDoc )

Пример 2, Скрипт вычисляет значения полей Total в главных документах вида как сумму значений полей Total в документах-ответах каждого главного документа. При этом во внешнем цикле происходит перемещение от главного документа к главному, а во внутреннем - от документа-ответа к следующему документу-ответу на текущий главный документ.

Dim db As New NotesDatabase{ "Server/Acme/RU", "mydatabase.nsf" )Dim view As NotesViewDim parentDoc As NotesDocumentDim responseDoc As NotesDocumentSet view = db.GetView( "Main View" }Set parentDoc - view. GetE'-irstDocument' Для каждого главного документа в видеWhile Not ( parentDoc Is Nothing ) *

newTotal% = 0Set responseDoc = view.GetChild( parentDoc )' Для каждого документа-ответа текущего главного документаWhile Not ( responseDoc Is Nothing )

subtotal = responseDoc.GetItemValue( "total" )newTotai% = newTotal% + Cint( subtotal( 0 } )Set responseDoc = view.GetNextSibling( responseDoc )

Wend' Замена значения в поле total текущего главного документаCall parentDoc. ReplaceltemValue ( "total", newTota.1% )Call parentDoc.Save( True, False }Set parentDoc = view.GetNextSibling( parentDoc )

Wend

Метод getPrevSibling - «предыдущий на том же уровне документ из вида»LotusScript: Set notesDocument = nolesҐiew.geiPrevSiblmg( notes Document )

Java: Document doc = View.geiPrevSibling(Document current Doc)

© InterTrust Co. Тел. (095) 9567928

Page 21: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: ^формулы, LotusScript, встроенные классы LotusScript и Java 521

Для заданного документа возвращает непосредственно предшествующий ему в том же виде и на том же уровне документ. В остальном поведение подобно getNextSibling.

Метод getParentDocuraent - «документ-родитель для документа-ответа в•' виде»' : '„ -. : • • • . . ' ; ' • ' . . • ............. ; • . : ' • - • • : . ; • • . ' .'.• :-: "••

LotusScript: Set notesDocwnent = wo/e,vF/ew.getParentDocument( notes Document)

Java: Document doc = F/evv.getParentDocument(Docwm«?H/ currentDoc)

Для заданного в качестве параметра документа-ответа возвращает родительский документ (т.е. документ, на который данный документ является ответом). Возвращаемый документ может быть как главным документом, так и документом-ответом или ответом на ответ. Если метод был вызван для главного документа, возвращается Nothing/null.

Следует учитывать, что если в результате выполнения запроса полнотекстового поиска на вид была наложена фильтрация, метод просто возвращает предыдущий документ в виде.

Пример 1. Java-агент находит в виде базы предпоследний главный документ.

// Java-View/get PrevSiblingDatabase db = agentContext.getCurrentDatabase();View view = db.getView("Main View"); 'Document doc = view.getLastDocument();// Поиск последнего главно:1'.:) документа в видеwhile (doc.isResponse(}) { doc = view.getParentDocument(doc); }' Поиск предшествующего ему главного документаdoc = view.getPrevSibling(doc);System.out.println("Doc is \""4 doc.getItemValueString("Subject")+ "\"");

Пример 2. Функция но заданному документу (обычно, документу-ответу) находит в данном виде и возвращает главный документ, независимо от того, сколько уровней иерархии разделяет оба документа.Function getAncestor ( doc As NotesDocument ) As NotesDocumentDim view As NotesView • •Set view = doc.ParentViewWhile doc.IsResponse

Set doc = view.GetParentDocument( doc ) :,WendSet getAncestor = doc . . . . , , .. , . .

End Function

Метод getChild - «первый прямой потомок документа в виде»

LotusScript: Set notesDocwnent ~ notes View.getChi\d( notesDocwnent)

Java: Document doc = Viev, .getChild(Document doc)

Для заданного в качестве параметра документа возвращает его первый документ-ответили Nothing/null, если данный документ не имеет ответного документа.

Следует учитывать, что если в результате выполнения запроса полнотекстового поиска на вид наложена фильтрация, метод getChild возвращает следующий документ в виде.

Для поиска остальных ответных документов обычно используют метод getNextSibling. Комбинация getChild и getNextSibling позволяет получить доступ к документам-ответам в том же порядке, как они представлены в виде. А для получения всех документов-ответов сразу, без учета сортировки, более удобно свойство Responses класса [NotesJDocument.

Пример. Скрипт находит первый документ-ответ на первый документ в виде базы.

© InterTrust Со. Тел, (095) 9567928

Page 22: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

522 Встроенные классы LotusScript и Java

Dim db As New Not esDatabase ( "Server/Acme/RU", "gonotes . risf " }Dim view As NotesViewDim doc As Notes-DocumentDim response As NotesDocumentSet view = db.GetView( "1. _Main View" )Set doc = vi ew. GetFirstDocuinentSet response = view.GetChild( doc )

Метод geiNthDocument - «документ с заданным номером в виде» . ..

LotusScript: Set notesDocument- notesView.getNtbT)ocumcnt( n& )

Java: Document doc = View.geiNtbDocument(int n)

Возвращает документ, имеющий заданный параметром п% номер (тип Long/int) на первом уровне в виде. Первый документ в виде имеет номер 1, второй - 2 и т.д.

Хотя метод «пропускает» ответные документы, он весьма удобен для «извлечения» документов из вида, на который была наложена фильтрация методом FTSearch, тем более, что сам метод FTSearch возвращает количество найденных документов,

Пример. Скрипт находит в папке Botanist's Delight («Восторг ботаника») «неуместные для нее» документы со словом pollution («загрязнение окружающей среды») и удаляет их из этой папки.

Dim session As New NotesSessionDim db As NotesDatabaseDim folderName As StringDim view As NotesViewDim count As IntegerDim doc As NotesDocumentSet db = session.CurrentDatabasefolderName = "Botanist's Delight"Set view -- db. GetView ( folderName )count = view.FTSearch( "pollution", 0 )For j — 1 To countSet doc = view.GetNthDocument( j }Call doc . Remove Proiri Folder ( folderName )

Next Call view.Clear

3.13.3. Методы поиска документов в виде

Метод getDocumentByKey - «пояск документа по ключу» • . . • . -. :.................. , •.

LotusScript: Set notesDocument - notesFiew.getDocument&yKey^ keys [, exact ] )

Java: Document doc = Fiew,getDocumentByKey(Java.uti/. Vector keys)

Document doc - View.getl)ocumentByKey(Object key)

Document doc — View.getDocumcnt'ByKey (Java, util. Vector keys,

boolean exact) Document doc - View.geiDocumentByKey(Object key,

boolean exact)

Первый параметр метода - «поисковый ключ» - может быть задан «одним значением» или «массивом значений». В LotusScript параметр keys может быть либо типа String, Integer, Long, Single или Double («одно значение»), либо массивом строк - Array of Strings. В Java «одно значение» задается параметром key типа Object (например, класса String или типов int., iong,

© InterTrust Co. Тел. (095) 9567928

Page 23: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

524 Встроенные классы LotusScript и Java

Set db = session. CurrentDatabaseSet view = db.GetViewf "By Category" )Set dc = view.GetAllDocumentsByKey("Spanish leather", False)Call dc.PutAHInFolder ("Boots")

Пример 2. Java-агент выполняет то же, что и скрипт из предыдущего примера.

//' Java-View/getAllDocumentsByKey Database db = agentContext.getCurrentDatabase(); View view — db.getView("By Category"); DocumentCollection dc =

view. getAHDocumentsByKey ("Spanish leather", false); dc . putALlInFolder ( "Boots " ) ;

@ Метод getEntryByKey - «поиск .строки вида по ключу»

LotusScript: Set notes ViewEntry ~ notesF/Vw.getEntryByKey( keys [ .exact ] )

Java: View Entry entry - F/e>v.getEntryByKey(/ava. util Vector keys)

ViewEntry entry — View.getEntry'ByKey(Ob/ect key) ViewEntry

entry ~ View.g&tEntry'ByKey(/ava.uti/. Vector keys,

boolean exact) ViewEntry entry = View.getDocumentByKey(Oiyject

key, boolean exact)

Первый параметр метода - «поисковый ключ» - может быть задан «одним значением» или «массивом значений». В LotusScript параметр keys может быть либо типа String («одно значение»), либо массивом строк - Array of Strings. В Java «одно значение» задается параметром key типа Object (например, класса String или типов int, long, float или double), a «массив значений» задается параметром keys класса Java.util.Vector с элементами класса String или типов int, long, float или double.

Если поисковый ключ задан «одним значением», метод находит первую строку вида, у которой в первом отсортированным столбце данного вида содержится значение, совпадающее с поисковым ключом. Если поисковый ключ задан «массивом значений», метод находит первую строку вида, для которой в отсортированных столбцах данного вида содержатся соответственно те же значения, что и в заданном «массиве строк». При этом первый элемент этого «массива» сравнивается со значением из первого отсортированного столбца вида, второй - со значением из второго отсортированного столбца, и т.д.

Если флаг ехас! равен true, требуется точное совпадение с поисковым ключом, если false (по умолчанию) - достаточно частичного совпадения.

Если строка вида не найдена, возвращается Nothing/null.Для поиска «прочих подобных» строк вида следует использовать метод

getAHEntriesByKey.

@ Метод getAII.EntriesBy.Key - «поиск строк вида по ключу» • ...... ..., :

LotusScript: Set notes ViewEntryCollection — notes View.getAllEntriesByKey(

keys [, exact j)

Java: ViewEntryCollection ec = View.getAllEntrie$ByK.ey(/ava.uti/. Vector keys)

ViewEntryCollection ec = View.getAllEntriesHyKey(Object key)

ViewEntryCollection ec = View,getAliEntriesBy'Key(java.util. Vector keys, •

boolean exact)

© InterTrust Co. Тел. (095) 9567928

Page 24: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @~формулы, LotusScript, встроенные классы LotusScript и Java 525

VierwEntryCollection ec = Fzew.getAHEntriesByKey(O6/eaf key,

boolean exact)

Метод находит все строки вида, соответствующие заданному поисковому ключу. Все параметры метода такие же, как параметры метода getEntryByKey. Отличие в том, что возвращается коллекция из всех найденных строк вида. Если ни одной строки с указанным поисковым ключом не найдено, возвращается пустая коллекция.

Пример. Java-агент выводит количество строк в категории "Spanish leather" вида By Category.

// Java-View/getAllEntriesByKeyDatabase db - agentContext.getCurrentDatabase( ) ; View view = db.getView("By Category"); ViewEntryCollection vec =

view. getAHEntriesByKey ("Spanish leather", false); System.out.println("Number of entries found = " + vec.getCount(});

Метод FTSearch - «полнотекстовый поиск по документам вида» . . • - . . .LotusScript: numDocs% — notes Fz'ew.FTSearch( qiteryS, maxDocs% )Java: int numDocs ~ F/ew.FTSearch^V/rmg query)

int numDocs — yiew.ҐTSearch(String query, int maxdocs)

Выполняет заданный запрос мол нетекстового поиска по документам из данного вида и накладывает на вид соответствующую фильтрацию, т.е. отображает в виде только удовлетворяющие поисковому запросу документы. Не «ищет» варианты слов.

Параметр query (тип String) задает запрос полнотекстового поиска. Параметр maxDocs (тип Integer/int) сообщает максимальное количество документов, которое должно возвращаться как результат запроса полнотекстового поиска. Если должны возвращаться все найденные документы, следует указать 0. Возвращаемое значение numDocs (тип Integer/int) дает количество документов из вида, удовлетворяющих запросу полнотекстового поиска.

Если база не имеет индекса пол ноте кетового поиска, метод работает, но значительно менее эффективно. Для проверки наличия у базы индекса полнотекстового поиска используется свойство IsFTIndexed класса [NotesjDatahase. Дня создания индекса полнотекстового поиска для локальной базы используется метод updateFTlndex класса [NotesjDatahase.

Метод clear'- «снятие фильтрации с вида»LotusScript: Call notes F/ew.clear

Java: void Fz'ew.clearOДействуя подобно кнопке Reset на панели полнотекстового поиска, метод «снимает» с

вида фильтрацию, наложенную как результат выполненного ранее запроса полнотекстового поиска.

3.13.4. Методы для создания навигаторов по виду

© Метод createViewNav - «создание навигатора по всему виду» .- .. ..•.••..- •.,-..• •.-.:•• •

LotusScript: Set notes ViewNavigator - notes Fzew>.createViewNav( )

Java: ViewNavigator nav — F/evf.createViewNavQViewNavigator nav — Fiew.createViewNav(z«/ cacheSize)

© InterTrust Co. Тел. (095) 9567928

Page 25: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

526 Встроенные классы LotusScript и Java

Создает объект [Notes]ViewNavigator, содержащий все строки из вида (даже если на вид наложена фильтрация полнотекстового поиска). Максимальное количество уровней в созданном «навигаторе по виду» - 32. Параметр cacheSize используется только при «удаленных» (ПОР) вызовах и задает размер кэша для объекта ViewNavigator в «строках»; допустимые значения от 0 (нет кэша) до 128 (значение по умолчанию). Подробности смотрите в описании класса [NotesJViewNavigator.

Для работы только со строками вида, полученными в результате выполнения запроса полнотекстового поиска, используйте объект класса [NotesJViewEntryCollection.

@ Метод createViewNavFrom - «создание навигатора по виду начиная сзаданного документа или строки» • . .

LotusScript: Set notes ViewNavigator = notes F/<?H'.createViewNavFrom( obj )

Java: ViewNavigator nav = View.createViewNavFrom(ObJect obj)

ViewNavigator nav — F«?w.createViewNavFrom(O/?>/e'c/ obj, int cacheSize)

Создает объект [NotesJViewNavigator, содержащий все строки из вида, начиная с документа или строки, указанной параметром obj. В качестве параметра obj может выступать объект класса [NotesJDocument или [NotesjViewEntry. Наложенная на вид фильтрация полнотекстового поиска не учитывается. Максимальное количество уровней в созданном «навигаторе по виду» - 32. Параметр cacheSize используется только при «удаленных» вызовах и задает размер кэша для объекта ViewNavigator в «строках»; допустимые значения от 0 (нет кэша) до !28 (значение по умолчанию).

Пример. Навигатор по виду будет содержать все строки из вида By Category, но начиная со второго документа.Dim session As New NotesSessionDim db As NotesDatabaseDim view As NotesViewDim docA As NotesDocumentDim docB As NotesDocumentSet db = session.CurrentDatabase •Set view = db. Get.View ( "By Category" )Set docA= view.GetFirstDocumentSet docB --= view. GetNextDocument (docA) v

Set nav = view.CreateViewNavFrom(docB)

© Метод create ViewNavFromCategory - «создание навигатора .по виду из • строк в заданной категории»

LotusScript: Set notes ViewNavigator = notes F/ew.createViewNav.FromCategory(

categoryName$ )

Java: ViewNavigator nav ~ F/Vw.createViewNavFromCategoryX

Siring categoryName) ViewNavigator nav =

F/ЈVf.createViewNavFroinCategory(

String categoryName, int cacheSize)

Создает объект [NotesJViewNavigator, содержащий все строки из категоризированного вида, «входящие» в категорию categoryName. Фильтрация полнотекстового поиска, наложенная на вид, методом не учитывается. Максимальное количество уровней в созданном «навигаторе по виду» - 32. Параметр cacheSize используется только при «удаленных» вызовах

©InterTrust Co. Тел. (095) 9567928

Page 26: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5; @-формулы, LotusScript, встроенные классы LotusScript и Java 527

и задает размер кэша для объекта ViewNavigator в «строках»; допустимые значения от 0 (нет кэша) до 128 (значение по умолчанию).

Пример. Java-агент создает навигатор, содержащий все строки из категории "Boots\Spanish leather" категоризированного вида, а затем для каждой строки этого навигатора выводит тип строки (категория, документ или «итого:»).

// Java-View/createViewNavFromCategory Database db = agentContext.getCurrentDatabase(); View view = db.getView("By Category"); ViewNavigator nav =

view.areateViewNavFromCategory("Boots\\Spanish leather"); int n = 0; String t = null;ViewEntry entry = nav.getFirst(); while (entry ! ;= null) {

П + +;

if (entry.isCategory()) t = "category"; else if {entry. isDocument ()) t ~- "document"; else if (entry.isTotal()) t = "total";

System.out.println("Entry #" + n + " is a " + t);en.try = nav. getNext () ;}

© Метод createViewNavFromChildren - «создание навигатора по виду из прямых потомков заданного документа или строки»

LotusScript: Set notesViewNavigator - no/e,vJ//ew.createViewNavFromChiIdren( obj )

Java: ViewNavigator nav = F/t'w.createViewNavFromChildrei^Oi/ec/ obj)

ViewNavigator nav - F/ew.createViewNavFromChiIdren(C%'ec7 obj,

int cachcSize)

Создает объект [Notes]ViewNavigator, содержащий все строки из вида, являющиеся прямыми потомками документа или строки вида, указанных параметром obj. В качестве параметра obj может выступать объект класса [Notes]Document или [Notes]ViewEntry. Фильтрация полнотекстового поиска, наложенная на вид, методом не учитывается. Максимальное количество уровней в созданном «навигаторе по виду» - 32. Параметр cacheSize используется только при «удаленных» вызовах и задает размер кэша для объекта ViewNavigator в «строках»; допустимые значения от 0 (нет кэша.) до 128 (значение по умолчанию).

Пример. Java-агент создает навигатор по прямым потомкам первого документа в категории "Boots".

// Java-View/createViewNavFromChildrenDatabase db = agentContext.. getCurrentDatabase ( ) ;View view = db.getView("By Category");Document doc = view.getDocumentByKey("Boots");ViewNavigator nav = view.areateViewNavFromChildren(doc);

© Метод createViewNavFromDescendants - «создание навигатора по виду из всех потомков заданного документа или строки»

LotusScript: Set notesViewNavigator = notesF/ew.createViewNavFromDescendants( obj )

© InterTrust Co. Тел. (095) 9567928

Page 27: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

528 Встроенные классы LotusScript и Java

Java: ViewNavigator nav ~ J//ew.createViewNavFromDescendants(O6/ec/' obj)

ViewNavigator nav = F/ew\createViewNavFromDescendants(0Z>/ec/ obj,

inl cacheSize)

Создает объект [Notes]ViewNavigator, содержащий все строки из вида, являющиеся потомками (как прямыми, так и «потомками потомков») документа или строки вида, указанных параметром obj. В качестве параметра obj может выступать объект класса [Notes]Document или [Notes]ViewEntry. Фильтрация полнотекстового поиска, наложенная на вид, методом не учитывается. Максимальное количество уровней в созданном «навигаторе по виду» - 32. Параметр cacheSize используется только при «удаленных» вызовах и задает размер кэша для объекта ViewNavigator в «строках»; допустимые значения от 0 (нет кэша) до 128 (значение по умолчанию).

Пример. Скрипт создает навигатор по всем потомкам первого документа в виде By Category.Dim session As New NotesSessionDim db As NotesDatabaseDim view As NotesViewDim doc As NotesDocumentDim nav As NotesViewNavigatorSet db = session.CurrentDatabaseSet view ••= db . GetView ( "By Category")Set doc = view. GetFirstDocument.Set nav = view.CreateViewNavFromDescendants(doc)

© Метод create ViewNavMaxLevel - .«создание навигатора но виду из всехстрок вида до.заданного уровня включительно» . •••"••'

Java: ViewNavigator nav = F/"evt'.createViewNavMaxLevel(/«? level)

ViewNavigator nav = F/ew.createViewNavMaxLevel(m/ level, inl cacheSize)

Создает объект ViewNavigator, содержащий все строки из вида до указанного уровня level включительно. Верхний уровень имеет номер 0, «самый нижний» - 31, а всего уровней возможно не более 32. Фильтрация полнотекстового поиска, наложенная на вид, методом не учитывается. Параметр cacheSize используется только при «удаленных» вызовах и задает размер кэша для объекта ViewNavigator в «строках»; допустимые значения от 0 (нет кэша) до 128 (значение по умолчанию).

3.13.5. Прочие методы

Метод getCoIumn - «столбец вида» • : • : . . . . •; - :..;. .. .- ..;:LotusScript: notes ViewColumn Array = notes View.Colnmns

notesViewCoiumn — notesViewColwnnArray[ columnNumber% - 1 ]

Java: ViewColumn vc - Vie\v.getColumn(int columnNiimber)

Метод getColumn возвращает объект класса ViewColumn, представляющий заданный столбец вида. Для получения первого столбца вида параметр columnNwnber должен быть равен единице.

Метод refresh - «обновление вида» LotusScript: Call notesView.refresh

© InterTrust Co. Тел. (095) 9567928

Page 28: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R, 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 529

Java: void F/'ew.refreshQ

Объект класса [NotesJView является как бы «фотографическим снимком» содержимого вида (индекса вида) в момент создания объекта. Если свойство IsAutoUpdate равно true, обновление объекта [NotesJView происходит автоматически при каждом вызове метода навигации по виду для объекта. Если же свойство IsAutoUpdate равно false, автоматического обновления объекта [NotesJView не происходит. Поэтому изменения, добавления или удаления, успевшие произойти в виде с момента создания объекта класса [NotesJView, могут привести к неправильной навигации по виду.

Данный метод приводит содержимое объекта [NotesJView в соответствие с изменениями, произошедшими в базе с момента создания данного объекта класса [Notes)View или с момента предыдущего вызова метода refresh.

Пример. Скрипт создает в базе новый документ, а затем «пытается обнаружить» этот документ в виде By Category. Значение свойства IsAutoUpdate не играет никакой роли, поскольку вызовов методов навигации но виду в скрипте нет. Обнаружить этот документ удается только после применения к объекту NotesView метода Refresh.

Dim session As New NotesSessionDim db As NotesDatabaseDim view As NotesViewDim newDoc As NotesDocumentDim doc As NotesDocurnentSet--db = session . CurrentDatabaseSet view - db.GetView( "By Category" }1 Создаем новый документ в категории Latest newsSet newDoc = New NotesDocument{ db )newDoc.Form = "Main Topic"newDoc.Categories ~ "Latest news"newDoc.Subject = "Just created this doc"Call newDoc.Save( True, True )' Пытаемся найти его в виде по ключу Latest news . ,Set doc = view.GetDocumentByKey( "Latest news" )' Однако это не удаетсяIf ( doc Is Nothing ) Then

Messagebox( "Refresh the view" }End If . • •' Обновляем объект NotesView ,Call view.Refresh' Снова пытаемся найти документ, теперь уже успешно Set doc = view.GetDocumentByKey( "Latest news" ) If { doc Is Nothing ) Then

Messagebox( "Something's wrong" ) Else

Messagebox{ "Now that view is refreshed, doc appears" ) End If

Метод remove - «(удаление вида»' "••': • . . . •.•'••• ::;Ч- : : ".• . • : • ' • : . . ' : • ;•• • . ; • . . '

LotusScript: Call notesView.remove

Java: void F/evi'.removeQ

Удаляет вид из базы.

© InterTrust Co. Тел. (095) 9567928

Page 29: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

530 Встроенные классы LotusScript и Java

3.14. «Коллекция документов» - класс [NotesjDocuraentCollectionПредставляет коллекцию (т.е. некоторое множество) документов из базы данных.

Свойства объекта класса [Notes]DocumentColSection позволяют узнать, сколько в коллекции документов, в результате выполнения какого поискового запроса она была получена и является ли она упорядоченной. Документы в коллекции упорядочены только в том случае, когда коллекция получена в результате выполнения запроса полнотекстового поиска. В противном случае документы в коллекции не упорядочены. Методы объекта класса [NotesJDocumentCollection позволяют получать доступ к содержащимся в коллекции документам: по номеру документа в коллекции или путем последовательного просмотра коллекции от первого документа к последнему или в обратном порядке; выполнять поиск (проверку наличия) документа в коллекции; добавлять элементы в коллекцию и удалять их из нее; выполнять полнотекстовый поиск по документам коллекции и получать в результате коллекцию удовлетворяющих запросу документов; помещать документы коллекции в папку и удалять их из папки; удалять документы коллекции из базы; эффективно заменять значение поля в документах коллекции и помечать документы коллекции как обработанные агентом.

«Контейнерная иерархия»

LotusScript NotesSession —> NotesDocumentColIection —> NotesDocumentNotesDatabase N otesDatabase

NotesUIDatabase__ NotesUIView

Java AgentContext —> DocumentCoHection _> DocumentDatabase Database

____________________View

Объект класса [NotesJDocumentCollection может быть создан свойствами или методами класса [NotesJDatabase - свойство AllDocuments и методы search и FTSearch, а так же свойствами или методами класса NotesDatabase/AgentContext - свойство UnprocessedDocurnents и методы unprocessedSearch и unprocessedFTSearch. Кроме того, объект класса [NotesJDocumentCollection возвращается свойством Responses класса [NofesJDocumenl. Наконец, в LotusScript объект класса NotesDocumentColIection возвращает свойство Documents классов NotesUIDatabase и NotesUIView.

Объект класса [NotesJDocumentCollection поддерживает указатель текущего документа в коллекции (current pointer). Все методы «навигации» по коллекции автоматически изменяют положение указателя текущего документа. При добавлении документов в коллекцию или удалении их из коллекции положение указателя текущего документа не изменяется.

Оба объекта [NotesJDocumentCollection и [NotesJView обеспечивают доступ к документам в базе данных. Рекомендуется использовать объект класса [NotesJDocumentCollection, если:* вы хотите работать со специфическим набором документов, удовлетворяющих

некоторому критерию;

* в базе данных нет такого вида, который содержит все те документы, с которыми вамнеобходимо работать;

* вам не нужно «перемещаться» по иерархии ответных документов.

Виды - объекты класса [NotesJView - по сравнению с коллекциями более эффективные средства доступа к документам, поскольку в этом случае местоположение документов определяется непосредственно по индексу этого вида в базе данных. Однако видов в базе

Page 30: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: (а)г-формулы, LotusScript, встроенные классы LotusScript и Java 531

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

Пример I. Скрипт методом Search из класса NotesDatabase создает коллекцию документов, созданных или модифицированных после 4 марта 1998 года и содержащих в поле Subject текст "lake",

Dim db As New NotesDatabase( "Server/Acme/RU", "project.nsf" )Dim datetirae As New NotesDateTime( "03/04/98" )Dim selection As StringDim collection As NotesDocumentCollectionselection = "@Contains( Subject; ""lake"" )"Set collection = db.Search( selection, dateTime, 0 )

Пример 2. Java-агент методом FTSearch из класса Database создает коллекцию документов, удовлетворяющих запросу полнотекстового поиска "iake".

// Java-Documentedlection/createDatabase db = agentContext.getCurrentDatabase();DocumentCollection dc -- db. FTSearch ("lake") ;

3.14.1. Свойства

Свойство Parent - «родитель» ' • . • ; . . : : • • •••:• •••-•. ".•'- ••".'.•'": :..: •:>....-...: •'•••' •LotusScript: Set notesDatabase — notesDocumentCollection.P&rent

Java: Database db = DocumentCollection.getParentty

База данных (объект класса [Notes]Database), содержащая данную коллекциюдокументов.

Свойство Count - «количество документов» .-.- /у .. •.-;.;••:•:-::.•'•••.-•;..••: --• ;::... у-:/'.:.: ;••;;'•'-..:. •

LotusScript: nwnDocs& = notesDocumentCoUection.Conni

Java: int numDocs = DocumentColIection.getCountQ

Количество документов (тип Long/int) в коллекции.

Пример. Сначала скрипт создает коллекцию документов, созданных или модифицированных после 1 января 1998 года, имеющих поле Subject и не имеющих поля Topic. Затем скрипт в цикле просматривает коллекцию и в каждом документе заменяет поле Subject полем Topic со значением из поля Subject.

Dim session As New NotesSessionDim db As NotesDatabase • . •Dim collection As:NotesDocumentCollection • .Dim doc As NotesDocumentDim dateTime As New NotesDateTime( "01/01/98" )Set db = session.CurrentDatabaseSet collection = db.Search

("@IsUnavailable(Topic) & @IsAvailable(Subject)", dateTime, 0) Messagebox collection.Count For i = 1 To collection.CountSet doc = collection.. GetNthDocument. ( i )oldSubject = doc.Subjectdoc.Topic = oldSubjectf 0 }Call doc.Removeltem( "Subject" )Call doc.Save( True, False )

Next

© InterTrust Co. Тел. (095) 9567928

Page 31: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

532 Встроенные классы LotusScript u Java

Свойство Query - «поисковый запрос»

LotusScript: query$ = notesDocumentCollection.Query

Java: String query - DocumentCollection.getQaeryQ

Если коллекция была получена в результате выполнения запроса полнотекстового поиска (методом FTSearch) или простого поиска (методом search), возвращает текст (тип String) данного запроса. В противном случае возвращается ""/null.

Свойство IsSorted - «отсортированная коллекция»LotusScript: flag = notesDocumentCollection.lsSorteu

Java: boolean flag ~- DocumentCollection.isSortedQВозвращает true, если коллекция отсортирована, или false, если нет. Только коллекция,

полученная в результате выполнения запроса полнотекстового поиска, является отсортированной. Она сортируется по убыванию значения показателя соответствия поисковому запросу, так что документы с большими значениями показателя, т.е. «наиболее удовлетворяющие» поисковому запросу, расположены в начале коллекции.

3.14.2. Методы навигации по коллекции

Метод getFirstDocument - «первый документ» :....•LotusScript: Set notesDocument = note.sDocumentColiection.geiFirsiDecumcnt

Java: Document doc =- DocumentCollection.geiFirsiDocumentQВозвращает объект класса [Notes]Document, представляющий первый документ в

коллекции. Если коллекция пуста, возвращается Nothing/null.

Метод getNextDocument - «следующий документ» - . • . - . • ; • . . . ...LotusScript: Set notesDocument — rtotesDocumentCollection.geiNexiDoca.ment(

notesDocument)

Java: Document doc = DocumentCollection.getNentDocument()

Document doc — DocutnentCollectiotKgetl$extDQCiiment(Document doc)

Возвращает документ, непосредственно следующий в данной коллекции за заданным параметром метода или текущим документом, или Nothing/null, если такового нет.

Пример. Скрипт находит в текущей базе данных все «конфликтные» документы - такие документы являются ответными документами и содержат поле SConflict - и помещает их в папку.Dim s As New NotesSessionDim db As NotesDatabaseSet db = s.CurrentDatabaseDim dc As NotesDocumentCollectionSet. dc = db. All.DocumentsDim doc As NotesDocumentSet doc = dc.GetFirstDocumentWhile Not(doc Is Nothing)

If doc.IsResponse Then

© InterTrust Co. Тел. (095) 9567928

Page 32: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Dotnino R. S: ^-формулы, LotusScript, встроенные классы LotusScript и Java 533

If doc.Hasltein( "$Conflict") ThenCall doc.PutlnFolder("Conflicts") End

If End IfSet doc = de.GetNextDoeument(doe)

Wend

Метод getLastDocument - «последний документ» •; . • .. . •LotusScript: Set notes Document = notesDocumentCoHection.geiLsisiDocument

Java: Document doc ~ DocitmentCollection.geiL&siDocumentQ

Возвращает объект класса [NotesjDocument, представляющий последний документ в коллекции. Если коллекция пуста, возвращается Nothing/null,

Метод get'PrevDocument - «предыдущий документ» • '- . .... ...LotusScript: Set notesDocument — nolesDocumentCol!ection.getPrev]i)ociiment(

notesDocumenl)

Java: Document doc = DocumentCollectiori.getPrevDocumentQ

Document doc - DocunieniCollection.getPrevf)QCument(Docuinent doc)

Возвращает документ, непосредственно предшествующий в данной коллекции заданному параметром метода или текущему документу, или Nothing/null, если такового нет.

Пример. Java-агент методом FTSearch из класса Database создает коллекцию документов, удовлетворяющих запросу полнотекстового поиска "lake", а затем «просматривает» эту коллекцию в обратном порядке, выводя для каждого документа содержимое поля Subject.// Java~Document.Collect.ion/getLastPrevDatabase db = agentContext.getCurrentDatabase(); " .DocumentCollection dc = db.FTSearch("lake");Document doc = dc.getLastDocument();while (doc != null){ .

System, out .print In (doc . get ItemValue ( "Subject." ) ) ;doc = dc.getPrevDocument();

}

t~

Метод getNthDocument - «документ с заданным номером» . -.;...;; ;:•.-:. .•.....-. ; •:.

LotusScript: Set noiesDocument — notesDocumentCollection.gct1StthDocument( n& )

Java: Document doc = DocumentCollection.geiNthD<)cument(mt n)

Возвращает документ (объект класса [Notes] Document), имеющий в коллекции заданный номер п (тип Long/int). Номер документа в коллекции изменяется в диапазоне от 1 до количества документов в коллекции, возвращаемого свойством Count. Пустая коллекция содержит 0 документов. Если документа с заданным номером нет, возвращается Nothing/null. Учтите, что элементы коллекции «переномеровываются» после удаления документов из нее.

Пример. Скрипт 'агента получает свойством UnprocessedDocuments класса NotesDatabase коллекцию документов, которые были созданы или модифицированы в текущей базе после последнего запуска этого агента. Затем скрипт в цикле «просматривает» все документы из коллекции и для

© InterTrust Co. Тел, (095) 9567928

Page 33: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

534 Встроенные классы LotusScript и Java

каждого документа изменяет поле Status, сохраняет документ и «отмечает его», как обработанный этим агентом.

Sub InitializeDim session As New NotesSessionDim db As NotesDatabaseDim collection As NotesDocumentCollectionDim j As IntegerSet. db - session, CurrentDatabase ' ' ':

Set collection = db.UnprocessedDocumentsFor j = 1 To collection.CountSet doc = collection.GetNthDocunent( j )doc.Status = "Processed by agent"Call doc.Save( True, True )

Call session.UpdateProcessedDoc( doc ) Next End Sub

© Метод getDocument - «поиск документа в коллекции» : . . :: :. . . . . - . • . •

LotusScript: Set notesDocument = notesDocumentCollection.geiDocttment(

. notesDocument)

Java: Document doc - DocumentCotlection.geiDocument(Document doc)Возвращает объект класса [Notes]Document, соответствующий заданному параметром

метода объекту класса [NotesjDocument. При успехе указатель текущего документа в коллекции «перемещается» на найденный документ. Если «запрашиваемый» документ в коллекции не найден, возвращается Nothing/null,

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

3.14.3. Прочие методы

© Метод FTSearch - «полнотекстовый, поиск по коллекции». ...". -: ..-,: . . . . . .I ,. . . . . . . . .;;

LotusScript: Call notesDocumentCollection.~FTsearch(query$, [ maxDocs% ] )

Java: void DocumentCollection.VTSesurcWString query)

void Dociimen/Co/lection,ҐTSenrch(Slrmg query, inl maxDocs)Выполняет полнотекстовый поиск по всем документам «исходной» коллекции и

оставляет в этой коллекции только документы, удовлетворяющие поисковому запросу. Поисковый запрос задается в строке query. Параметр maxDocs задает максимальное количество документов, возвращаемый по запросу. Если должны возвращаться все найденные документы, укажите maxDocs равным 0. Полученная коллекция будет отсортирована по показателю соответствия поисковому запросу, а указатель текущего документа в коллекции будет «перемещен» на ее первый документ. Определить значение показателя для элемента коллекции можно свойством FTSearchScore класса [NotesJDocument.

Пример. Скрипт выполняв! полнотекстовый поиск по коллекции из всех документов базы, затем по полученной коллекции формирует «обзорный документ» и отправляет его почтой.Dim session As New NotesSessionDim db As NotesDatabase • . .Dim collection As NotesDocumentCollection

© InterTrust Co, Тел. (095) 9567928

Page 34: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 535

Dim newsletter As NotesNewsletterDim doc As NotesDocumencSet db = session.CurrentDataba.seSet collection = db.AllDocumentsCall collection.FTSeareh("vaccine", 10)Set newsletter = New NotesNewsletter( collection )Set doc =- newsletter. FormatMsgWithDoclinks ( db )doc,Form = "Memo"doc.Subject = "Here's the newsletter you requested."Call doc.Send( False, "Denis Ivanov/Acme/RU" )

© Метод add Document - «добавить документ в коллекцию»

LotusScript: Call notesDocumentCollection.addDocattient(notesDocument)

Java: void DocumentCo/lection.ftddDocument(Docutnent doc)

void DocumenlCoUection.addDocmnent(Document doc,

boolean checkDups)

Добавляет документ в коллекцию. Если коллекция отсортированная, документ добавляется «в конец коллекции», если несортированная - добавляется с применением внутреннего алгоритма. Если добавляемый документ уже имеется в коллекции, в LotusScript возникает сообщение об ошибке, а в Java генерируется исключение.

Если параметр checkDups равен true, то при «удаленных» вызовах обращение к серверу, инициированное попыткой добавить документ в коллекцию, происходит до завершения работы метода, так что в случае попытки «повторно добавить» в коллекцию документ исключение будет сгенерировано «сразу», а не по прошествии некоторого времени,

© Метод deleteDoeument - «удалить документ из коллекции»

LotusScript: Call notesDocumentCollection.de\eteDocument(notesDocument)

Java: void DocumentCol!ection.deleteDocument(Docitment doc)Удаляет документ из коллекции. Если удаляемый документ отсутствует в коллекции или

уже был удален методом removeAIl, в LotusScript возникает сообщение об ошибке, а в Java генерируется исключение.

Пример 1. Скрипт сначала удаляет первый документ из коллекции, а затем снова добавляет его в коллекцию, «протоколируя», как мри этом изменяется количество документов в коллекции.

Dim session As New NotesSessionDim db As NotesDatabase :"Set db = session.CurrentDatabaseDim dc As NotesDocumentCollectionSet dc = db.AllDocumentsMessagebox "Count before delete: " & dc.CountDim doc As NotesDocumentSet doc = dc.Get.NthEnt.ry (1 )Call dc.DeleteDocument(doc)Messagebox "Count after delete: " & dc.CountCall dc.AddDocument(doc)Messagebox "Count, after add: " & dc. Count.

Пример 2. Аналогичные операции с коллекцией выполняет Java-агент.

// Java-DocumentCollection/AddDeleteDatabase db ~ agentContext.getCurrentDatabase();

© InterTrust Co, Тел. (095) 9567928

Page 35: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

536 Встроенные классы LotusScript u Java '

DocumentCollection dc = db . getAHDocu.me.nts () ;System, out .println ( "Count before delete: " -f dc . getCount () ) ;Document doc = dc . getFirst.Document (} ;dc.deleteDocument(doc);System.out,println("Count after delete: " f dc.getCount( } ) ;dc.addDocument(doc);Syste.m..out .println ( "Count after add: " + dc.getCount( ) ) ;

© Метод putAUInFolder - «поместить документы в папку»

LotusScript: Call notesDocumentCollection.putAUInFolder(folderName$ )

Java: void DocumentCollection.patAlllnFolder(String folderName)Помещает все документы данной коллекции в папку с именем folderName. Если папка с

заданным именем не существует, она автоматически создается. Поместить в папку два экземпляра одного документа не удается - если документ уже в папке, метод «пропускает» этот документ.

Пример ). Скрипт находит в базе все документы, в которых «упоминаются Ивановы», и помещает найденные документы в папку.

Dim session As New NotesSessioriDim db As NotesDatabaseSet db --• session. CurrentDatabaseDim dc As NotesDocumentCollectionSet dc - db.AllDocumentsCall dc.FTSearch("Иванов*", О)Call dc . PutAUInFolder ( "Ручной поиск\Ивановы")

Пример 2. To же самое выполняет Java-агент, Позвольте лишь напомнить, что в Java символ «\» в строке записывается как «\\».

/ / Java-DocumentCollectiori /putAllInFolder -Database db = agentContext.getCurrentDatabase(); DocumentCollection dc = db. getA.HDocum.ents () ; dc.FTSearch("Иванов*", О ) ; dc.putAUInFolder ( "Ручной лоиек\\Ивановы") ;

© Метод removeAHFromFolder - «удалить документы из панки» • :

LotusScript: Call notesDocwnentCollection.removeAl]FromFolder(folderName$)

Java: void DocumentCollection.removeAllFromFolder(String folderName)

Уда1гшет документы данной коллекции из папки с именем folderName. Если папка с заданным именем не существует, ничего не происходит. Персональные папки, хранящиеся в файле DESKTOP.DSK, доступны только при выполнении на станции. Если папка существует, но в ней нет представленного в коллекции документа, тоже ничего не происходит. Удаление документа из папки не влечет его удаления из базы - папка «сама подобна коллекции документов».

© Метод reraoveAlI •-«удалить документы из базы» • - . . . . . . . . . . . •LotusScript: Ca!l notesDocumentCollection.removeAll(force )

Java: void DocumentCollection.removeAll(boolean force)

© InterTrust Co. Тел. (095) 9567928

Page 36: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: (^-формулы, LotusScript, встроенные классы LotusScript и Java 537

Удаляет из базы данных все документы данной коллекции. Если флаг force равен true, сама коллекция тоже будет «очищена», если false - в ней могут остаться «ссылки на документы».

© Метод stampAII -«изменить поле во всех документах»

LotusScript: Cal! notesDacumentCoUection,st&m\>Mi{ itemnameS , value )

Java: void DocumentCollectian.stampMl(String itemName, Object value)Заменяет во всех документах данной коллекции значение поля с именем itemName на

значение value. Для параметра value допустимы такие же «типы», как и у соответствующего параметра метода replaceltemValue класса [NotesjDocument. Если поле с указанным именем вдокументе не существует, оно автоматически создается.

Перед вызовом метода stampAII все документы из коллекции, которые былимодифицированы вашим приложением, должны быть сохранены в базе, т.е. для них долженбыть вызван метод save. Метод stamp All вносит изменения непосредственно в находящиеся вбазе документы, и для этих документов не нужен «последующий вызов чего-то подобногометоду save». . .

Пример. Скрипт запрашивает у пользователя имя и значение поля, а затем заменяет или добавляет это текстовое поле во всех документах базы.Dim session As New NotesSessionDim db As NotesDatabaseSet db - session.CurrentDatabaseDim dc As NotesDocumentCollectionSet dc = db.AllDocumentsDim FieldName As StringFieldName = Inputbox("Field name?")FieldValue = Inputbox("Field value?")Call dc.StampAII{FieldName, FieldValue)

© Метод updateAl! - «отметить документы как обработанные агентом»

LotusScript: Call notesDocumentCoIlection.upAateAll

Java: void DocumentCollection.updateAllQ

Отмечает все документы данной коллекции как обработанные данным агентом. Действие, выполняемое методом, подобно вызову метода updateProcessedDoc класса NotesSession/AgentContext для каждого документа из коллекции.

© InterTrust Co. Ten, (095) 9567928

Page 37: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

538 Встроенные классы LotusScript и Java

3.15. «Столбец вида» - класс [NotesJViewColumnОбъект этого класса представляет столбец вида иди папки. Имеет только свойства.

Пользуясь свойствами, можно «узнать» заголовок столбца, номер столбца в виде, формулу или имя ноля, значения которых выводятся в этом столбце, выравнивание, стиль и шрифт для отображения данных столбца и его заголовка, форматы представления числовых и «дата-временных» данных, является ли столбец сортированным, категоризированным, скрытым или представляющим информацию только об ответных документах... В общем, свойств класса вполне достаточно, чтобы было возможным извлечь информацию из вида в базе Notes и загрузить ее в «электронную таблицу иной природы» практически с таким же внешним оформлением, как и в клиенте Notes. Например, для того, чтобы создать собственный апплет для представления вида из базы Notes в броузере... Но часто ли встречаются на практике такие задачи?

«Контейнерная иерархия»

LotusScript NotesView — > Notes ViewColumn — > NotesView

Java View — > ViewColumn — > View

Для получения доступа к объекту класса [NotesJViewColumn используют свойство Columns класса [Notes]View, возвращающее «массив» объектов класса [NotesJViewColumn, представляющих все столбцы вида. Первый элемент этого «массива» имеет индекс 0 и соответствует левому столбцу вида, второй - индекс 1, и т.д. Кроме того, в Java для получения объекта ViewColumn, представляющего столбец вида с заданным номером, может использоваться метод getColumn.

Пример 1. Скрипт выводит в окне заголовки всех столбцов вида, используя для этого свойство Title класса NotesViewCotumn.

server? = "Server/Acme/RUM" dbfileS = "corpcommXwalnut,nsf"Dim db As New NotesDatabase ( server?, d.bfile$ ) Dim view As NotesViewSet view = db.GetView( "By Date\Ascending By Main Topic" } Fora 11 с In view.Columns Messagebox ( c.Title ) End Fora11

Пример 2. Java-агент выводит заголовки и номера всех столбцов вида, используя для этого свойства Title и Position класса ViewColumn.

// Java-ViewColumn/createDatabase db = agent-Context . getCurrentDatabase ();View view = db.getView("By Category"};System.out.println("By Category view"};Vector columns = view.getColumns();i f (columns . s i z e ( ) i = 0 ){

for (int i=0; i < columns.size(); i++) {

ViewColumn column = (ViewColumn)columns.elementAt(i);String vtitle = column.getTitie();if (vtitle — null) vtitle = "No title";System.out.println("\t" + column.getPosition{) + " " + vtitle);

} }

© InterTrust Co. Тел. (095) 9567928

Page 38: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 539

3.15.1. Свойства

Свойство Parent - «родитель»LotusScript: Set notes View = notes ViewColitmn.Parent

Java: View view - F/fc-wCo/wmn.getParentO

Объект класса [NotesjView, «от которого» был получен данный объект

Свойство Title - «заголовок» LotusScript:

title$ ~ notesViewColumn.'TMe

Java: • String title = F/ewCTo/w«n.getTitle()

Возвращает заголовок (название) столбца, если он имеется. Если у столбца нет заголовка, возвращает ""/null.

Свойство Position - «номер столбца»

LotusScript: pos% — notesViewColumn.fosition

Java: hit рок — F/ewCo/M/wz.getPositioiiO

Возвращает номер столбца в виде. Тип Integer/int. Столбцы в виде пронумерованы слева направо, начиная с единицы. Обратите внимание, что свойство Columns возвращает «массив» столбцов вида, в котором первый элемент имеет индекс 0, второй - индекс 1, и т.д.

Свойство Formula - «формула для вычисления значений столбца»LotusScript: formula^ = notesViewColamn.Formvl&

Java: String formula = F/ewCo/wm«.getFormula()

Возвращает (йЬформулу столбца, если таковая существует. Тип String.

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

Если в столбце выводится значение «простой функции» (simple function), свойство возвращает её @-формульный эквивалент. Например, если для столбца выбрана «простая функция» Creation Date (дата создания), свойство вернет "@Created".

Ну, а уж если у столбца полноценная формула, свойство вернет полный текст формулы.

Пример. Скрипт получает формулу из третьего столбца вида By Author. Например, если формула столбца @Name([CN]; From), свойство Formula вернет "@Name([CN]; From)". Если же в столбце выводится значение «простой функции» Size, свойство Formula вернет "@DocLength".Dim db As New NotesDatabase ( "", "yahoo.nsf" )Dim view As NotesViewDim column As NotesViewColumnDim f As StringSet view = db.GetViewf. "By Author" )Set column = view.Columns( 2 }f — column . Formula '•

© InterTrust Co. Ten, (095) 9567928

Page 39: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

540 Встроенные классы LotusScript u Java

Свойство ItemName - «поле значений столбца»

LotusScript: name$ =• notesViewColumn. ItemName

Java: String name = K/ewCo/M/wn.getltemNameO '• •

Имя поля (тип String), значения которого выводятся в данном столбце. Для столбцов, значения которых вычисляются «простыми функциями» или (©-формулами, возвращается автоматически генерируемое внутреннее имя (подобно "$26"), которое можно наблюдать в Domino Designer на последней закладке окна свойств столбца вида.

© Свойство IsFormula - «вычисляется по формуле»LotusScript: flog-- -notes ViewColumn. Is Formula

Java: boolean flag - F/ewCo/w/ww.isFormulaQ

Возвращает true, если значения столбца вычисляются формулой, или false, если нет. Обратите внимание, что true возвращается, когда:* явно указана формула, даже если «она состоит» только из названия поля или только

вычисляет название поля;* формулы явно не указано, но выбрано название поля, значения из которого должны

отображаться в столбце;* выбрана простая функция.

0 Свойство IsField - «вычисляется как значение поля»

LotusScript: flog = notesViewColumn.IsFieM

Java: boolean flag — ViewColumn.isFieldOВозвращает true, если значения столбца являются значениями из поля, или false, если нет.

Обратите внимание, что true возвращается, когда в определении столбца явно выбрано название поля.

Свойство IsResponse - «столбец ответных документов»

LotusScript: flag- notesViewColtimn.IsResponse

Java: boolean/lag - F/'<?wCo/M/nn.isResponseO

Возвращает true, если столбец служит только для представления информации об ответных документах, или false, если нет.

Пример. Скрипт просматривает «иерархический» вид и на основе представленной в нем информации о документах-ответах формирует «отчет» в главном документе, удаляя ответные документы. Предполагается, что в виде нет «ответов на ответы», и что имеется один столбец для представления информации по ответному документу. Например, предположим, что в виде АИ один главный документ и три ответных документа на него:

Какой ваш любимый цвет? (Shelley Kinnamon)

Blue (Joe Doyle) Purple

(Peg Yip) Orange

(Kendra Zowker)

Поскольку документы-ответы удаляются скриптом, после его выполнения вид станет таким:

Какой ваш любимый цвет? (Shelley Kinnamon)

© InterTrust Со. Тел. (095) 9567928

Page 40: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 541

Но в поле Body главного документа будут добавлены строки:

Blue (Joe Doyle) Purple (Peg Yip) Orange (Kendra Zowker)

Dim db As New NotesDatabase ( "", "corn.nsf" } Dim view As NotesView Dim responsePos As Integer Dim doc As NotesDocument Dim rtitem As Variant-Dim response As NotesDocument Dim tempResponse As NotesDocument Set view - db.GetView( "All" )' определение номера столбца, представляющего информацию 1 только о документах-ответахForall с In view.Columns .

If c.IsResponse ThenresponsePos = c.Position

End If End ForallSet doc = view,GetFirstDocument' для каждого главного документа в виде .White Not( doc Is Nothing )Set rtitem = doc.GetFirstItem( "Body" ) Set response = view.GetChild( doc } ' посещаем каждый его документ-ответ While Not( response Is Nothing )

' добавляем значение из столбца для ответных документов в родителя Call rtitem.AppendText _

( response.ColumnValues( responsePos - 1 ) ) Call rtitern.AddNewLine ( 1 )' сохраняем временную копию ссылки на текущий документ-ответ... Set tempResponse = response1 ...поскольку сначала надо перейти к следующему ' документу-ответу...

Set response = view.GetNextSiblingf response } '...и только потом удалять текущий документ-ответ. Call tempResponse.Remove( True } Call view.Refresh Wend

Call doc.Save( True, True ) Set doc = view.GetNextSibling( doc ) Wend

Свойство IsSorted - «отсортированный столбец» LotusScript: flag = notesViewColumn.lsSorted Java: boolean flag — F/ew'C'o/www.isSortedQВозвращает true, если значения столбца сортируются, или false, если нет. Если вид

спроектирован так, что пользователь щелчком мыши может «вызвать» сортировку по столбцу, но столбец не является «основным» сортированным столбцом вида, свойство возвращает false.

© InterTrust Со. Тел. (095) 9567928

Page 41: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

542 Встроенные классы LotusScript и Java

© Свойство IsSortDescending - «отсортированный по убыванию столбец»

LotusScript: flag = notes Fi'eM'Co/M/wz.IsSortDescending

Java: boolean flag — F/<?wCo/Mm».isSortDescending()

Возвращает true, если значения столбца сортируются по убыванию, или false, если нет.

© Свойство .IsCaselnsensitiveSort - «учет регистра при сортировке»LotusScript: flag = notes F/ewC0/Hwn.IsCaseInsensitiveSort

Java: boolean flag = K;ewCo/M/M«.isCaselnsensitiveSort()Возвращает true, если значения столбца сортируются без учета регистра («большие» и

«малые» буквы не различаются), или false, если с учетом.

© Свойство IsAccentlnsensitiveSort - «учет диакритических знаков присортировке»

1LotusScript: flag = notevF/ewCo/wwn.IsAccentlnsensitiveSortJava: boolean flag ~ F/evvCo/M/«w.isAccentInsens!tiveSort()

Возвращает true, если значения столбца сортируются без учета диакритических знаков (accent, диакритический знак - знак, который в ряде языков ставится над буквой, ниже буквы или «пересекает» букву для того, чтобы обозначить ее особое звучание), или false, если сучетом.

© Свойство IsResortAseending - «столбец может сортироваться повозрастанию»' •: . . . . . . •.•••..••'. ' • •''-.'•• • ••• ' :• ' . •••••••.•':'.' ' -ч'--"'"'"LotusScript: flog- notesViewCoIwnn.IsRe$ortAscending

Java: boolean flag ~ ViewColumnAsRe&ortAscendingQ

Возвращает true, если при выборе заголовка столбца «мышью» этот столбец может быть пересортирован по возрастанию (в свойствах вида была выбрана опция "Click on column header to sort" со значением "Ascending" или "Both"), или false, если нет,

© Свойство IsResortDescending - «столбец может сортироваться по убыванию»LotusScript: flag = notesViewCohimn.IsResoriDescenAmg

Java: boolean flag — ViewColumn.i&ResoriDescendingQ

Возвращает true, если при выборе заголовка столбца «мышью» этот столбец может быть пересортирован по убыванию (в свойствах вида была выбрана опция "Click on column header to sort" со значением "Descending" или "Both"), или false, если нет.

© Свойство IsResortToView - «столбец может вызывать переключение на-другой вид» . .LotusScript: flag = notesViewColumn.lsRe&orfToVlew

Java: boolean flag = ViewColumn.isResorfToViewQ

© InterTrust Co, Тел. (095) 9567928

Page 42: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: ^формулы, LotusScript, встроенные классы LotusScript и Java 543

Возвращает true, если при выборе заголовка столбца «мышью» должно выполняться переключение на другой вид (в свойствах вида была выбрана опция Click on column header to sort со значением "Change To View"), или false, если нет.

© Свойство IsSecondaryResort - «вторично сортируемый столбец»LotusScript: flag = notesViewCoIumn.lsSecondaryResart

Java: boolean flag ~ P7ewC'o/?.</?OT.isSecondaryResort()

Возвращает true, если это вторично сортируемый столбец, или false, если нет.

€> Свойство IsSecondaryResortDescending - «вторично сортируемый поубыванию столбец» • '"V. ' -''.".'• ."'••"'•. ' - . , ' • ' " • " . ... : . ' .... -.,. •LotusScript: flag = HOtei'K/ewCo/Mmn.IsSecondaryResortDescending

Java: boolean flag = F/ewC0/wra.isSecondaryResortDescendmg()

Возвращает true, если это вторично сортируемый в убывающем порядке столбец, или false, если нет.

Свойство IsCategory - «столбец категорий»LotusScript: flag — noief,ViewColumn.lsCategory

Java: boolean flag = F/ewCo/wm«.isCategory()

Возвращает true, если значения столбца катетеризированы, или false, если нет. Поскольку всякий категоризированный столбец всегда является сортируемым, если свойство IsCategory вернуло true, то и IsSorted вернет true.

Пример. Скрипт проверяет, категоризирован ли вид By Category по первому столбцу.

Dim db As New NotesDatabase( " " , "denmark.nsf' }Dim view As NotesViewDim column As NotesViewColumnSet view = db. GetView ( "By Category" ) ' - .••'•Set column •- view. Columns ( 0 )If column.IsCategory Then

Messagebox( "First column is categorized." ) Else

Messagebox( "First column isn't categorized." } •End If ,

© Свойство IsSiiowTwistie - «вертушка в столбце» LotusScript: flag - notesViewColumn.IsShawTwistieJava: boolean flag = F/ewCo/M«/n.isShowTwistie()Возвращает true, если в столбце, когда отображаемая в нем информация может быть

«раскрыта», должна выводиться «вертушка» (треугольник, «нажатием мышью» на который можно «раскрыть или свернуть» категорию или иерархию ответных документов), или false, если нет.

Свойство IsHidden - «скрытый столбец» ,LotusScript: flag - notes ViewCohtmn.lsWiMea

© InterTrust Co. Тел. (095) 9567928

Page 43: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

544 Встроенные классы LotusScript и Java

Java: boolean flag = F/ewCo/MW«.isHidden()

Возвращает true, если столбец скрытый (не «виден» пользователю), или false, если нет.

Пример. Скрипт проверяет, имеется ли скрытый столбец в виде By Author текущей базы.

Dim session As New NotesSessionDim db As NotesDatabaseDim view As NotesView ' • ' • • • :-Dim hiddenColumn As Variant xlSet db =• session. CurrentDatabaseSet view = db.GetView( "By Author" )hiddenColumn = FalseForall с In view.ColumnsIf c.IsHidden Then hiddenColumn = True Exit Forall

End If End Forall If hiddenColumn ThenMessagebox( "Имеется как минимум один скрытый столбец" )

RiseMessagebcx( "Скрытых столбцов нет" }

End If

@ Свойство Alignment - «выравнивание текста в столбце»LotusScript: alignment0/» ~ notesViewColumn.Alignmeat

Java: int alignment = F/ewCo/wnm.getAIignmentQ

Возвращает тип выравнивания текста в столбце:• VC..ALIGN J,EFT / ViewColumn ALIGN_LEFT - влево.• VC_AL1GN CENTER / ViewColumn ALIGN. ^CENTER - центрирование,• VC ALIGN RIGHT / ViewCoiumn.AHGNJRJGHT - вправо.

€> Свойство Header Alignment - «выравнивание текста в заголовке столбца»

LotusScript: alignment% = notesViewColumn.~H.eaAer Alignment

Java: int alignment = Fi"eM'Co/M/n«.getHeaderAlignment()Возвращает тип выравнивания текста в заголовке столбца; те же значения, что для

свойства Alignment.

© Свойство FontStyle - «стиль шрифта» ......"... •".".-; ' : ; :: • • ' . . ' . ' . '..". :

LotusScript: style% = notes ViewColumn .FontStyle

Java: int style = FiewC7o/wwj.getFontStyle()

Возвращает стиль шрифта, которым выводится текст столбца:• VC_FONT_BOLD / ViewColumn.FONT_BOLD - «жирный»,• VC_FONTJTALIC / ViewColumn.FONTJTALIC - курсив,• VC_FONT_UNDERLINE / ViewCotumn.FONT_ UNDERLINE - подчеркнутый,• VC_FONT_STRIKEOUT / ViewColumn.FONT_ STRIKEOUT - зачеркнутый.

Стиль может иметь несколько значений, например, FONT_BOLD и FONT_ITALIC.

© InterTrust Co. Тел. (095) 9567928

Page 44: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 545

© Свойство FontPointSize - «размер шрифта»LotusScript: size% — notesViewCo/umn.YoniPomtSize

Java: int. size = FiewC0/M/w?.getFontPointSize()

Возвращает размер шрифта (в пунктах), которым выводится текст столбца.

© Свойство FontFace - «название шрифта»LotusScript: faceS = notes F/ewCo/w/wn.FontFace

Java: String face = Ffen'Co/wwz.getFontFaceQ

Возвращает название шрифта, которым выводится текст столбца.

0 Свойство FontColor-'«цвет шрифта» - • . . : ' • . ' " . . • " • . ,""LotusScript: color% — notesViewColumn.fontColor

Java: ml color— K/ewCo/Mww.getFontColorQВозвращает цвет шрифта, которым выводится текст столбца. Определения констант

фиведены выше, в описании свойства BackgroundColor класса [Notes]View.

© Свойство TimeDateFmi-«формат даты-времени»

LotusScript: fmt% — notesViewColumn.TimeDateFmt

Java: intfmt = ViewColumn.getTimeDateFnitQ

Возвращает формат даты-времени в столбце: » VC FMT_DATE / ViewColumn.FMT_DATE - только дата, » VC_FMT_DATETIME / ViewColumn.FMT DATETIME - дата и время, » VC_FMT_TIME / ViewColumn.FMT JTIME - только время,» VC_FMT_TODAYTIME / ViewColumn.FMTJTODAYTIME - «Today» (сегодня),

«Yesterday» (вчера) или дата в качестве даты и время.

© Свойство DateFmt - «формат даты»LotusScript: fmt% — notesViewColumn.DateFmt

Java: intfmt ~ ViewCohimn.getDateFmtQ

Возвращает формат даты в столбце: » VC _FMT_MD / ViewColumn.DT_MD - месяц и день, » VC_FMT_YM / ViewColumn.DT_YM - год и месяц, » VC_FMT_YMD / ViewCoIumn.DT_YMD - год, месяц и день, в VC FMT_Y4M / ViewColumn.DT_Y4M - год (4 цифры) и месяц.

© Свойство TimeFmt - «формат времени»LotusScript: fmt% = notes ViewCo}umn.TimeҐmt

Java: intfmt = F/ewCo/ww«.getTiineFmt()Возвращает формат представления времени в столбце: » VC

FMT НМ / ViewCoiumn.FMTJHM - только часы и минуты,

© InterTrust Со. Тел. (095) 9567928

Page 45: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

546 Встроенные классы LotusScript и Java

* VC_FMT_HMS / ViewColumn.FMT_HMS - часы, минуты и секунды.

© Свойство TimeZoneFmt - «формат временной зоны»

LotusScript: fmt% — wotoFzewCo/Hmw.TimeZoneFmt

Java: intfmt = F/ewCo/Mww.getTimeZoneFmt()

Возвращает формат информации о временной :юне(часовом поясе) в столбце:

* VC_FMT_ ALWAYS / ViewColumn.FMT_ ALWAYS - всегда присутствует,* VC_FMT NEVER / ViewColumn.FMT NEVER - всегда отсутствует,* VC... FMT_SGMETIMES / ViewColumn.FMT_SOMETIMES - «иногда».

© Свойство NuniberFormat - «формат числовых значений»LotusScript: fmt% - notes Fz'ewCo/M/w/.NumberFormat

Java: intfmt— F/ewCo/i/mn.getNumberFormatQ

Возвращает формат представления числовых значений в столбце:

* VC_FMT_CURRENCY / ViewColumn.FMT_CURRENCY - «денежный»,* VC_FMT__FIXED / ViewColumn.FMT FIXED - с фиксированным числом разрядов после

гонки,* VC FMT^GENERAL / ViewColumn.FMT, GENERAL - общий,* VC_FMT_SCIENT1FIC / ViewColumn.FMT^SCIENTIFIC - «научный» (с плавающей

точкой).

© Свойство NumberDigits - «количество разрядов». ,;., -. . . . • • ; . . .LotusScript: digits% ~ «ofesFzewCo/M/wz.NumberDigits

Java: digits fint - FzewCo/ZOTn.getNumberDigitsQ

Возвращает количество знакомест для представления числовых значений в столбце.

© Свойство NumberAttrib - «атрибуты форматы числовых значений»LotusScript: attrib% — notes FzVwCo/zww.Number Attrib

Java: int attrib ~ ViewCo/w/wn.getNumberAttrib()

Возвращает атрибуты представления числовых значений в столбце:* VC ATTR PARENS / ViewColumn.ATTRJPARENS - отрицательные числа в круглых

скобках,* VC ATTR_PUNCTUAiED / ViewColumn.ATTR_PUNCTUATED - «с разделителем

тысяч»,* VCATTR PERCENT / ViewColumn.ATTR_PERCENT - в процентах.

Учтите, что столбец может иметь насколько атрибутов, например, ATTR__PARENS и ATTR__PUNCTUATED.

© Свойство ListSep - «разделитель элементов списка» ; • . . . . . • - . ; . . .

LotusScript: sep% — notes yiewColumn.lAstSep

Java: int sep = ViewColumn.geiListSepQ

© InterTrust Co, Тел. (095) 9567928

Page 46: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 547

Возвращает информацию о разделителе элементов списка в столбце:• VC_SEP_COMMA/ViewColumn.SEP„COMMA -запятая,• VCSEP SEMICOLON / ViewColumn.SEP_SEMICOLON - точка с запятой,• VC_SEP_NEWLINE/ViewColumn.SEP_NEWLJNE- с новой строки,« VC_SEP_SPACE/ ViewCoIumn.SEP SPACE-пробел.

© Свойство IsResize - «столбец изменяемой ширины» LotusScript: flag = notesViewColumn.I&Resize

Java: boolean flag = ViewCo!umn.isR.e$ize()

Возвращает true, если «ширина» столбца может быть изменена пользователем, или false, если нет.

© Свойство Width - «ширина столбца»LotusScript: width$ ~ notes ViewColumn.Width

Java: int width — F/ewC'o/w?«w.getWidth()

Возвращает «ширину» столбца.

@ Свойство Islcon - «значение отображается пиктограммой»LotusScript: flag = notes ViewCQlumn,l$lcon

Java: boolean flag = ViewColumn.isIconQ

Возвращает true, если значение в столбце отображается пиктограммой, или false, если нет.

© Свойство IsHideDetail - «скрытие деталей в столбце Totals»LotusScript: flag = notes ViewColumn.IsHideDetai}

Java: boolean flag = ViewColumn.isiHdeDetailQВозвращает true, если это столбец «Итого:» (Totals), но в нем не должны отображаться

значения, соответствующие документам, а только «сводные» значения для категорий и всего вида, или false, если нет.

i

© InterTrust Со. Тел. (095) 9567928

Page 47: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

548 Встроенные классы LotusScript и Java

3.16. «Коллекция строк вида» - класс ['NotesJViewEntryCoIlectionЕсли относиться к виду как к таблице или матрице, состоящей из строк и столбцов, то

объект класса [Notes] VievvEntry Col lection представляет коллекцию из всех строк вида или только некоторое подмножество строк вида. Порядок следования элементов в такой коллекции совпадает с порядком следования соответствующих строк в «родительском» виде. Каждый элемент из коллекции - «строка вида» - является объектом класса [Notes]ViewEntry. Вообще говоря, объект класса [Notes]ViewEntry может быть одного из трех типов -представлять строку вида, соответствующую документу, категории или строке «итого:» (total). Однако по способу своего получения объект класса [NotesJViewEntryCoIlection никогда не содержит элементов, соответствующих категориям и строкам «итого:». Кроме того, и в существующий объект [NotesJViewEntryCoIlection в принципе не могут быть добавлены элементы, соответствующие категориям и «итого:».

Свойства и методы класса [NotesJViewEntryCoIlection во многом похожи на свойства и методы класса [NotesJDocumentCoIlection.

Объект [NotesJViewEntryCollection поддерживает указатель текущего элемента в коллекции (current pointer). Все методы «навигации» по коллекции изменяют положение текущего указателя. Методы добавлении элементов в коллекцию или удаления элементов из коллекции положения текущего указателя не изменяют.

Объект [NotesJViewEntryCoIlection не может содержать «дублирующиеся» элементы. Гак, даже если коллекция была получена по катетеризированному виду, в котором один и тот же документ входит в несколько категорий, то элемент, представляющий такой документ, будет встречаться в коллекции только один раз.

«Контейнерная иерархия»

LotusScript NotesView — > NotesViewEntryColIection — > NotesViewEntry INotesView __________

Java View — > ViewEntryColIection — > ViewEntry jView |

Для получения объекта класса [NotesJViewEntryCollection используют свойство AHEntries или метод getAHEntriesByKey класса [NotesJV'iew, а так же метод FTSearch «самого» класса [NotesJViewEntryCollection.

3.16.1. Свойства

© Свойство Parent - «родитель» • .. :; : • .: -У :-• •: •.: : ,. . • : . ' . : 'LotusScript: Set notes View - notes ViewEntryCollection.Pareat

Java: View view = ViewEntry.geiParentQ

Объект класса [NotesJView, «от которого» был получен объект данной коллекции строквида.

© Свойство Count - «количество элементов»

LotusScript: count& = notesViewEntryCoUection.Covmt

Java: int count = ViewEntryCollection.getCountQ

Количество строк в коллекции. В LotusScript тип Long, в Java ~ int.

© InterTrust Co. Тел. (095) 9567928

Page 48: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: (е^-формулы, LotusScript, встроенные классы LotusScript и Java 549

©Свойство Query-«текст поискового запроса» • , .'";•.;.,:,:• •:• . .-: . . ; . : • . . : :....

LotusScript: query$ - notesViewEntryCoHection.Qucry

Java: String query — ViewEntryCollection.getQueryQ

Если коллекция была получена в результате выполнения запроса полнотекстового поиска, возвращается строка, содержащая текст этого запроса. В противном случае возвращается ""/null.

3.16.2. Методы навигации по коллекции

© Метод getFirstEntry - «первый элемент из коллекции» : •LotusScript: Set notes ViewEntry — notes ViewEntryCollection.geiFirsiEntry

Java: ViewEntry entry - ViewEntryCollection.geiFirsiEntryQ

Возвращает первый элемент коллекции или Nothing/null, если она пуста.

@ Метод getNextEntry - «следующий элемент из коллекции» ' ' . : . . • : :: -. : •

LotusScript: Set notes ViewEntry = notes ViewEfitryCollection.geiNe\?Entry( entry )

Java: ViewEntry entry ~ ViewEntryCollection.geiNe\iEntryQ

View Entry entry = ViewEntryCollection.gpt1Ste\iEntry(ViewEntry entry)

Возвращает элемент коллекции, следующий за текущим или заданным параметром метода. Если следующего элемента нет, возвращается Nothing/null.

Пример. Скрипт получав! коллекцию всех строк вида ($А11), а затем просматривает коллекцию от начала к концу, выводя для каждой строки вида ее содержимое из первой и второй колонок вида и ее «уровень в виде».

Dim session As New NotesSessionDim db As NotesDatabaseDim view As NotesViewDim vec As NotesViewEntryCollectionDim entry As NotesViewEntry • •- • 'Set db = session.CurrentDataba.seSet view = db.GetView{"($A11)")Set vec = view.AllEntries . • .Set entry = vec.GetFirstEntryWhile Not (entry Is Nothing)

Msgbox entry . ColumnValues ( 0 ) & " -- " & entry. Co LumnValues (1) , ,entry.getPosition("."}

Set entry = vec.GetNextEntry(entry) Wend

© Метод getLastEntry - «последний элемент из коллекции» . :;.: • • : . : • .'•• .. . '••.-

LotusScript: Set notesViewEntry - notesViewEntryColIectioti.getlj'dsiEntry

Java: ViewEntry entry = ViewEntryCollection.getlMstEntr$'Q

Возвращает последний элемент коллекции или Nothing/null, если она пуста.

О InterTrust Co. Тел. (095) 9567928

Page 49: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

550 Встроенные классы LotusScript u Java

© Метод getPrevEn try г «предыдущий элемент из коллекции» . • ''

LotusScript: Set notes ViewEntry ~ notes ViewEntryCollection.geiPrev'Entry( entry )

Java: ViewEntry entry = ViewEntryCollection.getPrevEntryQ

View Entry entry = ViewEntryCoUection.geiPrev'Entry(Vie'wEntry entry)

Возвращает элемент коллекции, предшествующий текущему или заданному параметром метода. Если предшествующего элемента нет, возвращается Nothing/null.

Пример. Java-агент получает коллекцию всех строк вида ($А11). а затем просматривает коллекцию от конца к началу, выводя для каждой строки вида ее «уровень в виде» и ее содержимое из первой и второй колонок вида.

// Java-ViewEntryCollection/LastPrevEntryDatabase db = agentContext.getCurrentDatabase();View view = db.getView("($A11)");ViewEntryCollection vec = view.getAllEntries() ;ViewEntry entry = vec.getLastEntry{); \while (entry != null){

System, out .println ( "Entry is at position " + entry. getPosition ('.') -t ": " + entry . getColumnValues (0) + " - " t- entry . getColumnValues (1) ) ;

entry = vec.getPrevEntry();i •

.

© Метод-getNthEntry - «элемент с указанным номером из коллекции» •

LotusScript: Set notes ViewEntry = notes ViewEntryCollection.get~NtliE,ntry( n& )

Java: ViewEntry entry -- ViewEntryCollection.get'NikE lntry(int n)

Возвращает элемент коллекции с указанным номером. Нумерация элементов в коллекции начинается с единицы. Если элемента с указанным номером нет, возвращается Nothing/null.

Учтите, что элементы объекта [Notes]ViewEntryCollection «переномеровываются» после удаления элементов из коллекции.

© Метод getEntry - «поиск элемента в коллекции» • .>. - •• •,....... . . . л ...;. .:. ;.::i

LotusScript: Set notes ViewEntry = notes ViewEntryCollection.getTЈntry( entryOhj )

Java: ViewEntry entry = ViewEntryColIection.getEntry(Object entryObj)

Возвращает имеющийся в коллекции объект класса [Notes]ViewEntry, соответствующий заданному параметром метода объекту класса ["Notes]ViewEntry или [Notes]Document. Указатель текущей позиции коллекции «перемещается» на найденный элемент. Если «запрашиваемый» объект не найден в коллекции, возвращается Nothing/null.

Наиболее частое применение метода - проверка вхождения элемента в коллекцию.

3.16.3. Прочие методы работы с коллекцией

© Метод FTSeareh - «полнотекстовый поиск по коллекции»

LotusScript: Call notesViewEntryCollectio?i,'FTsearcb(queryS, [ maxDocs% ] )

Java: void ViewEn!-ryCollection.Ґ'TSearcli(String query)

void ViewEntryColleclion.ҐTiSearch(String query, int maxDocs)

Page 50: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

© InterTrust Co, Тел. (095) 9567928

Page 51: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R, 5: (а)-формулы, LotusScript, встроенные классы LotusScript и Java 551

Выполняет запрос полнотекстового поиска по всем документам «исходной» коллекции и «оставляет» в этой коллекции элементы, соответствующие документам, удовлетворяющим поисковому запросу. Текст поискового запроса задается в строке query. Параметр maxDocs задает максимальное количество документов, «оставляемых» в коллекции после выполнения поискового запроса. Если в коллекции должны «остаться» все удовлетворяющие поисковому запросу документы, задайте параметр maxDocs равным 0 или «опустите» его.

Полученная коллекция будет отсортирована по значению показателя соответствия поисковому запросу. Определить значение показателя для элемента коллекции можно свойством FTSearchScore класса [NotesjViewEntry. Если база, «содержащая» коллекцию, не имеет индекса полнотекстового поиска, метод работает, но значительно менее эффективно.

Отметим, что на самом деле, вероятно, при выполнении поискового запроса на «исходную» коллекцию только «накладывается фильтрация полнотекстового поиска», но «прямого» удаления из «исходной» коллекции не удовлетворяющих поисковому запросу документов не происходит. Однако метода, подобного методу clear класса [NotesjView, позволяющему «снять с вида фильтрацию полнотекстового поиска», в классе [Notes]ViewEntryCollection нет.

Пример. Java-агент получает «исходную» коллекцию из элементов, соответствующих всем документам вида By Category текущей базы. По этой коллекции выполняется полнотекстовый поиск, в результате которого в коллекции остаются только элементы, соответствующие документам, содержащим слова "Spanish" и "leather". После этого агент формирует отчет по результатам поиска.

// Java -ViewEntryCollection/ETSearchDatabase db = agentContext.getCurrentDatabase();db.updateFTlndex(true) ;View view =-- db . getview ( "By Category");ViewEntryCol lection vec = view. getAHEntries () ;vec.FTSearch("Spanish & leather");System.out.println("Query: \"" + vec.getQuery() 4 "\"");System, out .println ( "Number of entries =•- " + vec.getCount());ViewEntry entry - vec.getFirstEntry();while (entry !— null){

System . out, println { "Entry is at position " + entry . getPosit ion ('.') +-" - relevance score is " + entry.getFTSearchScore () ) ;

entry = vec.getNextEntry(}; }

@ Метод addEntry -«добавить в коллекцию» : •. ......-,-•,. ,.::-••.... :- . . • • . . , .LotusScript: Call notesҐiewEntryCollection.»dd'Entry( entryObj )

Java: void ViewEntryColIection.nddEntry(Object entryObj)

void FiewEntryCollect ion,aduEntry (Object entryObj, boolean checkDups)

Добавляет элемент entryObj в коллекцию. Добавляемый элемент должен быть объектом класса [NotesjViewEntry (типа документ) или класса [Notes]Document.

Метод не допускает появления в коллекции «дублирующихся» элементов. При попытке повторно добавить элемент в коллекцию в LotusScript возникает ошибка, а в Java -генерируется исключение "Document or ViewEntry already exists in this collection".

Параметр checkDups функционирует только при «удаленных» (НОР) вызовах. Если параметр равен true, то возможное исключение, генерируемое методом addEntry, произойдет уже при текущем обращении к серверу. Если же параметр равен false, исключение, генерируемое методом addEntry, произойдет только при последующем обращении к серверу, при вызове методов навигации по коллекции или иных методов, подобных stamp AII.

© InterTrust Со. Тел. (095) 9567928

Page 52: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

552 Встроенные киксы LotusScript и Java

Отметим также, что соответствующий добавляемому элементу документ в момент добавления в коллекцию должен существовать в базе. Например, после создания вашим приложением нового документа (объект [Notes]Document в виртуальной памяти) этот документ сначала необходимо сохранить в базе (методом save), а только затем добавлять его объект [Notes]Document в коллекцию.

Пример, Скрипт «пытается» повторно добавить в коллекцию ее первый элемент, и это приводит к ошибке "Document or ViewEntry already exists in this collection".

Dim session As New NotesSessionDim db As NotesDatabaseDim view As NotesViewDim vec As NotesViewEntryCollectionDim entry As NotesViewEntrySet db - session.CurrentDatabaseSet: view = db . GetView ( " ( $A11) " )Set; vec =^ view. AllEntriesMsgbox Cstr(vec.Count),,"Исходно"Set entry = vec.GetFirstEntryCall vec.addEntry(entry)Msgbox Cstr(vec.Count) , , "После добавления дубликата"

© Метод deleteEntry - «удалить из коллекции» ' ' : ' ; •-: •."•;••'.: ' "•• . ; • ::: •;••••-•.'••-.• •--

LotusScript: Call notes ViewEntryCol/ection.deleteKntry(entry)

Java: void Vie\vEntryC-ollection.deleteiE.ntry(ViewEntry entry)Удаляет элемент из коллекции. Удаляемый элемент должен быть объектом класса

[Notes j ViewEntry (типа документ).

При попытке удалить из коллекции не существующий в ней элемент (в частности, уже удаленный ранее) в LotusScript возникает ошибка, а в Java - генерируется исключение. Можно или обрабатывать ошибки/исключения, или всякий раз перед удалением элемента проверять его наличие в коллекции методом getEntry,

Пример. Скрипт удаляет первый элемент из коллекции и «сообщает», как в результате этого изменился размер коллекции. В первый раз удаление происходит успешно и количество элементов в коллекции уменьшается на единицу. Попытка же повторно удалить этот документ из коллекции приводит к ошибке "Entry was deleted from this collection".

Dim session As New NotesSessionDim db As NotesDatabaseDim view As NotesView • : -Dim vec As NotesViewEntryCollectionDim entry As NotesViewEntrySet db = session.CurrentDatabase .Set view = db . GetV.i ew ( " ( $A11) " )Set vec = view.AllEntries ' 'Msgbox Cstr(vec,Count),,"Исходно"Set entry -= vec . GetNthEntry (1)Call vec.DeleteEntry(entry)Messagebox Cstr(vec.Count) , , "После удаления"Call vec.DeleteEntry(entry)Messagebox Cstr(vec.Count} , , "После повторного удаления"

@ Метод putAHInFolder- «поместить документы коллекции в папку» LotusScript: Call notes ViewEntryCollection.putAl\InFolder(folderName$

© InterTrust Co. Тел. (095) 9567928

Page 53: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 553

[, createOnFail ] )

Java: void ViewEnfryCollection.ptttAlllnҐolder(String folderName)

void ViewEntryCollection.putAlllnҐolder(String folderName,

boolean createOnFail}

Помещает все документы, соответствующие элементам данной коллекции, в папку с именем folderName. Если параметр createOnFail равен true (значение по умолчанию), и папка с заданным именем не существует, то она автоматически создается. Если же параметр createOnFail равен false, а папка с заданным именем не существует, «ничего не происходит».

Поместить в одну папку два экземпляра одного документа невозможно - если документ уже в папке, метод «пропускает» его.

Пример 1. Скрипт находит в виде, отсортированном по фамилии, «всех Ивановых», и помешает соответствующие документы в папку.

Dim session As New NotesSessionDim db As NotesDatabaseSet db = session.CurrentDatabaseDim view As NotesViewSet view = db . GetView ( "By last, name")Dim vec As NotesViewEntryCollectionSet: vec = view. GetAllEntriesByKey { "Иванов" )Call vec.PutAllInFolder("Ручной поиск\Ивановы")

Пример 2. To же самое выполняет Java-агент. Позвольте лишь напомнить, что в Java символ «\» в строке записывается как «\\».

Database db - agentCoiitext, getCurrent Database ( ) ; View view -- db . getView ( "By last; name");ViewEntryCollection vec = view . getAHEntriesByKey ( "Иванов" ); vec.putAHInFolcier ("Ручной поиск\\Ивановы") ;

© Метод removeAHFromFolder - «удалить документы коллекции из папки»LotusScript: Call notesViewEntryCollection.remQveAUҐromFQMer(folderName$ )

Java: void ViewEnlryCol/ection.removeAllҐromҐoMer(String folderName)

Удаляет документы, соответствующие элементами данной коллекции, из папки с именем folderName. Если папка с заданным именем не существует, «ничего не происходит». Персональные папки, хранящиеся в файле DESKTOP.DSK, доступны только при выполнении на станции. Если папка существует, но в ней нет представленного в коллекции документа, тоже «ничего не происходит». Удаление документа из папки не влечет его удаления из базы.

© Метод removeAll - «удалить документы коллекции из базы».....: : . .... ..LotusScript: Call notes yicwEntryCollection.removcAll( force )

Java: void ViewEntryCoUection.removeA\\(boolean force)

Удаляет из базы данных все документы, ассоциированные с элементами данной коллекции. Если флаг force равен true, удаление документов происходит даже тогда, когда в период с момента получения коллекции до момента удаления всех ее документов пользователи «успевают» модифицировать ассоциированные с некоторыми элементами коллекции документы. Если же флаг force равен false, то такие модифицированные пользователями документы не удаляются из базы. Все документы, которые были удалены из базы, автоматически удаляются и из коллекции.

. © InterTrust Со. Тел. (095) 9567928

Page 54: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

554 Встроенные классы LotusScript, и Java

® Метод stampAIl - «изменить поле во всех документах коллекции»

LotusScript: Call noteaViewEntryCollectioihStampAll( itemnameS , value )

Java: void ViewEntryCollection.stampAl\(String itemName, Object value}Заменяет во всех документах, ассоциированных с элементами данной коллекции,

значение поля с именем itemName на значение value, Для параметра value допустимы такие же «типы», как и у соответствующего параметра метода repiaceltemValue класса [NotesJDocument. Если поле с указанным именем в документе не существует, оно автоматически создается.

Перед вызовом метода stampAIl все документы из коллекции, которые были модифицированы вашим приложением, должны быть сохранены в базе, т.е. для них должен быть вызван метод save. Метод stampAIl вносит изменения непосредственно в находящиеся в базе документы, и для этих документов не нужен «последующий вызов чего-то подобного методу save». Однако изменения, произведенные методом в документах базы, не повлекут соответствующей модификации ранее связанных с этими документами объектов в вашем приложения - их придется «получить» снова.

i

© Метод updateAII - «отметить документы коллекции как обработанныеаг ент ом » . . .. • •: '.•':./.:,:••••'• :."...-. . : ' ;. ' ' •••;:•; :.' . " . - . - / . . . - . ' . ; : •-.-'••LotusScript: Call notes yiewEntryCollection.iipuateAll

Java: void ViewEntryColIection.updateAllQ

Отметчет все документы, связанные с элементами данной коллекции, как обработанные данным агентом. Действие, выполняемое методом, подобно вызову метода updateProcessedDoc класса NotesSession/AgentContext для каждого документа из коллекции.

i

© InterTrust Co. Тел. (095) 9567928

Page 55: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R, 5: С&формулы, LotusScript, встроенные классы LotusScript и Java 555

3.17. «Строка вида» - класс [Notes] ViewEntryЕсли относиться к виду как к матрице (таблице), состоящей из строк и столбцов, то

объект класса [Notes] ViewEntry представляет одну строку этого вида. Объект [NotesjViewEntry может быть одного из трех типов - представлять строку вида, соответствующую документу, категории или строке «итого:» (total).

Несмотря на относительно малое количество свойств и единственный метод, это практически полезный класс - по крайней мере он позволяет выбирать информацию непосредственно из строк вида, в том числе и из строк, соответствующих категориям или«итого:»,

«Контейнерная иерархия»LotusScript J NotesView — » NotesViewEntry — > NotesDocument NotesViewEntryCol lection NotesViewNavigator Java View — > ViewEntry --> DocumentViewEntryCollectionViewNavigator ________________________ (

В LotusScript и Java объект класса [Notes] View Entry получают многочисленными методами классов [NotesjViewEntryColIection и [Notes]ViewNavigator. а так же методом gelEntryByKey класса [Notes]View.

3.17.1. Свойства и метод

©Свойство Parent - «родитель» • . : ::•.• •.-;••- . . ; . . ; • . : • .. . . . .LotusScript: Set notes View - notes ViewEntry.If brent

Java: Object ohj = ViewEntry.getPurentQ

Объект класса [Notes]ViewEntryCollection, [Notes]ViewNavigator или [Notes]View, «от которого» был получен объект «данной строки вида».

© Свойство ChildCount - «количество прямых потомков»LotusScript: count% - notes ViewEntry.ChildCount

Java: int count — ҐiewEntry.gctCh\MCount()

Количество прямых потомков для данной строки вида.

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

0 Свойство DescendantCount - «количество всех потомков»LotusScript: count% = notes yicwEntry.Descend&ntCount

Java: int count = F/evt'Ј>rfry.getDescendantCount()

Количество всех потомков для данной строки вида.

© InterTrust Co. Тел. (095) 9567928

Page 56: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

556 Встроенные классы LotusScript и Java

Page 57: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Например, если строка соответствует категории, в которой два документа и одна подкатегория, в свою очередь содержащая три документа, то всего потомков будет пять.

© Свойство SiblmgCount - «количество строк на одном уровне с данной»

LotusScript: count% -- notesViewEntry.SiblingCoant

Java: int count - f/7evv.Јn/7'j.getSiblingCount()

Количество строк на одном уровне с данной, включая и ее саму, если только она не типа «total».

Пример. Пусть категорюированный вид Animals by Category выглядит следующим образом (категории даны жирным шрифтом).

1 Коты1.1 Васька1.2 Рыжик2 Собаки2.1 Шарик ,2 ,2 Таксы2.2.1 Атос фон дэ ля Фер2.2.2 Ион Ионыч Чолли Россо

Можно ожидать, что для строк из данного вида свойства ChildCount, DescendantCount и SiblingCount должны вернуть результаты, приведенные в следующей таблице.

г - ChildCount DescendantCount SiblingCount

1 Коты 2 2 ?

1.1 Васька 0 0 21 .2 Рыжик 0 0 22 Собаки 2 3 22.1 Шарик 0 0 22.2 Таксы 2 2

9 &

2.2, 1 Атос фон дэ ля Фер 0 0 Г 22.2.2 Ион Ионыч Чолли Россо 0 0 2

Однако следующий скрипт выведет в диалоговом окне ChildCount :" 0, DescendantCount = 0 и SiblingCount = 2. Причина в том, что метод getEntryByKey возвращает первую строку типа «документ» из категории «Коты» (она соответствует документу «Васька» и у нее действительно нет потомков), а вовсе не строку, соответствующую категории «Коты»,

Dim session As New NotesSessionDim db As NotesDatabaseDim view As NotesViewDim e As NotesViewEntrySet db — session.CurrentDatabaseSet view = db.GetView("Animals by Category")Set e =- view. GetEntryByKey ( "Коты" )Messagebox " O" & Cstr (e. ChildCount) &

" D=" & Cstr(e.DescendantCount) &" S=" & Cstr(e.SiblingCount} ,,"Pos=" & e.getPosition(".")

Модифицируем этот скрипт, воспользовавшись объектом класса NotesViewNavigator, чтобы получить все строки из вида. Теперь результаты совпадут с ожидаемыми.

Dim session As New NotesSessionDim db As NotesDatabaseDim view As NotesViewDim entry As NotesViewEntrySet db = session.CurrentDatabaseSet view - db.GetView("Animals by Category")

© InterTrust Co. Тел. (095) 9567928

Page 58: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: (су-формулы, LotusScript, scm/юенные классы LotusScript и Java 557

Dim nav As NotesViewNavigator -. • - • -- -. -:-Set nay = view.createViewNav • 'Dim e As NotesViewEntry • • .Set e = nav.GetFirstWhile Not (e Is Nothing)

Messagebox " O" & Cstr(e.ChildCount) &" D=" & Cstr(e.DescendantCount) &

" S = " & Cstr(e.SiblingCount) ,,"Pos = " & e.getPosition ( ".") Set e = nav.GetNext(e) Wend

© Свойства IsDocument, IsCategory, IsTotal - «тип строки в виде»LotusScript: flag = notesViewEntry.lsDocument

flag - notes ViewEntry.lsCategory

flag - notes ViewEntry.IsTotsl

Java: boolean flag = ViewEntryAsDocumentO

boolean flag — ViewEntry.isCutegoryQ

boolean flag = View Entry.isTotelQ

Если возвращается true, тип строки в виде соответственно «документ», «категория» или «total». '

@ Свойство ColunrnValues - «значения в ячейках строки»LotusScript: valuesArray — nntesViewEntry.Column Values

Java: java,util. Vector values — ViewEntry.getColumnVuluesQ

«Массив» значений «в ячейках» данной строки вида. В LotusScript тип Array of variants, в Java - объект класса Java.util.Vector с элементами классов String, DateTime или Double.

Пример, В базе LOG.NSF («Протокол работы сервера») имеется катетеризированный вид Replication Events (см. Рис. 3.27). Необходимо выбрать из него «сводную» информацию только об именах серверов и общем времени, затраченном на репликации. Имя сервера дается в первом столбце вида, а время, затраченное на репликации - в 5 столбце вида. Поскольку данный вид имеет два категоризированных столбца, для отбора категорий верхнего уровня применяется дополнительный признак - непустое значение в столбце 1. Следующий скрипт решает поставленную задачу.

Dim session As New NotesSessionDim db As New NotesDatabase("Domino500/InterTruscCorp/SU","log.nsf"} Dim view As NotesViewSet view = db.GetView("Replication Events") Dim nav As NotesViewNavigator Set nav = view.createViewNav Dim e As NotesViewEntry Set e = nav.GetFirst While Not: (e Is Nothing) If e.IsCategory Then

If e.ColumnValues( 0 ) <> "" ThenRem Индекс в массиве - номер столбца - 1Messagebox Cstr(e.ColumnValues(4)),,e.ColumnValues(0)End If . . . ; . .

End IfSet e = nav.GetNext(e)

Wend

© InterTrust Co. Тел. (095) 9567928

Page 59: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

558 Встроенные классы LotusScript и Java

With Serve* Date Starting Time Ending Time j Minutes ; Average •

|* 194 1S6.39.1B 66,6 8,3»> 194.73.241.129 33,7 4,2* BlueBottle 43,5 5,4> DominoSQQ 17 0,3> InterTrust 110,4 13,8

* LNN •;V<^i-nv;?'v 0,0 0,0* Lotus-36 117 1-5> LVS 0,0 0,0> Notesl 19,5 2,4> Notes2 6,3 0,8Ь pHSOO 0,0 0,0

293,4 267

Рис, 3.27 Вид Replication Events из базы LOG.NSF

© Свойство Document - «документ, представленный строкой»

LotusScript: Set notes Document = notesViewEntry.Document

Java: Document doc — ViewEntry.getDocumentQОбъект класса [Notes]Document, представляемый данной строкой, или Nothing/null, если

строка представляет не документ или документ с момента создания объекта [Notes]ViewEntry до момента получения значения свойства был удален,

Обратите внимание, что полученный таким образом объект [NotesjDocument не поддерживает свойств FTSearchScore, Column Values и Parent View - вместо них нужно пользоваться аналогичными свойствами FTSearchScore, ColumnValues и Parent «родительского» объекта [TNotes]ViewEntry.

@ Свойство FTSearchScore - «показатель полнотекстового поиска»

LotusScript: score% = notes FzewJU/rtry.FTSearchScore

Java: int .score = F/ewЈ>7/ry,getFTSearchScore()Если сама строка была получена как результат выполнения запроса полнотекстового

поиска и она представляет «найденный» документ, возвращается значение показателя полнотекстового поиска для документа. Если строка была получена не как результат выполнения запроса полнотекстового поиска, возвращается 0, Если строка была получена как результат выполнения запроса полнотекстового поиска, но база не имела индекса полнотекстового поиска, возвращается «неопределенное» число.

@ Свойство IndentLevel - «уровень строки в виде»

LotusScript: level% - notes F/ewЈ>i/ry.IndentLevel

Java: int level ~ Fz'ewЈ>z?r_).!,getTndentLeveI()

Уровень строки в виде - число от 0 до 31.

© Свойство IsConffict - «конфликтный документ»

LotusScript: flag - notesViewEntry.lsCtmuict

Java: boolean flag ~ ViewEntry.isConUKtQ

© InterTrust Co. Тел. (095) 9567928

Page 60: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: (а)-формулы, LotusScript, встроенные классы LotusScript и Java 559

Если строка в виде представляет документ и свойство возвращает true, то документ является конфликтным, т.е. он появился в результате конфликта сохранения или репликационного конфликта.

© Свойство Is Valid - «документ не удален» LotusScript: flag = notes ViewEntry.\sVA\\&

Java: boolean flag ~ ViewEntry.isVsAiAfy

Если строка в виде представляет документ и свойство возвращается true, то документ не является «окурком» (deletion stub), «оставшимся» после удаления этого документа, произошедшего в период с момента получения объекта [Notes] ViewEntry или «содержащего его объекта» до момента получения значения данного свойства.

€> Свойства NotelD и UniversallD - «идентификаторы представляемого строкой документа»LotusScript: note$ — notesViewEntry.NotelD

unic/S = notes ViewEntry. UniversallD

Java: String note ~ F/ewEnft'v.getNotelDO

String unid - F/>wЈ«/ry.getUniversalIDOЕсли строка в виде представляет документ, возвращается соответственно идентификатор

документа в данной базе или универсальный идентификатор документа.

@ Метод getPosition - «позиция в виде» : ' • -;•'..-• ' • ' - . . • . • •-. :

LotusScript: positions - notesViewEntry.getPosition(separator$)

Java: String position ~- ViewEntry.getPosition(char separator)Возвращает «позицию» строки в виде; нечто подобное «2.11.7» - например, 7-й ответ на

11-й документ во 2-й категории, если в качестве разделителя separator была выбрана «точка».

Пример. В базе LOG.NSF («Протокол работы сервера») имеется категоризированный вид Replication Events (см. Рис. 3.27). Необходимо выбрать из него «сводную» информацию только об именах серверов и общем времени, затраченном на репликации. Имя сервера дается в первом столбце вида, а время, затраченное на репликации - в 5 столбце вида. Поскольку данный вид имеет два категоризированных столбца, для отбора категорий верхнего уровня применяется дополнительный признак - отсутствие «точки» в текстовом представлении «позиции» такой строки.

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

import lotus.domino.*; import java.util.*;

public class DIIOPApplet.3 extends AppletBase {Java . awt. Text Area ta; ,. -Session s;String serverName = "NotesSrv400/InterTrustCorp/SU";String dbFileName = "log.nsf";Database db;

© InterTrust Co. Ten. (095) 9567928

Page 61: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

560 Встроенные классы LotusScript и Java

String viewName = "Replication Events"; View view;

P u b1iс void n о t e sApp1e 11 nit() {setLayout(null); • . -setSize (this . getSize (} .width, this . getS.ize () .height) ;t.a = new j ava . awt. Text Area {) ;ta. set-Bounds (0, 0, this . getSize () .width-1, this . getSize (} .height-1) ;add(ta);ta.setEditable(false);setVisible(true); }

public void notesAppletStart() {try { ta.append("DIIOPApplet3 started");if (s == null) ,// Сессия

i\if ( (s = this.getSession () ) == null) // s = this.getSession("Nlontsev","password") {ta.append("\nUnable to create a session!"}; return; }e 1 s e {String p = s.getPlatform(!; String u = s.getUserName();

ta.append("\nSession for user "+ u + " on platform " + p); } }if (db == null) // Ваза {db = s.getDatabase(serverName, dbFileName);if (db.isOpen()) ta.append("\nDatabase "+db.qetTitle()+" is opened");e 1 s e ,/!

ta.append("\nDb "+serverName+"!!"tdbFileName+" is not opened!");ret urn; } ( if (view == null) // Вид(view — db.getView(viewName);if (view != null) ta,append("\nView "4 view.getName()+" found"); else {ta . append ( "\nV.iew " + viewName-t " not found");return;i

}loadViewCategori.es (); // Загрузка категорий } catch(Exception e) { e.printStackTrace (); }

}

public void loadViewCategories ( ) {

© InterTrust Co. Тел. (095) 9567928

Page 62: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Loins Domino R, 5: (а^формулы, LotusScript, встроенные классы LotusScript и Java 561

try{ta.append("\nLoading view "+view.getName() +"..."); ' " 'ViewNavigator nav = view.createViewNav();ViewEntry entry = nav.getFirst();while (entry != null){if (entry . isCategory () & entry. getPosition ('.')• indexOf ('.') --= -1)i \Vector values -- entry . getColumriValues (); String srvname = values.elementAt(0).toString(); String txtTime = values.elementAt(5).toString();ta.append("\n" + srvname + " = " + txtTime);i/ i . • <entry = nav . get-Next (); } ta.append("\nView " + view.getName() + " is loaded");} catch(Exception e) { e.printStackTrace(); }i /

} •

Рис. 3.28 Внешний вид апплета DIIOP3

i

Page 63: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

© InterTrust Co. Ten. (095) 9567928

Page 64: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

562 Встроенные классы LotusScript u Java

3.18. «Навигатор по виду» - класс [NotesJViewNavigatorК навигатору по базе данных (элементу дизайна Navigator) объект этою класса никакого

отношения не имеет. Объект класса [NotesJViewNavigator предоставляет более продвинутые возможности для навигации на программном уровне по виду или части вида. Отличия [NotesJViewNavigator от [NotesJView состоят в следующем:* [NotesJViewNavigator может представлять не весь вид, а только его часть.* [NotesJViewNavigator «содержит» объекты [NotesJViewEntry («строки вида»), а не

[NotesJDocument («документы»).* Объекты [NotesJViewEntry из состава навигатора по виду представляют не только строки

вида, соответствующие документам, но и строки вида, соответствующие категориям и«итого:» (totals).

Наиболее важное из трех свойств класса [NotesJViewNavigator - MaxLevel - позволяет задать максимальный уровень, до которого включительно осуществляется «навигация» по элементам навигатора. Методы класса [NotesJViewNavigator обеспечивают всевозможные варианты для «просмотра» элементов из навигатора, а так же проверку вхождения элементов в навигатор.

В объекте [NotesJViewNavigator (по крайней мере в Java-реализации) поддерживается «указатель на текущий элемент» (current pointer), и все методы «перемещают указатель на текущий элемент».

В объекте [NotesJViewEntry могут встречаться «дублирующиеся» (повторяющиеся) элементы. Так, когда документ в виде принадлежит к нескольким категориям, то соответствующий документу объект [NotesJViewEntry «дублируется», т.е. повторяется в объекте [NotesJViewNavigator соответствующее количество раз. При этом в основном не возникает проблем, за исключением того, что методы поиска элемента в навигаторе всегда возвращают первый экземпляр [NotesJViewEntry для такого документа.

Поскольку навигатор по виду всегда связан с «породившим его» видом, обновление (refresh) объекта класса [NotesJView влечет обновление навигатора по виду.

«Контейнерная иерархия»

LotusScript Г NotesView __> NotesViewNavigator —> NotesViewEntryNotesView

Java View ~> ViewNavigator —> ViewEntry

I_ _ _ _ ________________ __________Y_i?^.__________Получить объект класса [NotesJViewNavigator можно следующими методами класса

[NotesJView: createViewNav, createViewNavFrom, createViewNavFromCategory, create ViewNavFromChildren, create ViewNavFromDescendants и create ViewNavMaxLevel(только Java).

3,18.1. Свойства

Свойство ParentView - «родительский вид» • ; . . . . : . . ... .LotusScript: notes View = notesViewNavigator.ParentView

Java: View view ~ ViewNavigator.geiParentViewQ

Вид, «от которого произошел» данный навигатор.

© InterTrust Co. Тел. (095) 9567928

Page 65: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 563

Пример. Скрипт создает навигатор по категории "Products" вида "By Category" и выводит название родительского вида.

Dim session As New NotesSessionDim db As NotesDatabaseSet db = session.CurrentDataba.seDim view As NotesViewSet view = db . Get.View ( "By Category")Dim nav As NotesViewNavigatorSet nav = view.CreateViewNavFromCategory("Products")Dim pv As NotesViewSet pv = nav.ParentViewMessagebox pv.Name

Свойство MaxLevel'- «максимальный уровень навигатора» LotusScript: long = notes ViewNavigator.MaxLevel

notes ҐiewNavigator.M'A\Level = long

Java: int mLevel = ViewNavigator.getMaxLe\el()

void ViewNaviga(or.seiMLuxL,e\el(int mLevel)

Свойство возвращает и позволяет изменять максимальный уровень для данного навигатора. Максимальный уровень навигатора может изменяться в диапазоне от 0 (это минимум, «охватывающий» только один «самый верхний» уровень навигатора) до 30 (это потенциально возможный максимум, устанавливаемый по умолчанию при созданиинавигатора).

Когда вы изменяете значение свойства MaxLevel, соответственно изменяются и возможности по «навигации» с использованием данного навигатора. Так, если установить MaxLevel = 0, навигация будет осуществляться только по элементам навигатора уровня О (уровень элемента возвращается свойством [NotesJViewEntry.lndGniLeve]), Если установить MaxLevel = 1, навигация будет осуществляться только по элементам навигатора уровней 0 и I. Если установить MaxLevel = 3, навигация будет осуществляться только по элементам навигатора уровней О, 1 и 2. И так далее... Устанавливать максимальный уровень навигатора большим, чем «реальный максимальный уровень», унаследованный от родительского вида, не имеет смысла.

Пример. Данный скрипт демонстрирует, что после изменения значения свойства MaxLevel навигатора по виду в цикле «getFirst - getNext» будут «перечисляться» только элементы (строки) из навигатора с уровнем IndentLevel не более заданного уровня MaxLevel. В частности, для категоризированного вида, в котором было 8 категорий уровня 0, 50 документов и одна подкатегория уровня ! и еще один документ уровня 2 (в подкатегории уровня I), при установке MaxLevel = 0 в цикле «перечислялось» 8 элементов, при установке MaxLevel = 1 в цикле «перечислялось» 59 элементов, а при установке MaxLevel = 3 в цикле «перечислялось» 60 элементов.

Dim session As New NotesSessionDim db As NotesDatabaseDim view As NotesViewDim nav As NotesViewNavigatorSet db = session.CurrentDatabaseSet view = db.GetView("($A11)")' Set nav = view.CreateViewNavFromCategory("SimpleForm"}Set nav = view. CreateViewNav --Messagebox nav.MaxLevel,,"Before"nav.MaxLevel =• 0Messagebox nav.MaxLevel,,"After"Dim e As NotesViewEntrySet e = nav.get First

© InterTrust Co. Тел. (095) 9567928

Page 66: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

564 Встроенные классы LotusScript и Java

n = 0 •• • .il - ОWhile Not' (e. Is Nothing)

n = n + 1If e. Indent-Level > il Then il = e. IndentLevelSet e = nav. getNext. (e)

Wend Msgbox Cstr(n),,Cstr(il)

Свойство CacheSize - «размер кеша для навигатора при ПОР-операщшх»Java: int numEntries = F/'ewA'av/^afor.getCacheSizeQ

void ViewAfavigator,setC'xheSi7Ј(int numEntries)

Размер кэша для навигатора в элементах (строках). Диапазон допустимых значений: О (минимум) - 128 (максимум, по умолчанию). Свойство имеет смысл только при «удаленных вызовах с дополнительным условием, что для «родительского» вида свойство AutoUpdate установлено в значение false. Это ситуация, когда при изменениях индекса вида автоматическое обновление объекта View, влекущее и обновление объекта ViewNavigator, не выполняется. Если в такой ситуации программист будет использовать методы «навигации» относительно «указателя на текущий элемент» (методы, имена которых начинаются с префикса «goto»), при максимальном размере кеша за счет сокращения количества обращений к серверу на клиенте может быть достигнут выигрыш в производительности.

В случае «локальных» вызовов свойство getCacheSize всегда возвращает 0, a setCacheSize не имеет никакого эффекта.

3,18.2. Методы

Метод getCurrent - «текущий элемент» : .: : - : . . - . - • •. . . . . . . . . . . -Java: ViewEntry currentEntry = ViewNavigator.getCurrentQ

Возвращает текущий элемент навигатора или null, если он не определен.

Методы getFirst и gotoFirst - «первый элемент» • .-... . ...•'-.: .. •..;..'Л'•;'LotusScript: Set notes ViewEntry = notes ViewNavigator.geiFirst

Java: ViewEntry entry = ViewNavigator.getҐirst()

boolean flag -~ ViewNavigator.gQtoFirstQ

Метод getFirst возвращает первый элемент навигатора или Nothing/null, если навигатор«пуст». Если элемент имеется, указатель текущего элемента «перемещается на него».

Метод gotoFirst позиционирует указатель текущего элемента на первый элемент навигатора. Возвращается true, если это удалось, иначе false.

Методы getNext и gotoNext - «следующий элемент» : ." ' . • ... ,: . . . .LotusScript: Set notes ViewEntry = -notesViewNavigator.geiNe\t(

currentNotes ViewEntry )

Java: ViewEntry entry = F/evvA7av/ga/or.getNext()

ViewEntry entry = ViewNavigator.getNext(ViewEntry entry)

) InterTrust Co. Тел. (095) 9567928

Page 67: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 565

boolean flag -- ViewNavigator.gotoNeKtQ

boolean flag ~ ViewNavigator.j>otdNeTtt(ViewEntry entry)

Метод getNext возвращает элемент навигатора, следующий за текущим, если параметр метода не задан, или заданным параметром элементом навигатора. Если такой элемент отсутствует, возвращается Nothing/null. Если элемент имеется, указатель текущего элемента «перемещается на него».

Метод gotoNext позиционирует указатель текущего элемента на следующий за текущим, если параметр опущен, или следующий за указанным параметром элемент навигатора по виду. Возвращается true, если это удалось, иначе false.

Пример 1. Java-агент выводит типы всех элементов навигатора, созданного по виду By Category текущей базы.

// ViewNav/getFirstNextDatabase db = agentContext.getCurrentDatabase( ) ;View view = db.getView("By Category"};ViewNavigator nav = view.createViewNav();irit n = 0;String t = null;ViewEntry entry = nav.getFirst () ;while (entry != null)I \

n++;if (entry.isCategory()) t = "category";else if (entry.isDocument()) t = "document";else if (entry.isTotal()) t = "total";else t = "Unknown";

System, out. println ("Entry If" + n + " is a " + t); entry = nav.getNext{); }

Пример 2. Java-агент позиционирует указатель текущего элемента на второй элемент навигатора.

// ViewNav/gotoFirstNextDatabase db = agentContext.getCurrentDatabase();View view •= db . getView ( "By Category");ViewNavigator nav = view.createViewNav();ViewEntry entry = null;if (nav.gotoFirst()) if (nav.gotoNext()){

entry = nav.getCurrent();String t. = null;if (entry.isCategory()) t = "category";else if (entry.isDocument()) t = "document";else if (entry.isTotal()) t = "total";else t = "Unknown";System.out.println("Entry # 2 is a " + t);

}

Методы getLast и gotbLast - «последний элемент»LotusScript: Set notes ViewEntry - notes ViewNavigator,getLastJava: ViewEntry entry = F/ewjVav/gator.getLast()

boolean flag = ViewNavigator.gotoLastQ

© InterTrust Co. Тел. (095) 9567928

Page 68: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

566 Встроенные классы LotusScript и Java

Метод getLast возвращает последний элемент навигатора или Nothing/null, если навигатор «пуст». Если элемент имеется, указатель текущего элемента «перемещается на него».

Метод gotoLast позиционирует указатель текущего элемента на последний элемент навигатора по виду. Возвращается true, если это удалось, иначе false.

Методы getPrev и gotoPrev - «предшествующий элемент»LotusScript: Set notes ViewEntiy ~ notes ViewNavigator.geiPrev( .

currentNotesViewEntry )

Java: ViewEntry entry - ViewNavigator.gctPre\Q

ViewEntry entry — ViewNiivigator,getPrev( ViewEntry entry]

boolean flag -= ViewNavigator.gotoPrevQ

boolean flag ~ ViewNavigator. gotoPrev( ViewEntry entry)

Метод getPrev возвращает элемент навигатора, предшествующий текущему, если параметр метода не задан, или заданному параметром элементу навигатора. Если такой элемент отсутствует, возвращается Nothing/null. Если элемент имеется, указатель текущего элемента «перемещается на него».

Метод gotoPrev позиционирует указатель текущего элемента на предшествующий текущему, если параметр опущен, или предшествующий указанному параметром элемент навигатора по виду. Возвращается true, если это удалось, иначе false.

Пример. Скрипт находит предпоследний элемент в навигаторе, созданном по виду By Category.

Dim session As New NotesSessionDim db As NotesDatabaseDim view As NotesViewDim entryA As NotesViewEntryDim entryB As NotesViewEntryDim nav As NotesViewNavigatorSet db = session.CurrentDatabaseSet view = db.GetView("By Category")Set entryA = nav.GetLastDocument ,Set entryB = nav.GetPrev(entryA)Messagebox entryB.NotelD

Методы getFirstDoeument и gotoFirstDoeument - «первый.элемент-документ»

LotusScript: Set notes ViewEntry = notes ViewNavigalor.getFirsiDocunient

Java: ViewEntry entry = ViewNavigator.getFirstDocumentQ

boolean flag - ViewNavigator.gotoFirsiDocu.ment()

Метод getFirstDoeument возвращает первый элемент навигатора, являющийся документом (при этом пропускаются категории) или Nothing/null, если навигатор «пуст». Если элемент имеется, указатель текущего элемента «перемещается на него».

Метод gotoFirstDoeument позиционирует1 указатель текущего элемента на первый являющийся документом элемент навигатора по виду. Возвращается true, если это удалось, иначе false.

© InterTrust Co. Тел. (095) 9567928

Page 69: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @гформулы, LotusScript, встроенные классы LotusScript и Java 567

Методы getNextDoeumerit и gotoNextDoeument - «следующий элемент-документ» . . : . . .LotusScript: Set notes ViewEntry = notes F/ewvVav/ga/or.getNextI)ocumeut(

currentNotes ViewEntry )

Java: ViewEntry entry ~ F/tni'Miv/gator.getNextDocumentO

boolean flag ~= ViewNavigator.gotoNexiDocumentQ

Метод getNextDocument возвращает элемент навигатора, являющийся документом и следующий за текущим или заданным параметром метода элементом навигатора. Если такой элемент отсутствует, возвращается Nothing/null. Если элемент имеется, указатель текущего элемента «перемещается на него».

Метод gotoNextDocument позиционирует указатель текущего элемента на являющийся документом и следующий за текущим элемент навигатора по виду. Возвращается true, если это удалось, иначе false.

Методы getLastDocument и goioLastDocuraent - «последний элемент-документ»- "• •'•".•'..'•' .. ....:". •'•..• •- . ' ••'•• :•'"••:/LotusScript: Set notesViewEntry - notesViewNaiigator.geiL&siDocum&nt

Java: ViewEntry entry -- ViewNavigator.getL-AstlJacmnentQ

boolean flag = /^ewAfaWgator.gotoLastDocumentQ

Метод getLastDocument возвращает последний элемент навигатора, являющийся документом (при этом пропускаются категории и «итого:») или Nothing/null, если навигатор «пуст». Если элемент имеется, указатель текущего элемента «перемещается на него».

Метод gotoLastDocument позиционирует указатель текущего элемента на последний являющийся документом элемент навигатора по виду. Возвращается true, если это удалось, иначе false.

Методы getPrevDocument и gotoPrevDocument - «предшествующий элемент-документ»LotusScript: Set notesViewEntry = notesViewNavigator,getPre\Document(

currentNoles ViewEntry)

Java: ViewEntry entry = F/ewAfov/ga/0r.getPrevDocumcnt()

boolean flag = F/enWav/gatongotoPrevDocumentQ

Метод getPrevDocument возвращает элемент навигатора, являющийся документом и предшествующий текущему или заданному параметром метода элементу навигатора. Если такой элемент отсутствует, возвращается Nothing/null. Если элемент имеется, указатель текущего элемента «перемещается на него».

Метод gotoPrevDocument позиционирует указатель текущего элемента на являющийся документом и предшествующий текущему элемент навигатора по виду. Возвращается true,если это удалось, иначе false.

Методы getChild и gotoChild - «элемент-потомок»LotusScript: Set childNotes ViewEntry = notes ViewNavigator.getChild( :

currentNotes ViewEntry)

© InterTrust Co. Тел, (095) 9567928

Page 70: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

568 Встроенные классы LotusScript и Java

Java: View Entry childEntry = F/eM'Mrwgo/or.getChildQ

ViewEntry childEntry = ViewNavigator.getChild(ViewEntry entry)

boolean flag -- ViewNavigator.gotoChildQ

boolean flag = ViewNa\'igator.gotoCh'M(ViewEn.try entry)

Метод getChild возвращает первый элемент - потомок для текущего, если параметр метода не задан, или заданного параметром элемента навигатора. Если потомок отсутствует, возвращается Nothing/null, Если потомок имеется, указатель текущего элемента «перемещается на него».

Метод gotoChild позиционирует указатель текущего элемента на первого потомка текущего или заданного параметром метода элемента навигатора по виду. Возвращается true, если это удалось, иначе false.

Методы getParent и gotoParent - «элемент-родитель» LotusScript:

Set notesViewEnlry = notesViewNavigator.GeiParent(

currentNotes ViewEntry ) •

Java: Vie wEntry parent Entry = ViewNavigator,geiParent()

ViewEntry parentEntry — ViewNavigator. getParent( ViewEntry entry)

boolean flag - ViewNavigator, gotoParentQ

boolean flag =- ViewNavigator.gotoParent(ViewEntry entry)

Метод getParent возвращает элемент, являющийся «родителем» для текущего, если параметр метода не задан, или заданного параметром элемента навигатора. Если «родитель» отсутствует, возвращается Nothing/null. Если «родитель» имеется, указатель текущего элемента «перемещается на него».

Метод gotoParent позиционирует указатель текущего элемента на родителя текущего или заданного параметром метода элемента навигатора по виду. Возвращается true, если это удалось, иначе false.

Методы getNextSibling и gotoNextSibling - «следующий элемент на том же . . . .уровне» ..•• '"• ,":•':-.'.'. ./'Я' ••.' ; • . ' . •••.'; .-..'.•'-.•'- •'..,. ';..:v'::•...:.-•"."'•'• : • • • • • ' .LotusScript: Set notes ViewEntry = notes ViewNavigator.getNe\tSiblmg(

citrrentNotesViewEntry )

Java: ViewEntry siblingEntry = FujwA'av/gator.getNextSibling()

ViewEntry siblingEntry — ViewNavigator.getNextSibling( ViewEntry entry)

boolean flag = ViewNavigator.gQtoNc\tSibling()

boolean flag - ViewNavigator.gotQNe\tSib\mg(ViewEntry entry)

Метод getNextSibling возвращает элемент, имеющий тот же уровень и следующий за текущим, если параметр метода не задан, или заданным параметром элементом навигатора. Если такой элемент отсутствует, возвращается Nothing/null. Если элемент имеется, указатель текущего элемента «перемещается на него».

Метод gotoNextSibling позиционирует указатель текущего элемента на следующий на том же уровне элемент за текущим или заданным параметром метода элементом навигатора по виду. Возвращает true, если это удалось, иначе false.

© InterTrust Co. Тел. (095)9567928

Page 71: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 569

Методы getPrevSibling и gotoPrevSibSing - «предшествующий элемент на том же уровне»LotusScript: Set notesViewEntry ~ notesViewNavigator.geiPrevS\bling(

currentNotes ViewEntry )

Java: ViewEntry siblingEntry - ViewNavigator.geiPrevSib\\ng()

View Entry siblingEntry — ViewNavigalor.getPre\Sibliu.g(yiewEntry entry)

boolean flag ~ K/ewA'av/gafor.gotoPrevSiblingQ

boolean flag = ViewNavigator,gotoPrevSiblmg(ViewEntry entry)

Метод getPrevSibling возвращает элемент, имеющий тот же уровень и предшествующий текущему, если параметр метода не задан, или заданному параметром метода элементу навигатора. Если такой элемент отсутствует, возвращается Nothing/null. Если элемент имеется, указатель текущего элемента «перемещается на него».

Метод gotoPrevSibling позиционирует указатель текущего элемента на предыдущий на том же уровне элемент по отношению к текущему или заданному параметром метода элементу навигатора по виду. Возвращает true, если это удалось, иначе false.

Методы getNextCategory и gotoNextCategory - «следующий элемент-категория»

: LotusScript: Set notesViewEntry —notcsViewNavigat0r.geiNey.tCategory(

currentNotes ViewEntry )

Java: ViewEntry entry - F/ewA/m>/ga/or.getNextCategory()

boolean flag == F/ewA/av/'gator.gotoNextCategory()Метод getNextCategory возвращает элемент, являющийся категорией и следующий за

текущим, если параметр метода не задан, или заданным параметром элементом навигатора. Если такой элемент отсутствует, возвращается Nothing/null. Если элемент имеется, указатель текущего элемента «перемещается на него».

Метод gotoNextCategory позиционирует указатель текущего элемента на следующий по отношению к текущему элемент, являющийся категорией. Возвращает true, если это удалось, иначе false.

Методы getPrevCategory и gotoPrevCategory - «предшествующий элемент-категория» .'.-.••.,'•- -Of. ;.#;..-•; : л ...•..•'••.:.-, - '. ; v,.... ,.-::.:-.•••••••• :. • •; . ;• • . : : "LotusScript: Set notesViewEntry — wote5F/eniA/av/^afor.getPrevCategory(

currentNotes ViewEntry )

Java: ViewEntry entry = Fi'ewA'av/ga/or.getPrevCategoryOboolean flag - F/ew/Vrav/ga/'or.gotoPrevCategory()

Метод getPrevCategory возвращает элемент, являющийся категорией и предшествующий текущему, если параметр метода не задан, или заданному параметром элементу навигатора. Если такой элемент отсутствует, возвращается Nothing/null. Если элемент имеется, указатель текущего элемента «перемещается на него».

Метод gotoPrevCategory позиционирует указатель текущего элемента на предыдущий по отношению к текущему элемент, являющийся категорией. Возвращает true, если это удалось, иначе false.

© InterTrust Co. Тел. (095) 9567928

Page 72: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

570 Встроенные классы LotusScript и Java

Метод getNth - «элемент нулевого уровня с заданным индексом» ,

LotusScript: Set notes View Entry = notesViewNavigalot:gei"Ntb( index& )

Java: ViewEntry entry ~ ViewNavigator.getNtb(int index)

Возвращает элемент из нулевого уровня навигатора, имеющий заданный индекс (порядковый номер). Первый элемент навигатора имеет индекс I. В LotusScript индекс задается целым числом типа Long, в Java - типа int. Если элемент с указанным индексом отсутствует, возвращается Nothing/null. Если элемент имеется, указатель текущего элемента «перемещается на него».

Подчеркнем, что этим методом можно получить только элемент из нулевого уровнянавигатора, а изменение значения свойства MaxLevel никакого влияния на поведение методане оказывает. '

Методы getPos и gotoPos - «элемент в заданной позиции навигатора»LotusScript: Set notes ViewEntry - notes ViewNavigator.geiPos( position^ , separators )

Java: ViewEntry entry — ViewNavigator.geiPos(String position, char separator)

boolean flag =- ViewNavigafor,gotoPos(String position, char separator)

Метод getPos возвращает элемент, имеющий заданную «позицию» в навигаторе. «Позиция» задается в строке position, например, "1.2.3" - третий потомок второго потомка первого элемента навигатора, а строка/символ separator определяет использованный разделитель уровней, в нашем случае «точка». Если такой элемент отсутствует, возвращается Nothing/null. Если элемент имеется, указатель текущего элемента «перемешается на него».

Метод gotoPos позиционирует указатель текущего элемента в заданную «позицию» в навигаторе. Возвращает true, если это удалось, иначе false.

Методы getEntry и gotoEntry - «поиск элемента в навигаторе»LotusScript: Set notes ViewEntry = notes ViewNavigatoi'.geiEntry( entryObj )

Java: boolean flag =- ViewNavigator.'gotoEtn\ry(pbject entryObj)Метод getEntry возвращает элемент навигатора, заданный параметром entryObj (объект

класса NotesDocument или NotesViewEntry). Если такой элемент отсутствует в навигаторе, возвращается Nothing. Если элемент имеется, указатель текущего элемента «перемещается на него».

Метод gotoEntry позиционирует указатель текущего элемента на элемент, заданный параметром entryObj (объект класса Document или ViewEntry). Возвращается true, если элемент найден в навигаторе и указатель позиционирован на него, иначе false.

В отличие от всех остальных методов класса [NotesJViewNavigator эти методы не требуют, чтобы их параметр entryObj был получен из данного навигатора. Поэтому наиболее частое применение метода - проверка вхождения (или не вхождения) полученных из другого объекта «документа» или «строки вида» в данный «навигатор». Только учтите, что в навигаторе по виду возможно существование «дублирующихся» элементов, а методы getEntry и gotoEntry в такой ситуации «находят» в навигаторе только первый из «дублирующихся» элементов.

© InterTrust Co. Тел. (095) 9567928

Page 73: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java

3.19. «Документ» - класс fNotesJDocumentОбъект класса [Notes]Document представляет документ в базе данных Notes.

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

Методы объекта класса [NotesjDocument позволяют получать доступ к полям документа (способом последовательного просмотра всех или по имени поля), к присоединенным файлам, проверять наличие и получать значения полей, добавлять в документ новые поля, заменять значения существующих полей, удалять поля, создавать копии полей (под новым именем), копировать сразу все поля из одного документа в другой документ, копировать документ «целиком» в другую базу, создавать документ-ответ на данный, помещать /документ в папку или удалять его из папки, создавать «образ» документа в поле типа RichText другого документа (подобно Actions - Forward), «подписывать» и шифровать поля в документе, и, наконец, удалять документ из базы, сохранять документ в базе или отправлять его почтой, а также создавать документ-ответ (reply) на «входящее» письмо.

«Контейнерная иерархия»LotusScript NotesDatabase — > NotesDocument — > NotesEmbeddedObject NotesView Notesltem NotesViewEntry NotesRichTextltem NotesDocumentCollection NotesNewsletter NotesUlDocument Java Database — > Document — > DateTime ' View EmbeddedObject DocumentCollection Item Newsletter RichTextltem

Для создания нового документа - нового объекта класса NotesDoeument - можно использовать либо метод New (только LotusScript), либо метод createDocument из класса [Notes]Database.

Метод New получает в качестве параметра объект класса NotesDatabase, представляющий базу, в которой должен быть создан документ.

Dim variableName As New NotesDocument( notesDatabase ) или

Set notesDocument = New NotesDocument( notesDatabase )

Для получения доступа к существующему документу имеется множество путей:

© InterTrust Co. Тел. (095) 9567928

Page 74: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

572 Встроенные классы LotusScript и Java

* если известна позиция документа в виде или в иерархии документов (response hierarchy),следует использовать методы класса [Notes]View;

* если известен идентификатор документа (NotelD) или универсальный идентификатордокумента (UNID). следует использовать методы getDocumentBylD илиgetDocumentByUNID класса [NotesJDatabase;

* если нужно получить доступ ко всем документам в базе, следует воспользоватьсясвойством AHDocuments объекта класса [NotesJDatabase;

* для получения всех документов из вида или всей базы, удовлетворяющих заданномузапросу полнотекстового поиска, следует использовать метод FTSearch из классов[NotesjView или [NotesJDatabase;

* для получения всех документов в базе, удовлетворяющих заданному некоторойформулой критерию отбора (подобно формуле отбора вида), используется метод searchкласса [NotesJDatabase;

* для получения всех документов, которые еще не были обработаны текущим агентом,используются свойство UnprocessedDocuments и методы unprocessedFTSearch илиunprocessedSearch классов NotesDataba.se/AgentContext;

* для получения всех документов-ответов на заданный документ используют свойствоResponses класса [NotesJDocument;

* для получения документа-родителя для документа-ответа используют свойствоParentDocumentUNID класса [NotesJDocument и метод getDocumentByUNID класса[NotesJDatabase;

* если доступен вид, для навигации по документам вида следует использовать методыкласса [NotesjView;

* если доступна коллекция документов, для навигации во входящим в нее документамследует использовать методы класса [NotesjDocumentCollection.

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

Скрипт или Java-приложение предпринимают попытку расшифровать зашифрованные поля в документе при первом обращении к свойству или методу представляющего документ объекта класса [NotesJDocument. Если процесс дешифрирования не удается, в LotusScript генерируется ошибка, а в Java - соответствующее исключение.

~i

Пример 1. Скрипт создает новый документ текущей базе, присваивает полю Subject значение и сохраняет документ. Поскольку в документе отсутствует поле Form, Notes будет использовать форму по умолчанию (default database form) для показа этого документа. Обратите внимание на то, что имя поля из документа используется как свойство объекта класса NotesDocument

Dim session As New NotesSessionDim db As NotesDatabaseDim doc As NotesDocumentSet db = session.CurrentDatabaseSet doc = New NotesDocument ( db }doc.Subject = "New building"Call doc.Save( True, True )

Пример 2. Java-агент создает новый документ в текущей базе, присваивает значения полям Form и Subject и сохраняет документ. Когда пользователь открывает этот документ, Notes будет использовать форму Status для его показа.

// Java-Document/createDatabase db - ageritContext. getCurrent Database ();Document doc = db.createDocument();

© InterTrust Co. Тел, (095) 9567928

Page 75: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. S: ^формулы, LotusScript, встроенные классы LotusScript и Java 573

doc . replaceltemValue("Form", "Status") ;doc.replaceltemValue("Subject", "New building");if (doc.save())

System.out.println("Document created and saved"); e 1 s e

System.out.println("Something went wrong");

Пример 3. Скрипт создает новый документ в текущей базе, отправляет его почтой по адресу Susanna Coil, но не сохраняет в базе. В качестве формы для показа документа в почтовом ящике получателя используется стандартная форма "Memo". Поле Body документа шифруется в стиле шифрования почты: генерируется случайный ключ шифрования, им шифруется содержимое поля Body, сам ключ шифрования в свою очередь шифруется открытым ключом получателя Susanna Coil и добавляется в документ - получатель своим секретным ключом дешифрирует ключ шифрования, а ключом шифрования дешифрирует содержимое поля Body.

Dim session As New NotesSessionDim db As NotesDatabaseDim doc As NotesDocumentSet db = session.CurrentDatabaseSet doc = New NotesDocument( db )doc.Form = "Memo"doc. Subject --• "Reminder!"doc.EncryptOnSend = Truedoc.Body = "A document awaits your approval in " + db.TitleCall doc.Send( False, "Susanna Coil" )

i.

3.19.1. Свойства

Свойство ParentDatabase - «база-родитель»LotusScript: Set notes-Database = MotesDocMmenfJParentDatabase

Java: Database db — Daciw??e??/.getParentDatabase()

Ссылка на объект класса [NotesJDatabase, соответствующий базе, которая содержит данный документ.

Пример 1. Скрипт выводит в диалоговом окне название одной и той же базы. Ссылку db на базу получают методом New. Ссылка dc на коллекцию представляет все документы в этой базе. Ссылка doc на документ указывает на первый документ. А уже из документа doc снова получается ссылка на базу, которая, естественно, та же, что и в первом случае.

Dim db As New NotesDatabase( "", "somedocs.nsf" )Dim dc As NotesDocumentCollectionSet dc = db.AllDocuments - - . . . 'Dim doc As NotesDocumentSet doc = dc.GetFirstDocumentDim pdb As NotesDatabaseSet pdb = doc.ParentDatabaseMessagebox( db.Title )Messagebox( pdb.Title )

Пример 2. Java-агент выполняет практически то же самое, что и скрипт из предыдущего примера.

//' Java -Document /ParentDatabaseDatabase db r= session.getDatabase("NotesSrvl/Acme/RU", "dbexampies");DocumentCollection dc = db . getAHDocuments () ;Document doc •= dc . getFirstDocument () ;Database pdb = d.getParentDatabase();

© InterTrust Co. Тел. (095) 9567928

Page 76: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

574 Встроенные классы LotusScript и Java

System.out.println("Parent database is V" + pdb.getTitle() + " \ " " ) ; System.out.println("Parent database is \"" + pdb.getTitle() + " \ " " ) ;

Пример З. Этот скрипт - функция, которая возвращает документ, являющийся родителем для документа, передаваемого в качестве параметра функции. Если документ не имеет родителя, функция возвращает Nothing. Функция использует свойство ParentDatabase для доступа к базе, а затем, если документ является ответным документом, определяет UNID родительского документа, а по нему уже находит сам документ.

Function GetParentDocument( doc As NotesDocument ) Dira db As NotesDatabase Dim parentDoc As NotesDocument Set db = doc.ParentDatabaseIf doc.IsResponse Then

Set parentDoc =• db . Get.DocumentByUNID ( doc . Parent DocumentUNID ) End IfSet GetParentDocument = parentDoc End

Function

Свойство ParentView - «вид-родитель»LotusScript: SetnolesView = notesDocument.T?arentView

Java: View view = DocMwiew/.getParentViewQ

Возвращает объект класса [Notes]View, представляющий вид, из которого был получен данный документ. Но если документ был получен непосредственно из базы или из коллекции документов, свойство возвращает Nothing/null.

Пример 1. Скрипт двумя способами получает один и тот же вид "Main View" в одной и той же базе,и выводит в окнах одно и то же название вида. . .

Dim db As New NotesDatabase{ "", "somedocs,nsf" )Dim view As NotesViewDim parentView As NotesViewDim doc As NotesDocumentSet view = db.GetView( "Main View" )Set doc = view.GetFirstDocument .Set parentView = doc.ParentView *Messagebox( view.Name } .Messaqeboxf parentView,Name )

Пример 2. Java-агент демонстрирует, что документ, полученный из вида, имеет «родительский вид», а документ, полученный из коллекции всех документов в базе, не имеет «родительского вида».// Java-Document/ParentViewDatabase db = agentContext.getCurrentDatabase();View view = db.getView{"By Category");Document docl = view.getFirstDocument();View viewl = docl.getParentView{);if (viewl == null) System, out.. println ("Documentl did not; from a view.");else System.out.println("Documentl from \""+ viewl.getName()+ "\" view.");DocumentCollection dc = db.getAllDocuments(); . •Document doc2 = dc.getFirstDocument();View view2 = doc2.getParentView();if (view2 —= null) System.out.print!n("Document2 did not from a view.");else System.out.println("Document2 from \""+ view2.getName(}+ "\" view.");

© InterTrust Co. Ten. (095) 9567928

Page 77: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R, 5: (а)гформулы, LotusScript, встроенные классы LotusScript и Java 575

Свойство Created - «время создания документа»LotusScript: dateV - notesDocument.Created

Java: DateTime dale = Document.getCre&teil()

Время создания документа (в LotusScript Variant of type DATE, в Java - объект класса DateTime).

Свойство LastAccessed ~ «время последнего обращения к документу»LotusScript: dateV' - notes Document. LastAccessed

Java: DateTime date ~ DocMme»/.getLastAccessed()

Время последней модификации или чтения документа (в LotusScript Variant of type DATE, в Java - объект класса DateTime).

Свойство LastModified - «время модификации документа»LotusScript: dateV ~ notesDocitment.l^stModified

Java: DateTime dale = /Joc«we«/.getLastModSfied()

Время последней модификации документа (в LotusScript Variant of type DATE, в Java -объект класса DateTime).

Свойство Size - «размер документа в байтах»

LotusScript: size& -= notes Document.Size

Java: int size = Z)ot'M/w«?«/.getSize()

Размер документа в байтах (тип Long/int), включая размеры присоединенных файлов.

Свойство NotelD - «идентификатор документа в данной базе»LotusScript: noteid$ - notes Document J$QteID

Java: String noteid ~ Document.geiNotelDQ

Идентификатор документа (тип String) - 8~символьная комбинация букв и цифр, уникально идентифицирующая документ только в данной базе. Типичный вид noteid таков: "000020FA".

./ '' '•' • '

Свойство UniversallD - «UNID документа» ..•---••;. .• .. . ..•. . ... ...LotusScript: unid$ = notesDocument.VmversallD

notesDocument.UmversallD — unidS

Java: String unid = DocMwew/.getUiiiversallDO

void Document,setVmversallD(String unid)

Универсальный идентификатор (UNID) документа, в форме 32-х символьной комбинации букв и цифр (тип String). Универсальный идентификатор документа одинаков для этого документа во всех репликах базы. Типичный вид unid, например, таков: "FF863D8ACB6E2210852561BD005867C7".

Если изменить UNID существующего документа и сохранить документ, он станет новым документом. Но если при этом окажется, что заданный вами «новый» UNID совпадает с

© InterTrust Со. Тел. (095) 9567928

Page 78: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

576 Встроенные классы LotusScript и Java

UNID существующего в базе документа, то при попытке сохранить документ вы получите в LotusScript сообщение об ошибке с кодом 4000, а в Java будет сгенерировано соответствующее исключение.

Пример. Скрипт создает новый документ и «назначает» для него UNID, «часть» которого вводится пользователем. Если окажется, что в базе уже существует документ с таким UNID, скрипт «перехватывает» стандартную обработку ошибки и выводит обычное сообщение. Но следует заметить, что хотя «назначать» UNID возможно, применять это на практике в большинстве случаев нецелесообразно.

On Error 4000 Goto doError' Database already contains a document with this IDDim session As New NotesSessionDim db As NotesDatabaseDim doc As NotesDocumentDim invoicelD As VariantDim UniversallD As String*32Set db - session.CurrentDatabaseSet doc — New NotesDocument(db) . . "doc.Subject = "New invoice"invoicelD = Inputbox("Enter invoice number - max of 8 digits")If Not Isnumeric(invoicelD) Then

Messagebox "Invoice number must be numeric"Exit Sub End If If

Len(invoicelD) > 8 ThenMessagebox "Max of 8 digits"Exit Sub • -

End Ifdoc.InvoicelD = Cstr (invoicelD)UniversallD = "AAAABBBBCCCCDDDDEEEEFFFF" & invoicelD doc.UniversallD = UniversallD Call doc.Save( True, True ) Exit Sub doError:Messagebox "Invoice number " & invoicelD & " already used" Exit Sub

Свойство Authors - «имена сохранявших документ» .:'.-'•-.••• •:•:••:: . ' • . : ,LotusScript: authorsArray — notesDocument.Authors

Java: Java.util. Vector authors ~ Document-getAuihorsQ

«Массив» (в LotusScript тип Array of Strings, в Java - объект класса java.util.Vector с элементами класса String) имен пользователей, сохранявших этот документ. Это «массив» имен тех, кто действительно уже сохранял данный документ1, а не тех, кто может быть перечислен в полях типа Authors этого документа (и поэтому имеет принципиальную возможность редактировать документ, даже имея к базе доступ автора).

Свойство IsNewNote - «документ не был сохранен в базе»

LotusScript: flag ~ notesDocumettt,IsNe\vNoteJava: boolean flag - DocumentAslSewNoteQ

© InterTrust Co. Тел. (095) 9567928

Page 79: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 577

Подобно функции @IsNewDoc, свойство возвращает true, если данный документ является новым (т.е. еще не был ни разу сохранен в базе), или false, если документ (обычно предыдущая версия) уже имеется в базе.

© Свойство IsDeleted - «документ удален» • ••••• . ......LotusScript: flag = «otesZ>oewme«?.IsDeleted

Java: boolean flag - DocumentAsDeletedQ

Возвращает true, если представляемый объектом [Notes]Document документ был удален из базы, или false, если нет.

@ Свойство Is Valid - «документ существует» ,

LotusScript: flag ~ notesDocument.IsValid

Java: boolean flag = DocumentAsValiA()

Возвращает true, если данный объект [NotesJDocument представляет существующийдокумент (а не «окурок», оставшийся после удаления документа), или false, если нет.

Свойство IsUIDocOpen - «документ доступен через NotesUIDocument»

LotusScript: flag = notesDocument.IsUlDocOpen

Возвращает true, если представляемый объектом NotesDocument документ доступен также через объект NotesUIDocument (документ в интерфейсе пользователя), или false, если нет.

Пример. Подпрограмма на LotusScript проверяет, не открыт ли в интерфейсе пользователя переданный ей объект NotesDocument, и если не открыт, заменяет значение поля в документе.

Sub UpdateSubject(doc As NotesDocument) If doc.IsUIDocOpen ThenMessagebox "Can't do Subject update from front-end",, "No can do" Exit Sub End If

Call doc.ReplaceltemValue("Subject", doc.Sub]ect(0} & "0")Call doc.Save(True, False)End Sub , . . . . .

© Свойство IsProfile - «документ является профильным»LotusScript: flag = notesDocument.lsPraule

Java: boolean flag - Documenl.isProTileQ

Возвращает true, если данный документ является профильным, или false, если нет.

© Свойство NameOiProfile - «название профильного документа»

LotusScript: profileNameS = ?zo/e.vDocw;we7?/.NameOfProfiIe

Java: StringprofileName$ -- Z)oe«wenЈ.getNanieOfProfiIe()

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

© InterTrust Co. Тел. (095) 9567928

Page 80: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

578 Встроенные классы LotusScript и Java

© Свойство Key - «ключ профильного документа»

LotusScript: profile UserNameS == notesDocimient.Key

Java: String profileUserNameS - Docitmenl.getKejQ

Возвращает «ключ», т.е. имя пользователя, к которому относится данный профильный документ.

Пример. Скрипт выводит в диалоговом окне свойства профильного документа.

Dim session As New NotesSessionDim db As NotesDatabaseDim doc As NotesDocumentSet db = session.CurrentDatabaseprofileName = Iriputbox ( "Prof ile name?")profileUserName = Inputbox("User name (key)?")Set doc = db.Get ProfileDocument(profileNarne, profileUserName)If doc,IsProfile Then

Messagebox "Profile name: " & doc.NameOfProfile & Chr(lO) &"User name (key): " & doc.Key,, doc.NameOfProfile

End If

Свойство IsResponse - «ответный документ» : ;: • • ••-.-• • ••• •LotusScript: flag = notesDocument.IsResponse

Java: boolean flag = Z)ocww<?/rf.isResponse()Возвращает true, если данный документ является документом-ответом на другой

документ (response), или false, если нет.

Свойство Responses - «прямые документы-ответы на данный» . . - . •LotusScript: Set notesDocumentCollection = notesDocument.'Responses

Java: DocumentCollection dc - DocM/??ew/.getResponses()

Возвращает коллекцию (объект класса [NotesJDocumentCollection) документов, которые являются «прямыми» документами-ответами на данный. «Ответы на ответы» не включаются в эту коллекцию. Если у документа нет ответных документов, возвращается коллекция, в которой количество документов равно 0. Для получения всех ответных документов для заданного документа можно написать рекурсивную функцию.

Пример. Скрипт кнопки помещает открытый в интерфейсе пользователя документ в папку. Имя папки пользователь вводит в диалоговом окне. Но «вместе» с документом в эту папку помещаются и все его ответные документы (не только «прямые», а вся иерархия ответных документов). Перенос ответных документов в папку реализован рекурсивной подпрограммой PutAllResponseslnFolder.

Sub Click(Source As Button)Dim workspace As New NotesUIWorkspaceDim uidoc As NotesUIDocumentSet uidoc = workspace.CurrentDocumentDim doc As NotesDocumentSet doc --- uidoc. DocumentDim choice As Stringchoice = Inputbox( "Please enter a folder name:", "Which folder?" )Call doc.PutInFolder( choice ) . .Call PutAllResponsesInFolder( doc, choice ) End

Sub

© InterTrust Co. Тел. (095) 9567928

Page 81: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @гформулы, LotusScript, встроенные кляесы LotusScript и Java 579

!ub Put.AllResponses InFolder ( doc As NotesDocument, folderName As Strinq )Dim collection As NotesDocumentCollectionDim currentResponse As NotesDocument1 «Прямые» ответные документы для docSet collection = doc.ResponsesSet currentResponse ~ collection.GetFirstDocumentWhile Not ( currentResponse Is Nothing ) ' «Прямой» ответный документ в

папку Call currentResponse.PutlnFolder( folderName ) ' И все его «прямые» ответные документы рекурсивно тоже Call PntAllResponsesInFolder( currentResponse, folderName ) Set currentResponse = collection.GetNextDocument{ currentResponse )

Wend Ind Sub

Свойство ParentDocumentUNID - «UNID родительского документа»

LotusScript: parentUnidS ;= notesDocument.Ґarentl)ocument\JNlD

Java: String parentlJnid = I)ocMwe77?.getParentDocunientUNII)()

Если документ, к которому применяется метод, является документом-ответом на другой кжумент, свойство возвращает универсальный идентификатор (UNID) родительского (окумента. (тип String). Если же документ, к которому применяется метод, является главным юкументом, свойство возвращает ""/null. При использовании совместно с методом ^etDocumentByUNID класса [Notes]Database, свойство ParentDocumentUNID позволяет найти юдительский документ.

Пример 1. Скрипт выводит UNID родителя или сообщение об отсутствии родителя.

)im parentUnid As String>arentUnid = doc.ParentDocumentUNID:f ( parentUnid = "" ) Then

Messagebox( "У этого документа нет родителя." } :iseMessagebox ( "UNID родителя равен " + pareritUNID )

:,nd If

Пример 2. Скрипт находит родительский документ parentDoc для документа doc.

)im parentDoc As NotesDocument Jet db = doc.ParentDatabase "f doc.IsResponse Then

Set parentDoc = db.GetDocumentByUNID( doc.ParentDocumentUNID ):nd if

Свойство Column Values.- «массив значений в столбцах родительского вида»LotusScript: valuesArray — tiotesDocument.ColumnValues

Java: Java, util. Vector values = DocMOTew/.getColumnValuesQ

кМассив» значений (в LotusScript тип Array of Variants, в Java объект класса ava.util.Vector с элементами класса java.lang.Object), каждое из которых «представляет» этот юкумент в соответствующем столбце родительского вида для документа. Первый элемент (массива» (индекс 0) содержится в первом столбце вида, второй (индекс 1) - во втором, и т.д. !начения всех элементов «массива» вычисляются с помощью формул столбцов

© InterTrust Co. Тел. (095) 9567928

Page 82: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

580 Встроенные классы LotusScript и Java

родительского вида применительно к данному документу. При этом для каждого документа возвращаются значения всех столбцов, без учета того, что документ-ответ чаще всего бывает представлен в виде лишь одним значением, возвращаемым столбцом со свойством "Responses-only". Например, если третий столбец вида имеет свойство "Responses-only", то значение notesDocument.ColumnVa\ues(2) / Document.gelColumnVnlues().elementAt(2) всегда возвращается без учета того, является ли этот документ главным или документом-ответом.

Пример 1. Пусть соответствующий документу объект класса NotesDocument называется currentDoc. а родительский вид этого документа содержит два столбца: в первом дата начала проекта (формула столбца - поле DueDate), во втором описание проекта (формула столбца "New Project: " + Description). Пусть документ содержит в поле DueDate значение "10/16/95", и в поле Description значение "Ad Campaign for Acme." Тогда

currentDoc.ColumnValues( 0 ) равно "10/16/95"currentDoc.ColumnValues{ 1 ) равно "New Project: Ad Campaign for Acme"

Пример 2. Вы хотите получить список всех значений из первого столбца вида Products в базе inventory. Скрипт просматривает этот вид и для каждого документа в нем выбирает значение из первого столбца. Выбранные значения заносятся в массив (к сожалению, при этом не контролируется выход за границы массива). Результат работы скрипта подобен работе функции @DbColumn по первому столбцу вида.

counter% = 1Dim db As New NotesDatabase ( "Server/Acme/R'J", "inventory. nsf" )Dim view As NotesViewDim doc As NotesDocumentDim productList( 1 To 100 ) As VariantDim current Product As VariantSet view = db.GetView( "Products" )Set doc = view.GetFirstDocumentWhile Not ( doc Is Nothing )' Взять значение из первого столбца в виде для текущего документа' Добавить это значение в массив productListcurrentProduct = doc.ColumnValues( 0 )productList ( counter'% } ~ currentProductSet. doc = view. GetNext Document ( doc )counter% = counter! + 1

Wend

Пример 3. Java-агент выводит для всех документов из вида "($АН)" информацию в столбцах вида. При этом выполняется анализ возможных «типов» значений в столбцах.

import java.util.Vector;// Java-Document/ColumnValuesDatabase db = agentContext.getCurrentDatabase();View view --- db . getView ( " ( $A11) " ) ;Vector v;String s, tabs; DateTime dt;; Double d;Document doc = view.getFirstDocument();while (doc != null){ 'v = doc.getColumnValues(); tabs = "";for (int i = 0; i < v.size(); i-n-}; \if (v.elementAt (i.) . get-Class () . getName () . endsWith ( "String" ) )

s •- ( String) v . element At (i ); else if (v. elementAt (i.) .getClassf) . getName () . endsWith ( "DateTime" ) }

{ dt = (DateTime)v.elementAt(i); s = dt.getLocalTime(); } else if (v.elementAt(i),getClass().getName().endsWith("Double"))

{ d = (Double)v.elementAt(i); s = d.toString(); }

© InterTrust Co. Тел. (095)9567928

Page 83: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 581

else s = "not String, DateT'ime, or Double"; if (s . length() = = 0 ) s = "*no value*"; System.out.println(tabs + s ) ; tabs = tabs + "\t"; }doc = view.getNextDocument(dop);

} -

Свойство FTSearchScore - «показатель соответствия поисковому запросу»LotusScript: score% = notexDocument.WTSearcliScore

Java: int score = DocM/we«ЈgetFTSearchScore()

Значение показателя соответствия поисковому запросу для данного документа (тип Integer/int). Это значение имеет смысл, когда у базы имеется индекс полнотекстового поиска и документ был получен в результате выполнения запроса полнотекстового поиска (например, из коллекции, полученной методом FTSearch или вида с «фильтрацией, наложенной методом FTSearch). Конкретное значение показателя зависит от количества обнаруженный «вхождений» запроса в документ, весов, назначенных отдельным терминам, и наличия в запросе «операторов близости».

Если документ был получен не в результате выполнения запроса полнотекстового поиска, возвращается 0. Если документ получен методом FTSearch, но база не имела индекса полнотекстового поиска, возвращается «непрогнозируемое» значение. Если документ входит в несколько коллекций, полученных методом FTSearch, возвращается значение в той коллекции, из которой был получен документ.

© Свойство FolderReferences - «папки, в которые помещен документ»LotusScript: StringArray = notesDocument.falderReferences

Java: Java. util. Vector folderNames = ^ocMwzt'w/.getFolderReferencesQ

Если база данных поддерживает ссылки на папки (folder references), свойство возвращает «массив» (в LotusScript тип Array of Strings, в Java - «вектор» с элементами класса String), содержащий имена папок, в которые был помещен данный документ.

Проверить или разрешить поддержку базой ссылок на папки можно свойством FolderReferencesEnabled класса [NotesJDatabase. Реализуется же данная возможность посредством скрытых видов с названиями SFolderlnfo и SFolderReffnfo. Эти виды, как элементы дизайна, необходимо предварительно скопировать в вашу базу данных из шаблона почтового ящика версии 5.0 - «простого включения» свойства FolderReferencesEnabled недостаточно. Естественно, при этом и ваша база данных должна быть формата R5 (ODS version 41).

Свойство Items - «массив полей документа»-;: : ;: • •;..:.••',' :••-'; •:•• '-..;•,:.••;•:•. •;•;.; ••"•: : ••/••-.С": •' :LotusScript: notesItemArray = notesDocument.ltemsJava: Java.util. Vector items — Document.geiltemsQВозвращает «массив» объектов класса [Notesjltem (в LotusScript тип Array of Notesltems, в

Java - «вектор» с элементами класса Item), представляющих все поля в документе. Порядок элементов в «массиве» соответствует порядку следования полей в документе. Нижняя граница «массива» равна 0.

Пример 1. Скрипт выдает в диалоговом окне имена всех полей из документа.

Dim doc As NotesDocument

© InterTrust Co. Тел. (095) 9567928

Page 84: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

582 Встроенные классы LotusScript и Java

' . . . set value of doc, ,. Forall item In doc.Items

Messagebox( item.Name ) End Forall

Пример 2. В документе может содержаться несколько полей с одним и тем же именем. Скрипт находит в документе все поля с именем "ИетЗЗ".

Dim doc As Notes Document. ' . . . set value of doc. . . Forall item In doc.ItemsIf item.Name = "Item33" Then '...process one item... End I f End Forall

Пример З. Скрипт находит в документе все поля типа Authors (поле, содержащее список лиц, которые, имея к базе доступ автора, могут редактировать этот документ).

Dim doc As NotesDocument 1 . . .set: value of doc. . . Forall item In doc.Items

If ( item.IsAuthors ) Then ''...process one Authors item.,.

End If End Forall

Пример 4. Java-агент для каждого документа из текущей базы выводит список имен полей и текстовых представлений их значений.import java.util.Vector;// Java-Document/ItemsDatabase db = agentContext.getCurrentDatabase();DocumentCollect ion dc = db . getAHDocuments ().;Document doc = dc.getFirstDocument();while (doc != null){

System.out.println("Document " + doc.getNotelD() + ":"};Vector items = doc . getlterns ();for (int j=0; j < items.size (); j++){

Item item = (Item) items . el ement.At (j );System.out.println("\t" + item.getName() + " = \"" +

item.getValueString() + "\"");}doc = dc.getNextDocument(); }

Свойство HasEmbedded - «содержит OLE-объект или присоединенный файл»LotusScript: flag = notesDocumentJtlasEmbedded

Java: boolean/Jag = Ј)ocMwenr.hasEmbedded()

Возвращает true, если документ содержит один или более OLE-объектов (встроенных или связанных) или присоединенных файлов, или false, если таковых нет. Свойство не поддерживается для платформ OS/2, UNIX и Macintosh.

Свойство EmbeddedObjectsLotusScript: notesEmbeddedObjectArray = notes /Эосмотеп/.EmbeddedObjects

© InterTrust Co. Тел. (095) 9567928

Page 85: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 583

Java: Java.util. Vector embeddedObjects - Ј)ocMwt'w?.getEmbeddedObjects()

«Массив» содержащихся в документе OLE/2 и OLE/1-объектов (в LotusScript тип Array of NotesEmbeddedObjects, в Java - «вектор» с элементами класса EmbeddedObjeet), OLE-объекты могут содержаться в полях типа RichText документа, а также в составе формы, сохраненной в документе. Свойство не поддерживается для платформ OS/2, UNIX и Macintosh.

В отличие от свойства EmbeddedObjects класса [Notes]RichTextItem, это свойство не включает в массив присоединенные файлы и OLE/1-объекты, созданные в Notes версии 3.x. Свойство включает в массив OLE/2 и OLE/1-объекты, созданные только в Notes версий не ниже 4. Кроме того, в массив включаются объекты из документа, которые первоначально находились в форме, по которой создавался этот документ. Такие объекты при создании документа по форме могут быть активизированы, изменены и сохранены, но при этом они станут частью документа.

Пример 1. Скрипт демонстрирует, что же возвращается свойством EmbeddedObjects класса NotesDocument. Последний документ в виде All Documents базы H1LL.NSF содержит следующие OLE-объекты:• встроенный объект Word Pro типа "Word Pro Document" в поле Body• связанный объект Microsoft® Excel типа "MS Excel Worksheet" в поле Body• встроенный объект Ami Pro®, созданный в Notes версии 3.x, типа "Ami Pro Document" в поле Body• присоединенный файл "CASTLE.BMP" в поле Body• встроенный объект Freelance Graphics® типа "Freelance® Presentation" в поле Description• встроенный объект 1-2-3® типа "123 Worksheet", который первоначально был встроен в форму, покоторой создавался этот документ, а затем был активизирован и отредактирован пользователем.

Dim db As NotesDatabaseDim view As NotesViewDim doc As NotesDocumentSet db = New NotesDatabase( "Server/Acme", "hill.nsf" )Set view = db.GetView( "All Documents" )Set doc = view.GetLastDocumentForall о In doc.EmbeddedObjectsMessagebox( o.Name )

End Forall

Скрипт выводит следующее:

"Word Pro Document" "MS Excel Worksheet" "Freelance Presentation""123 Worksheet"

Свойство EmbeddedObjects не возвращает встроенный объект Ami Pro, поскольку он был создан в версии 3.x, и присоединенный файл.

Пример 2. Java-агент формирует по базе отчет об OLE-объектах, имеющихся в документах.

import Java.util.Vector;// Java-Document/EmbeddedObjects - .Database db = agentContext.getCurrentDatabase();DocumentCollection dc = db . getAHDocuments () ;Vector v = null;Document doc = dc . getFirstDocurnerit () ;while (doc != null){

i f (doc.hasEmbedded()){

© InterTrust Co. Тел. (095) 9567928

Page 86: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

584 Встроенные классы LotusScript и Java

System.out .println ("V" + doc. getltemValueString ( "Subject") +"\" has embedded objects.");

// Beta bug: Attachment throws null pointer exception // Catch exception and set vector to null ,// In final product, v should be emptytry { v = doc.getEmbeddedObjectsО; } catch(Exception e) { v = null; j if (v == nu11)

System.out.printIn("\tEmbedded objects are an attachments."); else for (int. i = 0; i < v . s i z e f ) ; i + +) {

EmbeddedObject eo - (EmbeddedObject)v.elementAt(i);System, out .println ( "\t"+ eo . getNaine () + " of "+ eo . getClassNarne ( } ) ;

} }doc - dc.getNextDocument(doc) ; }

Свойство EncryptionKeys - «ключи шифрования»

LotusScript: stringArray = notesDocument.'EncryptionKeys

notes Document.EacryptionKeys = stringArray

notesDocumenLEncryptionKeys ~ stringS

Java: Java.util. Vector keys = Document.getEncryptionKeysQ

voidDocument.setEncryptionK.eys(java.Mil. Vector keys)

«Массив» названий ключей шифрования (в LotusScript тип String или Array of Strings, в Java - «вектор» с элементами класса String), которыми должны шифроваться «подлежащие шифрованию» поля документа. Это поля, для которых свойство IsEncrypted было установлено в значение true или в одноименных полях при разработке формы было установлено свойство "Enable encryptions for this field". Каждый элемент в «массиве» -название ключа шифрования. В LotusScript при чтении свойства всегда возвращается массив строк, при установке можно присвоить свойству как строку (только одно название ключа), так и массив строк.

Свойство, по сути, просто возвращает или изменяет в документе значение поля SecretEncryptionKeys. Собственно процесс шифрования документа выполняется методом encrypt. Метод encrypt будет использовать ключи, имена которых содержатся в поле SecretEncryptionKeys, для шифрования «подлежащих шифрованию» полей документа. Сам же ключ шифрования выбирается «по его названию» из ID-файла пользователя. «Подлежащие шифрованию» поля документа шифруются всеми указанными в поле SecretEncryptionKeys ключами. Для дешифрирования необходимо наличие в ID-файле пользователя хотя бы одного такого ключа шифрования.

Если для документа, имеющего «подлежащие шифрованию» поля, не был задан ни один ключ шифрования, то метод encrypt будет шифровать документ открытым ключом текущего пользователя. Такой документ может быть дешифрирован только этим пользователем. Чтобы зашифровать документ открытыми ключами нескольких пользователей, в документ до вызова метода encrypt нужно добавить поле PublicEncryptionKeys со списком необходимых пользователей.

На шифрование почты свойство EncryptionKeys никаким образом не влияет - почта шифруется иным способом.

© InterTrust Co. Тел. (095) 9567928

Page 87: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: (ay-формулы, LotusScript, встроенные классы LotusScript и Java 585

Свойство IsSigned - «документ подписан»

LotusScript: flag = notesDocument.lsSigned

Java: boolean flag = Z)ocwwew/.isSigned()

Возвращает true, если данный документ имеет хотя бы одну электронную подпись, или false, если нет. «Подписанный» документ содержит хотя бы одно поле типа SIGNATURE.

Свойство Signer - «кто подписал документ»

LotusScript: signer$ := notesDocument.Signer

Java: String signer = Z>ocwmen?.getSigner()

Возвращает имя пользователя (тип String), «подписавшего» документ, или ""/null, если документ не подписан.

Свойство Verifier - «имя сертификатора, выдавшего сертификат, на основе которого проверялась подпись»LotusScript: verifiers = notesDocument, Verifier

Java: String verifier = Document.getVeriuerQ

Имя сертификатора (тип String), выдавшего сертификат, на основе которого проверялась электронная подпись. Имеет смысл, если документ «подписан».

Позвольте напомнить, что электронная подпись представляет собой вычисляемоеалгоритмом хеширования MD2 128-и битовое значение по информации из «подписываемых»полей документа, зашифрованное секретным ключом лица, сохранившего (т.е.«подписавшего») документ. Для проверки подписи другим лицом необходимо «увереннознать» открытый ключ подписавшего документ. Есть два случая, когда открытым ключампользователей из адресной книги «не доверяют»: аутентификация и проверка электроннойподписи. Поэтому зашифрованное 128-битное значение сопровождается иерархическимсертификатом, извлеченным из ID-файла подписавшего документ. Иерархическийсертификат состоит из «цепочки» сертификатов-компонент, созданных сертификаторамиразных уровней дерева имен. Процесс проверки начинается с нахождения либо общего(созданного одним и тем же сертификатором) сертификата-компоненты для «подписавшего»и «проверяющего», либо с нахождения взаимного сертификата, если «подписавший» и«проверяющий» из разных деревьев имен. Имя сертификатора, выдавшего этот «оказавшийсяобщим» сертификат-компоненту или взаимный сертификат, с которого и начинаетсяпроцедура определения открытого ключа и проверки подписи, как раз и возвращает этосвойство. ,

Например, если документ подписал Ivan Ivanov/Marketing/Acme/RU, а «проверяет подпись» Petr Petrov/Marketing/Acme/RU, свойство вернет /Marketing/Acme/RU. Если же документ подписал Ivan Ivanov/Marketing/Acme/RU, а «проверяет подпись» Petr Petrov/Development/Omega/RU, и в локальной адресной книге проверяющего имеется взаимый сертификат, созданный сертификатором /Omega/RU для /Marketing/Acme/RU, свойство вернет /Omega/RU.

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

Dim session As New NotesSession Dim db As NotesDatabase Dim doc As NotesDocument Dim verifyName As String

© InterTrust Co. Тел. (095) 9567928

Page 88: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

586 Встроенные классы LotusScript и Java

Set db = session. CurrentDatabase '•-•••'•-.,•• •--•;•• •••-.- . ••• , '. -.- •Set doc = New NotesDocument( db )doc.Form = "Main Topic"doc.Subject = "A signed document"Call doc.SignCall doc.Save( False, True ) ' • :

verifyName = doc.Verifier '

Свойство SaveMessageQnSend - «сохранять документ после отправки почтой»

LotusScript: flag ~ nofevjDocw/Mew/.SaveMessageOnSend

notesDocumenl.SiiveMess'AgeQnSend -flag

Java: boolean flag = .OocM/wt'«/.isSaveMessageOnSend()

void Document.setSsweM.essBgeOnSetid(boolean flag)

Значение true требует сохранять документ в базе сразу после его отправки почтой. Значение false, напротив, не требует сохранения документа в базе после отправки почтой. Свойство имеет смысл только для новых документов.

Пример. Скрипт создает документ, отправляет его почтой и сохраняет в базе. В качестве формы документа выбрана "Main Topic", чтобы документ нормально отображался в базе, А чтобы документ нормально отображался и в почтовом ящике получателя, в методе Send первый параметр задан равным True - это требует сохранять форму в отправляемом почтой документе. Однако авторы по ряду причин не рекомендуют широко применять встроенную в документ форму в почтовых сообщениях.

Dim session As New NotesSessionDim db As NotesDatabaseDim doc As NotesDocumentSet db = session.CurrentDatabaseSet doc = New NotesDocument( db )doc.SaveMessageOnSend = Truedoc.Form = "Main Topic"doc.Subject - _ •"Here's a new document that's going to be saved and mailed."Call doc.Send( True, "Carl Pycha" )

•t

Свойство EncryptOnSend - «шифровать при отправке почтой»

LotusScript: flag = notesDocumentJZncryptOnSend

TiotesDocument.EncryptOnSend -flag

Java: boolean flag = DocumenLlsEncryptOnSendQ

void Document.seiEnctyptOnSemd(booleanflag)

Если flag - true, то документ должен быть зашифрован при отправке его почтой, если false - не должен.

Когда документ со свойством EncryptOnSend = true отправляют почтой, шифруется только поле Body документа: генерируется случайный ключ шифрования, им шифруется содержимое поля Body, сам ключ шифрования в свою очередь шифруется открытым ключом получателя и добавляется в документ. Открытый ключ получателя берется из адресных книг и должен там находиться. Если открытого ключа получателя не удается найти, ему отправляется незашифрованное письмо. Получатель своим секретным ключом дешифрирует ключ шифрования, а ключом шифрования дешифрирует содержимое поля Body. Если документ отправляется почтой группе пользователей, каждому из них при наличии

© InterTrust Со. Тел, (095) 9567928

Page 89: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. S: (aj-формулы, LotusScript, встроенные классы LotusScript и Java 587

открытого ключа направляется «своя зашифрованная» копия, а при отсутствии открытого ключа - незашифрованная копия.

Пример. Скрипт создает документ и отправляет его с применением шифрования двум получателям.

Dim db As New notesDatabase( "Server/Acme", "review.nsf" )Dim memo As New NotesDocument( db }Dim recipients { 1 To 2 } As Stringmemo.Form = "Memo"memo.Subject = "Design review"memo.Body = "Last week's design review is posted in " + db.Titlememo.EncryptOnSend = Truerecipients ( 1 ) = "Edith Sprout"recipients ( 2 ) -- "Mariko Ikebuchi"Call memo.Send( False, recipients )

Свойство SignOnSend - «подписывать при отправке почтой» LotusScript: flag ~ notesDocument.SignOnSenu

notesDocument.SignOaSend -flag

Java: boolean flag = Docwwe/ztisSignQnSend()

void Document.setSig,nOnSend(booleanflag)

Если flag = true, то документ должен подписываться при отправке почтой, или false, TO недолжен.

Пример 1. Скрипт создает и отправляет подписанное письмо.

Dim session As New NotesSessionDim db As NotesDatabase • •-: . . - • - - •. ... :Dim doc As NotesDocumentSet db = session.CurrentDatabaseSet doc = New NotesDocument( db )doc.SignOnSend = Truedoc.Form = "Memo"doc.Subject = "Here's a signed mail memo."Call doc.Send( False, "Carl Pycha" )

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

import Java . util. Vector; '' '// Java-Document/send2Database db = agent-Context. getCurrentDatabase (};Document memo = db.createDocument();memo.appendltemValue("Form", "Memo"};memo.appendltemValue("Subj ect", "Test");RichTextltem rti = memo.createRichTextltem("Body");rti.appendText( "Please reply if you get this" );Vector v —- new Vector();v.addElement(session.getUserName());v.addElement("Kyla Town");memo.setSaveMessageOnSend(true);memo.setEncryptOnSend(true);memo.setSignOnSend(true);memo.sign();memo.send(false, v);

© InterTrust Co. Ten. (095) 9567928

Page 90: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

588 Встроенные классы LotusScript и Java

Свойство SentByAgent - «прислан агентом»

LotusScript: flag = notesDocument.Seni&yAgent

Java: boolean/lag = Document. isSentByAgentQ

Возвращает true, если документ был «прислан» в базу агентом, или false, если документ был «прислан» в базу пользователем. Отличие почтового сообщения, посланного агентом, от почтового сообщения, посланного пользователем, состоит в наличии в нем поля SAssistMail со значением 1. автоматически создаваемого методом send.

Свойство может использоваться в агенте, который автоматически «отвечает» на входящие почтовые сообщения. В терминологии Internet подобный «автоответчик» часто называют «почтовым отражателем». Проверка свойства позволяет достичь того, чтобы агент «отвечал» только на сообщения от пользователей, но «не отвечал» на сообщения, посланные ему другими агентами. Учет программистом при разработке агентов этого свойства будет, хотя и пассивно, способствовать недопущению возникновения «зацикливающегося» или «лавинообразно разрастающегося» потока писем между двумя «почтовыми отражателями».

3.19,2. Методы для работы с полями

Метод hasltem - «имеется ли в документе поле с заданным именем» ^LotusScript: flag - notesDocument.ba$ltem( itemNameS )

Java: boolean flag = Document.hasltem(String itemName)

Возвращает true, если поле с именем itemName (тип String) содержится в документе, или false, если нет.

Метод getFirstltem - «первое поле с заданным именем»

LotusScript: Set notesltem - r!otesDocitment.getҐirsiltem( name$ )

Java: Item item = Document.getҐirstItf:ni(String name)Данный метод возвращает (как объект класса [Notesjltem) первое поле с именем,

заданным параметром пате (тип String). Если в документе нет ни одного поля с указанным именем, возвращается Nothing/null.

Поскольку значения полей типа computed for display в документе не сохраняются, метод возвращает для них Nothing/null, кроме случая, когда объект NotesDocument был получен из объекта NotesUIDocument свойством Document.

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

Пример 1. Скрипт проверяет наличие поля Subject в документе и, если он имеется, выводит его значение.

Dim doc As NotesDocument1 . . . se t va lue of doc . . .Dim item As Notesltem.Set item = doc.GetFirstltem( "Subject" )If ( item Is Nothing ) Then .Messagebox( "В документе нет поля Subject" ) . . -

ElseMessageboxf "Значение первого поля Subject: " + item.Text )

End If

© InterTrust Co. Тел. (095) 9567928

Page 91: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 589

Пример 2. Java-агент для всех документов в базе выводит отчет о наличии и содержимом полей Subject и Body (типа RichText).

// Java-Document/getFirstltem . . . .Database db = agentContext.getCurrentDatabase(); DocumentCollection dc = db. getAHDocuments ( ) ; Document doc = dc . getF'irstDocument () ;while (doc != null)/ iItem subject = doc. getFirstltem ("Subject") ;if (subject -= null) System.out.println("[ No subject ]"); else System.out.println("[ " + subject.getText() + " ]"); RichTextltem body = (RiehTextltern)doc.getFirstltem("Body");

if (body == null) System.out.println("No body"); else System.out.println(body.getFormattedText(true, 0, 0)); doc = dc.getNextDocument(); }

Методы getltemValue, getltemValuelnteger, getltemValueDouble, getltemValueString - «значение поля с заданным именем»LotusScript: valuesArray = notesDocument.getItemV&lue( itemName$ )

Java: Java.util. Vector values = Document.getItemVa\ae(String itemName)

int value = Document,geiltemValue\nteger(String itemName) double

value - Document.getltemV&lneY)ouble(String itemName) String value

= Document.getltemValtteString(String itemName)

Метод getltemValue возвращает из документа значение поля с именем itemName (тип String). Тип возвращаемого значения зависит от типа поля, что показано в следующей таблице.

Тип поля в Notes Тип возвращаемого значения

RichText String /java.util. Vector с одним элементом класса String.Содержит Plain text (только текст, без шрифтового оформления, графики, таблиц и т.п.) из поля

Text или Text List (включая Array of strings /java.util. Vector с элементами класса Stringтипы Names, Authors иReaders)

Number или Number List Array of doubles /java.util. Vector с элементами класса Double

Date/Time или Date/Time List Array of doubles /java.util. Vector с элементами классаDateTime

В Java метод getltemValue всегда возвращается «вектор» значений. Если поле имеет только одно значение, в «векторе» будет только один элемент, с индексом 0. В случае, если поле вообще не имеет значения, возвращается «пустой» вектор - с нулевым количеством элементов.

Кроме того, в классе Document (Java) имеются методы getltemValuelnteger, getltemValueDouble и getltemValueString, которые возвращают значение из поля типа Number или Text, имеющего только одно значение (не список), соответственно как целое или вещественное число или строку.

© InterTrust Со, Тел. (095) 9567928

Page 92: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

590 Встроенные классы LotusScript и Java

В LotusScript для полей всех типов, кроме Rich Text, метод getltemValue всегда возвращает массив, даже если в нем содержится только один элемент. Первый элемент этого массива имеет индекс 0. Если вы заранее уверены, что возвращается только одно значение, можно использовать для доступа к этому элементу «индекс 0». Если же значений может быть много, обычно выполняют «перебор» элементов массива оператором Forall.

Кроме того, в LotusScript для получения значения поля можно использовать синтаксис «расширенного класса». Например, следующие два оператора эквивалентны:t - lastDoc.GetltemValue( "Topic" )t = lastDoc.Topic f

Поскольку для полей всех типов, кроме RichText, всегда возвращается массив, если в нашем примере поле Topic имеет тип Text, то t - массив строк, a t(0) - его первый элемент.

Во всех следующих примерах doc - объект класса NotesDocument.

Пример I. Скрипт выводит в окне значение поля Subject.

Dim subj As Variantsubj = doc.GetltemValue{ "Subject" )Messagebox( subj ( 0 ) } • .

To же самое, но имя поля употребляется как свойство объекта.

Dim subj As Variant subj = doc.SubjectMessagebox( subj( 0 } }

Пример 2, Скрипт суммирует значения из числового списка quarterlyRevenue и помещает результат в tolalRevenue. Например, если quarterlyRevenue содержит список значений 50; 60; 70; 80, то поле totalRevenue получит значение 260.

Dim total As Integertotal = 0money = doc.GetltemValue( "quarterlyRevenue" )Forall m In money

total = total + in End ForallCall doc.ReplaceltemValue( "totalRevenue", total } Call doc.Save( False, True )

To же самое, но имя поля употребляется как свойство объекта.

Dim total As Integertotal - 0money = doc.quarterlyRevenueForall m In money

total = total + m End Foralldoc.totalRevenue = total Call doc.Save( False, True )

Пример З. Скрипт получает значение из поля Body типа RichText (оно возвращается как строка), и помещает его в поле Body создаваемого почтового сообщения.

Dim memo As NotesDocumentSet memo = New NotesDocument( db )Dim bodytext As Stringbodytext = doc.Get!temValue( "Body" )Call memo.ReplaceltemValue( "Body", bodytext )Call memo.ReplaceltemValue( "Subject", "Here's some plain text" )Call memo . ReplaceltemValue ( "E'orm", "Memo" )Call memo. Send ( False, "dmahari3purple.peopleeater.org" )

© InterTrust Co. Тел. (095) 9567928

Page 93: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R, 5: ((^-формулы, LotusScript, встроенные классы LotusScript и Java 591

To же самое, но но имя поля употребляется как свойство объекта.

Dim memo As NotesDocumentSet memo = New NotesDocument( db )memo.Body = doc.Bodymemo.Subject = "Here's some plain text"memo.Form = "Memo"Call memo. Send ( False, "[email protected]" )

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

import Java.util.Vector;/'/ Java-Document /get It em ValuesDocumentCollection dc = agentContext.getUnprocessedDocuments();Document doc = dc.getFirstDocument(};while (doc i= null){ • •// Поле типа Text с одним значениемSystem.out.println("[ " + doc.getltemValueString("Subject") + " ]");// Поле типа RichText ~> plain textSystem.out.println(doc.getltemValueString("Body"));// Поле типа Number с одним целочисленным значениемSystem.out.println(doc.getltemValuelnteger("integer"));// Поле типа Number с одним вещественным значениемSystem.out.println(doc.getltemValueDouble("double"));// Поле типа Text со многими значениями (список)Vector sM = doc.getlternValue("stringMultiple");for (int i=0; i < sM.size(); i++)System.out.println((i+1) + ": " + sM.elementAt:(i));

// Поле типа Number со многими значениями (список)Vector iM = doc.getltemValue("integerMultiple");Double d;for (int i=0; i < iM.sizef); i++){d = (Double)iM.elementAt(i);System.out.println((i-M ) + ": " + d.intValue() );

}// Поле типа Date/Time с одним значениемVector dM = doc.getltemValue("dateTime");if (dM.sizeO > 0);iDateTime dt = (DateTime)dM.elementAt(0);System.out.println(dt.getLocalTime()) ;} 'doc = dc.getNextDocument(); }

Метод appendltemValue - «добавить поле с заданными именем и значением»LotusScript: Set notesltem - notesDocument.appendltem Value( itemNameS, value )

Java: Item item = Document.appendltemValue(String itemName)

Item item - Document.appendltemValue(String itemName, int value) Item

item = Document.appendltemValue(String itemName, double value) Item

item = Document, appendltemValue(5'fr/ng itemName, Object value)

© InterTrust Co. Тел. (095) 9567928

Page 94: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

592 Встроенные классы LotusScript u Java

Создает в документе новое поле и присваивает ему заданное значение. Параметр itemName (тип String) задает имя нового поля, a value - значение для нового поля. Тип данных создаваемого поля зависит от типа параметра value.

Тип параметра value Тип получаемого поля

String / java.lang.String Text; содержит заданную строку

Array of strings / Java.util.Vector c Text List; содержит все значения из заданного

элементами Java,lang.String «массива» строк

Integer / int Number; содержит заданное значение

Array of integers / java.util.Vector с Number List; содержит все значения изэлементами класса integer заданного «массива»Variant of type DATE / DateTime Date/Time; содержит заданное значение

Array of variants, в котором каждый Date/Time List; содержит все значения из элемент типа DATE /Java. util. Vector с заданного «массива» элементами класса DateTimeNotesDateTime / DateTime Date/Time; содержит значение, представленное

объектом

Notesltem / Item Того же типа и с теми же данными, что иэлемент данных, представленный объектом класса

Возвращаемое значение - объект класса [Notes]Item, представляющий новые поле. Для поля по умолчанию значение свойства IsSummary устанавливается равным true, т.е. информация из поля может отображаться в виде или папке.

Новое поле будет сохранено в документе в базе только после вызова метода save (после appendltemValue). Если в документе уже содержится поле с именем itemName, метод appendltemValue не заменяет это поле, а создает другое поле с тем же именем, и присваивает ему заданное значение.

Для того, чтобы добавленное в документ поле «отображалось на экране», форма для показа документа должна содержать одноименное поле.

В LotusScript вместо явного применения метода appendltemValue часто можно пользоваться именем поля как свойством (синтаксис «расширенного класса»). Например, следующий скрипт, добавляющий поле в документ:Dim item As NotesltemSet item = doc.AppendltemValue( "Subject", "Update on stock options" )Call doc.Save( False, True )

может быть записан более коротко:doc.Subject = "Update on stock options"Call doc.Save( False, True ) . • • ' "

Однако имеются и принципиальные отличия:• если поле с тем же именем уже существует в документе, метод appendltemValue создает

новое поле с таким же именем, а использование синтаксиса «расширенного класса»заменяет значение существующего поля;

• метод appendltemValue возвращает объект класса [Notes]Item, представляющийсозданное поле.Пример 1. Скрипт добавляет два поля в документ: EstimatedCost со значением 89 и Region со

значением "Pacific Rim".

© InterTrust Co. Тел. (095) 9567928

Page 95: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 593

Dim doc As NotesDocument' . ..set value of doc.. .Dim itemA As Notes-ItemDim itemB As NotesltemSet itemA = doc.AppendltemValue( "EstimatedCost", 89 )Set itemB = doc.AppendltemValue( "Region", "Pacific Rim" )Call doc.Save( False, True )

Пример la. Этот скрипт делает то же самое, но он записан с использованием синтаксиса «расширенного класса». Учтите, что в примере,! в документе всегда создаются новые поля, а в примере 1а они создаются, только если ранее отсутствовали, иначе же выполняется замена значения в существующих полях.

doc.EstimatedCost = 89 doc.Region = "Pacific Rim"Call doc. Save ( False, True ) ...

Пример 2. Скрипт создает в документе поле с именем Contacts, содержащее список из трех текстовых значений.

Dim doc As NotesDocument' . . . set. value of doc. . .Dim stringArray ( 1 To 3 ) As StringstringArray( 1 } = "Ch.rissa Ehrhardt"stringArray( 2 ) = "Allegra Pisarro"stringArray( 3 ) = "Esteban Garcia"Call doc.AppendltemValue( "Contacts", stringArray )Call doc.Save( False, True )

Пример 2а. Подобная операция с использованием синтаксиса «расширенного класса».

Dim stringArray ( 1 То 3 } As String stringArray ( 1 ) = "Chrissa Ehrhardt" stringArray ( 2 } == "Allegra Pisarro" stringArray ( 3 ) = "Esteban Garcia" doc.Contacts = stringArray Call doc.Save( False, True }

Пример З. Скрипт создает новое поле типа Date/Time и присваивает ему значение 05/15/99 12:00:00 AM.

Dim doc As NotesDocument1...set value of doc...Call doc.Append!temValue( "DueDate", Datenumber( 1999, 5, 15 ) )Call doc.Save( False, True )

Пример За, Скрипт выполняет то же самое. Различие лишь в том, что если поле с именем DueDate уже существует, значение в нем заменяется на заданное 05/15/99 12:00:00 AM.doc.DateDue = Datenumber( 1999,5,15)Call doc.Save( False, True }

Пример 4. Java-агент создает документ с полями различных типов.import Java . util .Vector; -..-.-.// Java-Document/apperidl temValueDatabase db = agentContext.getCurrentDatabase();Document doc = db.createDocument();doc.appendltemValue("Form", "Main Topic"}; •// Поле типа Text с одним значениемdoc.appendltemValue("Subject", "Test appendltemValue");// Поле типа Text со многими значениями (список)Vector stringMultiple = new Vector();stringMultiple . addElement ( "String one"); • - - : • • • . •stringMultiple.addElement("String two") ;

© InterTrust Co. Тел. (095) 9567928

Page 96: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

594 Встроенные классы LotusScript и Java

stringMultiple.addElement("String three"); doc.appendltemValue{"stringMultiple", stringMultiple); // Поле типа Number с одним целочисленным значением doc.appendltemValue("integer", 101);// Поле типа Number с одним вещественным значением doc.appendltemValue{"double", 1.01);// Поле типа Number со многими целочисленными значениями (список)Vector integerMultiple = new Vector();Integer one = new Integer(1); integerMultiple.addElement(one);Integer two = new Integer(2); integerMultiple.addElement(two);Integer three = new Integer(3); integerMultiple.addElement(three);doc.appendltemValue("integerMultiple", integerMultiple);.// Полез типа Date/Time с одним значениемDateTime timenow = session.createDateTime("Today"); timenow.setNow();doc.appendltemValue("dateTime", timenow);

if (doc.save()) System.out.println("Document created and saved");else System.out.println("Something went wrong");

Метод repiaceltemValue - «заменить значение поля»LotusScript: Set notesltem — notesDocument.replaceltemVa\ne( itemArame$, value )

Java: Item item = /)осм/ие«/. replaceltemValue^/r/wg itemName, Object value)

Заменяет все поля с заданным именем itemName одним новым полем с заданным значением value. Если поле с заданным именем не содержался в документе, метод создает новое поле и добавляет его в документ. Синтаксис и семантика параметров такие же, как у метода appendltemValue. Для поля значение свойства IsSummary по умолчанию устанавливается равным false, т.е. информация из поля не может отображаться в виде или папке.

В LotusScript вместо явного применения метода repiaceltemValue удобно использовать имя поля как свойство объекта (т.н. синтаксис «расширенного класса»). Например, вместо:Dim item As NotesltemSet item = doc.RepiaceltemValue("Subject", "Update on stock options")Call doc.Save( False, True )

можно записать:doc.Subject = "Update on stock options" Call doc.Save( False, True )

Единственное различие в том, что метод repiaceltemValue возвращает объект класса Notesltem, представляющий вновь созданное поле.

Пример 1. Скрипт заменяет значение поля EstimatedCost на 122.Dim item As NotesltemSet item = doc.RepiaceltemValue{ "EstimatedCost", 122 )Call doc.Save( True, True )

Пример la. To же самое с использованием имени поля как свойства.

doc.EstimatedCost = 122Call doc.Save! True, True )

Пример Ib, Скрипт заменяет значение поля EstimatedCost на "Too much" - при этом тип поля изменяется с Number на Text.

Set item = doc.RepiaceltemValue( "EstimatedCost", "Too much" )Call doc.Save( True, True )

© InterTrust Co. Тел. (095) 9567928

Page 97: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные класс»! LotusScript и Java 595

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

import Java.util.Vector;// Java-Document/replaceltemValueDocumentCollection dc = ageritContext. getUnprocessedDocuments () ;Document doc = dc.getFirstDocument(};while (doc != null){// Поле типа Text с одним значениемdoc.replaceltemValue("Subject", "Test replaceItemValue");// Поле типа Text со многими значениями (список)Vector stringMultiple = new Vector();stringMultiple.addElement("String one 1");stringMultiple.addElement("String two 1");stringMultiple.addElement{"String three I");doc.replaceltemValue("stringMultiple", stringMultiple);// Поле типа Number с одним целочисленным значениемInteger intObj = new Integer(202);doc.replaceltemValue("integer", intObj);// Поле типа Number с одним вещественным значениемDouble doubleObj = new Double(2.02);doc.replaceltemValue("double", doubleObj);//' Поле типа Number со многими целочисленными значениями (список)Vector integerMultiple = new Vector();Integer one - new Integer(4); integerMultiple.addElement(one);Integer two = new Integer (5); integerMultiple.addElement(two);Integer three = new Integer(6); integerMultiple.addElement(three);doc.replaceltemValue("integerMultiple", integerMultiple);// Поле типа Date/Time с одним значением.DateTime timenow = session.createDateTime("Today"); timenow.setNow();doc.replaceltemValue("dateTime", timenow);

if (doc.save()) System.out.println("Document created and saved");else System.out.println("Something went wrong");doc = dc.getNextDocument();} - . '

Метод removeltem - «удалить ноле» ' -:: • • :: : •: --" 4.. • :.;.::::,;:; ' : • •; ;.-..: -: • •'::;.;:: ;

LotusScript: Call notesDocument.removeItem( itemNameS )

Java: void Document.remo\rclte.m(String itemName)

Удаляет все поля с именем itemName (тип String) из документа. Если указанного поля не существует, ничего не происходит. В документе из базы соответствующие изменения произойдут только после вызова метода save.

Пример 1. Скрипт удаляет из документа поле Subject.

Dim mainDoc As NotesDocument -' . . . s e t value of mainDoc...Call mainDoc.Removeltem( "Subject" )Call mainDoc.Save( True, True )

Пример 2. Скрипт удаляет из документа все присоединенные файлы и встроенные объекты.

Call doc.Remove!tem( "$FILE" )Call doc.Save( True, False )

© InterTrust Co. Тел. (095) 9567928

Page 98: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

596 Встроенные классы LotusScript и Java

Пример 3. Подпрограмма служит для переименования поля в документе. Сначала она создает новое поле с новым именем и значением из старого поля, а затем удаляет старое поле.

Sub changeFNf doc As NotesDocument, oldName As String, newName As String ) If doc. Hasltern ( oldName ) Then

Call doc.ReplaceltemValue( newName, doc.GetItemValue( oldName ) ) Call doc.Removeltem( oldName )Call doc.Save( False, True )

End If -'ч; ,:-Vv::•>:'.•

End Sub ' •

Пример 4. Java-агент во всех документах базы «переименовывает» поле OldName в поле New Item. Принцип работы: если в документе имеется поле OldName, создать в нем поле Newltem со значением из поля OldName, а затем удалить поле OldName.

// Java-Document/removeItemDatabase db = agentContext.getCurrentDatabase() ;DocumentCollection dc = db . getAHDocuments () ;Document doc = dc.getFirstDocument();while (doc != null){if (doc.hasltem("OldName"))

'; idoc.replaceItemValue("Newltem", doc.getItemValue("Oldltem")); doc.remove!tern("Oldltem");doc.save

(); }doc = dc.getNextDocument(doc);

}

Метод createRichTextltem - «создать поле типа RichText»LotusScript: Set notesRichTextltem = notesDocument.createRicbrYextItem( itemName$ )

Java: RichTextltem rtitem = Docw/wen/.createRichTextltem(ftrz>7g itemName)

Создает в документе, к которому применяется метод, новое поле типа RichText с указанным параметром itemName именем (тип String), и возвращает соответствующий созданному полю объект класса [Notes]RichTextltem. Подробности в описании класса [Notes]RichTextItem.

Метод renderToRTItem - «создать образ документа в поле типа RichText»LotusScript: flag - notesDocument.RenderToRTItem( notesRichTextltem )

Java: boolean flag = Document.remlerToRTltem(RichT'extItem rtitem)

Создает «образ» документа, к которому применяется метод, и помещает этот образ в представленное параметром rtitem поле (объект класса [NotesJRichTextltem). Образ документа создается с использованием как информации из документа, так и предусмотренной для этого документа формы. В ходе работы метода, если имеются, выполняются формулы трансляции и проверки для полей формы. Если метод отработал успешно, он возвращает true. В противном случае, что обычно связано с тем, что формулы проверки полей в форме «вернули @Failure(...)», метод возвращает false, а поле rtitem остается неизмененным.

Пример 1. Скрипт создает образ документа А и помещает его в поле Body в созданном новом документе В.

Dim session As New NotesSession

Page 99: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

© InterTrust Co. Тел. (095) 9567928

Page 100: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: (агформулы, LotusScript, встроенные классы LotusScript и Java 597

Dim db As NotesDatabaseDim view As NotesView

,Dim docA As NotesDocurnent Dim docB As NotesDocument Dim rtitem As NotesRichTextItem Dim success As Variant-Set db = session.CurrentDataba.se '...set value of docA... Set docB = New NotesDocurnent ( db )Set rtitem = New NotesRichTextltem( docB, "Body" ) docB.For.rn = "Main Topic"docB.Subject = " I t ' s a picture of the document" Call docB.Save( True, True ) success = docA.RenderToRTItem( rtitem ) Call docB.Save( True, True )

Пример 2. Java-агент, работающий по множеству выбранных пользователем документов, создает образ каждого документа (doc), помещает его в поле Body, создаваемое в новом документе (memo), и отправляет созданный документ (memo) почтой.

// Java-Document/renderToRTIternDocumentCollection dc = agentContext.getUnprocessedDocuments( ) ;Database db = agentContext.getCurrentDatabase( ) ;Document doc = dc.getFirstDocument(};while (doc != null){Document memo = db.createDocument();memo.appendltemValue{"Form", "Memo");memo.appendltemValue("Subject", "Picture of document");RichTextltem rti = memo.createRichTextltern("Body");doc.renderToRTItem(rti);memo.send(session.getUserName()); ' •doc = dc.getNextDocument();

} ' ,

Метод getAttachment - «получить присоединенный файл по имени»LotusScript: Set notesEmbeddedObject = notesDocument.getAttachment( fileNames )Java: EmbeddedObject embObj = Dacument.getAttsicbment(Strmg fileName)По заданному параметром fileName имени присоединенного файла (тип String)

возвращает объект класса [NotesJEmbeddedObject, представляющий этот присоединенный файл. Используется для поиска присоединенных файлов в полях типа Rich Text документа и в самом документе (вне поля типа RichText), но не в форме для этого документа. Возвращает Nothing/null, если не удается найти присоединенный файл с указанным именем. Учтите, что свойство Parent для возвращенного объекта класса [Notes]EmbeddedObject будет возвращать Nothing/null, поскольку этот объект недоступен через объект класса [NotesjRichTextltem.

Метод copyltem - «копировать поле в другой документ»LotusScript: Set notesltem — notesDoeument.copylLtem( notesltem , newNameS )

Call notesDocument.copyltem( notesltem , ne\vName$ )

Java: Item item = Document.copyltem(ltern item)

Item item = Document.copy\tem(ltem item, String newName)

© InterTrust Co. Тел. (095) 9567928

Page 101: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

598 , . . . - , - Встроенные классы LotusScript u Java

Копирует в документ, к которому применяется метод, заданное первым параметром поле, обычно изменяя при этом имя поля на заданное вторым параметром новое имя.

Параметр notesltem/item задает поле (объект класса [NotesJItem), обычно из другого документа, который необходимо скопировать. Параметр newName (тип String) сообщает новое имя для скопированного поля. Если в LotusScript указать пустую строку (""), а в Java использовать метод с одним параметром, то копия сохранит имя копируемого поля. Возвращаемое значение - копия как объект класса [NotesJItem.

Пример. Скрипт создает новое письмо и копирует в него поле Body из сохраненного в базе документа.

Dim db As New NotesDatabase{ "", "review.nsf" )Dim doc As NotesDocumeritDint memo As NotesDocumentDim item As Notesltem' . . .set value of doc. . .Set item - doc.GetFirstltem( "Body" )Set memo = New NotesDocument( db }memo.Form = "Memo"memo.Subject = "Here's a copy of the review." iCall memo. Copy-Item ( item, "Body" )Call memo.Send( False, "Viquinha Mayer" )

Метод copyAUItems" - «копировать все поля в другой документ»

LotusScript: Call notesDocument.copyAllltems( notesDocument [, replace] )

Java: void Document.copyA\litenis(Document doc, boolean replace)Копирует в документ, к которому применяется метод, все поля из документа, заданного в

качестве параметра метода. Имена, типы и значения полей при этом не меняются. Если параметр replace равен true, выполняется замена полей в документе, в который выполняется копирование, если false (по умолчанию) - выполняется добавление полей.

3.19.3. Методы для работы с документами

Метод copyToDatabase - «копировать документ в другую базу»LotusScript: Set notesDocument - «ote5/)ocM/we«/.copyToDatabase( notesDatabase )Java: void Document.capyToDatabase(Database db)Копирует документ, к которому применяется метод, в базу, заданную параметром метода,

и возвращает новый документ в этой базе. Под документом имеется в виду объект класса [Notes]Document, под базой - объект класса [NotesjDatabase,

Пример 1. Скрипт проверяет, создан ли документ ранее 12 августа 1998 года, и, если это так, копирует его в архивную базу.

Dim archiveDb As New NotesDatabase( "", "" ) ' * ' ' 'Dim doc As NotesDocument' . . .set value of archiveDb.. .1 . . .set value of doc. . . "If ( doc.Created < Datenumber( 1998, 8, 12 ) ) ThenCall doc.CopyToDatabase( archiveDb )

End If

© InterTrust Co. Тел. (095) 9567928

Page 102: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: (^-формулы, LotusScript, встроенные классы LotusScript и Java 599

Пример 2. Java-агент копирует документы из вида By Category текущей базы во вновь создаваемую архивную базу.

// Java-Document/copyToDatabaseDatabase db = agentContext.getCurrentDatabase () ;Database newdb = db.createCopy(null, "archive");System.out.println("Archive created");View view = db.getView("By Category");Document doc - view.getFirstDocument(); int count = 0;while (doc != null){

doc.copyToDatabase(newdb);doc = view.getNextDocument(doc); count++;

} System.out.println(count + " documents copied to archive");

Метод makeResponse - «сделать документ ответом на другой»LotusScript: Call notesЈ>ocwmen/.makeResponse( notesDocument)Java: void Document, makeResponse(Ј>ocM/Me«/ doc)Делает документ, к которому применяется метод, документом-ответом на документ,

который задан параметром метода. Учтите (хотя это и очевидно), что оба документа должнынаходиться в одной базе, и не забудьте вызвать метод save для сохранения внесенных вдокумент изменений в базе. .

Пример. Скрипт делает второй документ из вида "All documents" ответным документом на первый документ из этого вида.Dim session As New NotesSessionDim db As NotesDatabaseDim view As NotesViewDim docA As NotesDocumentDim docB As NotesDocumentSet db = session.CurrentDatabaseSet view = db.GetView( "All documents" )Set docA = view.GetFirstDocumentSet docB = view.GetNextDocument( docA )Call docB.MakeResponse( docA )docB.Form = "Response"Call doc.B.Save( True, True ) • .

Метод computeWithForm - «пересчитать поля документа по форме»LotusScript: flag =• notesDocument.computeV^itbҐorm( doDataTypes , raiseError )

Java: boolean flag — Docutnent.computeVi/ithform(boolean doDataTypes,

boolean raiseError)

Проверяет документ путем вычисления для его полей, одноименных с полями сопоставленной документу формы, всех формул значений по умолчанию, трансляции и проверки ввода. Значение параметра doDataTypes попросту игнорируется методом - можно указать как true, так и false. Если параметр raiseError равен true, при работе метода возникает ошибка или возбуждается исключение, если проверки полей завершаются неуспешно. Если задано же false, ошибки/исключения не возникают, но метод возвращает false, если проверки «не прошли». Возвращаемое методом значение равно true, если ошибок не обнаружено, или false, если обнаружены.

© InterTrust Co. Тел. (095) 9567928

Page 103: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

600 Встроенные классы LotusScript и Java

Notes сопоставляет форму документу следующим образом:* форма, сохраненная в документе;* форма в соответствии с содержимым поля с именем Form из документа;* форма «по умолчанию» для базы.

Метод может использоваться для проверки документов, создаваемых разработчиком непосредственно в коде приложения без использования форм, но с ориентацией на некоторую форму для последующего показа документа. Тем не менее, вне зависимости от TGI о, что возвращает данный метод, разработчик всегда может сохранить свой документ (в отличии от пользователя, который не сможет сохранить созданный им но некоторой форме документ, пока не будут «удовлетворены» все формулы проверки полей).

Метод putlnFolder - «поместить документ в панку»LotusScript: Call notesDocument.putInҐolder(folderName$ [, createonfail ] )

Java: voidDocument,pvttlnҐolder(Stnng folderName)

void Document.puilnҐolder(Strmg folderName, boolean createonfail)

Помещает документ в папку, имя которой задано параметром folderName (тип String). Если папка «находится в другой папке», имена разделяются символом «обратный слеш», например: "VehiclesYBikes" в LotusScript или "Vehicles\\Bikes" в Java. Если папка с указанным именем не существует, она создается. Чтобы запретить автоматическое создание папок, нужно явно задать параметр createonfail равным false Если документ уже имеется в папке, второй раз он в нее не помещается. Если выполнение происходит на станции, папка может быть личной (personal) и храниться в файле DESKTOP.DSK на компьютере пользователя. Метод не может только добавить первый документ в папку с опцией "Shared, Personal on first use".

Пример 1. Скрипт выполняет полнотекстовый поиск по базе и помещает найденную коллекцию документе в папку.

Dj.m session As New NotesSessionОпт db As NotesDatabaseDim doc As NotesDocumentDim collection As NotesDocumentCollectionSet db = session.CucrentDatabaseSet collect ion = db.FTSearch( "cayenne", 20 )for i - l To collection.Count

Set doc = collection.GetNthDocument( i )Call doc.PutlnFolder( "RecipesXSpicy" )

Next

Пример 2. Java-агент помещает необработанные им документы в папки, имена которых берутся из поля Category каждого документа. Ьсли папки не существуют, они автоматически создаются.

// Java-Docament/putlnFolderDocument-Collection dc — agentContext.getUnprocessedDocumcnts();Database db = agentContext. getCurreritDatabase ( ) ;Document doc = dc.getFirstDocument();while (doc '= null){String category = doc.getltemValueStrina("Category");if (category != null) i doc.putlnFolder(category); }agentContext.updatePiocessedDoc(doc);doc.save();doc = dc.getNextDocument(doc);

}

Page 104: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 601

Метод removeFromFolder - «удалить документ из папки»

LotusScript: Call notesDocument.remweFromҐolder(folderName$)

Java: void Document.removeFromFolder^Vr/wg folderName)Удаляет документ из папки с именем folderName. Ничего не делает, если нет указанной

папки или в папке нет этого документа.

Метод sign - «подписать документ»

LotusScript: Call notesDocument.sign

Java: vo id Document. signQ

«Подписывает» документ. Если выполнение происходит на сервере, метод ничего не делает. Учтите, что созданные в документе в результате работы метода поля, содержащие относящуюся к электронной подписи информацию, будут записаны в базу только при выполнении метода save.

Пример. Скрипт создает новый документ, «подписывает» его, сохраняет в базе и выводит информацию о подписавшем документ и сертификате, использованном для проверки подписи. В подписанном документе появляется «относящееся к электронной подписи» поле SSignature. Если скрипт выполняется на станции под ID-файлом Nikolay N. Iontsev/InterTrustCorp/SU, в первом окне выводится "CN=Nikolay N. Iontsev/O=InterTrustCorp/C=SU", а во втором "O=lnterTrustCorp/C=SU".

Dim session As New NotesSessionDim db As NotesDatabaseDim doc As NotesDocumentDim verifyName As StringSet db = session.CurrentDatabase /Set doc = New NotesDocument( db )doc.Form = "Main Topic" 'doc.Subject = "A signed document"Call doc.SignCall doc.Save( False, True )MessageBox doc.SignerMessageBox doc.Verifier

Метод encrypt - «зашифровать документ»

LotusScript: Call notesDocumeni.encrypt

Java: void Document.encryptQ

Шифрует документ. Зашифрованный документ не будет записан в базу, пока не будет вызван метод save. Шифруются только те поля документа, для которых свойство IsEncrypted равно true. Поля, для которых это свойство равно false, останутся «видимыми» всем пользователям, даже если эти пользователи не имеют нужного ключа шифрования.

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

© InterTrust Co. Теп. (095) 9567923

Page 105: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

602 Встроенные классы LotusScript и Java

Метод не предназначен для шифрования почты, поскольку способы шифрования документов и отправляемой почты различны. Для шифрования почты следует установить свойство EncryptOnSend в значение true и использовать метод send.

Пример 1. Скрипт шифрует в документе поля Subject и Body ключом шифрования с именем "ТорSecret".

Dim doc As NotesDocumentDim item/A As NotesTtern ' ''Dim itemB As Notesltem'...set valu» of doc...Set iteiriA - doc. GetFirst Item ( "Subject" )Set itemB = doc.GetFirstltem( "Body" }i temA . IsEncrypted -- TrueitemB.IsEncrypted = Truedoc.EncryptionKeys - "Top Secret"Call doc.EncryptCall doc.Save( True, True )

Пример 2. Java-агент шифрует в документах из вида By Category поле Body ключом шифрования с именем "Top Secret".

im p o r t J a va . u t i l . Ve c to r ;// Java-Documerit/encryptDatabase db - agentContext.getCurrentDatabase( ) ;View view — db.getView("By Category");Document doc = view.getFirstDocument() ;while (doc != null){Item item = doc.getFiLstltem("Body"};i f (item != null){// Поле должно иметь свойство Encryptedif (!itern.isEncrypted(}) item.set Encrypted(true);// Ключ "Top Secret" должен быть в списке ключей шифрованияboolean found = false;Vector v = doc.getEncryptionKeys();for (int i = 0; i < v.size(); i4-+){String k = (String)v.elementAt(i); 'if (k.compareTo("Top Secret") == 0) { found = true; break; } }

if ( !found) // до&авпяем{ v.addElement("Top Secret"); doc.setEncryptionKeys(v); } // Шифруем

try { doc.encrypt(); } catch (NotesException e) { System.out.println(e.id + " " + e.text); break; } doc.save(); }doc - view.getNextDocument(doc);

}

Метод save - «сохранить документ в базе»LotusScript: flag = notesDocument.save( force, createResponse [, markRead ])

Java: boolean flag — DocumenLssveQ

boolean flag— Document.s»ve(boolean force)

© InterTrust Co. Тел. (095) 9567928

Page 106: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @~формулы, LotusScript, встроенные классы LotusScript и Java 603

boolean flag = Document.s&ve(boolean force, boolean createResponse)

boolean flag — Document.s&ve(hoolean force, boolean createResponse,

boolean markRead)

Сохраняет изменения, выполненные в документе, находящемся «в виртуальной памяти», в базе данных.

Если параметр force равен true, документ сохраняется в базе без попыток разрешения конфликтов сохранения. Если два пользователя одновременно модифицировали документ, и оба сохранили его методом save с выбором данной опции, в базе останется та версия документа, которая была сохранена позже. Если параметр force равен false и при сохранении возникает конфликт, то тогда параметр createResponse определяет, что при этом должно происходить. Если createResponse равен true, этот документ станет документом-ответом на модифицированный документ (точно так же разрешаются конфликты при репликациях), если false, работа метода save будет прекращена. Если параметр markRead равен true, документ будет отмечен как «прочитанный», если false (по умолчанию) - не будет.

Метод возвращает true, если документ был успешно сохранен, или false, если не был сохранен.

Метод send - «отправить документ почтой »LotusScript: Call notesDocument.send( attachForm [, recipients ] )

Java: void Document.$end(String recipient)

void Document. send(/ova. util. Vector recipients)

void Document,send(boolean attachForm, String recipient)

void Document.send(boolean attachForm, java.util. Vector recipients)

Отправляет документ почтой получателям.

Если параметр attachForm равен true, форма сохраняется в отправляемом документе и пересылается вместе с ним, если false, то нет.

Параметр recipient или recipients (в LotusScript типа String или Array of Strings, в Java класса String или java.util.Vector с элеменами класса String) определяет получателей сообщения: пользователей, группы, почтовые базы. Значение параметра используется только тогда, когда в документе отсутствует поле с именем SendTo. Если же поле SendTo в документе имеется, сообщение отправляется всем содержащимся в нем получателям.

Если в документе содержатся поля с именами СоруТо или BlindCopyTo, документ отправляется также содержащимся в них получателям.

Если в документе содержатся поля с именами DeliveryPriority, DeliveryReport, или ReturnReceipt, их значения учитываются в процессе доставки документа и уведомлений.

В отправляемое сообщение вставляется поле From с именем текущего пользователя, если скрипт выполняется на станции, или с именем сервера, если скрипт выполняется на сервере.

Метод автоматически добавляет в отправляемый документ «предопределенное» поле SAssistMail. Свойство SentByAgent использует это поле для определения того факта, что документ был отправлен скриптом.

Если свойство SaveMessageOnSend равно true, то посылаемый документ сохраняется в базе. Если свойство SaveMessageOnSend равно true, и первым параметром метода send вы затребовали сохранение формы в документе, то и документ, сохраненный в базе, будет содержать сохраненную форму.

© InterTrust Co. Тел. (095) 9567928

Page 107: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

604 Встроенные классы LotusScript и Java

Сохранение формы в документе, хотя и увеличивает размер документа, зато позволяет получателю всегда «увидеть» документ нужным образом. Однако эта возможность может иметь достаточно опасные последствия совершенно иного рода. Дело в том, что письмо с формой, встроенной в документ, может быть прислано в почтовый ящик пользователя или почтовую базу не только «благонамеренными» пользователем или агентом, но и «злоумышленником», в том числе и из другой организации. Пользователь, «привыкший» к письмам с формой, встроенной в документ, зачастую «открывает» такое письмо «без всяких опасений», ожидая, что письмо «будет вести себя штатным образом». Однако письмо от «злоумышленника» может повести себя и «не штатно»: удалить документ, базу или файлы, отправить обратно письмо с информацией, извлеченной с компьютера получателя и доступных ему баз, отправить свою копию от имени получателя всем абонентам получателя и т.п. Поэтому авторы рекомендуют избегать использования в разработках формы, встроенной в документ.

Метод createReplyMessage - «создать ответ на письмо»LotusScript: Set notesDocument = notesDoctiment.cre&teReplyMessage( all)

Java: Document doc = DocM/wewtcreateReplyMessage(6oo/eaw a/I)

Создает для документа (обычно, «входящего письма»), к которому применяется метод, новый документ по стандартной почтовой форме и «оформляет» его как «ответ» (в смысле reply, а не response) на оригинальный документ. Если параметр all равен true, получателями нового документа будут все получатели оригинала. Если параметр равен false, получателями нового документа будет отправитель оригинала.

После вызова метода createReplyMessage остается добавить в документ поле Subject и для отправки документа применить к нему метод send.

Метод remove - «удалить документ из базы»LotusScript: flag - notesDocument.remo\e( force) '

Java: boolean flag = Document.remove(boolean force)

Удаляет документ из базы. Если параметр force задан равным true, документ удаляется даже в случае, если другой пользователь успел изменить документ с тех пор, как скрипт или Java-приложение этот документ открыли. Если параметр равен false, документ не удаляется, если его уже успел изменить другой пользователь. Метод возвращает true, если документ был успешно удален, или false, если параметрит? был равен false и документ «параллельно» был изменен другим пользователем.

© InterTrust Co. Тел. (095) 9567928

Page 108: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 60S

3.20. «Поле документа» - класс [Notes]ItemОбъект класса [Notesjltem представляет часть данных из документа - поле документа

(Item). Notes отображает в интерфейсе пользователя информацию из полей документа в полях формы (Field). Если для поля формы в документе имеется поле с таким же именем, поле формы отображает информацию из поля документа. Однако поля документа доступны из LotusScript и Java независимо от того, какая форма используется (и используется ли вообще), чтобы отображать документ в интерфейсе пользователя.

Свойства объекта класса [Notes]Itern позволяют определить имя и тип поля, размер значения поля в байтах, контролировать, может ли информация из поля отображаться в виде, должна ли «подписываться» или шифроваться информация из поля, получать и устанавливать значение поля как массив или значение типа дата-время, получать «простой» текст (Plain Text) из поля типа RichText. Методы объекта класса [Notesjltem позволяют выполнять некоторую обработку значения из текстового поля, добавлять значения в поле типа «текстовый список», проверять, содержится ли заданное значение в поле типа «список» как элемент, копировать поле в другой документ и удалять поле из документа.

Класс [Notesjltem является базовым для класса [NotesJRichTextrtem, представляющего поля типа RichText в документах. Это означает, что объект класса [NotesJRichTextltem наследует все свойства и методы класса [Notes]Item, и, дополнительно, имеет еще и свои собственные свойства и методы, присущие только полям типа RichText. Однако это никак не отражается на «контейнерной» иерархии - объект класса [NotesJRichTextltem «не содержится» в объекте класса [Notesjltem.

«Контейнерная иерархия»

LotusScript I NotesDocument —> Notesltem -> NotesDocument

Java I Document _> Item -> Document_____________|________________________________________________DateTime____________

Для создания нового объекта класса [Notesjltem возможны следующие пути:• метод New (только LotusScript);• методы replaceltemValue или appendltemValue класса [NotesJDocument;• методы copyltem или replaceltem класса [NotesJDocument и метод copyltemToDocument

класса [Notesjltem (создание нового объекта на основе объекта, который ужесуществует).Метод New создает в документе новое поле с заданным именем и заданным значением.

Тип поля, если он не указан явно, устанавливается согласно типу заданного значения.

Dim notesltem As New Notesltem( notes Document, name$, valueV [, specialType% J ) или

Set notesltem = New Notesltem( notesDocument, name$, value У [, specialType% ] )

Параметр notesDocument (объект класса NotesDocument) определяет документ, в котором создается новое поле. Параметр пате$ (тип String) задает имя (название) нового поля. Параметр value - значение, присваиваемое этому полю. Тип значения в LotusScript определяет тип поля в Notes, как это дается в следующей таблице.

Тип value в LotusScript Тип поля в Notes

String Text (если указан specialType%, может быть Names,Readers или Authors)

Array of Strings Text List (если указан specialType%, может бытьNames, Readers или Authors)

© InterTrust Co. Тел, (095) 9567928

Page 109: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

606 Встроенные классы LotusScript и Java

Integer, Long, Single, Double, NumberCurrency

Array of Integers, Longs, Singles, Number List

Doubles, или Currencies .

Variant of type DATE Date/Time

Array of Variants of type DATE Date/Time List

Необязательный параметр specialType% - константа типа Integer, конкретизирующая тип создаваемого поля. Используется только в случае, если параметр value имеет тип String. Может принимать одно из значений: NAMES, READERS или AUTHORS. Позволяет уточнить, что заданное значение должно интерпретироваться как имена (NAMES), имена читателей (READERS) или имена авторов (AUTHORS) и приводить к созданию поля соответственно типа Names, Readers или Authors.

Пример 1. Скрипт создает три новых поля в документе: типа Text, Number и Date/Time.

Dim doc As NotesDocumentDim textltem As Notesltem - . iDim numberltem As NotesltemDim dateTimeltem As Notesltem'...set value of doc...Set textltem = New Notesltem( doc, "Region", "South America" )Set numberltem = New Notesltem( doc, "Earnings",, 98 )Set dateTimeltem = New Notesltem{ doc, "LastAccessed", Today )Call doc.Save( True, True )

Пример 2. Скрипт создает новое поле типа Text и присваивает ему список из трех элементов.

Dim doc As NotesDocumentDim textListltem As NotesltemDim newValues( 0 To 2 ) As String' . . .set value of doc...newValues( 0 ) = "Bicycle"newValues( 1 ) = "Train"newValues( 2 ) = "Foot"Set textList = New Notesltem( doc, "Choices", newValues )Call doc.Save( True, True ) ,

3. Скрипт создает новое поле типа Authors и присваивает ему список из двух элементов.

Dim doc As NotesDocument1...set value of doc...Dim newValues( 1 To 2 ) As StringnewValues{ 1 ) = "Mariko Nakamura"newValues( 2 ) = "Pierre Singer"Dim authorsltem As New Notesltem _

(doc, "docAuthors", newValues, AUTHORS) Call doc.Save( True, True )

Для получения объекта класса [NotesJItem, представляющего существующее поле в документе, возможны такие пути:• для доступа к полю, когда известно его имя, используется метод getFirstltem класса

[NotesJDocument;• для доступа ко всем полям в документе удобно свойство Items класса [Notes]Document.

Для удобства разработчиков класс [NotesJDocument имеет методы, которыми можно работать с полями документа без явного объявления и создания объекта класса [NotesJJtem:

© InterTrust Co. Тел. (095) 9567928

Page 110: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 607

• метод getltemValue для получения значения поля;• метод replaceltemValue для изменения значения поля;• метод appendltemValue для создания нового поля с заданным значением;• метод hasltem для проверки наличия в документе поля с указанным именем;• метод removeltem для удаления поля из документа;• использование имени поля в качестве свойства объекта класса NotesDocument (т.н.

синтаксис расширенного класса).

Новое или модифицированное поле будет сохранено в документе, а документ в базе, только после того, как вы примените к этому документу метод save.

Чтобы информация из созданных полей могла отображаться в видах и папках, явно устанавливайте для полей свойство fsSummary равным true.

3.20.1. Свойства

Свойство Parent - «родитель»LotusScript: Set notesDocument ~ notesIlem.P'Arent

Java: Document doc = ftemgetParentQ :

Объект класса [NotesjDocument, содержащий данное поле.

Свойство Name - «имя поля»LotusScript: itemNameS = notesItem.Name

Java: String itemName =//e/n.getName()Имя (название) поля, тип String. В документе может быть несколько полей с одинаковым

именем. Присоединенные файлы обычно хранятся в полях с именем $FILE.

Свойство''Ту ре' - «тип- поля» " •••'. '•• •'•"-'• ••:"' ' ;:;; './• •.."..:.';': '•. ;•,;•• ••"• • ;-j..;:...' • ;••'.-.'•'•'• .:.•,'•.•::'••:,;:.• - / •'.LotusScript: itemType% - notesItem.TypeJava: int itemType = /tem.getType()Тип (данных) поля. Возвращаемое значение itemType (тип Integer/int) может быть одним

из следующих:• ТЕХT/Item.TEXT - поле типа Text (Text List), Names, Readers или Authors;• NAMES/Item.NAMES - поле типа Names; : : ;

• КЕАВЕК5Л1ет.КЕАВЕК8 - поле типа Readers;• AUTHORS/Item.AUTHORS - поле типа Authors;• RICHTEXT/Item.RICHTEXT - поле типа RichText;• HTML/I tern. HTML - поле содержит HTML-код;• АТТАСНМЕОТЯ1ет.АТТАСНМЕШ' - поле содержит присоединенный файл;• EMBEDDEDOBJECT/Item.EMBEDDEDOBJECT - поле содержит встроенный объект;• NOTELINKS/Item.NOTELINKS - поле содержит ссылку на документ, вид или базу:• OTHEROB JECT/Itern.OTHEROBJECT - поле содержит другие объекты;• NOTEREFS/Item.NOTEREFS - поле-ссылка на «родительский» документ, например, $Ref;

© InterTrust Co. Тел. (095) 9567928

Page 111: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

608 Встроенные классы LotusScript и Java

• NUMBERS/Item.NUMBERS - поле типа Number (Number List);• DATETIMES/Item.DATETIMES - поле типа Date/Time (Date/Time List);• S!GNATURE/Item.SIGNATURE - поле типа Cryptographic Signature, например $Signature

в почтовом сообщении или $51§_<имя секции> в документе с подписываемымисекциями;

• FORMULA/Itern.FORMULA - поле содержит @-формулу Notes;• ICON/Item.ICON - поле содержит пиктограмму;• USERDATA/Item.USERDATA - поле определяемого разработчиком типа (такие поля

могут создаваться средствами Notes API);

• ERRORITEM/Item.ERRORITEM - при определении типа поля возникла ошибка; '» UNAVAILABLE/Item.UNAVAILABLE -тип поля недоступен;• UNKNOWN/Item.UNKNOWN - тип поля неизвестен.

В Domino версий 4.x свойство Туре для полей типа Names, Readers и Authors возвращает TEXT. Для уточнения типа такого поля нужно использовать свойства IsNames, IsReaders, IsAuthors. Но в Domino версий 5.x для полей типа Names, Readers и Authors свойство Туре возвращает соответственно NAMES, READERS, AUTHORS.

Свойство IsAuthors - «поле типа Authors»LotusScript: flag — notesItem.IsAuthors notesItem.lsAuthors -flag

Java: boolean flag = /rew-isAuthorsQ voidItem.setAuthors(booIean flag)

True означает, что поле, для которого свойство Туре возвращает TEXT, содержит список имен пользователей, имеющих доступ автора к данному документу. Если поле типа TEXT не является списком авторов документа, возвращаемое или устанавливаемое значение равно false.

Пример. Если поле From имеет тип Authors, скрипт добавляет в это поле еще одного автора -Jeffrey Kinnamon/Acme.Dim doc As NotesDocumentDim item As Notesltern '•••••' . . .set value of doc.. .Set item = doc.GetFirstltem( "From" )If ( item.IsAuthors = True ) ThenCall item.AppendToTextList( "Jeffrey Kinnamon/Acme" )Call doc.Save( False, True )

End If

Свойство IsReaders - «поле типа Readers»LotusScript: flag — notesItem.IsReaders notesItem.IsRe&ders -flag

Java: boolean flag =/ifew.isReaders() void Item.se.iReaders(boo/ean flag)

True означает, что поле, для которого свойство Туре возвращает TEXT, содержит список имен пользователей, серверов, групп и ролей тех, кто имеет право «видеть» этот документ. Если поле типа TEXT не является списком имен имеющих право «видеть» этот документ, возвращаемое или устанавливаемое значение равно false.

Свойство IsNames - «поле типа Names»LotusScript: flag = notesItem.lsNames notesltem.IsNames -flag

© InterTrust Co. Тел. (095) 9567928

Page 112: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 609

Java: boolean flag = /tew.isNames() void I(ern.$eiN%.m&s(hoolean flag)

True означает, что поле, для которого свойство Туре возвращает TEXT, содержит список имен пользователей, серверов, групп... Если поле типа TEXT не является списком имен, возвращаемое или устанавливаемое значение равно false.

Свойство IsSummary - «информация из поля может отображаться в виде»LotusScript: flag — «oto/fem.IsSummary «ofes/?ew.IsSummary -flag

Java: boolean flag = /fem.isSummary() void Item.setSummary(boolean flag)

Если flag = true, то значение данного поля может быть показано в столбце вида или папки, если false, то нет.

Каждое поле имеет флаг SUMMARY, сигнализирующий о том, может ли значение поля показано в виде или папке, или не может. Вы можете узнать значение этого флага из окна свойств документа (Рис. 3.29). Если для конкретного поля, например, Subject, в секции Field Flags имеется флаг SUMMARY, это поле может быть показано в виде или папке. Если же флаг SUMMARY отсутствует - значение поля не может быть показано в виде или папке.

Рис. 3.29 Поле Subject имеет флаг SUMMARY

Информация из поля типа RichText не может быть показана в столбце вида - свойство IsSummary для объекта класса [NotesJRichTextltem всегда возвращает false. В LotusScript при создании нового поля методом New свойство IsSummary по умолчанию устанавливается в значение false. В LotusScript и Java при замене значения поля методом replaceltemValue класса [NotesJDocument свойство IsSummary no умолчанию устанавливается в значение false, а при создании нового поля методом appendltemValue класса [NotesJDocument или с использованием «синтаксиса расширенного класса» (только LotusScript) свойство IsSummary по умолчанию устанавливается в true. Так что не забывайте при работе с полями устанавливать их свойство IsSummary в нужное вам значение.

Свойство SaveToDisk - «сохраняется ли поле при сохранении документа»LotusScript: flag - notesItem.S'AveToDisk «ofes/fcffj.SaveToDisk —flag

Java: boolean flag = 7/ew.isSaveToDisk() voidItem.setSsveToDisk(boolean flag)

Если flag = true (это значение по умолчанию), то значение данного поля будет сохраняться при сохранении документа в базе, если false, то не будет.

Когда документ уже существует в базе, а вы «программно открываете» его и «отмечаете» в нем некоторые поля как «не сохраняемые», эти поля будут «устранены» в базе только после сохранения документа методом save.

) InterTrust Со. Тел. (095)9567928

Page 113: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

610 Встроенные классы LotusScript и Java

Свойство IsSigned - «поле подписывается»LotusScript: flag = notesItem.IsSigned notesItem.IsSigned = flag

Java: boolean flag = /?em.isSigned() void Item.setSigned(boo!ean flag}

Если flag -• true, то данное поле «подписывается», если false - нет.

- - - . - - . - ' ; '. «fMC^vi-^ '<

Свойство IsEncrypted - «поле подлежит шифрованию»LotusScript: flag = wotofte/w.IsEncrypted notesltem.lsllncrypted -flag

Java: boolean flag - /feffz.isEncrypted() void/tem.setEncrypted(ioo/ea« flag)

Если flag = true, то информация из данного поля должна шифроваться, если false - нет. Учтите, что значение поля фактически будет зашифровано только тогда, когда к документу будет применен метод encrypt.

Свойство IsProtected - «для изменения необходим доступ выше автора»LotusScript: flag = notes Item.IsProtecteu notesItem.lsProtecteA -flag

Java: boolean flag - /ton.isProtected() voidItem,setProt&cted(boolean flag)

Ест flag = true, то для модификации данного поля пользователь должен иметь к базе как минимум доступ редактора (доступа автора недостаточно), если false - то для модификации поля достаточно доступа автора к базе и «наличия авторских прав» по отношению кдокументу.

Свойство LastModified - «время модификации поля»LotusScript: dateV— «ofes/tew.LastModified „

Java: DateTime dt = //e/ra.getLastModified()

Время последней модификации поля (в LotusScript - Variant of type DATE, в Java - объект класса DateTime). Возвращенное время может быть меньше, чем время модификации документа, поскольку при последней модификации документа данное поле могло не менять своего значения.

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

Свойство ValueLength - «размер поля в байтах»LotusScript: size& = notesItem.ValueLength

Java: int size = 7/em.getVaIueLength()

Размер значения поля в байтах, включая «накладные расходы» (тип Long/int).

Пример. Функция для заданного параметром документа вычисляет общий размер присоединенных к документу файлов.

Function AttachmentSizes( doc As NotesDocument ) As IntegerDim itms As Variant . - .Dim totalSize As Long itms = doc.Items

> InterTrust Co. Тел. (095) 9567928

Page 114: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 611

totalSize = 0 • .-.-•; • • - . • •Forall i In itms

If ( i.Type = ATTACHMENT ) ThentotalSize = totalSize + i.ValueLength

End IfEnd Forall '•'"•'•'-AttachmentSizes = totalSize

End Function

Свойства Values, ValueStrmg,ValueInteger,VaIueDouble - «значения поля» LotusScript: valuesArray = notesltem.\alues

notesltem. Values = valuesArray

Java: java.util. Vector values - Item, get Val uesQ

void Item.$etValue$(java.utii. Vector values)

String value = /fem.getVaIueStrmg()

void Item.$etV&lueString(String value)

int value = Jtem.getVaIueInteger()

void //em.setValue!nteger(m^ value)ь

double value = 7fe/?z.getValueDoubleO

double /?em.setValueDouble(w/ value)

Свойство Values возвращает или позволяет задавать «массив» значений для поля. В LotusScript это действительно массив, в Java - объект класса java.util.Vector. Тип элементов «массива» зависит от типа поля, как это показано в следующей таблице.

Тип поля Тип/класс элементов «массива» значений

RichText String, Plain Text значения поля в элементе с индексом О

Text и Text List (включая String

Names, Authors и Readers)

Number и Number List Double

Date/Time и Date/Time List Double/DateTime

Attachment String, имя присоединенного файла в элементе синдексом 0.

Имеющиеся в классе Item (только Java) свойства ValueString,ValueInteger,ValueDouble позволяют получать или устанавливать значения «не списковых» полей соответствующих типов.

Пример. Скрипт выводит все элементы текстового поля-списка с имелем TextList.

Dim doc As NotesDocument' . ..set value of doc...Dim item As NotesltemSet item = doc,GetFirstltem( "TextList" )Forall v In item.ValuesMessagebox( v )

End Forall

© InterTrust Co. Тел. (095) 9567928

Page 115: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

612 Встроенные классы LotusScript u Java

Свойство Text - «текстовое представление значения поля»LotusScript: itemText$ - notesItem.Text

Java: String itemText = 7/<?OT.getText()

String itemText = Item.getTent(int maxleri)

Возвращает строку, содержащую Plain Text значений поля. Значения элементов списка в возвращаемой строке будут разделены точкой с запятой. Если значение поля слишком длинное, оно усекается. Для поля типа RichText свойство возвращает только текст (естественно, без шрифтового выделения), пропуская нетекстовые данные (изображения, присоединенные файлы...). Для поля типа HTML свойство возвращает Null/null. В Java имеется возможность извлекать из поля не более заданного количества maxlen символов.

Пример 1. Возвращается текст из поля Body типа RichText. Считаем, что doc - уже установленный объект класса NotesDocument. Предположим, что в поле Body содержится текст "Sally, here's the attachment you requested," а вслед за ним - присоединенный файл. Тогда свойство Text вернет строку "Sally, here's the attachment you requested".Dim item As NotesItem /Dim contents As StringSet item = doc.GetFirstltem( "Body" )contents = item.Text

Пример 2. В этом примере предполагается, что поле Amount имеет тип Number. Считаем, что doc -уже установленный объект класса NotesDocument. Предположим, что в документе значение поля Amount равно 35.2. Свойство Text вернет строку "35.2".

Dim item As Notes ItemDim contents As StringSet item = doc.GetFirstltem( "Amount" )contents = item.Text

Пример 3. Эта функция для документа-параметра возвращает новый документ, содержащий в поле Body информацию о содержимом всех полей исходного документа, кроме тех полей, в имени которых присутствует "$". Для каждого поля исходного документа в поле Body создаваемого документа попадает информация вида "<имя поля> : <значение поля><Новая строка>". Для поля Body объект класса NotesRichTextltem использован только затем, чтобы информация по каждому полю начиналась с новой строки.

Function createPlainDoc( doc As NotesDocument ) As NotesDocument Dim db As NotesDatabase Dim piainDoc As NotesDocument Dim plainltem As NotesRichTextltem Set db = doc.ParentDatabase Set piainDoc = New NotesDocument( db )Set plainltem = New NotesRichTextltem( piainDoc, "Body" ) . -itemList = doc.Items Fora11 i In itemList

If ( Instrf i.Name, "$" ) = 0 ) ThenCall plainltem.AppendText( i.Name + ": " + i.Text ) Call plainltem.AddNewLine( 1 ) End If End ForallSet createPlainDoc = piainDoc

End Function

Пример 4, Java-агент для выбранных пользователем документов выводит сведения обо всех содержащихся в них полях: имя поля, тип, размер, дата модификации поля и до 80 байтов текстового представления значения поля.

import; j ava . util. Vector; ©

InterTrust Co, Тел. (095) 9567928

Page 116: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 613

import j ava. util. Enumeration; - . - . . , - - , .// Java-Item/PropertyDocumentCollection dc = agentContext.getUnprocessedDocuments();Document doc = dc . getFirstDocument (} ;if (doc != null){Enumeration items = doc.getltems().elements();while (items.hasMoreElements()){Item item = (Item)items.nextElement(); " •-String type;switch (item.getType()) • •{case Item.ACTIONCD: type = "Action CD"; break;case Item.ASSISTANTINFO: type - "Assistant information"; break;case Item.ATTACHMENT: type - "File attachment"; break;case Item.AUTHORS: type = "Authors"; break;case Itern..COLLATION: type = "Collation"; break;case Item.DATETIMES: type = "Date-time or range"; break;case Item.EMBEDDEDOBJECT: type = "Embedded object"; break;case Item.ERRORITEM: type = "Error while accessing type"; break;case Item.FORMULA: type = "Formula"; break;case Item.HTML: type = "HTML source text"; break;case Item.ICON: type — "Icon"; break;case Item.LSOBJECT: type = "LotusScript object"; break;case Item.NAMES: type = "Names"; break;case Item.NOTELINKS: type = "Link to db, view, or doc"; break; •case Item.NOTEREFS:type - "Reference to the parent doc"; break;case Item.NUMBERS: type = "Number or number list"; break;case Item.OTHEROBJECT: type = "Other object"; break;case Item.QUERYCD: type = "Query CD"; break;case Item.RICHTEXT: type = "Rich text"; break;case Item. READERS: type =- "Readers"; break;case I tern. SIGNATURE: type = "Signature"; break;case Item.TEXT: type = "Text or text list"; break;case Itern.UNAVAILABLE: type = "Unavailable type"; break;case Item.UNKNOWN: type = "Unknown typet"; break;case Item.USERDATA: type = "User data"; break;case Item.USERID: type = "User ID name"; break;case Item.VIEWMAPDATA: type = "View map data"; break;case Itern.VIEWMAPLAYOUT: type = "View map layout"; break;default : type = "Other " + item.getType(); }

System, out .println (item. getName (}); •., /, ,,System.out.println(type);System.out.println(item.getValueLength() + " bytes"); ;

System.out.println("Last modified " +item,getLastMcdified().getLocalTime());

if (item.getText().length() == 0) System.out.println("[no text]\n"); else System.out.println(item.getText(80) + "\n"); }doc = dc.getNextDocument();

} . - ••-•- •"••

t

Свойство DateTimeValue - «значение поля типа Date/Time как объект» LotusScript: Set notesDateTime = wjtes'AeOT.DateTimeVaiue

notesItem.TdateFimeValne = notesDateTime

© InterTrust Co. Тел. (095) 9567928

Page 117: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

614 Встроенные классы LotusScript u Java

Java: DateTime dt — //em.getDateTimeVa!ue()

void Item,seiDateTimeValue(DateTime dt)

Для поля типа Date/Time это значение поля как объект класса [NotesjDateTime. Для полей других типов возвращается Nothing/null.

Пример 1. Скрипт конвертирует значение поля DateComposed в объект класса NotesDateTime.

Dim item As Notes IternDim dateTime As NotesDateTimeSet item - doc.GetFirstltem( "DateComposed" )Set dateTime — item.DateTimeValue

Пример 2. Скрипт присваивает текущую дату полю DateApproved в документе.

Dim doc As NotesDocumentDim item As NotesltemDim dateTime As NotesDateTime' ...set value of doc...Set. item = doc. GetFirstltem ( "DateApproved" )Set dateTime = New NotesDateTime( "Today" ) <item.DateTimeValue = dateTimeCall doc.Save( False, True )

3.20.2. Методы

Метод abstract/abstraetText - «сокращенное представление значения поля» LotusScript: abbreviations ~ notesltem,abstrsct( maxlen&, dropVowels ,

useDictionary )

Java: String abbreviation = /fem.abstractText(/n/ maxlen, boolean dropVowels,

boolean useDictionary)

Возвращает соответствующим образом обработанное значение поля типа Text. Параметр maxlen (тип Long/int) задает максимапьную длину возвращаемой строки. Если флаг dropVowels равен true, в словах из поля будут пропускаться гласные, если false - нет. Если флаг useDiclionary равен true, будет использоваться таблица сокращений из файла NOTEABBR.TXT, если false - не будет. Возвращаемое значение дает содержимое поля, с пропущенными гласными и выполненными сокращениями, если это было запрошено, и усеченное до длины maxlen.

Метод appendToTextList - «добавление элементов в текстовый список»LotusScript: Call notesItem.appendToTex.tList( newValues)

Java: void Item. appendToTextList(iSW/7g new Value)

void Item. appendToTextList(/'ava.w//7. Vector newValues)Добавляет одно или несколько новых значений newValues (в LotusScript тип String или

Array of Strings, в Java - объект класса String или класса java.util.Vector с элементами класса String) в поле, которое является текстовым списком. Операция не приводит к удалению существующих значений.

Пример 1. Скрипт добавляет значение "Shocks" в поле Categories. Например, если у поля Categories до выполнения скрипта было значение "Clocks":"Blocks", то после выполнения значение будет "Clocks": "Blocks": "Shocks".

© InterTrust Co. Тел. (095) 9567928

Page 118: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: (а^формулы, LotusScript, встроенные классы LotusScript и Java 615

Dim doc As NotesDocument • . - . . - • .Dim item As Notesltem' ...set value of doc...Set item = doc.GetFirstltem( "Categories" )Call item.AppendToTextList( "Shocks" )Call doc.Save{ False, True )

Пример 2. Скрипт добавляет три новых текстовых значения в поле Categories.

Dim doc As NotesDocumentDim item As Notesltem' . . .set value of doc. . . • • . . - . : •Set item = doc.GetFirstltem( "Categories" )Dim newVals( 1 To 3 ) As StringnewVals( 1 ) = "Girls"newVals( 2 ) = "Boys"newVals( 3 ) = "Toys"Call item.AppendToTextList{ newVals )Call doc.Save( False, True }

Пример 3. Java-агент добавляет 4 элемента в текстовое поле: первые два - «по одному», следующие два - из «вектора».

import Java.util.Vector;// (Your code goes here)//...set value of doc...Item item = doc.getFirstltem("textListltem");item.appendToTextList("Add Element 1") ;item.appendToTextList("Add Element 2");Vector v ~ new Vector();v.addElement("Add Element. 3");v.addElement("Add Element 4");item.appendToTextList(v);

Page 119: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

616 Встроенные классы LotusScript u Java

Пример 3. Java-агент, прежде чем добавить новое значение в поле - текстовый список, проверяет, не содержится ли уже в нем это значение.

// (Your code goes here)//. . .set value of doc. . .Item item = doc.getFirstltem("textListltem");if (!item.containsValue("Motorcycle"))item. appcndToTextList ( "Motorcycle") ; .-.';'.•

doc.save();

Метод copyltemToDocument - «копирование поля в документ» LotusScript: Set notesltem = notesItem.copyItemToDocument( notesDocwnent,

newNameS )

Java: Item item ~ Item.copyItKm'ToDocumejat(Document doc)

Item item = Item.copyIteinToDocument(Dociiment doc. String newName)

Копирует поле, к которому применяется метод, в документ (объект класса [Notes]Document), заданный первым параметром метода, с прежним именем поля или именем newName (тип String) и возвращает объект класса [NotesJItem, представляющий копию поля. Если в LotusScript указать в качестве newName пустую строку (""), а в Java - воспользоваться вариантом метода с одним параметром, поле-копия будет иметь то же имя, что и оригинал.

При копировании полей типа RichText, т.е. применении метода к объектам класса [NotesJRichTextltem, следует учитывать, что «содержащиеся в поле-оригинале» присоединенные файлы, встроенные объекты или ссылки на объекты данным методом не копируются в «документ-мишень».

Пример. Скрипт копирует поля Body и BriefDescription из документа в новое почтовое сообщение в текущей базе, и отправляет его. Иоле Body копируется под прежним именем, а поле BriefDescription изменяет имя на Subject.

Dim session As New NotesSessionDim db As NotesDatabaseDim doc As NotesDocumentDim memo As NotesDocumentDim itemA As Notesltem : '

т

Dim. itemB As NotesltemSet db = session.CurrentDatabase'...set value of doc...Set iternA = doc . Get First Item ( "Body" )Set itemB = doc.GetFirstltem( "BriefDescription" )Set memo = New NotesDocument( db )Call itemA.CopyTtemToDocument( memo, "" )Call itemB.CopyItemToDocument( memo, "Subject" )Call memo.Send( False, "Cynthia Brainey" )

Метод remove - «удаление поля из'документа»LotusScript: Call rtotesltem.removeJava: void Item. reinove()Удаляет поле из документа. Произведенное удаление «вступит в силу» после сохранения

документа, содержавшего удаленное поле, методом save. Кроме того, удалить поле из документа можно методом removeltem из класса [NotesjDocument.

© InterTrust Co. Тел. (095) 9567928

Page 120: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: ^-формулы, LotusScript, «строенные классы LotusScript и Java 617

3.21. «Поле типа RichText» - класс fNotesJRichTextltemОбъект класса [Notes] RichTextltem представляет поле типа RichText. В свою очередь

может содержать объект класса [NotesjEmbeddedObject.

Класс [NotesJRichTextltem наследует все свойства и методы класса [NotesJItem. Но имеет и ряд собственных свойств и методов. Единственное «собственное» свойство позволяет получать доступ к имеющимся в поле OLE-объектам и присоединенным файлам (как массив объектов класса [NotesjEmbeddedObject). «Собственные» методы позволяют формировать текст поля из «простого» текста и других полей типа RichText, вставлять разделители строк, описатели стилей текста (объект класса [NotesJRichTextStyle) и описатели стилей абзаца (объект класса [NotesjRichTextParagraphStyie), табуляции, ссылки на документы, виды и базы, добавлять присоединенные файлы, встраивать объекты, а также извлекать из поля «простой» текст и OLE-объекты и присоединенные файлы по имени,

«Контейнерная иерархия»

LotusScript NotesDocument —> NotesRichTextltem —> NotesEmbeddedObject_____________________________________________________________NotesDocument______________Java Document _> RichTextltem -> NotesEmbeddedObject

_____________________________________________________________Document__________________

Вы можете либо создать новый объект класса [NotesJRichTextltem, либо получить доступк существующему.

Для создания нового объекта используют или метод New (только LotusScript), или метод createRichTextltem класса [Notes]Document (LotusScript и Java).

Метод New использует два параметра: объект класса NotesDocument, в котором создается поле, и строка, задающая имя нового поля.

Dim variableName As New NotesRichTextItem( notesDocument, name$ ) или

Set notesRichTextltem = New NotesRichTextItem( notesDocument, nameS )

Для поиска существующих полей типа RichText в документе и получения представляющих их объектов класса [Notes] RichTextltem используются методы класса [Notes]Document. Так, когда известно имя поля, наиболее часто используют getFirstltem класса [NotesJDocument.

Однако имеется одна тонкость: если каждое поле типа RichText является «просто» полем, то обратное в общем не верно. Поэтому и LotusScript, и Java не позволяют присваивать результат метода, возвращающего объект базового класса ([NotesJItem), переменной, объявленной как ссылка на объект производного класса ([NotesJRichTextltem), Дело в том, что иначе станет возможным присвоить переменной класса [NotesJRichTextltem значение переменной класса [NotesJItem, представляющей поле не типа RichText (например, Date/Time) и затем применить к первой переменной методы класса [NotesJRichTextltem.

Правильный подход к написанию кода в LotusScript состоит в том, чтобы объявить переменную типа Variant, присвоить ей ссылку на объект класса Notesltem, затем проверять свойство Туре, чтобы убедиться, что это действительно поле типа RichText. Если это так, можно затем применять методы и свойства класса NotesRichTextltem к этой переменной типа Variant.

Пример. Скрипт получает доступ к существующему полю типа RichText с именем PrqjectDescription, используя метод GetFirstltem, который возвращает ссылку на объект класса Notesltem. Однако ссылка присваивается переменной rtitem типа Variant. Затем проверяется, действительно ли поле ProjectDescription типа RichText, и только после этого к переменной rtitem типа

© InterTrust Co. Тел. (095) 9567928

Page 121: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

618 Встроенные классы LotusScript u Java

Variant применяют «собственные» методы класса NotesRichTextltem - добавление символа перехода на новую строку и текста.

Dim doc As NotesDocument '...set value of doc. . . - . • Dim rtitem As VariantSet rtitem = doc.GetFirstItern( "ProjectDescription" } If rtitem.Type = RICHTEXT Then

Call rtitem.AddNewLine( 1 )Call rtitem.AppendText( "Этот текст добавляется в поле типа RichText." )

End If Call doc.Save( False, True )

Правильный подход к написанию кода в Java состоит в явном приведении типа возвращаемого методом getFirstltem объекта класса Item к типу RichTextltem.Document doc;//...set value of doc.,.RichTextltem rtitem ~ {RichTextltem)doo,getFirstltem("Body");

3.21.1. Свойство ,

Свойство EmbeddedObjects - «встроенные объекты и присоединенные файлы»LotusScript: notesEmbeddedOhjeci'Array — notesRichTextltem.EmbeddedObjects

Java: java.util. Vector Richl^extltem.getEmbeddedObjectsQ

«Массив» встроенных объектов, ссылок на объекты и присоединенных файлов (в LotusScript тип Array of NotesEmbeddedObjects, в Java - объект класса java.util.Vector с элементами класса EmbeddedObject), содержащихся в поле типа RichText, к которому применяется метод.

Свойство EmbeddedObjects не поддерживается на платформах OS/2, UNIX и Macintosh.

Пример. Java-агент выводит список имен содержащихся в поле Body объектов и присоединенных файлов.

import java.util.Vector;import java,util.Enumeration;// (Your code goes here)//.. .set value of doc. . .System.out.printIn(doc.getltemValueString("Subject"));RichTextltem body = (RichTextltem}doc.getFirstltem("Body");Vector v = body.getEmbeddedObjects();Enumeration e = v.elements();while (e.hasMoreElements()){EmbeddedObject eo = (EmbeddedObject)e.nextElement();System, out.println ( "\t" + eo. getNaine () ) ;

i . . . . ,

3.21.2, Методы

Метод appendText - «добавить текст»LotusScript: Call notesRichTextItem.appendTeTtt( text$ )

Java: void RichTextltem. appendTex.t(String text)

© InterTrust Co. Тел. (095) 9567928

Page 122: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: (^-формулы, LotusScript, встроенные классы LotusScript и Java 619

Добавляет в поле («прицепляет в конец») текст из строки text. Добавленный текст «оформляется» текущим стилем поля.

Метод appendRTItem - «добавить содержимое поля типа RichText»LotusScript: Call notesRichTextItem.appendR'Tltem( notesRichTextltem )Java: void RichTextltem. inppendWritem(RichTextItem item)Добавляет в поле («прицепляет в конец») содержимое поля типа RichText, заданного

параметром метода.

Метод addNewLine - «добавить новые строки»LotusScript: Call note.4RichTextItem.&ddNewL,ine( n% [,forceParagraph ] )

Java: void RichTextltem.addNcwLineQ

void RichTextItem.ad(lNewlAne(int n)

void RichTextltem, addNewLine(;>rf и, boolean forceParagraph)

Добавляет в поле («прицепляет в конец») и (тип Integer/int) символов перевода строки (CR).

Если флаг forceParagraph равен true (значение по умолчанию), то с новой строки будет начат новый абзац (т.е. вслед за последним символом перевода строки будет вставлен разделитель абзацев), если false - новый абзац с новой строки не начнется (т.е. разделитель абзацев не будет вставлен).

Метод appendStyle - «добавить описатель стиля текста»LotusScript: Call notesRichTextItem.appendStyle( NotesRichTextStyle)Java: void RichTextItem.appenuStyle(RichTextStyle style)Добавляет в поле («прицепляет в конец») заданный объектом класса [NotesJRichTextStyle

описатель стиля текста. В результате текст, который затем будет добавлен после данного описателя стиля, будет оформляться в соответствии с этим стилем, пока не будет добавлен другой описатель стиля.

Однако на информацию, добавляемую методом appendRTItem, данный описатель стилявлияния не окажет - в содержимом добавляемого поля типа RichText имеются свои описателистилей. >

Пример. Скрипт оформляет текст, вводимый пользователем для поля Body, шрифтом Courier размера 14 пунктов.

Dim session As New NotesSessionDim db As NotesDatabaseSet db = session.CurrentDatabaseDim doc As New NotesDocument(db)Call doc.AppendltemValue("Subject", Inputbox("Subject?"))Dim richStyle As NotesRichTextStyleSet richStyle = session.CreateRichTextStylerichStyle.NotesFont = FONT_COURIERrichStyle.FontSize = 14Dim richText As New NotesB.ichTextltem (doc, "Body")Call richText.AppendStyle(richStyle)newPara = Inputbox("Paragraph of text for ""Body"" item")firstPara = True '

© InterTrust Co. Тел. (095) 9567928

Page 123: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

620 Встроенные классы LotusScript и Java

While newPara <> "" . . - - - • . . -If firstPara Then

firstPara = FalseElse

Call richText .AddNewLine (2) • • - .••-•>< .••.'-•' • •. ' ' ;= :,End IfCall richText.AppendText(newPara)newPara = Inputbox("Paragraph of text for ""Body"" item")

Wend Call doc.Save(True, False)

© Метод appendParagraphStyle - «добавить описатель стиля абзаца» LotusScript: Call notesRichTextItem.appendParagraphStyle(

NotesRichTextParagraphStyle)

Java: void RichTextItem,appendPamgraphStyle(RichTextParagraphStyle pstyle)

Добавляет в поле («прицепляет в конец») заданный объектом класса [NotesJRichTextParagraphStyle описатель стиля абзаца, В результате текст, который будет добавляться в поле после данного описателя стиля, станет форматироваться этим стилем абзаца, пока не будет добавлен новый описатель стиля абзаца.

Пример. Java-агент оформляет информацию в поле Body двумя стилями абзаца.// Java-RTItem/ParagraphStyleDatabase db = agentContext.getCurrentDatabase();Document doc = db.createDocument();Item subject := doc . replaceltemValue ( "Subject ",

"Rich text paragraph style");RichTextltem body = doc.createRichTextltem("Body"); // Стиль абзаца для заголовкаRichTextParagraphStyle h = session.createRichTextParagraphStyle( ) ; h.setAlignment(RichTextParagraphStyle.ALIGN_CENTER); h.setPagination(RichTextParagraphStyle.PAGINATE_KEEP_WITH_NEXT); h.setSpacingAbove(RichTextParagraphStyle.SPACING_SINGLE); h.setSpacingBelow(RichTextParagraphStyle.SPACING_DOUBLE); // Стиль абзаца для основного текстаRichTextParagraphStyle b = session.createRichTextParagraphStyle( ) ; 'b.setAlignment(RichTextParagraphStyle.ALIGN_LEFT); b.setSpacingAbove(RichTextParagraphStyle.SPACING^SINGLE); b.setSpacingBelow(RichTextParagraphStyle.SPACING_ONE_POINT_50); b.setlnterLineSpacing(RichTextParagraphStyle.SPACING J3INGLE); b.setLeftMargin(RichTextParagraphStyle.RULER ONE_INCH); Ь . setFirstLineLeftMargin(

(int)(RichTextParagraphStyle.RULER_ONE_INCH * 1 . 5 ) ) ; b.setRightMargin(0); // Формирование текста в поле body.appendParagraphStyle(h); body.appendText("Header"); body.appendParagraphStyle(b);for (int i=0; i<16; i++) body.appendText("Line one of body. " ) ; body.addNewLine() ;for (int i=0; i<16; i++) body.appendText("Line two of body. "); doc.save(true, true);

© Метод addPageBreak - «добавить переход на новую страницу»LotusScript: Call notesRichTextItem.suldPsigeJ}reak( [ NotesRichTextParagraphStyle ] )

© InterTrust Co. Тел. (095) 9567928

Page 124: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5; @-формулы, LotusScript, встроенные классы LotusScript и Java 621

Java: vo/W/?/c/z7'ex?/?em.addPageBreak()

void RichTextltem. addPage"Break(RichTextParagraphStyle pstyle)

Добавляет в поле («прицепляет в конец») признак переход на новую страницу. Если был задан параметр метода - объект класса [Notes]RichTextParagraphStyle, определяющий стиль абзаца - то первый абзац новой страницы будет форматироваться указанным стилем абзаца.

Метод addTab-«добавить символы табуляции»LotusScript: Cal! notesRichTextItem.aAArfnb( n% )

Java: void RichTextItem.addTab()

void RichTextltem. addTab(m/ и)

Добавляет в поле («прицепляет в конец») п (тип Integer/int) символов табуляции (Tab).

Добавление символа табуляции «влечет переход» в этой строке на следующую табуляционную метку. Положение табуляционных меток может задаваться программно («массив» объектов класса [Notes]RichTextTab в составе объекте класса [Notes]RichTextParagraphStyle).

Метод appendDocLink - «добавить ссылку на документ, вид, базу»

LotusScript: Call notesRichTextItem.appendDoclAnk( HnkTo,

comments [, hotSpotText$ ] )

Java: void RichTextltem-appendDocLintyDocument doc

[, String comment [, String hotSpotText ] ])

void RichTextItem.&ppendDoK'Linli(Database db

[, String comment f, String hotSpotText ] ] )

void RichTextItem.appenADodjinh(View vw

[, String comment [, String hotSpotText ] ])

Добавляет в поле («прицепляет в конец») ссылку на документ, вид или базу, заданную первым параметром метода (объект класса [NotesJDatabase, [NotesJView или [NotesJDocument). Параметр comment (тип String) содержит поясняющий текст, который увидит пользователь, когда установит курсор мыши на эту ссылку. Добавленный в версии 5.0 параметр hotSpotText задает текст «активной площадки», который будет отображаться вместо стандартной пиктограммы ссылки на документ, вид или базу, а при «нажатии его мышью» вызовет переход по этой ссылке.

Q Без параметра hotSpotText

notSpptTextl С параметром hotSpotText

Рис, 3.30 Различия при отсутствии и наличии параметра hotSpotText

Но обратите внимание на следующий момент. Ссылка на документ содержит, среди прочего, информацию о виде, из которого должен открываться этот документ. Чтобы метод appendDocLink смог получить информацию о виде, содержащем документ, объект [NotesjDocument должен иметь «непустое» значение свойства ParentView, Это свойство, определено, когда объект [Notes]Document, например, был получен из вида. Однако это

© InterTrust Co. Тел. (095) 9567928

Page 125: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

622 Встроенные классы LotusScript и Java

свойство равно Nothing/null, если объект [Notes]Document был получен «напрямую» из базы или из коллекции документов.

Пример. Скрипт создает почтовое сообщение, добавляет в его поле Body набор ссылок на все документы из вида ($А11) текущей базы и отправляет сообщение получателю. По каждому документу из вида в поле Body формируется одна строка, в которой содержится «активная пиктограмма» ссылки на документ, сопровождаемая текстом из поля Subject этого документа.

Dim session As New NotesSessionDim db As NotesDatabase - • , • ••• : .Dim view As NotesViewDim newDoc As NotesDocumentDim rtitein As NotesRichTextltem " ^Dim doc As NotesDocumentSet db = session.CurrentDatabaseSet view = db.GetView( "($A11)" )Set newDoc = New NotesDocument( db )Set rtitem --•== New NotesRichText Item ( newDoc, "Body" )Set doc = view.GetFirstDocumentWhile Not: ( doc Is Nothing ) i

Call rtitem.AppendDocLink( doc, db.Title } ' Ссылка на документCall rtitem.AddTab( 1 ) ' ТабуляцияCall rtitero.AppendText( doc.Subject( 0 ) ) ' ТекстCall rtitem.AddNewLine( 1 ) . ' ' Н а новую строку

Set doc = vj.ew. GetNextDocumerit ( doc )WendnewDoc.Subject = "Here are links to all docs in the Boots folder"newDoc.SendTo = "Nikolay N. lontsev"Call newDoc . Send ( E'alse )

Метод embedObject - «добавить объект или присоединенный файл» LotusScript: Set notesEmbeddedObject = notesRickTextItem.embedQbject( type%,

className$, sourceS, [ name$ } )

Java: EmbeddedObject embObj - RichTextItem.embedObject(int type,

String className, String source, Siring name) Встраивает или

присоединяет OLE-объект или присоединяет файл в поле типа RichText.

Параметр type - константа, определяющая «природу» этого OLE-объекта. Она может быть одной из следующих:

• EMBED JDBJECT/EmbeddedObject.EMBED_OBJECT - embedded data object - встроенныйобъект. OLE-объект хранится в поле. По двойному щелчку мыши запускается связанное сOLE-объектом приложение, в него передается этот OLE-объект. Изменения, внесенные вприложении в OLE-объект, автоматически передаются «назад» в поле.

• EMBED_OBJECTLlNK/EmbeddedObject.EMBED_OBJECTLINK - link to an external object- ссылка на внешний OLE-объект. В поле содержится лишь ссылка на файл OLE-объекта.Сам этот файл хранится не в поле, а вообще отдельно от базы. По двойному щелчкумыши запускается связанное с OLE-объектом приложение, в него передается имя файла ионо загружает этот файл. Изменения, внесенные пользователем в приложении в OLE-объект, сохраняются в файле. При этом, чтобы ссылка в поле оставаласьработоспособной, файл OLE-объекта не должен менять своего местоположения.

• EMBED_ATTACHMENT/EmbeddedObject.EMBED_ATTACHMENT - file attachment -присоединенный файл. Этот файл «логически» хранится в поле (хотя «физически» онхранится в специальном поле с именем $F1LE). По двойному щелчку мыши по

© InterTrust Co. Тел. (095) 9567928

Page 126: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: (шгформулы, LotusScript, встроенные классы LotusScript и Java 623

пиктограмме файла появляется окно свойств. Изменения в файле, которые обычно можно выполнить в приложении, запущенном кнопкой Launch, не вернутся «назад» в поле. Для этого придется заново «переприсоединить» измененный файл.

Рис. 3.31 Окно свойств присоединенного файла

Если type = EMBED_OBJECT и требуется создать новый «пустой» OLE-объект, то параметр className (тип String) задает имя соответствующего объекту приложения (например, "123 Worksheet"), а параметр source задается пустой строкой (""/null). Если же type = EMBED_OBJECTLINK или EMBED_ATTACHMENT, то параметр className задается пустой строкой.

Если type = EMBED_OBJECT и требуется создать OLE-объект из готового файла, то параметр source (тип String) должен определять полное имя этого файла (по его расширению определяется имя связанного с ним приложения), а параметр className задается пустой строкой (""/null). Если же type = EMBED JDBJECTLINK или EMBED_ATTACHMENT, то параметр source задает полное имя «связываемого» или присоединяемого файла.

Параметр пате (тип String) может задавать имя, по которому в дальнейшем вы сможете обращаться к этому объекту. Это имя используется, например, в методе getEmbeddedObject.

Возвращает метод новый объект класса [Notes]EmbeddedObject, представляющий встроенный или присоединенный OLE-объект или присоединенный файл.

Отметим, что файлы могут быть присоединены к полю типа RichText на любой платформе, поддерживающей Notes. Но встроенные или присоединенные OLE-объекты могут быть созданы только на платформах, поддерживающих OLE. В их число не входит OS/2, UNIX и Macintosh.

Пример. Java-агент создает документ с присоединенным файлом в поле Body.

/./ Java-RTItem/embedObjectDatabase db = agentContext.getCurrentDatabase();Document doc = db.createDocument(};doc.replaceltemValue("Subject", "Attachment");RichTextltem body = doc.createRichTextltem("Body");body.appendText("Here is the attachment:");body.addNewLine(2);body.embedObject(EmbeddedObject.EMBED_ATTACHMENT, null,

"c:\\notesr50\\notes.ini", "notesini"); doc.save(true, true);

Метод getEmbeddedObject -«объект [Notes] EmbeddedOb ject из поля типаRichText» • - • . . ' • - • . . . . : . Y '•' • " ..• • •LotusScript: Set notesEmbeddedObject = note$RichTextItem,geiEmbedde(\Qbject(

© InterTrust Co. Тел. (095) 9567928

Page 127: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

624 Встроенные классы LotusScript и Java

nameS )

Java: EmbeddedObjecl embObj - RichTextItem.getEmbeddedQbleet(

String name)

По заданному имени встроенного или связанного OLE-объекта или присоединенного файла из поля типа RichText возвращает объект класса [Notes]EmbeddedObject, представляющий этот OLE-объект или присоединенный файл. Параметр пате типа String, Если объект или файл с заданным именем в поле не найден, возвращается Nothing/null.

Метод getFormattedText - «текст из поля типа RichText»LotusScript: plainText$ - notesRichTextItem.getҐormattedTe\t(tabstrip , lineLength%)

Java: StringplainText = RichTextItem.getҐorm&ttedrYe\t(boo!ean labstrip,

int lineLen, int maxLen)

Возвращает строку, содержащую «простой текст» (Plain Text), полученный из содержимого поля типа RichText.

Если параметр tabstrip равен true, символы табуляции не включаются в «простой текст», если false - включаются. Параметр lineLen (тип Integer/hit) задает количество символов, после которого в «простой текст» принудительно вставляется символ перехода на новую строку. Значение по умолчанию - 0 - трактуется как 80 символов. Параметр int maxLen (тип Integer/int) задает максимальное количество символов, возвращаемых методом. Значение по умолчанию - 0 - трактуется как «весь текст».

v

© InterTrust Со. Тел. (095) 9567928

Page 128: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino JR. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 625

3.22. «Описатель стиля текста» - класс [Notes]RichTextStyleОбъект класса [NotesJRichTextStyle представляет описатель стиля текста, используемый в

полях типа RichText для шрифтового оформления текстовой информации. Имеет только свойства, которые позволяют определить шрифт, размер шрифта, начертание («жирный», курсив, подчеркнутый, перечеркнутый), дополнительные эффекты, цвет, а так же «объявить», что текст, оформленный этим стилем, представляет собой HTML-код и должен передаваться в броузер «без трансляции, как он есть».

«Контейнерная иерархия»

LotusScript NotesSession _> NotesRichTextStyle

Java Session _> RichTextStyle ,

Для создания объекта класса [Notes]RichTextSty!e используется метод createRichTextStyle класса [Notes] Session. Все свойства вновь созданного объекта [Notes]RichTextStyle (разумеется, кроме Parent) по умолчанию имеют значение STYLE_NO_CHANGE/ RichTextStyle.STYLE_NO_CHANGE, означающее сохранение значения свойства таким, каким оно было в предыдущем состоянии. После определения необходимых свойств соответствующий объекту [NotesJRichTextStyle описатель стиля текста добавляется в поле типа RichText методом appendStyle класса [Notes] RichTextltem. С этого момента описатель начинает определять шрифтовое оформление текста, добавляемого в поле RichText вслед за описателем. Его действие распространяется до момента добавления в поле RichText нового описателя стиля текста.

3.22.1. Свойства

0 Свойство Parent - «родитель»Java: Session session = RichTextStyle.geiPurentQ

Объект класса Session, «содержащий» данный объект класса RichTextStyle.

Свойство NotesFont/Font - «шрифт»LotusScript: notesFont% = notesRichTextStyle.NotesFont .

notesRichTextStyle.NotesFont = notesFont%

Java: int notesFont = RichTextStyle.geiFontO

void RichTextStyle.setҐont(int notesFont)

Шрифт. Задается константами FONT_COURIER/RichTextStyle.FONT_COURIER,FONT_HELV/RichTextStyle.FONT_HELV, FONT_ROMAN/RichTextStyle.FONT_ROMAN,STYLE_NO_CHANGE/RichTextStyle.STYLE_NO^CHANGE (RichTextStyle.MAYBE) - как впредыдущем состоянии. . •• ..••;;/,

Свойство FontSize - «размер шрифта»LotusScript: fontSize% = notesRichTextStyle.FontSize

notesRichTextStyle,FontSize:=fontSize%

Java: intfontSize = RichTextStyle.getFontSizeQ. < f > i s > ' < ^ U ^ . . . \ ' -' . '*;:-,. ,•.•,•.:-'•- -• , . ' ' . ' . ' ; . ' .

© InterTrust Co. Тел. (095) 9567928

Page 129: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

626 Встроенные классы LotusScript и Java

void RichTextStyle. seiFontS'ne(intfontSize)

Размер шрифта в пунктах. Задается целым от 1 до 250 или константой STYLE^NO_CHANGE/RichTextStyle.STYLE^NO_CHANGE(RichTextStyle.MAYBE) - как в предыдущем состоянии.

Свойство Bold - «жирный шрифт»LotusScript: flag = notes RichTextStyle.Hold notesRichTextStyle.l&old -flag

Java: int value = RichTextStyle,geiBoldQ void RichTextSty!e.seiBold(mt value)

Задается константами: «жирный» шрифт - True/RichTextStyle.YES, обычный -False/RichTextStyle.NO, STYLEJTO_CHANGE/RichTextStyle.STYLE_NO_CHANGE(RichTextStyle.MAYBE) - как в предыдущем состоянии.

Свойство Italic - «курсив».".: :' • .-• :: ;: •"•'.' -. ;;.: .'.Г-.'-::; -С'. :••'-;•'/.'•• '.' ;л:::л :•• .•;:••:.:;..'::./:::: -:-;..:•:.;•• ':•:•>•:-

••!'-:-..'

LotusScript: flag = notesRichTextStyle.ItaliK notesRichTextStyle.ltalic -flag

Java: int value = RichTextStyle.getltalicQ voidRichTextStyle.seHtalic(int value)

Задается константами: курсив - True/RichTextStyle.YES, обычный («прямой», не курсив) -False/RichTextStyle.NO, STYLE_NO_CHANGE/RichTextStyle.STYLE_NO_CHANGE(RichTextStyle.MAYBE) - как в предыдущем состоянии.

Свойство Underline - «подчеркнутый» LotusScript: flag = notesRichTextStyle.Underline

notesRichTextStyle.\Jnderline=flag

Java: int value = RichTextStyle.getUnderlineQ

void RichTextStyle, setUnderline(/«/ value)

Задается константами: подчеркнутый - True/RichTextStyle.YES, без подчеркивания -False/RichTextStyle.NO, STYLE_NO_CHANGE/RichTextStyIe.STYLE_NO_CHANGE(RichTextStyle.MAYBE) - как в предыдущем состоянии.

Свойство StrikeThrough - «зачеркнутый»LotusScript: flag = notesRichTextStyle.StrikeThrough

notesRichTextStyle.StrikeThrougb =flag

Java: int value = RichTextStyle.getStrikeJhroughQ

void RichTextStyle.setStrikeThrough(int value)

Задается константами: зачеркнутый - True/RichTextStyle.YES, без зачеркивания -False/RichTextStyle.NO, STYLE_NO_CHANGE/RichTextStyle.STYLE_NO_CHANGE(RichTextStyle.MAYBE) - как в предыдущем состоянии.

Свойство Effects - «дополнительные эффекты»LotusScript: effects% = notesRichTextStyle.EffectsnotesRichTextStyle.Effects = effects%Java: int effects = RichTextStyle.geiEffectsQ

© InterTrust Co. Тел. (095) 9567928

Page 130: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R, 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 627

void RichTextStyle.setEffects(/nf effects) Дополнительные

эффекты оформления текста. Задаются константами:• EFFECTS^EMBOSS/RichTextStyle.EFFECTSJEMBOSS,• EFFECTS^EXTRUDE/RichTextStyle.EFFECTS_EXTRUDE,• EFFECTS^SHADOW/RichTextStyle.EFFECTS^SHADOW,• EFFECTS_SUBSCRIPT/RichTextStyle.EFFECTS_SUBSCRIPT,• EFFECTS SUPERSCRIPT/RichTextStyle.EFFECTS_SUPERSCRIPT,• EFFECTS_NONE/RichTextStyle.EFFECTS_NONE - без дополнительных эффектов,• STYLE_NO_CHANGE/RichTextStyle.STYLE_NO_CHANGE (RichTextStyle.MAYBE) - как

в предыдущем состоянии.

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

The meeting is at 3 :00 not 2:00

The meeting is at jlUU not 2:00The meeting is at 3:00 not 2:00EMBOSS EXTRUDE SHADOW швсгтгтрт

5иРШШРТ

bUcbLrUrl

Dim session As New NotesSessionDim db As NotesDatabaseSet db -- session. CurrentDatabaseDim doc As New NotesDocuraent(db)Call doc.AppendltemValue("Subject", "Meeting time changed")Dim richStyle As NotesRichTextStyleSet richStyle = session.CreateRichTextStyleDim richText As New NotesRichTextltem(doc, "Body")' ШрифтrichStyle.NotesFont = FONT_HELVCall richText.AppendStyle(richStyle)Call richText.AppendText("The meeting is at ")richStyle.NotesFont = FONT_COURIERCall richText.AppendStyle(richStyle)Call richText.AppendText("3:00")richStyle.NotesFont = FONT_ROMANCall richText.AppendStyle(richStyle) ' -Call richText.AppendText(" not 2:00")Call richText.AddNewLine{ 1 )' Размер шрифтаrichStyle.FontSize = 12 ;

Call richText.AppendStyle(richStyle)Call richText.AppendText("The meeting is at ")richStyle.FontSize = 24Call richText.AppendStyle(richStyle)Call richText.AppendText("3:00")richStyle.FontSize =16Call richText.AppendStyle(richStyle) •Call richText.AppendText(" not 2:00")Call richText.AddNewLine( 1 )' «Жирный», курсив, зачеркнутый "richStyle.Bold = True

© InterTrust Co. Тел. (095) 9567928

Page 131: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

628 Встроенные классы LotusScript и Java

Cal.l richText. AppendStyle (richStyle)Call richText .AppendText ("The meeting is at "} : >•-• ' ,richStyle.Bold = FalserichStyle.Italic = TrueCall richText.AppendStyle(richStyle) 'Call richText.AppendText("3:00")richStyle.Italic = FalserichStyle.StrikeThrough = True • :

Call richText.AppendStyle(richStyle)Call richText.AppendText(" not 2:00")Call richText-AddNewLine( I )' Дополнительные эффектыrichStyle.StrikeThrough = FalserichStyle. Effects = EFFECTS__EMBOSSCall richText.AppendStyle(richStyle)Call richText.AppendText("EMBOSS ")richStyle.Effects = EFFECTS_EXTRUDECall richText.AppendStyle(richStyle)Call richText .AppendText ("EXTRUDE] ")richStyle. Effects = EFFECTSjSHADOW ''Call richText.AppendStyle(richStyle)Call richText.AppendText("SHADOW ")richStyle.Effects = EFFECTS_SUBSCRIPT 'Call richText.AppendStyle(richStyle)Call richText.AppendText("SUBSCRIPT ")richStyle.Effects = EFFECTS_SUPERSCRIPTCall richText.AppendStyle(richStyle)Call richText.AppendText("SUPERSCRIPT")Call richText.AddNewLine( 1 )Call doc.Save(True, False)

Свойство NotesColor/GoIor - «цвет текста» :' ' ..Л-:.-:;':" '--.• •• ••••:••• ^^'"':;'';; ": •'::.•••"•>'•LotusScript: notesColor- notesRichTextStyleJSotesColor

notesRichTextStyle.NotesColor == notesColor

Java: int notesColor =RichTextStyle.getColorQt

void RichTextStyle.setColor(int notesColor)

Цвет текста. Задается константами:• COLOR_BLACK/RichTextStyle.COLOR_BLACK,• COLOR_BLUE/RichTextStyle.COLOR_BLUE,• COLOR_CYAN/RichTextStyle.COLOR_CYAN,• COLOR_DARK_BLUE/RichTextStyle.COLOR_DARK_BLUE,• COLOR_DARK__CYAN/RichTextStyle.COLOR_DARK_CYAN,• COLOR_DARK_GREEN/RichTextStyle.COLOR_DARK_GREEN,• COLOR_DARK_MAGENTA/RichTextStyle.COLOR_DARK_MAGENTA,• COLOR_DARK_RED/RichTextStyle.COLOR_DARK_RED,• COLOR_DARK_YELLOW/RichTextStyIe.COLOR_DARK_YELLOW,• COLOR_GRAY/RichTextStyle.COLOR__GRAY,• COLOR_GREEN/RichTextStyle.COLOR_GREEN,• COLOR_LJGHT_GRAY/RichTextStyle.COLOR_LIGHT_GRAY,• COLOR_MAGENTA/RichTextStyle.COLOR_MAGENTA,

© InterTrust Co. Тел. (095) 9567928

Page 132: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 629

* COLOR_RED/RichTextStyle.COLOR_RED,* COLOR_WHITE/RichTextStyle.COLOR_WHITE,• COLOR_YELLOW/RichTextStyle.COLOR_YELLOW,• STYLE_NO CHANGE/RichTextStyle.STYLE NO_CHANGE (RichTextStyle.MAYBE) - как

в предыдущем состоянии.Пример. Java-агент создает новый документ и оформляет текст в его поле Body с использованием

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

First line is default everything

This text is in style 1.This text is in style 2.

// Java-RichTextStyle/RichTextStyleDatabase db = agentContext.getCurrentDatabase();Document doc = db.createDocument();RichTextltem rti = doc.createRichTextltera("body");// Стиль 1RichTextStyie stylel = session.createRichTextStyle();stylel.setBold{RichTextStyie.YES);stylel.setColor(RichTextStyie.COLORJDARK__CYAN);stylel.setEffects(RichTextStyie.EFFECTS_EMBOSS);stylel.setFont(RichTextStyle.FONT_ROMAN);stylel.setFontSize(24);// Стиль 2RichTextStyie style2 - session.createRichTextStyle();style2.setBold(RichTextStyie.NO);style2.setColor(RichTextStyie.CGLORJDARKJRED);style2.setEffects(RichTextStyle.EFFECTS_EXTRUDE);style2.setFont(RichTextStyie.FONT_HELV);style2.setFontSize(18);// Формирование и оформление текстаrti.appendText("First line is default everything"};rti.addNewLine();rti.appendStyle(stylel);rti.appendText("This text is in style 1.");rti.addNewLine();rti.appendStyle(style2);rti.appendText("This text is in style 2.");doc.save();

© Свойство PassThruHTML - «содержит HTML-код» V ::...;';••. : -•••;: • ••; ..;:v;.v '.•-•;. :

LotusScript: flag = notesRichTextStyle.PussThruHTMLnotesRichTextStyle.Pass'rbrum'ML=flag

Java: int value = RichTextStyie. getPassThruHTMLQ

void RichTextStyle.setPassThrnHTML(int value)

Задается константами: True/RichTextStyle.YES - содержит HTML-код, False/RichTextStyle.NO - содержит обычный текст (не HTML-код), STYLEJNOJTHANGE/ RichTextStyle.STYLE_NO_CHANGE (RichTextStyle.MAYBE) - как в предыдущем состоянии.

© InterTrust Co. Тел. (095) 9567928

Page 133: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

630 Встроенные классы LotusScript и Java

В клиенте Notes данное свойство полностью аналогично «включению/выключению» в меню флага Text\Pass-Thru HTML для «выделенного» в поле RichText фрагмента текста. Текст, оформленный стилем со свойством PassThruHTML, должен содержать HTML-код. При генерации HTML-кода для документа серверной задачей HTTP такой фрагмент текста передается в броузер «как он есть» (без изменений и учета прочих свойств) и интерпретируется броузером как HTML-код. Однако в клиенте Notes такой фрагмент текста отображается обычным образом, как будто свойство PassThruHTML для него не было установлено.

Пример. Скрипт создает новый документ и добавляет HTML-код в поле Body типа RichText.

„г с Hell° X T * r<B>Heilo</B> |В броузере этот текст будет выглядеть как , но в клиенте Notes как ----- -•' .Dim session As New NotesSessionDim db As NotesDatabaseSet db = session.CurrentDatabaseDim doc As New NotesDocument(db)Call doc,AppendltemValue("Subject", "Pass-Thru HTML")Dim richStyle As NotesRichTextStyle ;

Set. richStyle = session. CreateRichTextStyleDim richText As New NotesRichTextltem(doc, "Body")richStyle.PassThruHTML = TrueCall richText.AppendStyle(richStyle)Call richText.AppendText("<B>Hello</B>")Call doc.Save(True, False)

© InterTrust Co. Тел. (095) 9567928

Page 134: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 631

3.23. «Описатель стиля абзаца» - класс [Notes]RichTextParagraphStyIe

Объект класса [NotesjRichTextParagraphStyle представляет описатель стиля абзаца, используемый в полях типа RichText для форматирования текстовой информации. Свойства объекта позволяют задать способ выравнивания текста в абзаце, левую и правую границы абзаца, левую границу для первой строки абзаца, интервалы перед абзацем и после абзаца, интервал между строками внутри абзаца, поведение абзаца при переходе на новую страницу, а так же получить набор табуляционных меток абзаца. Методы объекта позволяют задавать или «очищать» набор табуляционных меток абзаца.

«Контейнерная иерархия»

LotusScript NotesSession _> NotesRichTextParagraphStyle ~> NotesRichTextTabI_______________________________________________________________________________

Java Session —> RichTextParagraphStyle —> RichTextTabI___________j___________________________________________________________________

Для создания нового объекта класса [NotesjRichTextParagraphStyle используют метод createRichTextParagraphStyle класса [Notes]Session. После определения необходимых свойств соответствующий объекту [NotesjRichTextParagraphStyle описатель стиля абзаца добавляется в поле типа RichText методом appendParagraphStyle класса [Notes]RichTextItem. С этого момента описатель начинает определять форматирование текста, добавляемого в поле RichText вслед за описателем. Его действие распространяется до момента добавления в поле RichText нового описателя стиля абзаца.

3.23.1. Свойства

© Свойство Alignment - «выравнивание»LotusScript: alignment% — notesRichTextParagraphStyle.AM^nment

notesRichTextParagraphStyle.Alignment ~ alignment%

Java: int. alignment = RichTextParagraphStyle.getAlignment()

void RichTextParagraphStyle. setAHgnment(/«/ alignment)

Выравнивание абзаца. Задается константами:* ALIGN_CENTER/RichTextParagraphStyle.ALIGN_CENTER - центрирование,* ALlGN_FULL/RichTextParagraphStyle.ALlGN_FULL - по ширине,* ALIGNJLEFT/RichTextParagraphStyle.ALIGN_LEFT - на левый край.* ALIGN J^OWRAP/RichTextParagraphSryle.ALIGN J4OWRAP - без переноса,* ALIGN_RIGHT/RichTextParagraphStyle.ALlGN_RIGHT - на правый край.

© Свойство LeftMargin - «левая граница»LotusScript: margin& ~ notesRichTextParagraphStyleJueffMargm

notesRichTextParagraphStyle.IjeftM&rgin ~ margin&

Java: int margin = RichTextParagraphStyle.geiljefiMargmQ

void RichTextParagraphStyle. setLeftMargin(//7? margin)

Левая граница абзаца (за исключением первой строки абзаца), тип Long/int.

© InterTrust Co. Тел. (095) 9567928

Page 135: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

632 Встроенные классы LotusScript и Java

В качестве единицы измерения используется «twip». В одном сантиметре 537 twips, а в одном дюйме - 1440 twips. Определены константы:• RULER_ONE_CENTIMETER/RichTextParagraphStyle.RULER_ONE_CENTIMETER

количество twips в сантиметре и• RULER_ONE_lNCH/RichTextParagraphStyle.RULER_ONE_.INCH - количество twips в

одном дюйме.

Поэтому целесообразно применять конструкции наподобие(RULER_ONE_CENTIMETER * 2) - 2 сантиметра или(RichTextParagraphStyle.RULER_ONEJ"NCH * 0.75) - три четверти дюйма.

Эта же единица измерения используется в свойствах FirstLineLeftMargin и RightMargin и методах setTab и setTabs класса [Notes]RichTextParagraphStyle и в свойстве Position класса [Notes] RichTextTab.

© Свойство RightMargin - «правая граница»LotusScript: margin = notesRichTextParagraphStyle.JZighiMargm

notesRichTextParagraphStyle.RigbtMsirgm = margin

Java: int margin = RichTextParagmphStyle.getRigMM&rgmQ

void RichTextParagraphStyle.setRighiMargm(int margin)

Правая граница абзаца в twips (см. свойство LeftMargin), тип Long/'int.

© Свойство FirstLineLeftMargin - «левая граница первой строки»LotusScript: margin = notesRichTextParagraphStyle.FirstlAael^efi^l»rgin

notesRichTextParagraphStyle.firstLmeLefiMargin = margin

Java: int margin = RichTextParagraphStyle.geiҐir$iLmeLeftMairgm()

void RichTextParagraphStyle.setFirstLmeJueftMargm^nt margin)

Левая граница для первой строки абзаца в twips (см. свойство LeftMargin), тип Long/int.

© Свойство SpacingAbove - «интервал перед первой строкой абзаца» LotusScript: spacing% = notesRichTextParagraphStyle.SpacmgAbove

notesRichTextParagraphStyle.SpucingAbove = spacing%

Java: int spacing = RichTextParagraphStyle.getSp»KingAboveQ

void RichTextParagraphStyle. setSpacingAbove(/'«/ spacing)

Интервал перед первой строкой абзаца, задается константами:• SPACING_DOUBLE/RichTextParagraphStyle.SPACING_DOUBLE - два интервала,• SPACING_ONE_POINT_50/RichTextParagraphStyle.SPACING_ONE_POINT_50 - полтора

интервала,• SPAClNG_SINGLE/RichTextParagraphStyle.SPACING_SINGLE - один интервал.

© Свойство SpacingBelow - «интервал после последней строки абзаца»LotusScript: spacing% = notesRichTextParagraphStyle.SpacingBeloMv

notesRichTextParagraphStyle.SpacmgBelow = spacing%

© InterTrust Co. Тел. (095) 9567928

Page 136: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 633

Java: int spacing - RichTextParagraphStyle.getSpacmgBelowQ

void RichTextParagraphStyle.setSpitcmg,BelQ\v(itit spacing)

Интервал после последней строки абзаца, задается теми же константами, что и для свойства SpacingAbove.

© Свойство InterLineSpacmg-«интервал между строками абзаца» LotusScript: spacing% = notesRichTextParagraphStyle.lnterlAneSpacmg

notesRichTextParagmphStyle.lnterLmf:Spacing ~ spacing%

Java: int spacing = RichTextParagraphStyle.getlnterl^meSpac'mgO

void RichTextParagraphStyle,setInterLineSpacing(?>7/ spacing)

Интервал между строками абзаца, задается теми же константами, что и для свойстваSpacingAbove. , - .. .

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

j ™ Ч j^y^i.v.^^aMiyj?^ *.-W.?re^?^vy-<ff>^^ — .~j~~~ ~~~~.

, < ! i c , I i ! 6 ' ! ' 7 ' • ! ' 8 < i ' 9 ( I ' 1 0 ' I ' 1 1 ' I ' 1 2 ' 1 ' 1 3 " i ' U H Iabcde abcde abcde abode abcde abcde abode abcde

abcde abcde abcde abcde abcde abcde abcde abcde abcdeabcde abcde abcde .

.

abcde abcde abcde abcde abcde abcde abcde abcde abcde abcde abcde abcde abcde abcde abcde abcde abcde abcde abcde abcde

Dim session As New NotesSessionDim db As NotesDatabase -_.,.. ;; ,-..-., : -,..,, ., .,.-. . . : :, '• •••-• ' - •Set db = session.CurrentdatabaseDim doc As New NotesDocument (db) • - ' . - - . . • • • . : •Call doc.AppendltemValue("subject", "RichTextParagraphStyle test")Dim rtpStyle As NotesrichTextParagraphStyleSet rtpStyle = session.CreateRichTextParagraphStylertpStyle.Alignment = ALIGN_FULLrtpStyle.LeftMargin = RULER_ONE__CENTIMETER * 4rtpStyle.FirstLineLeftMargin = rtpStyle.LeftMargin + RTJLER_ONE_CENTIMETERrtpStyle.RightMargin = RULER_ONE_CENTIMETER * 14rtpStyle. SpacingAbove = SPACING__DOXJBLErtpStyle.InterLineSpacing = SPACING_SINGLErtpStyle . SpacingBelow = SPAC1NG__ONE_POINT_50Dim richText As New NotesRichTextltern (doc, "Body")Call richText.AppendParagraphStyle(rtpStyle) . •For p=l To 2 ' '

For w = 1 To 20 • - . . • - . - . . . ... ^, .... Call richText. AppendText ("abcde ") '•

.-,,...

Next , . . • . - . • • . . ' - .Call richText . addnewLine (1, True) . .-. •: • .-•- •••-•-•• . • •- .

Next . . . . . . .Call doc.Save(True, False)

Page 137: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

© InterTrust Co. Тел, (095) 9567928

Page 138: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

634 Встроенные классы LotusScript и Java

© Свойство Pagination - «поведение абзаца при переходе на новую страницу» LotusScript: pagination% — notesRichTextParagraphStyle.Pagmatioa

notesRichTextParagraphStyle.Pagmatian —pagination%

Java: int pagination = RichTextParagraphStyle.getPaginationQ

void RichTextParagraphStyle.setPagination(int pagination)

Свойство определяет поведение абзаца при переходе на новую страницу (например, методом addPageBreak класса [NotesJRichTextltem). Возможное поведение задается константами:

• PAGlNATE_BEFORE/RichTextParagraphStyIe.PAGINATE_BEFORE - абзац начинается сновой страницы,

• PAGINATE_KEEP_WITH_NEXT/RichTextParagraphStyle.PAGrNATE_KEEP_WITH_NEXТ - сохранять абзац на одной странице со следующим,

• PAGINATE_KEEP_TOGETHER/RichTextParagraphStyle.PAGINATE_KEEP_TOGETHER -сохранять вместе,

• PAGINATE_DEFAULT/RichTextParagraphStyle.PAGINATE_DEFAULT - по умолчанию.

© Свойство Tabs - «массив табуляционных меток»LotusScript: tabs = notesRichJ'extParagraphStyle.Tabs

Java: Java.util Vector tabs = RichTextParagraphStyle.getTabsO

«Массив» табуляционных меток для данного стиля абзаца. В LotusScript это массив объектов с элементами класса NotesRichTextTab. в Java - объект класса java.util.Vector с элементами класса RichTextTab.

3.23.2. Методы

0 Методы setTab/setTabs - «добавить табуляционные метки» LotusScript: Call notesRichTextParagraphSty!e,setTab(position&, type% )

Call notesRichTextParagraphStyle.setTabs( count%, startpos&, interval&

[,type%])

Java: voidRichTextParctgraphStyle.setTab(intposition, int type)

void RichTextParagraphStyle.setTabs(int count, int startpos, int interval)

void RichTextParagraphStyle.setTabs(int count, int startpos, int interval,

int type) Устанавливают для данного стиля позицию одной или

нескольких табуляционных меток.Параметр position (тип Long/int) задает местоположение табуляционной метки (в twips,

см. свойство LeftMargin). «Связка» из трех параметров: startpos (тип Long/int) - позиция первой табуляционной метки (в twips), interval (тип Long/int) - интервал между табуляционными метками (в twips), count (тип Integer/int) - количество табуляционных меток• позволяет задать «серию равноотстоящих» табуляционных меток.

Параметр type (тип Integer/int) задает способ выравнивания текста относительно табуляционной метки:

• TAB_CENTER / RichTextTab.TAB_CENTER - центрирование относительно метки,

© InterTrust Co. Тел. (095) 9567928

Page 139: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: (а)гформулы, LotusScript, встроенные тасСы LotusScript и Java 635

• TAB_ DECIMAL / RichTextTab.TAB_DECIMAL - выравнивание по десятичной точке,• TAB_LEFT / RichTextTab.TAB_LEFT - выравнивание влево,• TAB RIGHT / RichTextTab.TAB^RIGHT - выравнивание вправо. ..•,. , , .

© Метод clearAliTabs - «удалить все табуляционные метки» .•.••••• '--:.:•• :.. ';:::;... . . .LotusScript: Call notesRichTextParagraphStyle.clearA\\Tubs()

Java: void RichTextParagraphStyle.cle&rAlYfubsQ

Удаляет все табуляционные метки из данного стиля.

Пример. Сначала Java-агент создает первый стиль абзаца с тремя равноотстоящими табуляционными метками, затем второй стиль абзаца на основе первого, но без последней табуляционной метки. После этого агент выводит два абзаца текста, форматируя их соответственно первым и вторым стилем. Результат в поле Body выглядит следующим образом.

ГГ^СТГГ!*^Column 1 Column 2 Column 3 . Column 4Column 1 CoiumnS Column 3 . . . .

import java.util.Vector;// Java-RichTextParagraphStyle/Tabs " 'Database db - agentContext. getCurrentDatabase () ; • -• • • ., .• :Document doc = db.createDocument() ;Item subject = doc. replaceltemValue ( "Subject", "Rich text tab"); V.---,L.RichTextltem body = doc.createRichTextltem("Body"};RichTextParagraphStyle bl = session.createRichTextParagraphStyle();RichTextParagraphStyle Ь2 = session.createRichTextParagraphStyle();// Стиль bl - три табуляционных метки "I, 12 и 1.7 смЫ.clearAllTabsО; , _ •, • •bl.setTabsp, RichTextParagraphStyle.RULER_ONE_CENTIMETER * 7, . , \.

RichTextParagraphStyle.RULER_ONE__CENTIMETER * 5, ' f ' ''RichTextParagraphStyle.TABJLEFT);

// Стиль Ь2 - две табуляционных метки 7, 12 «копированием» из стиля Ы Ь2.clearAllTabs(); Vector bltabs = Ы.getTabs(); for (int i=0; i < (bltabs.size()-1); i++) ( .....RichTextTab bltab -- (RichTexttab) bltabs . elementAt ( i ) ; •' :

b2.setTab(bltab.getPosition(), bltab.getType()); }// Добавление стиля bl и вывод текста -- •body. appendParagraphStyle (bl) ; : , ; •; •• •body.appendText("Column 1"); body.addTab();body. appendText ("Column 2");. body. addTab (}; .. .• . , „,.body.appendText("Column 3"); body.addTab();body. appendText ("Column 4"); . '•••'"• . - • ..- •. .- .- ,/'/ Добавление стиля Ь2 и вывод текста body.appendParagraphStyle(Ь2);body. appendText ( "Column 1"); body. addTab (); - . . . , . _ .. body.appendText("Column 2"}; body.addTab(}; body.appendText("Column 3"); // Сохранение документа doc.save(true, true);

© InterTrust Co. Тел. (095) 9567928

Page 140: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

636 Встроенные классы LotusScript и Java

3.24. «Табуляционная метка» - класс [NotesJRichTextTabОбъект класса [NotesJRichTextTab представляет одну табуляционную метку. Набор

табуляционных меток входит в состав описателя стиля абзаца (объект класса [NotesJRichTextParagraphStyle). Описатель стиля абзаца добавляется в поле типа RichText и определяет форматирование текста в поле.

«Контейнерная иерархия»

LotusScript NotesRichTextParagraphStyle ~> NotesRichTextTab

Java RichTextParagraphStyle -> RichTextTab

Для создания в объекте [NotesJRichTextParagraphStyle новых табуляционных меток -объектов класса [NotesJRichTextTab - используют методы setTab или setTabs, а для удаления всех табуляционных меток метод clearTabs класса [NotesJRichTextParagraphStyle.

Существующий объект класса [NotesJRichTextTab может быть получен свойством Tabs класса [NotesJRichTextParagraphStyle.

© Свойство Position - «положение табуляционной метки»LotusScript: position = notesRichTextTab.PositionJava: int position = RichTextTab.getPositionQПоложение табуляционной метки (в twips, см. свойство LeftMargin класса

[NotesJRichTextParagraphStyle), тип Long/int.

© Свойство Туре - «способ выравнивания текста относительнотабуляционной метки»

:

LotusScript: type = notesRichTextTab.Type

Java: int type = RichTextTab.getTypeQСпособ выравнивания текста относительно табуляционной метки. Тип Integer/int,

задается константами:• TAB CENTER / RichTextTab.TAB_CENTER - центрирование относительно метки,• TAB_DECIMAL / RichTextTab.TAB_DECIMAL - выравнивание по десятичной точке,• TAB_LEFT / RichTextTab.TAB_LEFT - выравнивание влево,• TAB_RIGHT / RichTextTab.TAB_RIGHT - выравнивание вправо.

© Метод clear - «очистка информации в табуляционной метке»LotusScript: Call notesRichTextTab.c\K&rJava: void RichTextTab. clear()Очищает информацию в табуляционной метке.

© InterTrust Co. Тел. (095) 9567928

Page 141: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: (а)-формулы, LotusScript, встроенные классы LotusScript и Java 637

3.25. «OLE-объект» - класс [Notes]EmbeddedObjectПредставляет встроенный OLE-объект, связанный OLE-объект или присоединенный файл

в объекте класса [NotesjRichTextltem - поле типа RichText. Свойства объектов класса [NotesjRichTextltem позволяют определить тип OLE-объекта, имя приложения, в котором был создан OLE-объект, размер OLE-объекта, имя, используемое для ссылки на OLE-объект, а также, если имеются, список «действий» (verbs), которые могут быть применены к OLE-объекту. Методы позволяют инициировать загрузку OLE-объекта в OLE-сервер, применять к OLE-объекту допустимые для него «действия», извлекать присоединенные файлы и удалять OLE-объекты.

«Контейнерная иерархия»

LotusScript NotesDocurnent _> NotesEmbeddedObject —> NotesRichTextltem_______________M?lЈ.sJ^is]ll5?l[M?Il^_____________________________________________Java Document —> EmbeddedObject —> RichTextltern___________________WchJ^tltem____________________________________________________

OLE - спецификация встраивания и связи объектов. OLE включает два механизма для создания сложных документов: встроенные объекты и связанные объекты, а также систему долговременной регистрации служебных имен серверов. Участники процесса обмена данными в OLE могут быть клиентами, серверами и обработчиками объектов. Клиенты могут принимать, отображать и сохранять объекты OLE. Функции OLE-библиотек позволяют приложению-клиенту отображать в своем пользовательском интерфейсе объекты, «почти ничего не зная об их природе». Серверы могут активизировать объекты по требованию. Обычно объект выбирается в программе-клиенте. Запрос на активацию этого объекта направляется от клиента к серверу через библиотеки OLE. Если выбранный объект является связанным, сервер полностью загружает файл, содержащий связанные данные, а затем «предоставляет» их пользователю. В случае встроенного объекта его содержимое передается от клиента к серверу с помощью библиотечных функций. Когда пользователь желает сохранить изменения в объекте OLE, выполненные им в программе-сервере, он использует команду меню Update (она замещает команду Save для OLE-серверов). Если же пользователь по завершении редактирования выбирает команду Exit в приложении-сервере, он возвращается в приложение-клиент. Обработчики объектов представляют собой библиотеки, осуществляющие специфические для объектов посреднические функции между сервером и клиентом. Обычно они являются составной частью приложений-серверов.

Для создания нового объекта класса [NotesjEmbeddedObject используется метод embedObject класса [NotesjRichTextltern.

Для доступа к существующим объектам класса [Notes] EmbeddedObject возможны следующие варианты:• если известно имя объекта и поле типа RichText, содержащее объект, используют метод

getEmbeddedObject класса [Notes]RichTextltem;

• для получения всех объектов в поле типа RichText используют свойство EmbeddedObjectsкласса [NotesjRichTextltem;

• для получения всех объектов в документе используют свойство EmbeddedObjects класса[Notes]Document

Пример. Следующие два скрипта демонстрируют различия между объектами, полученными свойством EmbeddedObjects классов "NotesDocument и NotesRichTextltem. Скрипты применяются к последнему документу из вида All Documents в базе HILL.NSF на сервере SanFrancisco/Acme.

© InterTrust Co. Тел. (095) 9567928

Page 142: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

638 Встроенные классы LotusScript и Java

Этот документ содержит следующие объекты:

• встроенный объект Word Pro с именем "Word Pro Document" в поле Body;• связанный объект Microsoft Excel с именем "MS® Excel Worksheet" в поле Body;• встроенный объект Ami Pro, созданный в Notes Release 3, с именем "Ami Pro Document" в поле

Body;• присоединенный файл "CASTLE.BMP" в поле Body;• встроенный объект Freelance Graphics с именем "Freelance Presentation" в поле Description;• встроенный объект 1-2-3 с именем "123 Worksheet", унаследованный от формы,

использованной для создания документа.

Скрипт, получавший объект свойством EmbeddedObjects класса NotesDocument, выводит следующее:

"Word Pro Document""MS Excel Worksheet""Freelance Presentation""123 Worksheet"

iDim db As NotesDatabase Dim view As NotesView Dim doc As NotesDocumentSet db = New NotesDatabase( "SanFrancisco/Acme", "hill.nsf" ) Set view = db.GetView{ "All Documents" ) Set doc = view.GetLastDocument Forall о In doc.EmbeddedObjects

Messagebox( o.Name ) End Forall

Скрипт, получавший объект свойством EmbeddedObjects класса NotesRichTextltem, выводит следующее:

"Word Pro Document""MS Excel Worksheet""Ami Pro Document" : ,"" (для присоединенного файла CASTLE.BMP).

ч

Dim db As NotesDatabaseDim view As NotesViewDim doc As NotesDocumentDim rtitem As VariantSet db = New NotesDatabase( "SanFrancisco/Acme", "hill.nsf" )Set view = db.GetView( "All documents" )Set doc = view.GetLastDocumentSet rtitem = doc.GetFirstltem( "Body" )If ( rtitem.Type = RICHTEXT ) ThenForall о In rtitem.EmbeddedObjects Messagebox( o.Name )

End Forall:nd If

-

3.25.1. Свойства

Свойство Parent - «родитель»LotusScript: Set notesRichTextltem — notesEmbeddedObject.Ґ&rent

InterTrust Co. Тел. (095) 9567928

Page 143: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: (а),-формулы, LotusScript, встроенные классы LotusScript и Java 639

Java: . Rickfextltem rtltem•— EmbeddedObject.^eiParKntQ

Объект класса [NotesJRichTextltem, содержащий данный объект.

• Свойство Type - «тин» --•'•-'-.-:::-"':-:':..,•••'...:" ........ -.•;:.•"'•.::-..,•• ..••••...• :•••••/.:•••••••.•... •-.-.•'. ••.LotusScript: type% = notesEmbeddedObjecL'Type

Java: int type = EmbeddedObject.getTjpe()

Константа типа Integer/int, определяющая тип объекта:• EMBEDJDBJECTLINK / EmbeddedObject.EMBED OBJECTLINK - связанный объект

(ссылка на внешний объект),

•EMBED OBJECT / EmbeddedObject.EMBED J3BJECT - встроенный объект,

•EMBED_ATTACHMENT / EmbeddedObject.EMBED ATTACHMENT - присоединенныйфайл. - - . - ' • • . ...

Пример. Скрипт подсчитывает количество встроенных объектов, связанных объектов и присоединенных файлов в поле Body документа, и выводит результат в строку статуса.

Dim doc As NotesDocument . ' .- . --- . . . - - .Dim rtitem As VariantDim attachCount As IntegerDim linkCount As IntegerDim object-Count As Integer' . . . set value of doc. . . . • . • • . . .Set rtitem = doc.GetFirstItern( "Body" ) .attachCount =0 -linkCount =0 .objectCount = 0If ( rtitem.Type = RICHTEXT } Then

Forall о In rtitem. EiribeddedObj ects .-.. . . . Select Case; о . Type Case EMBED^ATTACHMENT:

..., attachCount = attachCount + 1Case EMBED_OBJECTLINK:

linkCount = linkCount + 1 : , - - • .Case EMBEDJDBJECT:

objectCount = objectCount + 1 End Select '

End Forall - ~- -,, ::- -..., . -., •' , . • -. -. .- •• -•• .... End IfPrint( attachCount & " attachments " & linkCount & _ ' '

" links " & objectCount & " objects " )

Свойство Class/ClassName - «класс»LotusScript: className$ = notesEmbeddedObject.Class

Java: String className = EmbeddedObject.getClassNsimeQ

Имя приложения (тип String), в котором был создан объект. Встроенные и связанные объекты всегда имеют имя приложения, поддерживающего их. Для присоединенных файлов свойство возвращает ""/null.

О InterTrust Co. Тел. (095) 9567928

Page 144: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

640 Встроенные классы LotusScript и Java

Пример. Скрипт определяет приложение, использованное для создания объекта "City picture" в поле Body документа. Например, если объект был создан в Visio®, свойство Class вернет "Visio.Drawing"; если же объект был создан в WordPro, свойство вернет "WordPro.Document".

Dim doc As NotesDocumentDim rtitem As VariantDim object As NotesEmbeddedObjectDim className As String' . . . set value of doc. ..Set rtitem = doc.GetFirstltem( "Body" )If { rtitem.Type = RICHTEXT ) ThenSet object = rtitem.GetEmbeddedObject( "City picture" )className = object.Class

End If

Свойство Source - «источник»LotusScript: sourceS = notesEmbeddedObject.SQurce

Java: String source = EmbeddedObject.getSourceQ

Если объект класса [Notes]EmbeddedObject является встроенным или связанным объектом, свойство возвращает внутреннее имя, которое Notes использует для ссылки на исходный документ (что-то подобное ЕХТ21582).

Если объект класса [Notes]EmbeddedObject является присоединенным файлом, и был получен методом embedObject класса [Notes]RichTextltem, свойство Source возвращает полный путь и имя файла-оригинала. Если объект класса [Notes]EmbeddedObject является присоединенным файлом, но был получен другим свойством или методом, свойство возвращает только имя файла-оригинала.

Свойство FileSize - «размер в байтах»

LotusScript: size& = notesEmbeddedObject.VileSize

Java: int size = EmbeddedOhject.gKiFileSizeQ

Размер присоединенного файла в байтах (тип Long/int). Для встроенных или связанных объектов возвращается 0.

Свойство Name - «имя, используемое для ссылки на объект»

LotusScript: name$ = notesEmbeddedObject.Name

Java: String name — EmbeddedObject.geiNameQ

Имя (тип String), используемое для ссылки на встроенный или связанный объект. Для присоединенных файлов возвращается ""/null. Если встроенный или связанный объект не имеют имени, возвращается ""/null. Если встроенный или связанный объект созданы методом embedObject класса [Notes]RichTextItem, свойство вернет значение параметра пате, использованное в методе embedObject. Если встроенный или связанный объект созданы в интерфейсе пользователя Notes, свойство вернет то имя, которое можно увидеть в окне свойств этого объекта.

Свойство Object - «дескриптор OLE-объекта»LotusScript: Set handleV= notesEmbeddedObject.Object

Java: int handle = EmbeddedObject.getObjectQ

© InterTrust Co. Тел. (095) 9567928

Page 145: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 641

Если встроенный объект загружен в виртуальную память, возвращает его OLE-дескриптор ({Unknown или IDispatch - дескриптор). Переменная, которой присваиваетсявозвращаемое значение, в LotusScript должна иметь тип Variant, а в Java - тип int. Еслиобъект поддерживает OLE automation, можно вызывать методы и свойства этого объекта,используя его дескриптор. , . . . • . .•; . .

Свойство Verbs - «действия, поддерживаемые OLE-объектом»LotusScript: stringArray ~ riotesEmbeddedObjec[.Verbs

Java: " java.util Vector verbs ~ EmbeddedObject.getVerbsQЕсли объект является встроенным объектом OLE/2, возвращается список (в LotusScript

тип Array of Strings, в Java - объект класса java.util.Vector с элементами класса String) действий, которые могут быть выполнены с этим объектом. Для выполнения действий над таким объектом используется метод doVerb («выполнить действие»).

- : >=* - : ' \ •

Пример. Java-агент обрабатывает выбранные пользователем документы вида. Для каждого документа он выводит информацию о свойствах всех объектах, имеющихся в поле Body.

Для документа, содержащего в поле Subject текст «Object», а в поле Body встроенный объект Microsoft Word и присоединенный файл, агент выводит приблизительно следующее.

Object Документ Microsoft Word 6.0 - 7 .0 Type: embeddedobject Verbs: [SOperi] Source: EXT21582 Classname: Word.Document.6 Size: 0 bytes Parent doc: Object

Docl.doc Type: file attachment Source: Docl.docSize: 12288 bytes Parent doc: Object

import java.util.Vector; . . • 'import Java.util.Enumeration; // (Java-EmbeddedObj\PropDocumentCollection dc = agentContext.getUnprocessedDocuments(};Document doc = dc. getFirstDocument ( ) ; - • • - . - . . .while (doc != null) . *•' ,. • • • •- • . '{ •.•„—.-;:-,.,..-..•

System.out.printin(doc.getltemValueString("Subject")) ;RichTextltem body = (RichTextltem) doc . getFir.stltem ( "Body" ); . .-.,',•.. ,Vector VHJ= boeiy. ge:t'Ј'.mbeddedObjetst;s.(} ; .',,- ••••• -' ""'. . ; •*Enumeration e = v. elements (); .. • . . .. ••:•••',•..• .--••• -..- ,,;- ' 'while (e. hasMoreElements (} ) . • _.' '.'''{ v .: , ' :: ': - ''?'• ' ..-.*-':, '•-"'-. ". :; ':•'•' •'..- ' : . . : . " ! '•;EmbeddedObject eo = (EmbeddedObject.) e . next-Element (•) ; ./'.'.;,System, out. println (" \t" + eo.getName() ) ; :.'';;- •;. -•'String type = null; switch (eo. getType ('} ) . •{case EmbeddedObject.EMBED_ATTACHMENT: type = "file attachment"; break;case EmbeddedObject.EMBED^OBJECT : type = "embedded object"; break; .case EmbeddedObject.EMBED OBJECTLINK: type. = "object link"; . •> •; ; \ :System.out.println("\t\tType: " + type); . , . . . - •if (type. equals ("embedded object")) • • - - > . - . - - i > - ' " •System.out.println("\t\tVerbs: " + eo.getVerbs());

System.out.print In("\t\tSource: " + eo.getSource()); ' ' if (!type.equals("file attachment"!)

System.out.println("\t\tClass name: " + eo.getClassName()); System, out .println ( "\t\t,Size : " + eo .getFileSize () + " bytes");

Page 146: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

System.out.println{"\t\tParent doc: " +eo.getParent().getParent() .getltemValueString("Subj ect"));

}

© InterTrust Co. Тел. (095) 9567.428

Page 147: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

642 Встроенные классы LotusScript и Java

doc = dc.getNextDocument(); }

Свойство FitTo Window - «объект при активизации занимает все окно документа»LotusScript: flag — notesEmbeddedObject.ҐinoWindow

notesEmbeddedObject.ҐitToWindow ~/lag

Свойство появилось в Domino с версии 4.6.2 и имеет смысл, если объект представляет собой встроенный объект OLE/2 или OLE control (ActiveX или OCX) и, обычно, является единственным объектом в документе. В окне свойств объекта это свойство соответствует опции Size object to fit window (Рис. 3.32).

Рис. 3.32 Окно свойств OLE-объекта

Если значение свойства равно true, то встроенный объект при активизации занимает все окно документа, «скрывая» при этом сам документ. Если же значение равно false (по умолчанию), происходит активизация объекта «по месту».

Рис. 3.33 Документ в режиме редактирования, объект Microsoft Word не активизирован

© InterTrust Со. Тел. (095) 9567928

Page 148: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 643

PMC. 3.34 Свойство FitToWindow = false, объект активизирован «по месту»

Рис. 3.35 Свойство FitToWindow -= true, активизированный объект занимает «все окно»

• - ! •. .••• •. -• ..-'- . . ; . . V

Свойство FitBelowFields - «объект ори активизации занимает часть окнадокумента ниже первой области размещения»LotusScript: flag = notesEmbeddedObject.ҐiiBelowҐields

notesEmbeddedObject,ҐiiBelowҐie\ds -flag

Свойство появилось в Domino версии 4.6.2 и имеет смысл, если объект представляет собой встроенный объект OLE/2 или OLE control (ActiveX или OCX) и, обычно, является единственным объектом в документе.

.", .У- i • г • i • 3 • i •

Page 149: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

© InterTrust Со. Тел. (095) 9567928

Page 150: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

644 Встроенные классы LotusScript и Java

Если значение равно true, то встроенный объект при активизации занимает часть окна документа: «по высоте» ниже первой области размещения (layout region) в документе, а «по ширине» - в ширину окна документа. При этом информация из документа, не входящая в первую область размещения, будут невидима. Если же значение равно false (по умолчанию), происходит активизация объекта «по месту».

3.25.2. Методы

Метод activate - «загрузить объект в OLE-сервер»LotusScript: Set handleV=notesEmbeddedObject.acti\a.te(show)

Java: int handle = EmbeddedObject.&ctiv&te(boolean show)

Загружает встроенный или связанный объект в OLE-сервер.

Если параметр show равен true, приложение-сервер при показе объекта пользователю будет использовать свой пользовательский интерфейс. Если false, приложение-сервер скрывает свой интерфейс пользователя - объект «будет виден» пользователю в интерфейсе приложения-клиента, т.е. оболочки станции Notes. Если скрипт или Java-агент должны выполняться на сервере, параметр должен иметь значение false, поскольку сервер Domino как приложение не имеет таких возможностей, как оболочка станции Notes (у него, хотя бы, попросту нет меню, в которое OLE-сервер мог бы «пожелать добавить» свои пункты меню).

Возвращаемое значение - дескриптор OLE-объекта - в LotusScript имеет тип Variant, в Java - int. Если же объект не поддерживает OLE automation, возвращается Nothing/null.

Пример I. Скрипт встраивает новый объект в поле Body и активизирует этот объект.Dim session As New NotesSessionDim doc As NotesDocument • , .Dim rtitem As NotesRichTextltemDim object As NotesEmbeddedObjectDim handle As Variant ;

Set doc = New NotesDocument( session.CurrentDatabase )Set rtitem = New NotesRichTextltem( doc, "Body" )Set object = rtitem. EmbedObject _ , -••!

( EMBEDJDBJECT, "Microsoft Excel Worksheet", "", "Report" )Set handle = object.Activate( False )If ( handle Is Nothing ) Then • :

doc.Subject = "This object has no OLE automation interface" Else

doc.Subject = "This object has an OLE automation interface" End If Call doc.Save( True, True )

Пример 2. Скрипт встраивает новый объект - «электронную таблицу» - в поле типа RichText, активизирует его, и использует полученный дескриптор для установки значения в ячейке таблицы и сохранения.

Dim rtitem as NotesRichTextltemDim object as NotesEmbeddedObjectDim handle as Variant' . . .set value of rtitem...Bet object = rtitem.EmbedObject( EMBED_OBJECT, _

"Microsoft Excel Worksheet", "", "Report" ) Set handle = object.Activate ( False ) landle.Cells( 1,1 ).Value = 100 landle.Parent.Save

Ъ InterTrust Co. Тел. (095) 9567928

Page 151: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5; @-формулы, LotusScript, встроенные классы LotusScript и Java 645

Метод doVerb - «выполнить действие над OLE-объектом»LotusScript: Call notesEmbeddedObject.doVerb( verb$ )Java: void EmbeddedObject.doVcrb(String verb)Выполняет над объектом, к которому применяется метод, указанное параметром verb

(тип String) действие. Действие должно быть одним из тех. которые возвращаются свойствомVerbs этого объекта.

Метод extractFile - «выгружает присоединенный файл на диск»LotusScript: Call notesEmbeddedObject.e\traciҐile(path$ )Java: void EmbeddedObject.e\tractҐi\e(String path)Копирует присоединенный файл из объекта [Notes]EmbeddedObject на диск в файл,

заданный параметром path (тип String). Для встроенных и связанных объектов в LotusScript возникает ошибка, а в Java - генерирует исключение.

Пример 1. Скрипт «выгружает» на диск и затем удаляет из поля Body все присоединенные файлы, превышающие 100000 байтов. Первый присоединенный файл записывается в c:\reports\newfilel, второй -в c:\reports\newfile2, и так далее.

Dim doc As NotesDocumentDim rtitem As Variant . •• • . • • , . . - • • .Dim fileCount As Integer . - . . ' • , . - • • - • :Const MAX = 100000 fileCount = 0 ' . . .set value of doc. . .Set rtitem = doc.GetFirstltem( "Body" ) If ( rtitem.Type - RICHTEXT ) Then Forall о In rtitem.EmbeddedObjects If ( o.Type = EMBED_ATTACHMENT ) And ( o.FileSize > MAX ) Then fileCount = fileCount + 1

Call o.ExtractFile ( "c:\reports\newfile" & Cstr(fileCount) ) Call о.Remove

Call doc. .Save ( True, True )End IfEnd ForallEnd If ,

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

import java.util.Vector;import j ava.util.Enumeration;// Java-EmbeddedObject/extractFileDatabase db = agentContext.getCurrentDatabase(};DocumentCollection dc = db. getAHDocuments () ;Document doc = dc.getFirstDocument();boolean saveFlag = false;while (doc !~ null){RichTextltem body = (RichTextltem)doc.getFirstltem("Body");System.out.printIn(doc.getltemValueString("Subject"));Vector v = body,getEmbeddedObjects();

© InterTrust Co. Тел. (095) 9567928

Page 152: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

646 Встроенные классы LotusScript и Java

Enumeration e = v.elements(); while (e.hasMoreElements()){ - • • •EmbeddedObject eo = (EmbeddedObject)e.nextElement(); if (eo.getTypeO == EmbeddedObject.EMBED_ATTACHMENT) feo.extractFile("c:\\extracts\\" + eo.getSource()); eo.remove(); saveFlag = true; } }if (saveFlag) {doc.save(true, true);

"saveFlag = false; }doc = dc.getNextDocument(); }

I

Метод remove - «удаление объекта»LotusScript: Call notesEmbeddedObject.removeJava: void EmbeddedObject.removeQУдаляет объект из документа. Фактически же объект будет удален из документа в базе

только после выполнения метода save для документа.

•»

© InterTrust Со. Тел. (095) 9567928

Page 153: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: (^-формулы, LotusScript, встроенные классы LotusScript и Java 647

3.26. «Протокол выполнения» - класс [NotesJLogПозволяет протоколировать выполняемые действия и возникающие при выполнении

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

«Контейнерная иерархия»

f LotusScript NotesSession —> NotesLog_________„_______________________________-.. ____..... _________ --,--____________________________________________________________

Java Session —> Log —> Session

Для создания нового объекта класса [NotesJLog используют метод createLog из класса [NotesJSession.

Для создания нового объекта класса NotesLog в LotusScript можно также использоватьметод New:

Dim variableName As New ~N®tes\Mg(programName$ ) или

Set notesLog — New NotesLog( programNameS )

Параметр programNameS (тип String) задает имя, идентифицирующее протокол. Когда протокол создан, его, прежде чем начинать протоколирование, следует открыть одним из следующих методов:• для протоколирования в базу методом openNotesLog;• для протоколирования в почтовое сообщение методом openMailLog;• для протоколирования в файл методом openFileLog;• для протоколирования в протокол выполнения агента методом openAgentLog.

Для протоколирования действий используют метод logAction, а для протоколирования ошибок - метод logError.

По завершении протоколирования протокол закрывают методом close.

Пример 1. Скрипт протоколирует в почтовое сообщение, отправляемое при закрытии Jimmy Но/Acme.

Su b I n i t i a l i zeDim currentLog As New NotesLog( "Checkup Agent" )

Call currentLog.OpenMailLog( "Jimmy Но/Acme", "Log for Checkup Agent" ) Call currentLoq.Close End Sub

Письмо, полученное Jimmy Но/Acme, с точностью до даты-времени будет содержать в поле Body следующее:

04/26/99 12:19:40 РМ Checkup Agent starting

Пример 2. Скрипт протоколирует в почтовое сообщение. Для каждого документа, найденного в текущей базе, в протокол вносится одна запись "Processed document <номер>". При закрытии протокола письмо отправляется Jimmy Ho/Acme.

Dim currentLog As New NotesLog( "Cleansing Agent" )Call currentLog.OpenMailLog( "Jimmy Но/Acme","Log for Cleansing Agent" )

>. Dim session As New NotesSessionDim db As NotesDatabase ' ..' -Dim collection As NotesDocumentCollection Dim doc As NotesDocument

© InterTrust Co. Тел. (095) 9567928

Page 154: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

648 Встроенные классы LotusScript и Java

Set db = session.CurrentDatabaseSet collection = db.AllDocumentsSet doc = collection.GetFirstDocumentcount% = 0While Not ( doc Is Nothing )count% = count% +1Call currentLog.LogAction( "Processed document " + Cstr(count%) )Set doc = collection.GetNextDocument( doc )

WendCall currentLog.Close

End Sub

Если предположить, что в базе оказалось 4 документа, Jimmy Ho/Acme получит письмо, в поле Body которого будет, с точностью до даты-времени, следующее:

04/26/99 10:50:17 AM Cleansing Agent starting04/26/99 10:50:17 AM Processed document 104/26/99 10:50:17 AM Processed document 204/26/99 10:50:17 AM Processed document 304/26/99 10:50:18 AM Processed document 4

Пример 3. Java-агент выполняет протоколирование в базу agentlog.nsf (обычно такая база создается по шаблону StdR4AgentLog). Если агент не находит в текущей базе вида с названием "All by Category", он регистрирует ошибку.

// Java-Log/createLogAgenL agent = agentContext.getCurrentAgent();Database db = agentContext.getCurrentDatabase();View view = db.getView("All by Category");if (view == null){ •Log log = session.createLog(db.getTitie О + " on " + db.getServer());log.openNotesLog(null, "agentlog.nsf");log.logError(0, "Unable to find view All by Category");log.close(); }

Если вид "All by Category" не будет найден в текущей базе, в базе-протоколе AGENTLOG.NSF появится один новый документ, содержащий имя протокола, текущие дату и время, код ошибки (0) и ее описание ("Unable to find view All by Category").

3.26.1. Свойства

Свойство Parent - «родитель»Java: Session session = Z-og.getParentQ

Объект класса Session, являющийся «родителем» для данного объекта.

Свойство ProgramName - «имя протокола»LotusScript: logName$ = wotesZog.ProgramName

«ofesZ,0g.ProgramName = logName$

Java: String logName = Zog.getProgramName()

void Log.setProj*r&mName(String logName)

Имя протокола (тип String), которое вы сами задали параметром метода createLog или метода New при создании протокола.

© InterTrust Co. Тел. (095) 9567928

Page 155: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @гформулы, LotusScript, встроенные классы LotusScript и Java 649

Пример. Java-агент выведет строку «Program name = "Program name file"».

// Java-Log/getProgramNameLog log = session.createLog("Program name file");log,openFileLog("progname.log");System.out.printIn("Program name = \"" + log,getProgramName() + "\"");log.close();

Свойство LogActions - «приостановка протоколирования действий»LotusScript: flag = notesLog.LngAcuons notesLog.LogA.ctions -flag

Java: boolean flag = Zog-.isLogActionsQ void Log.setlMgActions(boo!ean flag)

Если flag = true, протоколирование действий разрешено, иначе запрещено. При создании протокола свойство устанавливается в значение true.

Свойство позволяет временно отменять протоколирование - метод logAction не вызывает никакого эффекта, если свойство LogActions равно false.

Свойство LogErrors - «приостановка протоколирования ошибок»LotusScript: flag = notesLogJLogErrors notesLog,L<ogErrors —flag

Java: boolean flag = jLeg-.isLogErrorsQ void Log.seiLogErrors(boolean flag)Если flag = true, протоколирование ошибок разрешено, иначе запрещено. При создании

протокола свойство устанавливается в значение true.

Свойство позволяет временно отменять протоколирование ошибок - метод logError не вызывает никакого эффекта, если свойство LogErrors равно false.

Пример 1. Скрипт запрещает, а затем вновь разрешает протоколирование ошибок.

Dim currentLog As New NotesLogf "Turning Errors On and Off" )Call currentLog.OpenMailLog ( "Charlie Pycha/Acme", "Here's your log" )currentLog.LogErrors = FalseCall currentLog.LogError( 0, "Эта ошибка не протоколируется." )currentLog.LogErrors = TrueCall currentLog.LogError( 0, "Эта ошибка протоколируется/" )Call currentLog.Close - •

Пример 2. Java-агент запрещает, а затем вновь разрешает протоколирование ошибок.

import Java.util.Vector;// Java-Log/LogErrors . ,Log log = session.createLog("Turning actions on and off");Vector v - new Vector () ; - - . . . . . ' . , .-.v.addElement(session.getUserName{));log.openMailLog(v, "Here's your log");log.setLogErrors(false) ;log.logError(0, "Эта ошибка не протоколируется."); . •log.setLogErrors(true) ;log.logError(0, "Эта ошибка протоколируется.");log.close();

Свойство NumActions - «количество запротоколированных действий»LotusScript: actions0/» = notesLog.NumActions

Java: int actions = Z,og.getNumActions()

Количество запротоколированных на данный момент действий. Тип Integer/int.• \

© InterTrust Co. Тел. (095) 9567928

Page 156: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

650 Встроенные классы LotusScript и Java

Свойство NumErrors - «количество запротоколированных ошибок»LotusScript: errors% = notesLog.NumErrors

Java: int errors = Z-og.getNumErrorsQКоличество запротоколированных на данный момент ошибок. Тип Integer/int.

Свойство OverwriteFile - «должен ли перезаписываться файл протокола»LotusScript: flag = notesLog.OverwriteFilenotesLog.O\erwriteҐ\le =flagJava: boolean flag = Zog.isOverwriteFileQ

void Log.setO\erwriteҐi\e(boolean flag)

Свойство касается только протоколирования в файл. В этом случае может случиться так, что файл протокола уже существует. Тогда можно либо добавлять протоколируемую информацию в существующий файл, либо удалить существующий файл протокола и открыть новый с таким же именем, т.е. перезаписать файл.

Если flag = true, файл протокола должен перезаписываться, если false - протоколируемые записи должны добавляются в существующий файл. При создании протокола свойство устанавливается в false. Если необходимо перезаписывать существующий файл протокола, вы должны установить свойство OverwriteFile в значение true перед вызовом метода openFileLog.

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

// Java-Log/OverwriteFileLog log = session.createLog("Overwrite file"};DateTime lastRun = agentContext.getLastRun();DateTime nowDateTime = session.createDateTime("Today");nowDateTime.setNow();int daysSinceRun = nowDateTime.timeDifference(lastRun) / 86400;if (daysSinceRun > 7) log.setOverwriteFile(true);else log.setOverwriteFile(false);log.openFileLog("over.log");log . logAction ( "Logged an action"); •>

3.26.2. Методы

Метод openFileLog - «открыть протоколирование в файл»LotusScript: Call woterZ0g.openFileLog( filepath$ )Java: void Log.apenFi\eLog(String fllepath)Открывает протоколирование в файл, путь и имя которого заданы параметром fllepath

(тип String). Файл до вызова метода может не существовать, но каталог, указанный в пути к файлу, существовать должен.

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

Пример. Скрипт открывает протоколирование с перезаписью файла.

Dim currentLog As New NotesLog( "Script log" )currentLog.OverwriteFile = TrueCall currentLog.OpenFileLog( "c:\logs\scripts.txt" )' ... протоколирование действий и ошибок ... Call currentLog.Close

© InterTrust Co. Тел. (095) 9567928

Page 157: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 651

Метод openMailLog - «открыть протоколирование в почтовое сообщение»LotusScript: Call notesLog.(tpenMailLog( recipientsV [, subjects ] ) ;'.Java: void Zo,g.open!VIail.Log(/a\>a. util. Vector recipients, String subject)

Открывает протоколирование в почтовое сообщение.

Параметр recipients (в LotusScript типа String или array of Strings, в Java - объект класса java.util.Vector с элементами класса String) задает получателей почтового сообщения, а параметр subject (тип String) - тему сообщения (текст, помещаемый в поле Subject).

При работе метода Notes открывает почтовый ящик текущего пользователя (местоположение его почтового ящика выясняется по адресной книге) и создает в нем новое почтовое сообщение формы Memo. В ходе протоколирования в это почтовое сообщение добавляются записи. По завершении протоколирования (когда для данного объекта класса [NotesjLog вызывается метод close или данный объект удаляется) письмо отправляется адресатам, но без сохранения в ящике отправителя.

Пример 1. Скрипт протоколирует в почтовое сообщение. При работе метода close пользователю Thalia Ruben/Acme отправляется письмо, в поле Subject которого содержится "Here's the Linguist Log", a в поле Body протокол действий и ошибок.

Dim currentLog As NotesLcgSet currentLog = New NotesLog( "Linguist Log" )Call currentLog.OpenMailLog __

( "Thalia Ruben/Acme", "Here's the Linguist Log" )'... протоколирование действий и ошибок ...currentLog. Close . . . . . . . . ., , .

Пример 2. Java-агент протоколирует в почтовое сообщение. При работе метода close разработчику агента отправляется письмо, в поле Subject которого содержится "Java-Log/openMailLog in Java&LScript Classes", а в поле Body протокол действий и ошибок..

im po r t . j a va .u t i l .Ve c to r ;// Java-Log/openMailLogAgent agent = agentContext.getCurrentAgent( ) ;Database db ' = agentContext'.• getCurrentDatabase ( ) ; . . .. • ' . - - -Log log = session.createLog(agent.getName( ) } ;Vector v = new Vector( ) ;v . addElement ( agent. getOwner ( ) ) ; •. ...log.openMailLog(v, agent.getName() + " in " + db.getTitle());log.close();

Метод openNotesLog - «открыть протоколирование в базу»LotusScript: Call 77OtevZog.openNotesLog( server$, dbfile$ )

Java: void Log.openNotesLog(SVr/«g server, String dbfile)

Открывает протоколирование в базу Notes.

Параметр server (тип String) задает имя сервера, на котором находится база, в которую должно происходить протоколирование. Пустая строка (""/null) означает «текущий компьютер»: если выполнение происходит на сервере (включая «удаленные» (НОР) вызовы) - то «этот сервер», а если на станции - то «эту станцию».

Параметр dbfile (тип String) сообщает путь и имя файла базы. База должна существовать, а скрипт или Java-приложение должны иметь к этой базе необходимый доступ (не менее автора). Учтите, что агент, выполняющийся на сервере, не может открыть базу на другом сервере.

В результате в этой базе для каждого протоколируемого действия или ошибки будет создаваться отдельный документ. Документ будет иметь поле Form, содержащее "Log Entry", а также следующие поля.

© InterTrust Co. Тед. (095) 9567928

Page 158: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

652 Встроенные классы LotusScript и Java

Поле Содержимое

ASPROGNAME Значение свойства ProgramName

A$LOGTIME Дата-время протоколирования

ASUSER Пользователь

ASLOGTYPE Тип (ошибка/действие): "Error" или "Action"

ASACTION Описание действия (только для действий)

ASERRCODE Код ошибки (только для ошибок)

ASERRMSG Описание ошибки (только для ошибок)

В комплект поставки Notes входит шаблон StdR4AgentLog (ALOG4.NTF), специально разработанный для визуализации протоколов, создаваемых объектами класса [Notes] Log. Когда база dbfile создана по этому шаблону, в нее могут протоколировать информацию многие скрипты - в базе имеется вид, категоризированный по значению поля ASPROGNAME.

Пример 1. Скрипт протоколирует в базу AGENTLOG.NSF на текущем компьютере.Dim currentLog As New NotesLog( "Database log" ) Call currentLog.OpenNotesLog( "", "agentlog.nsf" )' . .. протоколирование действий и ошибок ... Cal l currentLog .Close

Пример 2. Java-агент протоколирует в базу AGENTLOG.NSF на текущем компьютере.// Java-Log/openNotesLogLog log = session.createLog("Database log"};log.openNotesLog(null, "agentlog.nsf");log.logAction("Logging an action"); log.close ();

Метод openAgentLog - «открыть протоколирование в протокол выполнения агента»LotusScript: Call ио/esZog.openAgentLog

Java: void Zog.openAgentLog()Открывает протоколирование в «протокол выполнения текущего агента». Может

применяться только в агенте. Просмотреть протокол выполнения агента можно выбором AgentXLog в меню.

Пример 1. Агент на LotusScript записывает текст "Action one" в свой протокол выполнения.Dim agentLog As New NotesLog("Agent log") Call agentLog.OpenAgentLogCall agentLog.LogAction("Action one") Call agentLog.Close

Пример 2. Java-агент записывает текст "Action one" в свой протокол выполнения.// Java-Log/openAgentLogLog log = session.createLog("Agent Log");log.openAgentLog();log.logAction("Action one"); log.close();

© InterTrust Co. Тел. (095) 9567928

Page 159: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5; @гформу.чы, LotusScript, встроенные классы LotusScript и Java 653

Метод logAction - «запротоколировать действие»

LotusScript: Call notesLog.logA.ction( descriptions )

Java: void Log.logAetmn(String description)Протоколирует одно действие. Параметр description (тип String) должен содержать

описание выполненного действия - этот текст и будет помещён в протокол.

Если протокол открыт методом openNotesLog, в базе протокола создается новый документ. Поле А$ACTION этого документа будет содержать текст из description.

Если протокол открыт методом openMailLog, метод добавляет текст' из description в поле Body почтового сообщения, предваряя его текущими датой и временем.

Если протокол открыт методом openFileLog, метод добавляет текст из description «следующей строкой» в файл, предваряя его значением свойства ProgramName и текущими датой и временем.

Пример 1. Скрипт протоколирует в почтовое сообщение. Он выполняет полнотекстовый поиск но текущей базе и переносит удовлетворяющие запросу документы в папку. Каждый акт переноса в папку протоколируется.

Предположим, запросу удовлетворяют 3 документа. Поле Body письма будет выглядеть примерно так:

10/25/9812:26:37 РМ Botany Agent starting ,10/25/98 12:26:42 РМ Document Petals placed in folder.10/25/98 12:26:44 РМ Document Stems placed in folder.10/25/98 12:26:46 РМ Document Leaves placed in folder.

Dim session As New NotesSession ' ' > • - • • - • • . . - • • . :..Dim db As NotesDatabase . . . " . .Dim collection As NotesDocumentCollectionDim currentLog As NotesLogDim doc As NotesDocumentSet db = session.CurrentDatabaseSet collection = db.FTSearch( "botany", 0 ) . - . •Set, currentLog = New NotesLog ( "Botany Agent" )Call currentLog.OpenMailLog( "Jesse Gora/Acme", "Log for Botany Agent" }For j = 1 To collection.Count

Set. doc = collection.. GetNthDocument ( j )Call doc.PutlnFolder ( "Botanist's Delight" ) ' •• • • Call currentLog.LogAction( "Document " & _ doc.Subjact( 0 ) & " placed in folder." )

Next ' . . - . . - • -..-Call currentLog.Close '

Пример 2. Java-агент выполняет то же, что и скрипт в примере 1. Отличия лишь в адресеполучателя почтового сообщения. . . . . .import Java. util. Vector; '•••' ' ' - • - . • • • ' • -// Java-Log/logAction ' '' - '•'''• "' •' • " • ••"'" - •' ' ••'•Log log = session. createLog ("Botany Agent"); ' "' ' ' ' •' -'• ' '•""Vector v = new Vector ( ) ; .... .. .v. addElement (session. getUserName ( ) ) ; , .. . . . . . . ...log.openMailLog(v, "Log for botany agent"),Database db -- agentContext. getCurrentDat.abase () ; :

DocumentCollection dc = db.FTSearch("botany", 0 ) ;Document doc;for (int j=0; j < dc. getCount () ; j++) ' ' ' . -:

1 '•• 'doc = dc.getNthDocument(j+1) ;doc.putlnFolder("Botanist's Delight"),-

© InterTrust Co. Тел. (095) 9567928

Page 160: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

654 Встроенные классы LotusScript и Java

log.logAction("Document " + doc.getltemValue("Subject") + " placed in folder.");

}log.close();

Пример 3. В примерах 1 и 2 вызов метода openMailLog заменен соответственно на

Call currentLog. OpenNotesLog( "", "agentlog.nsf" ) 'LotusScriptlog. openNotesLog(null, "agentlog.nsf") ; // Java

При прежних предположениях в базе AGENTLOG.NSF на текущем компьютере появится три документа. Первый из них будет содержать следующие поля:

ASPROGNAME "Botany Agent"ASLOGTIME 10/25/98 01:22:24 РМASUSER "Kerry Bowling"ASLOGTYPE "Action"ASACTION "Document Petals placed in folder."

Пример 4. В примерах 1 и 2 вызов метода openMailLog заменен соответственно на

Call currentLog.OpenFileLog( "c:\log.txt" ) 'LotusScriptlog. openFileLog("c: \\log. txt") ; .// Java

При прежних предположениях в файл LOG.TXT будут добавлены строки:

Botany Agent: 10/25/98 01:23:33 РМ: Document Petals placed in folder. Botany Agent: 10/25/98 01:23:35 РМ: Document Stems placed in folder. Botany Agent: 10/25/98 01:23:37 РМ: Document Leaves placed in folder.

Метод logError - «запротоколировать ошибку»LotusScript: Call noteslog.logError( code%, descriptions )Java: voidLog.logError(int code, String description)Протоколирует сообщение об ошибке. Параметр code (тип Integer/int) задает код ошибки,

а параметр description (тип String) - описание ошибки, помещаемое в протокол..Если протокол открыт методом openNotesLog, метод создает в базе протокола новый

документ. Поле ASERRCODE этого документа содержит code, а поле ASERRMSG содержит текст из description.

Если протокол открыт методом openMailLog, метод добавляет code и description в поле Body сообщения, предваряя его текущими датой и временем.

Если протокол открыт методом OpenFileLog, метод добавляет code и description «с новой строки» в файл, предваряя его значением свойства ProgramName и текущими датой и временем.

Пример 1. Скрипт протоколирует в файл. Ошибка lsERR_NOTES_DATABASE NOTOPEN возникает, когда не удалось открыть базу. Если она происходит, управление передается на метку logDbOpenError, где и происходит протоколирование. Вот пример записи из протокола:

Ornithology Agent: 10/25/98 02:48:40 РМ: Error (4063): Unable to open db CPycha.nsf

Обратите внимание, что этот скрипт должен включать файл LSXBEERR.LSS, в котором коды ошибок Notes сопоставляются символьным константам, в частности:

Public Const lsERR_NOTES_DATABASE_NOTOPEN = 4063

Sub InitializeOn Error lsERR_NOTES_DATABASE_NOTOPEN Goto logDbOpenErrorDim currentLog As NotesLogDim db As NotesDatabaseDim collection As NotesDocumentCollection

© InterTrust Co. Тел. (095)9567928

Page 161: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R, 5: (^-формулы, LotusScript, встроенные массы LotusScript и Java 655

' : > Set current Log' = New NotesLog( "Ornithology Agent" )'""' ' !: s-'Set db = New NotesDatabase ( » » , » » } -' . ••••Call db.OpenMail ' :

Call currentLog.OpenFileLog( "c:\log.txt" )Set collection = db.AllDocuments ' error might occur here. Call currentLog. Close ;, = .•• Exit Sub :

logDbOpenError:Call currentLog.LogError( lsERR__NOTES_DATABASE_NOTOPEN, _

"Unable to open db " & db,FileName ) Resume Next End Sub

Пример 2. Java-агент осуществляет полнотекстовый поиск по запросу «Rocks» (слово многозначное, в данном контексте вероятно «камни») в документах из текущей базы. Если документов не найдено, в файл logerror.log в текущем каталоге Notes протоколируется ошибка. Если же документы найдены, текущему пользователю отправляется почтовое сообщение со ссылками на все обнаруженные документы (т.н. «обзорный документ»).

// Java-Log/loqErrorDatabase db = agentContext.getCurrentDatabase();Log log = session, createLog ("Geology Agent"}; •• • • -•log.openFileLog("logerror.log");DocumentCollection dc -- db. FTSearch ( "Rocks", 0);if (dc.getCount(} == 0) { log.logError(0, "No documents found"); }else{Newsletter news = session.createNewsletter(dc);news.setSubj ectItemName("Subj ect" ) ;Document doc = news.formatMsgWithDoclinks(db);doc.appendltemValue("Form", "Memo");doc . append.ItemVa.lue ( "Subject", "The Rock Report");doc.send(false, session.getUserName(}); :

} _ . . . . . . . . . . . . .

Метод close - «закрыть протокол»

LotusScript: Call notesLog.close

Java: void Log.close()

Закрывает протокол. Если протоколирование осуществлялось в почтовое сообщение, в этот момент происходит отправка сообщения получателям.

1

Метод logEvent - «запротоколировать событие»LotusScript: Call notesLog.\ogEvent( message$, queuenameS, eventtype%, severity% )

Java: void Log.\ogE\ent(String message, String queuename, int even f type,

hit severity)

«В стороне» от всего рассмотренного находится метод logEvent. Только выполняющиеся на сервере агенты или Java-приложения могут использовать logEvent.

Чтобы уяснить суть метода, нужно быть в некоторой степени знакомым с системой сбора статистики и протоколирования событий в Domino. Метод logEvent только генерирует событие. Любое событие характеризуется типом, «степенью серьезности» и относящимися к событию данными - для logEvent это текст сообщения. Событие помещается в очередь событий с заданным именем, поддерживаемую сервером. Вот собственно и все, что делает метод. Далее обычно подразумевается, что серверная программа, обрабатывающая эту

© InterTrust Со. Тел. (095) 9567928

Page 162: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

656 Встроенные классы LotusScript и Java

очередь событий, находит в ней событие и должным образом обрабатывает его. Типичный пример такой программы - EVENT - программа протоколирования выбранных из стандартной очереди событий.

Параметр message (тип String) задает текст сообщения о событии.

Параметр queuename (тип String) сообщает имя очереди, в которую должно быть помещено событие. Если указать пустую строку, ваше событие попадет в стандартную очередь событий Domino.

Константа eventtype задает тип события. Может быть одной из следующих:• EVT_COMM/Log.EV_COMM,• EVT_SECURITY/Log.EV_SECURITY,• EVTJVlAIL/Log.EV_MAIL,• EV_REPLICA/Log.EV_REPLICA,• EVJJPDATE/Log.EVJJPDATE,• EVT_MISC/Log.EVJVlISC,• EVT_SERVER/Log.EV_SERVER,• EV_RESOURCE/Log.EV_RESOURCE,• EVT_ALARM/Log.EV_ALARM,• EVJJNKNOWN/Log.EVJJNKNOWN.

Константа severity определяет «степень серьезности» события. Может быть одной изследующих:• SEV_FATAL/Log.SEV_FATAL,• SEV_FAILURE/Log.SEV_FAILURE,• SEV_ WARNING 1/Log. SEV_ WARNING 1,• SEV_WARNING2/Log.SEV_WARNING2,• SEV NORMAL/Log.SEV_NORMAL,• SEV_UNKNOWN/Log.SEV_UNKNOWN.

т

© InterTrust Co. Тел. (095) 9567928

Page 163: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

658 Встроенные классы LotusScript и Java

Свойство DoSubject - «включать ли название документа»LotusScript: flag = notesNewsletter.DoSubiect , - •••

notesNewsletterJOoSub^ect =flag

Java: boolean flag = NewsletterAsDoSubjectQ

void Newsletter.sefDoSubject(boolean flag)

Если flag = true, обзорный документ, создаваемый методом formatMsgWithDoclinks, должен включать для каждого документа из коллекции «краткое название документа», если false - не должен (при создании объекта это свойство устанавливается в false). По смыслу краткое название документа должно раскрывать основную суть этого документа. Формально же краткое название - просто значение, выбираемое из некоторого поля документа, обычно текстового; например, из поля Subject или Topic.

Свойство SubjectltemName - «поле с названием документа»

LotusScript: name$ = notesNewsletter.SubiectltemName

notesNewsletter.SubjectltemName = пате$

Java: String name = News/etfer.getSubjectltemNameO

void Newsletter.setSubieciltemName(Sfring name)

Имя поля (тип String) в документах из коллекции, значение которого для каждого из документов должно включаться в обзорный документ, создаваемый методом formatMsgWithDoclinks, в качестве «краткого названия документа». Задавать значение этого свойства имеет смысл, если только свойство DoSubject равно true.

3.27.2. Методы

Метод formatMsgWithDoclmks - «создать обзорный документ со ссылками»

LotusScript: Set notesDocument = notesNewsletter.formaiMsgWitbiDoclinks(

notesDatabase )

Java: Document doc = Newsletter.form'AiMsgWithDoclinlis(Database db)

Создает в базе, заданной параметром метода, новый обзорный документ, содержащий информацию из тех документов и в той форме, как это было ранее определено в объекте [NotesJNewsletter, и возвращает ссылку на объект, представляющий этот документ.

В поле Body создаваемого документа каждый документ из коллекции будет представлен своим DocLink-ом. Если свойство DoScore равно true и коллекция отсортирована, вслед за DocLink-ом добавляется значение показателя соответствия поисковому запросу этого документа. Если свойство DoSubject равно true, вслед за DocLink-ом (или значением показателя соответствия запросу) добавляется «краткое название документа». Кроме того, в обзорный документ заносится имя файла базы, из которой была взята коллекция, и количество документов в ней. Внешний вид поля Body обзорного документа дается на Ошибка! Источник ссылки не найден, (в этом примере DoScore = true).

В LotusScript вы можете опустить параметр метода, а в Java указать вместо него null -тогда обзорный документ будет создан в базе - почтовом ящике текущего пользователя. Не забывайте сохранить созданный документ методом save или отправить получателю методом send.

© InterTrust Co. Тел. (095) 9567928

Page 164: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino JR. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 659

Search ResultsLocal Database:CN=NotesSrv4QQ/O=InterTrustCorp/C=SU!!WorkDatabases\EducationsJavaLSExs.nsf

Number of documents: 5

Rel% Link Title

100% В Here are links to all docs in the Boots folder

100% Ш Here are links to all docs in the Boots folder

100% D Кубик Рубика на Java

100% D 07. Класс [Notes] ACL . ..

67% D 08. Класс [Notes]ACLEntry .

Puc. 3.36 Внешний вид обзорного документа

Пример 1. LotusScript-агент работает по новым или модифицированным документам. Онвыполняет запрос полнотекстового поиска по необработанным документам в текущей базе, создаетобзорный документ со ссылками на каждый из документов найденной коллекции и отправляет егопочтой Susanna Tallan/Acme, которая интересуется ботаникой. После каждого DocLink-a в письмеследует значение показателя соответствия поисковому запросу и значение поля Topic из исходногодокумента. . - • . . . . . -

Обратите также внимание, что агент методом updateProcessedDoc отмечает документы из коллекции как обработанные, чтобы они не обрабатывались им вновь при очередном запуске.Sub Initialize

Dim session As New NotesSessionDim db As NotesDatabaseDim collection As NotesDocumentCollection '-• - ' ' 'Dim newsletter As NotesNewsletter - • • •Dim doc As NotesDocumentDim originalDoc As NotesDocument . . .Set db = 'session. CurrentDatabase - • • - . . . - - • • . . • • • . .. .Set collection = db.UnprocessedFTSearch( "botany", 0 ) : .Set newsletter = New NotesNewsletter( collection )newsletter.DoScore = Truenewsletter.DoSubject = Truenewsletter.SubjectltemName = "Topic"Set doc = newsletter.FormatMsgWithDoclinks( db ) ,doc.Subject = "New botany documents from this week"doc.Form = "Memo"Call doc.Send( False, "Susanna Tallan/Acme" )' Остается отметить документы как обработанные агентомFor j = 1 То collection.CountSet originalDoc = collection.GetNthDocument( j ) Call session.UpdateProcessedDoc( originalDoc )

NextEnd Sub .

Пример 2. Java-агент выполняет запрос полнотекстового поиска по всем документам в текущей базе, создает обзорный документ со ссылками на каждый из документов найденной коллекции и сохраняет его в базе. После каждого DocLink-a в созданном документе следует значение показателя соответствия поисковому запросу и значение поля Subject исходного документа.

©InterTrustСо. Тел. (095) 9567928

Page 165: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

660 Встроенные классы LotusScript u Java

// Java-Newsletter/ExlDatabase db = agentContext .'getCurrentDatabase () ;db.updateFTIndex(true);DocumentCollection dc = db.FTSearch("arachnid", 0); // паукиif (dc.getCount() > 0)r t

Newsletter news = session.createNewsletter(dc); news.setSubjectltemName("Subject") ; news.setDoSubject(true); news.setDoScore(true);Document doc = news.formatMsgWithDoclinks(db); doc.appendltemValue("Form", "Report");

doc.appendltemValue("Subject", "The Arachnid Report"); doc.save(); }

Метод formatDoeurnent - «создать обзорный документ с образом документа»LotusScript: Set notesDocument = notesNewsletter.formaiDocument( notesDatabase, n% )Java: Document doc - NewsIetter.formztDocument(Database db, int n)Метод создает новый документ в базе, заданной первым параметром метода, и

возвращает ссылку на объект, представляющий этот документ. Создаваемый документ будет содержать в поле Body «изображение» одного документа из коллекции, определенной в объекте [NotesJNewsletter, а именно документа из коллекции с номером п (тип Integer/int). Напомним, что нумерация документов в коллекции начинается с единицы. Если в LotusScript не указать значение первого параметра, а в Java задать его равным null, то документ -«изображение» будет создаваться в базе - «почтовом ящике» текущего пользователя. Не забывайте сохранить созданный документ методом save или отправить его получателю методом send.

Действие метода - создание «образа» документа - подобно выполнению из меню действия Actions-Forward над документом.

Если вам понадобится поместить в один документ «образы» нескольких документов, воспользуйтесь возможностями класса [NotesJRichTextltern.

Пример. Скрипт выполняет запрос полнотекстового поиска по текущей базе. По каждому найденному документу (а их будет не более трех) создается документ - «изображение». В каждый документ - «изображение» добавляется поле Subject из оригинального документа, и затем он отсылается специалисту по ботанике Susanna Tallan/Acme.

Dim session As New NotesSessionDim db As NotesDatabaseDim collection As NotesDocumentCollectionDim newsletter As NotesNewsletterDim doc As NotesDocumentSet db = session.CurrentDatabaseSet collection = db.FTSearch( "botany", 3 )Set newsletter = New NotesNewsletter( collection )' for every document in the newsletter's collectionFor j = 1 To collection.Count

' создание «изображения» оригинального документаSet doc = newsletter.FormatDocument( db, j )1 copy subject of original document into new documentdoc.Subject = collection.GetNthDocument( j ).Subject{ 0 ) ,' отправка нового документа почтойCall doc.Send( False, "Susanna Tallan/Acme" ) . • • • • • . •

Next • -

© InterTrust Co. Тел. (095) 9567928

Page 166: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-фармулы, LotusScript, встроенные классы LotusScript и Java 661

- И \ ', ".г ' - : . . , ; . - . - . .. ' • ' • " • ' ' _ • • . • ; / • • - :

3.28. «Регистрация» - класс [Notes]RegistrationОбъект класса [NotesJRegistration применяется при создании и администрировании ID-

файлов и «связанных» с ними документов в адресной книге сервера (с версии 5.0 - Domino Directory). Свойства по сути используются для того, чтобы методы класса имели по возможности меньше параметров - значения свойств «устанавливают» перед вызовом методов. Методы позволяют выпускать взаимные сертификаты, ресертифицировать существующие ID-файлы, регистрировать новых пользователей, сертификаторов и серверы, включая создание ID-файлов, соответствующих документов в адресной книге сервера, и, для пользователей, создание почтовых баз. Имеются также методы, позволяющие извлекать или удалять присоединенные ID-файлы из документов в адресной книге сервера, «переключаться» на другой ID-файл, получать или изменять информацию в документах адресной книги сервера.

«Контейнерная иерархия»

LotusScript NotesRegistration

Java Session _> Registration

В LotusScript объект класса NotesRegistration получают методом New:

Dim variableName As New NotesRegistration или Set

notesRegistration = New NotesRegistration

В Java для получения объекта класса Registration используют метод createRegistration класса Session:

Registration variableName = sess/o/ncreateRegistrationO

3.28.1. Свойства

Свойство CertifierlDFile - «путь и имя ID-файл а сертификатора»LotusScript: file$ = notesRegistration.CertifierlDҐile

notesRegistration.Certiu&rlDFile=file$

Java: public String Registration.getCertifierTDFileQ

public void Registration.setCertiuerlDҐile:(StrmgJile)Строка, содержащая полный путь и имя (например, "c:\notes\data\cert.id") ID-файла

сертификатора, который будет использоваться при последующих операциях: создании новых и ресертификации существующих ID-файлов, выпуске взаимных сертификатов.

Свойство ГОТуре - «тип создаваемых ID-файлов»LotusScript: type% = notesRegistration.IDType •

notesRegistration.IDType — type%

Java: public int Registration.geilDTypeO

public void Registration.setnyType(int type) 'Тип создаваемых ID-файлов (их создание инициируется методами registerNewUser,

registerNewServer или registerNewCertifier). Как в LotusScript, так и в Java задается целыми константами: 1D_FLAT - создается ID-файл с простым именем (простым сертификатом),

© InterTrust Co. Тел. (095) 9567928

Page 167: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

662 Встроенные классы LotusScript и Java

ID_HIERARCHICAL - создается ID-файл с иерархическим именем (иерархическим сертификатом), 1D_CERTIFTER - такого же типа, как ID-файл сертификатора, используемый при создании ID-файла.

Свойство NorthAmerican - «вид лицензии создаваемых ID-файлов» LotusScript: flag = notesRegistration.IsNorthAmcric&n

notesRegistration.lsNorihAmerican =flag

Java: public boolean Registration.isNarthAmericsmQ

public void Registration.seiNorthAmerican(booleanflag)

Вид лицензии для создаваемых ID-файлов. Если свойство равно true (это значение по умолчанию) - «североамериканские» лицензии (North American), если false «международные» (International).

Свойство Expiration - «время окончания срока действия сертификата» LotusScript: date = notesRegistration.^E^iration '

notesRegistration.Ex^iration = date

Java: public DateTime /?egw/raft'o«.getExpiration()

public void Registration.seiExpiration(DateTime date)

Дата и время окончания срока действия сертификата в создаваемых ID-файлах. В LotusScript имеет тип Variant of type DATE, а в Java - DateTime.

Пример 1. Установка окончания срока действия сертификата в LotusScript: 2 года с момента выдачи.Dim R As New NotesRegistrationDim CertExpireDate As VariantCertExpireDate = Datenumber(Year(Now)+2,Month(Now),Day(Now))R.Expiration = CertExpireDatePrint "ExpireDate = "; R.Expiration

Пример 2. Установка окончания срока действия сертификата в Java: 5 лет с момента выдачи.

Registration R = session.createRegistration( ) ;DateTime CertExpireDate = session.createDateTime("Today");CertExpireDate.setNow();CertExpireDate.adjustYear(5 , true);R.setExpiration(CertExpireDate);System.out.println("ExpireDate = " + R.getExpirationO.getLocalTime());

Свойство MinPasswordLength - «минимально-допустимая длина пароля»LotusScript: length% ~ notesRegistration.MinPasswordLengthnotesRegistration.MmPasswordLength = length%Java: public int ./?eg/s?rarioH.getMinPasswordLengthO

public void Registration.setMmPassv?oruLengtb(int length)

Минимально-допустимая длина пароля для создаваемых ID-файлов.

Свойство OrgUnit - «дополнительный уровень в имени создаваемых ID-файлов пользователя или сервера»

LotusScript: unit$ = notesRegistration. OrgUnit

© InterTrust Co. Тел. (095) 9567928

Page 168: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino К, 5: (ар-формулы, LotusScript, встроенные классы LotusScript и Java 663

, , , „ , , , , » , . , , . notesRegistration.OrgUnit = unit$ • • " ' ' • ' ,;

Java: public String Registration.getOrgUnitQ

public void Registration.setQrg\Jnit(String unit)

Строка, задающая дополнительный уровень в имени для создаваемых ID-файлов пользователя или сервера. Например, если регистрируется пользователь с именем "Ivan I. Ivanov", имя сертификатора "/Unitl/Organization/RU", а свойство OrgUnit = "OrgUnit", то полное имя пользователя будет иметь вид "Ivan I. Ivanov/OrgUnitAJnitl/Organization/RU". Этот дополнительный уровень в имени «не подтверждается сертификатором», т.е. «последний сертификат-компонента» в ID-файле пользователя будет выдан сертификатором "/Unitl/Organization/RU" для "Ivan I. Ivanov/OrgUnit/Unitl/Organization/RU".

Свойство RegistrationServer - «имя «регистрационного» сервера»LotusScript: server$ — notesRegistration.RegistrationServer <

notesRegistrationMegislratumServer = server$

Java: public String Registration.g&iRegistrationServerQ

public void Registration.seiRegistra.tionServer(String server)

Строка, содержащая полное имя «регистрационного» сервера. В адресной книге этого сервера при работе методов класса [NotesjRegistration может происходить создание или модификация документов Person, Server, Certifier или CrossCertificate, а так же сохранение созданных ID-файлов в документах Person или Server,

Свойство UpdateAddressBook - «вносить ли изменения в соответствующие документы адресной книги регистрационного сервера»LotusScript: flag — notesRegistration.UpdateAddressBook

notesRegistration.UpdateAddressBook^flag

Java: public boolean /?eg/5?ra//0w.getUpdateAddressBook()

public voidRegistration.setlJpdateAddressBook(boolean flag)Если свойство равно true, при создании или изменении методами класса

[NotesjRegistration ID-файлов пользователей, серверов и сертификаторов будут вноситься изменения в соответствующие документы адресной книги регистрационного сервера. Если свойство равно false, такие изменения в документах адресной книги сервера не выполняются.

Свойство StorelDInAddressBook - «сохранять ли создаваемые ID-файлы в документах адресной книги регистрационного сервера»LotusScript: flag = notesRegistration.StorelDInAddressftook

notesRegistration.StoreWlnAddressBook :=flag

Java: public boolean ^eg/5/ra//o/?.getStoreIDInAddressBook()

м- public void Registration.setStoreTDInAddressBook(boolean flag)

Если свойство равно true, создаваемые в процессе регистрации ID-файлы пользователей и серверов должны сохраняться в документах адресной книги регистрационного сервера, если false - не должны.

., © InterTrust Со. Тел. (095) 9567928

Page 169: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

664 Встроенные классы LotusScript u Java

Свойство CreateMailDb - «создавать ли почтовые базы для регистрируемых пользователей»LotusScript: flag = notesRegistration,CreateM ailDb

notesRegistration.CreateMailDb —flag

Java: public boolean Registration.getCrenteMaiiDbQ

public void Registration.setCreateMai\Db(boolean flag)Если свойство равно true, в процессе регистрации нового пользователя для него должна

создаваться почтовая база. Если свойство равно false, почтовая база в процессе регистрации не создается.

Свойство RegistrationLog - «база, в которую должно выполняться протоколирование»LotusScript: name$ = notesRegistralion.RegistrationLog

notesRegistration.RegistrationLog = пате$

Java: public String ./teg/sfra/z'ow.getRegistrationLogO

public voidRegistration.setRegistrationLog(String name)Строка, содержащая имя файла базы, в которую должно выполняться протоколирование

процесса создания ID-файлов.

К сожалению, документация по продукту и эксперименты не помогли автору уяснить сущность данного свойства. В процессе регистрации, осуществляемом как «вручную», так и методами и свойствами класса [NotesJRegistration, протоколирование осуществляется в базу certlog.nsf, если она существует (а не log.nsf, как отмечается в документации). После создания объекта [NotesJRegistration свойство имеет «пустое» значение. Эксперименты не выявили влияния установки значения этого свойства на процесс протоколирования.

3.28.2. Методы

Метод crossCertify - «выпустить взаимный сертификат»LotusScript: Call notesRegistration.crossCertify( idfile$ [, certpw [, comment ]])

Java: public boolean Registration.ctrossCertify(String id/lie)

public boolean Registration.crossCertify(String id/lie, .

., : String certpw, String comment)Выпускает взаимный сертификат. Строка id/ile задает полный путь и имя ID-файла, для

которого создается взаимный сертификат, строка certpw - пароль для ID-файла сертификатора (от «его имени» выпускается взаимный сертификат), а строка comment -комментарии, заносимые в соответствующее поле документа Cross Certificate. Метод возвращает true, если операция выполнена успешно, или false, если нет.

Метод требует, чтобы у объекта [NotesJRegistration было предварительно установлено свойство CertifierlDFile - путь к ID-файлу сертификатора. Чтобы задать срок действия взаимного сертификата, обычно дополнительно устанавливают и свойство Expiration. Кроме того, целесообразно предварительно установить свойства RegistrationServer и UpdateAddressBook.

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

© InterTrust Co. Тел. (095) 9567928

Page 170: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R, 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 665

Пример. Агент, написанный на LotusScript, запускается на станции пользователя, являющегося администратором домена, и обрабатывает все отмеченные этим пользователем документы. Подразумевается, что таким документом является почтовое сообщение с присоединенной безопасной копией ID-файла, подобное приведенному на Рис. 3.37 - запрос на выпуск взаимного сертификата.

Наше предприятие использует Е работе Lotus Motes, есть желание реплицировать ваш Форум. Вопросов по Motes очень иного. Прилагаю к письму безопасную копию ID-файла нашего сервера.

(See attached file: Safe.id)

• ОАО "Электросвязь" г. Петрозаводск . • . - .'.- .:• - -Дубинин Максим Александрович [email protected]

(

I "ЧI--1 - Safe.id

Рис. 3.37 Фрагмент «письма» с присоединенной безопасной копией ID-файла

Из каждого документа и каждого присоединенного файла в поле Body агент «отсоединяет» файл во временный каталог, выпускает на него взаимный сертификат, а затем удаляет этот файл. Все действия, касающиеся выпуска взаимного сертификата, вынесены в процедуру CrCert. В объекте класса NotesRegistration предварительно установлены свойства: CertifierlDFile - местонахождение ID-файла, «от имени которого» выпускается взаимный сертификат; Expiration - сертификат будет действителен в течении 2-х лет со дня выпуска; RegistrationServer - в адресной книге этого сервера создается документ, содержащий взаимный сертификат; UpdateAddressBook - изменения вносятся в адресную книгу. В качестве комментария в документ Cross Certificate помещается почтовый адрес пользователя, приславшего запрос.

Sub InitializeDim s As New NotesSessionDim db As NotesDatabaseDim cl As NotesDocumentCollection .. - 'Dim doc As NotesDocumentDim rtitem As Variant , . . ,Dim fn As Stringfn="d:\notes\data\temp\tempsc.id"

Set db = s. current-Database ' .;Set cl = db.unprocessedDocuments • ' 'For i = l To cl. count v,: •'••-:

Set doc •= cl. getNthDocument (i)Set rtitem = doc.getFirstltem( "Body" } • .If ( rtitem.Type = RICHTEXT ) Then

Forall о In rtitem.embeddedObjectsIf { o.Type = EMBED_ATTACHMENT ) Then . -,

Call o.extractFile(fn)... - Call CrCert (fn, doc. From (0)). ,: . Kill fn . . ' . . , . ' - : '

E n d i f : , . ' . ' . ' . :End Forall

End If .,

NextEnd Sub .

Sub CrCert(safeCopyFN As String, Comment As String) Dim CertExpireDate As Variant

© InterTrust Co. Тел. (095) 9567928

Page 171: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

666 Встроенные классы LotusScript и Java

CertExpireDate = Datenumber(Year(Now)+2,Month(Now) , Day(Now))Dim R As New NotesRegistrationR.CertifierlDFile = "d:\Notes\data\cert.id"R. Expiration = CertExpireDateR.RegistrationServer = "CN=Domino500/0=InterTrustCorp/C=SU"R.UpdateAddressBook = TrueCall R.crossCertify(safeCopyFN,"certpassword",Comment)End Sub

Рис. 3.38 Документ Cross Certificate

Метод recertify - «рёсертифицировать ID-файл»LotusScript: Call notesRegistration.recertify( idfileS [, certpw [, comment ]])

Java: public boolean Registration.recertify(String idfile)

public boolean Registration.recertify(String idfile,

String certpw, String comment)Ресертифицирует ID-файл - заменяет содержащийся в нем сертификат и, если

необходимо, информацию в соответствующем документе из адресной книги регистрационного сервера. Строка idfile задает полный путь и имя ID-файла, подлежащего ресертификации. В строке certpw должен содержаться пароль для ID-файла сертификатора (от чьего имени выпускается сертификат), а в строке comment - комментарии, заносимые в соответствующее поле документа из адресной книги. Метод возвращает true, если операция выполнена успешно, или false, если нет.

Метод требует, чтобы у объекта [Notes]Registration было предварительно установлено свойство CertifierlDFile - путь и имя ID-файла сертификатора. Чтобы задать срок действия взаимного сертификата, обычно дополнительно устанавливают и свойство Expiration. Кроме того, целесообразно предварительно установить свойства RegistrationServer и UpdateAddressBook.

Учтите, что если ресертифицируемый ID-файл защищен паролем, при работе метода будет выдан запрос на его ввод.

Пример. Java-агент ресертифицирует ID-файл пользователя zzzl.id. В качестве ID-файла сертификатора используется файл cert.id. Срок действия сертификата - 5 лет с момента выдачи. Происходит обновление информации в документе Person на регистрационном сервере.

// Registration/recertifyRegistration R = session.createRegistration( ) ;R.setCertifierIDFile("d:\\Notes\\data\\cert.id") ;DateTime CertExpireDate = session.createDateTime("Today"};CertExpireDate.setNow();CertExpireDate.adj ustYear(5, true};System.out.println("CertExpireDate = " + CertExpireDate.getLocalTime( ) ) ;R. setExpiration(CertExpireDate);

© InterTrust Co. Тел. (095) 9567928

Page 172: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 667

R.setRegistrationServer("CN=Domino500/0=Inte'rTrustCorp/C=SU"); . R. setUpdateAddressBook (true.) ;String safeCopyFN = "d: \\Notes\\data\\Temp\\zzzl. id"; if ( R.recertify(safeCopyFN,"certpassword","Comment here") == true )

System, out.println ( "recertify Ok!. " ) ;else , .' - - - •

System, out .println ( "recertify Failure!"); '.

Метод registerNewCertifier - «зарегистрировать нового сертификатора организации»LotusScript: Call notesRegi$tration.HegisterNewCertifier( organizations,

idfileS, userpw$ [, country ]] )

Java: public boolean Registration.registerNevtCertiuer(String organization,

String idfile, String userpw) public boolean

Registration.register~Ne'wCertiuer(Strmg organization,

String idfile, String certpw, String country)

Регистрирует нового сертификатора организации - создает для него ID-файл и, если необходимо, документ Certifier в адресной книге регистрационного сервера. Строка organization задает название организации, строка idfile - имя файла, включая полный путь, куда будет помещен созданный ID-файл сертификатора, строка userpw - пароль для создаваемого ID-файла, а строка country - код страны. Метод возвращает true, если операция выполнена успешно, или false, если нет.

Метод использует информацию не только из своих параметров. Обычно предварительнонеобходимо установить у объекта [NotesjRegistration свойства NorthAmerican = false,MinPasswordLength, а так же RegistrationServer и UpdateAddressBook = true, чтобы создавалсядокумент Certifier. •

Метод addCertifierToAddressBook - «добавить информацию о сертификаторе в адресную книгу»LotusScript: Call notesRegistration.addCertifier'ToA.ddressBoo\i( idfile$

[,password [, location [, comment]]])

Java: public boolean Registration.&MCeriiuerToAddress^oo\i(String idfile)

public boolean Registration.&ddCertifierToAddre$sT$ook(String idfile,

String password, String location, String comment)

Добавляет в адресную книгу регистрационного сервера документ Certifier с информацией о сертификаторе. Строка idfile должна задавать полный путь и имя ID-файла этого сертификатора, а строка password - пароль для этого ID-файла. Информация из строк location и comment заносится в соответствующие поля документа Certifier. Метод возвращает true, если операция выполнена успешно, или false, если нет.

Метод использует только информацию из передаваемых ему параметров - для него нет необходимости предварительно устанавливать какие-либо свойства объекта [Notes]Registration.

Пример. Скрипт создает в каталоге d:\Notes\data\Temp два ID-файла certOl.id и cert02.id для сертификаторов организаций /OrgNameOl/RU и /OrgName02/RU. Оба ID-файла будут иметь международные лицензии и минимально-допустимую длину пароля, равную 8. Для каждого сертификатора в адресной книге регистрационного сервера создается документ Certifier с соответствующей информацией в поле с меткой Certified public key (поле находится на закладке Basics

© InterTrust Co. Тел. (095) 9567928

Page 173: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

668 Встроенные классы LotusScript и Java

и «видимо» только в режиме редактирования). Однако для сертификатора /OrgNameOl/RU документ Certifier создается при работе метода registerNewCertifier, поскольку перед вызовом метода в объекте класса NotesRegistration свойство UpdateAddressBook равно true. Напротив, для сертификатора /OrgName02/RU документ Certifier создается позже, при работе метода addCertifierToAddressBook, поскольку перед вызовом метода registerNewCertifier в объекте класса NotesRegistration свойство UpdateAddressBook равно false. Единственное достоинство второго варианта в возможности добавить информацию в поля Location и Comment.

Dim Path, FileName, Password As String • Path = "d:\Notes\data\Temp" Password = "password"

Dim R As New NotesRegistrationR.IsNorthAmerican = False ' Международная лицензия R.MinPasswordLength = 8 ' Минимальная длина пароля R.RegistrationServer = "CN=NotesSrv400/0=InterTrustCorp/C=SU"

R.UpdateAddressbook = True •FileName = "certOl.id" ,Call R.registerNewCertifier("OrgName01",Path+"\"+FileName,Password,"RU")

R. UpdateAddressbook = False 'FileName = "cert02.id"Call R.registerNewCertifier("OrgName02",Path+"\"+FileName,Password,"RU")Call R.addCertifierToAddressbook(Path+"\"+FileName,Password, _

"Location here","Comment here") End Sub

Рис. 3.39 Документ Certifier на закладке Contact Information

Метод registerNewServer - «зарегистрировать сервер»

LotusScript: Call notesRegistration.registerNevi'Server( serverS, idfile$,

domain$ [, servpw$ [, certpw [, location$ [, comments

[, networks [, adminnameS [, titleS ]]]]]]] )

Java: public boolean Registration.registerNe'wServer(String server, String idfile,

String domain, String servpw)

public boolean Registration.registerNev?Server(String server, String idfile,

String domain, String servpw, String certpw, String location, String

comment, String network, String adminname, String title)

Регистрирует новый сервер - создает для него ID-файл и добавляет в адресную книгу регистрационного сервера информацию о зарегистрированном сервере. Строка server задает

© InterTrust Co. Тел. (095) 9567928

Page 174: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 669

имя нового сервера. Строка idfile должна задавать полный путь и имя файла, куда будет помещен ID-файл нового сервера. Строка domain задает имя домена, к которому принадлежит новый сервер. Строка servpw задает пароль ID-файла сервера (однако обычно защита паролем ID-файла сервера не практикуется). Строка certpw задает пароль ID-файла сертификатора, который используется при создании сертификата, помещаемого в Ш-файл нового сервера. Строка network задает имя поименованной сети Notes (Notes Named Network), к которой «своим первым портом» принадлежит новый сервер. Строка adminname задает имена администраторов этого сервера. Строки title и comment могут содержать информацию, заносимую в соответствующие поля документа Server. Метод возвращает true, если операция выполнена успешно, или false, если нет.

До вызова метода в объекте [Notes]Registration как минимум необходимо установить свойство CertifierlDFile, однако часто необходима установка ряда других свойств.

Метод addServerToAddressBook - «добавить в адресную книгу информацию о зарегистрированном сервере»LotusScript: Call «otesjRegw/ra/z'ow.AddServerToAddressBook( idfile$,

serverS, domainS [, userpw [, network

[, adminname [, title [, location [, comment ]]]]]])

Java: public boolean Registration.addServertoAddressBoo^String idfile,

String server, String domain) public boolean

/tegLv?ra?/on.addServerToAddressBook(.S'fr7>2g idfile,

String server, String domain, String userpw, String network,

String adminname, String title, String location, String comment)

Добавляет в адресную книгу информацию о зарегистрированном сервере. Строка idfile задает полный путь и имя ID-файла этого сервера, а строка server - имя сервера. Строка domain задает имя домена, которому принадлежит новый сервер. Строка userpw сообщает пароль ID-файла сервера. Строка network дает имя поименованной сети Notes (Notes Named Network), к которой «своим первым портом» принадлежит сервер. Строка adminname задает имена администраторов этого сервера. Строки title, location и comment могут содержать информацию, заносимую в соответствующие поля документа Server. Метод возвращает true, если операция выполнена успешно, или false, если нет.

Для этого метода из объекта [Notes]Registration используется только' свойство StorelDInAddressBook. Другие свойства объекта [NotesJRegistration нет необходимости предварительно устанавливать - в остальном метод пользуется только информацией из передаваемых ему параметров.

Пример. Java-агент создает в каталоге d:\Notes\data\Temp два ID-файла ServerOl.id и Server02.id для серверов TestServerOl/SrvUnitOl/InterTrustCorp/SU и TestServerOl/Sn/UnitOl/InterTrustCorp/SU. Сертификатором для обоих ID-файлов является /InterTrustCorp/SU (файл d:\Notes\data\cert.id с паролем "certpassword"), a SrvUnitOl - дополнительный уровень в имени. Оба ID-файла будут иметь международные лицензии, 50-летний срок действия сертификата и не будут защищены паролем. Для каждого сервера в адресной книге регистрационного сервера создается документ Server с присоединенным к нему ID-файлом сервера (причем «беспарольным», что следует расценивать как несоблюдение безопасности), соответствующей информацией в поле с меткой Certified public key (поле находится на закладке Miscellaneous и «видимо» только в режиме редактирования), именем домена TestDomain, именем поименованной сети NetworkOl, группой Administrators в качестве администраторов сервера и соответствующей информацией в полях Location, Comment и Server Title. Однако для сервера TestServerOl /SrvUnitOl документ Server создается при работе метода registerNewServer, поскольку перед вызовом метода в объекте класса NotesRegistration свойство UpdateAddressBook равно true. Напротив, для сервера TestServer02/SrvUnitO 1 документ Server создается

© InterTrust Со. Тел. (095) 9567928

Page 175: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

670 Встроенные классы LotusScript и Java

«позже», при работе метода addServerToAddressBook, поскольку перед вызовом метода registerNewServer в объекте класса NotesRegistration свойство UpdateAddressBook равно false.

// Java-Registration/registerNewServerRegistration R = session.createRegistration( ) ;R.setCertifierIDFile("d:\\Notes\\data\\cert.id") ; -DateTime CertExpireDate = session.createDateTime("Today"); CertExpireDate.setNow( ) ; CertExpireDate.adjustYear(50, true); R.setExpiration(CertExpireDate);System.out.println("CertExpireDate = "+R.getExpiration().getLocalTime()); R. setNorthAmerican (false) ; R.setOrgUnit("SrvUnitOl");R.setRegistrationServer("CN=Domino500/0=InterTrustCorp/C=SU"); R.setUpdateAddressBook(true); R.setStorelDInAddressBook(true);String IDFN1 = "d:\\Notes\\data\\Temp\\Server01.id"; if ( R.registerNewServer("TestServerOl",IDFN1,"TestDomain","", "certpassword","Location here", "Comment here", "NetworkOl","Administrators","Server title here") == true )

System.out.println("registerNewServerOl Ok!"); else

System.out.println("registerNewServerOl Failure!");

R.setUpdateAddressBook(false); R.setStorelDInAddressBook(false);String IDFN2 = "d:\\Notes\\data\\Temp\\Server02.id"; if ( R.registerNewServer("TestServer02",IDFN2,"TestDomain","", "certpassword","","","","","") == true )

System.out.println{"registerNewServer02 Ok!");else :'

System.out.println("registerNewServer02 Failure!");R. setUpdateAddressBook (true) ; '•- 'R. setStorelDInAddressBook (true) ;

•• .if ( R.addServerToAddressBook(IDFN2,"TestServer02","TestDomain","",

"NetworkOl","Administrators","Server title here", "Location here", "Comment here") == true )

System, out .println ( "addServerToAddressBook02 Ok!"); •>else

System.out.println("addServerToAddressBook02 Failure!");

© Метод registerNewUser - «зарегистрировать пользователя»LotusScript: Call notesRegistration.registerNe\vUser( lastnameS, idjile$, mailserverS[ ,firstname$ [, middle$ [, certpwS [, locations [, comment$[, maildbpath$ [ ,fwdaddress$ [, userpw$ [, usertype% ]]]]]]]]] )Java: public boolean Registration.registerNe\vUser(String lastname, String idfile,

String mailserver)

public boolean Registration.registerNe\vUser(String lastname, String idfile,

String mailserver, Stringfirstname, String middle, String certpw, String

location, String comment, String maildbpath, Stringfwdaddress, String

userpw)

© InterTrust Co. Тел. (095) 9567928

Page 176: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @гформулы, LotusScript, встроенные классы LotusScript и Java 671

Регистрирует нового пользователя - создает для него ID-файл, добавляет в адресную книгу регистрационного сервера информацию о зарегистрированном пользователе, создает для пользователя почтовую базу.

Строка lastname задает фамилию пользователя. Строка idfile должна задавать полный путь и имя файла, где будет создан ID-файл пользователя. Строка mailserver задает имя почтового сервера - на нем должна размещаться почтовая база пользователя. Строки firstname и middle определяют соответственно имя и букву отчества пользователя. Строка certpw дает пароль для доступа к ID-файлу сертификатора. Строки location и comment могут содержать информацию, заносимую в соответствующие поля документа Person. Строка maildbpath задает путь и имя файла почтовой базы пользователя (например, "mail\jones.nsf), & fwdaddress - информацию для заполнения поля Forwarding address документа Person (если не пусто, это адрес, по которому пересылается вся адресованная пользователю почта). Строка userpw дает пароль для доступа к создаваемому ID-файлу. Наконец, в версии 5.0 добавлен параметр usertype, задаваемый константами NOTES_DESKTOP_CLIENT, NOTES_FULL_CL1ENT или NOTES_LIMITED CLIENT и указывающий тип лицензии для пользователя. Метод возвращает true, если операция выполнена успешно, или false, если нет.

До вызова метода в объекте [NotesjRegistration как минимум необходимо установить свойство CertifierlDFile, однако часто требуется установка почти всех других свойств.

Метод addllserToAddressBook - «добавить в адресную книгу информацию о зарегистрированном пользователе»LotusScript: Call wofesjReg/s/raft'o«.addUserToAddressBook( idfileS, fullname$,

lastname$ [, userpw [, firstname [, middle [, mailserver [, maildbpath [,

fwdaddress [, location [, comment ]]]]]])

Java: public boolean Registration.a<udUser'ToA.ddress'Boo\i(String idfile,

String fullname, String lastname)

public boolean Tfeg/sfra/zow.addlJserToAddressBook^r/wg idfile,

String fullname, String lastname,

String userpw, String firstname, String middle, String mailserver, String

maildbpath, String fwdaddress, String location, String comment)

Добавляет в адресную книгу информацию о зарегистрированном пользователе, может создавать для пользователя почтовую базу. Строка idfile должна задавать полный путь и имя ID-файла этого пользователя. Строка userpw дает пароль для доступа к этому ID-файлу. Строки, full name и lastname должны содержать соответственно полное имя пользователя и его фамилию, а строки firstname и middle - соответственно имя и букву отчества пользователя. Строка mailserver задает полное имя почтового сервера пользователя, maildbpath - путь и имя файла почтовой базы пользователя, a fwdaddress - информацию для заполнения поля Forwarding address в документе Person. Строки location и comment могут содержать информацию, заносимую в соответствующие поля документа Person. Метод возвращает true, если операция выполнена успешно, или false, если нет.

Этим методом из объекта [Notes]Registration используются только свойства StorelDInAddressBook и CreateMailDB. Другие свойства объекта [Notes]Registration нет необходимости предварительно устанавливать - в остальном метод пользуется только информацией из передаваемых ему параметров.

Пример. Скрипт «при ответах по умолчанию во всех Inputbox-ax» создает в текущем каталоге данных Notes два ID-файла HvanovOl.id и IIvanov02.id для пользователей Ivan Ivanov/01/InterTrustCorp/SU и Ivan Ivanov/02/InterTrustCorp/SU. Сертификатором для обоих Ш-файлов

ff*\ 1-*.*~-Т—.*** f^~ Т„,, /ПП<:\ ПС/С7ПОР

Page 177: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

672 Встроенные классы LotusScript и Java

является /InterTrustCorp/SU (файл d:\Notes\data\cert.id с паролем "certpassword"), a 01 и 02 -дополнительные уровни в именах, позволяющие различать пользователей. Оба ID-файла будут иметь международные лицензии, 2-летний срок действия сертификата и будут защищены паролем "password". Для каждого пользователя в адресной книге регистрационного сервера создается документ Person с присоединенным к нему ID-файлом пользователя, соответствующей информацией в поле с меткой Certified public key (это поле находится на закладке Public Keys), соответствующими именами и почтовыми атрибутами (см. Ошибка! Источник ссылки не найден. - Рис. 3.41) и информацией в полях Location и Comment. Кроме того для каждого пользователя на указанном сервере создается почтовая база. Однако для пользователя Ivan Ivanov/01/InterTrustCorp/SU почтовая база и документ Person создаются при работе метода registerNewUser, поскольку перед вызовом метода в объекте класса NotesRegistration свойства UpdateAddressBook и CreateMailDB равны true. Напротив, для пользователя Ivan Ivanov/02/InterTrustCorp/SU почтовая база и документ Person создаются позже, при работе метода addUserToAddressBook, поскольку перед вызовом метода registerNewUser в объекте класса NotesRegistration свойства UpdateAddressBook и CreateMailDB равны false.

Dim R As New NotesRegistration * :

R.CertifierlDFile = "d:\Notes\data\cert.id"R.OrgUnit = "01" ' " ' • -R.IDType = ID__HIERARCHICAL ,R.isNorthAmerican = FalseR.MinPasswordLength =8Dim CertExpireDate As VariantCertExpireDate = Datenumber(Year(Now)+2,Month(Now),Day(Now))R. Expiration = CertExpireDate •• ••• .--R.RegistrationServer = "CN=NotesSrv400/0=InterTrustCorp/C=SU"R.UpdateAddressBook = TrueR.StorelDinAddressBook = True -R.CreateMailDB = True

Dim UseridFile, Lname, Fname, MailServer, Mlocation As StringDim UserPassword, UserMailPath, CertPassword, Comment As StringFName = Inputbox("First Name",,"Ivan")LName = Inputbox("Last Name",,"Ivanov")UserPassword = Inputbox("Password",,"password")UserlDFile = Inputbox("User ID File",,Trim(Left(FName,1)+LName)+R.OrgUnit)MailServer = Inputbox("Mail Srv",,"CN=NotesSrv400/O=InterTrustCorp/C=SU")UserMailPath = Inputbox("Mail File Path",,"Mail\"+UserIDFile+".nsf")Mlocation = Inputbox("Location",,"Moscow, Russia")Comment = Inputbox("Add Comments ",, _

"This entry added via the NotesRegistration Class") CertPassword = Inputbox("Certifier Password",,"certpassword")

If R.RegisterNewUser(LName,UserlDFile,MailServer,FName,,CertPassword, _MLocation,Comment,UserMailPath,,UserPassword) Then

Msgbox("User 01 was Registered Successfully")Else

Msgbox("Sorry, User 01 was Not Registered, Please try again")End If " •-''

R.OrgUnit = "02" : ' ' ;

R. UpdateAddressBook = False . . . . . . - 'R. StorelDinAddressBook = False ..- - . .R.CreateMailDB = FalseUserlDFile = Inputbox("User ID File",,Trim(Left{FName,1)+LName)+R.OrgUnit) UserMailPath = Inputbox("Mail File Path",,"Mail\"+UserIDFile+".nsf")

If R.RegisterNewUser(LName,UserlDFile,MailServer,FName,,CertPassword, _,,,,UserPassword) Then

Msgbox("User 02 was Registered Successfully") '

© InterTrust Co, Тел. (095) 9567928

Page 178: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @гформулы, LotusScript, встроенные классы LotusScript и Java 673

Else ,<-. •.-*•*-,-.-,,.;-. ;••• . , , . ,. », ;. .

M s g b o x ( " S o r r y , U s e r 0 1 w a s N o t R e g i s t e r e d , P l e a s e t r y a g a i n " )End If . . . . , - • • • ' 'Dim FullName As String . . . . .•• ...FullName = FName+" "+LName+"/"+R.OrgUnit+"/InterTrustCorp/SU" R.UpdateAddressBook = TrueR. StorelDinAddressBook = True ""R.CreateMailDB = TrueIf R.AddUserToAddressBook(UserIDFile+".id",FullName,LName,UserPassword, _

FName,,MailServer,UserMailPath,,MLocation,Comment) ThenMsgbox("User 02 was Added To AddressBook Successfully")

ElseMsgbox("Sorry, User 02 was Not Added To AddressBook, Please try again")

End If

© InterTrust Co. Тел. (095) 9567928

Page 179: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

674 Встроенные классы LotusScript и Java

Метод addUserProfile - «задать User Profile для пользователя»

LotusScript: Call notesRegistration.addUserProfi\e( username$, profilenameS)

Java: public void Registration.addUserProfile(String username,

String profilename)

Добавляет в документ Person адресной книги регистрационного сервера информацию об документе User Profile, который должен использоваться при установке станции этого пользователя. Строка username должна задавать имя пользователя, а строка profilename - имя документа User Profile. Необходимо, чтобы у объекта [Notes]Registration было предварительно установлено свойство RegistrationServer.

@ Метод getUserlnfo - «получить информацию о пользователе» LotusScript: Call notesRegistmtion.geiUserInfo( username$ [, mailserverS

[, mailfile$ [, maildomain$ [, maUsystem% [ ,profile$ ]]]]])

Java: public void Registration.geiUserInfo(String username,

StringBuffer mailserver, StringBuffer mailfile, StringBuffer maildomain,

StringBuffer mailsystem,java. util. Vector profile)Получает с сервера информацию о пользователе. Единственный «входной» параметр -

строка username - задает имя пользователя. Остальные параметры «выходные» - после вызова метода они будут содержать полученную с сервера информацию: mailserver - имя почтового сервера пользователя, mailfile - имя файла его почтовой базы, maildomain - имя домена, mailsystem - код/название почтовой системы, применяемой пользователем, profile - имя профиля для установки станции пользователя.

Необычность метода - наличие «выходных параметров» - обязывают привести примеры.

Пример 1. Скрипт получает информацию о пользователе. В строку статуса будет выведено приблизительно следующее:

retmailserver$=CN=NotesSrv400/O=InterTrustCorp/C=SUretmailfile$=Mail\NIontsevretmaildomain$=InterTrustCorpretmailsystem%=0 (Notes)retprofile$=AdminProfile

Dim reg As New NotesRegistrationreg.RegistrationServer = "NotesSrv400/InterTrustCorp/SU"Call reg.GetUserlnfo( "Nikolay N. lontsev/InterTrustCorp/SU", _

retmailserver$, retmailfile$, retmaildomain$, _retmailsystem%, retprofile$) Print

"retmailserver$=";retmailserver$ Print "retmailfile$=";retmailfile$ Print "retmaildomain$=";retmaildomain$ Print "retmailsystem%=";retmailsystem% Print "retprofile$=";retprofile$

Пример 2. Java-агент получает информацию о пользователе. В окне Java-консоли будет выведено приблизительно следующее:

mailserver=CN=NotesSrv400/O=InterTrustCorp/C=SUmailfile=mail\NIontsevmai!domain=InterTrustCorpmailsystem=DESK_MAILSYSTEMJVOTES (Notes)profile(0)=AdminProfile

import java.util.Vector; ©

InterTrust Co. Тел. (095) 9567928

Page 180: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: (ф-формулы, LotusScript, встроенные классы LotusScript и Java 675

// Java-Registration/getUserInfoRegistration reg = session.createRegistration( } ;

reg. set Regis t rat ionServer ( "NotesSrv400/InterT.rustCorp/SU" ) ;StringBuffer mailserver = new StringBuffer(512);StringBuffer mailfile = new StringBuffer(512) ; • . ,'StringBuffer maildomain = new StringBuffer(512);StringBuffer mailsystem = new StringBuffer (512); '• --' 'Vector profile = new Vector( ) ; reg.getUserlnfо( "Nikolay N. lontsev/InterTrustCorp/SU", mailserver,

mailfile, maildomain, mailsystem, profile); System.out.println("mailserver=" + mailserver); System.out.println("mailfile=" + mailfile);System, out .println ("m.aildomain=" + maildomain); • ... .System.out.println("mailsystem—" + mailsystem); System.out.println("profile(0)=" + proflie.elementAt(0));

Метод getlDFromServer - «получить Ш-файл из адресной книги сервера»

LotusScript: Call notesRegistration.getn)ҐramServer( username$,filepath$, isserverid)

Java: public void Registration.getlDҐromServcr(Strmg username,

Stringfilepath, boolean isserverid)

Позволяет получить ID-файл, присоединенный к документу в адресной книге регистрационного сервера. Строка тегпате задает имя пользователя или сервера. Строка filepath - имя файла, включая полный путь, куда должен быть помещен полученный из адресной книги ID-файл. Если флаг isserverid = true, должен быть получен ID-файл сервера, если false - пользователя. Необходимо, чтобы у объекта [Notes]Registration было предварительно установлено свойство RegistrationServer.

Метод deletelDOnServer - «удалить ID-файл из адресной книги сервера»LotusScript: Call notesRegistration.deletelDOnServer(username$, isserverid)

Java: public void deleteIDOnServer№rwg username, boolean isserverid)

Удаляет ID-файл, присоединенный к документу в адресной книге регистрационного сервера. Строка username должна содержать имя пользователя или сервера, в документе для которого имеется присоединенный ID-файл. Если флаг isserverid = true, удаляется ID-файл сервера, если false - пользователя. Необходимо, чтобы у объекта [Notes]Registration было предварительно установлено свойство RegistrationServer.

Метод switchToID - «переключиться на другой ID-файл»LotusScript: Call notesRegistration.svfitch'TolD( idfile$ [, userpw$ ])

Java: public String switchToIDC^fr/ng idfile, String userpw)

Выполняет «переключение» на другой ID-файл. Строка idfile задает полный путь и имя ID-файла, а строка userpw - пароль для этого ID-файла. Никаких свойств объекта [NotesJRegistration метод не использует .

- . . - . ^ .' " . _ , . '• : , . I' .

© InterTrust Со. Тел. (095) 9567928

Page 181: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

676 Встроенные классы LotusScript и Java

3.29. «Дата-временное значение» - класс [NotesJDataTimeЭтот класс предназначен для работы со значениями типа «дата-время» и, в частности, для

преобразования таких значений между форматами LotusScript/Java и форматами полей типа Date/Time в документах баз Domino. В отличие от типа данных Variant of type DATE в LotusScript, поле типа Date/Time в Domino и объект класса [NotesJDateTime поддерживают, во-первых, часовой пояс, и во-вторых, сотые доли секунды, т.е. являются «более строгими и точными».

«Контейнерная иерархия»

LotusScript NotesSession, Notesltem, -> NotesDateTime_______________________________NotesDateRange___________________________________Java Session, AgentContext, Database, -> DateTime —> Session

Replication, Agent, View, Document,______________________Item, DateRange, DateTime ___________________________________

Как в LotusScript, так и в Java новый объект класса [Notes]DateTime может быть создан методом createDateTime класса [NotesjSession.

В LotusScript новый объект класса NotesDateTime можно также создавать методом New. Единственным параметром метода New (как, впрочем, и метода createDateTime) является строка, содержащая местные дату и время, которые должны стать значением объекта:

Dim variableName As New NotesDateTime( dateTime$ ) или

Set notesDateTime = New NotesDateTime( dateTimeS )

Общий формат этой строки - "<дата> [<пробелы> <время>]". Можно указать «дату без времени», но нельзя «время без даты».

Форматы даты : MM/DD/YY (в XX веке), MM/DD/YYYY (любой год), MM/DD (текущий год), MM/YY (первый день месяца текущего года), MM/YYYY или MM-YYYY (первый день месяца любого года), где DD - день, ММ - месяц, YY или YYYY - год, а также "Today" (сегодня) или "Yesterday" (вчера).

Форматы времени: HH:MM:SS AM (первая половина дня), HH:MM:SS РМ (вторая половина дня), HH:MM:SS (24-часовой формат), где НН - часы, ММ - минуты, SS - секунды.

Существующий объект класса [Notes]DateTime может быть получен множеством способов, из которых отметим свойство DateTimeVaiue класса [NotesJItem.

3.29.1. Свойства

Свойство Parent - «родитель»Java: Session session = DateTime.getParentQОбъект класса Session, являющийся «родителем» данного объекта класса DateTime.

Свойство TimeZone - «часовой пояс»LotusScript: zone% = notesDateTime,TimeZ,one

Java: int zone = Z)ate77me.getTimeZone()

Возвращает часовой пояс (тип Integer/int), выбранный при создании данного объекта [Notes]DateTime. Его выбор при создании нового объекта выполняется в соответствии с часовым поясом, установленным на компьютере выполнения или, для «удаленных» (ПОР)

© InterTrust Co. Тел. (095) 9567928

Page 182: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 677

операций, на сервере Domino, а при создании объекта по значению ноля типа Date/Time - в соответствии с часовым поясом, хранимым в поле. Обычно это количество часов, которое нужно прибавить к значению объекта, чтобы получить его значение по Гринвичу (GMT). Например, в Москве свойство обычно возвращает -3, а чтобы перевести значение Московского времени в значение по Гринвичу, нужно к нему прибавить -3 часа.

Для изменения значения этого свойства применяют метод convertToZone.

Свойство IsDST - «летнее ли время в объекте»LotusScript: flag ~ notesDateTime.IsDS'l

Java: boolean flag = DateTime.isDSTQ

Возвращает true, если в настройках выполняющего компьютера (при ТЮР-вызовах -сервера Domino) при создании данного объекта [NotesjDateTime был учтен переход на летнеевремя и объект хранит «летнюю дату-время» (с середины апреля до середины октября). Еслиже в настройках выполняющего компьютера переход на летнее время был учтен, но объектхранит «зимнюю дату-время» (с середины октября до середины апреля), или в настройкахвыполняющего компьютера не был учтен переход на летнее время или объект содержиттолько дату (без компоненты времени) или только время (без компоненты даты),возвращается false. .

Для изменения значения этого свойства применяют метод convertToZone.

Свойство LocalTime - «местное время»LotusScript: dt$ - notesDateTime.JuocalTime

notesDateTime.ljacanime - dt$

Java: String dt = Da/e77/we.getLocaITime()

void Date Time.setLocalT(ime(String dt) . '

void DateTime.setljQcaYTime(java.util.Date df)

void DateTime.$eiL®ca\Date(intyear, int month, int day)

void DateTime.setLGca\Date(int year, int month, int day,

. boolean preserve LocalTime)

void DateTime.seiLocsiYfime(mt hour, int minute, int second, int hundredth)

Свойство возвращает строку, содержащую местное значение «даты-времени» - в локальной временной зоне. Для установки значения свойства возможны несколько вариантов, но во всех устанавливаемое значение дается в локальной временной зоне.

Параметр preserveLocalTime (дословно «сохранить местное время») влияет на корректировку указанной в параметрах метода «даты-времени», приходящейся на день перехода с летнего времени на зимнее или наоборот. Если параметр равен true, в объекте происходит увеличение или уменьшение времени по Гринвичу на час, в результате чего сдвиг от этой «даты-времени» на 24 часа даст то же местное время на следующий день. Если же параметр равен false или опущен, то время по Гринвичу в объекте не корректируется, а местное время при сдвиге от этой «даты-времени» на 24 часа «получает или теряет» час.

Свойство LSLocalTime - «местное время в формате LotusScript»LotusScript: timeV= notesDateTime.ljSLQcalTime

notesDateTime.ljSJuOcalTime = timeV

© InterTrust Co. Тел. (095) 9567928

Page 183: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

678 Встроенные классы LotusScript и Java

Вариант (Variant of type DATE), содержащий значение «дата-время» в локальной временной зоне.

Свойство GMTTime - «время по Гринвичу»

LotusScript: gmt$ = notesDateTime.GMTTime

Java: String gmt = Dater/we.getGMTTimeQВозвращает строку, содержащую значение «даты-времени», преобразованное в

Гринвичскую временную зону (0). При преобразовании учитываются значения свойств TimeZone и IsDST объекта.

Свойство LSGMTTime - «время по Гринвичу в формате LotusScript»LotusScript: gmtV= notesDateTime.LSGMITime

Подобно GMTTime, но возвращает результат типа Variant of type DATE.

Свойства DateOnly и TimeOnly - «компонента даты или времени» LotusScript: date$ = notesDateTime.DateOnly

time$ - notesDateTime.T"imeOn\y

Java: String date ~ DateTime.getDnteOnlyQ

String time = DateTime.getYimeOnlyQ Возвращает строку,

содержащую значение только даты или только времени.

Свойство ZoneTime - «время в текущей временной зоне»LotusScript: zoneTMS ~ notesDateTime.ZoneTimeJava: String zoneTM = Date77me.getZoneTime()Строка, представляющая дату и время с учетом текущих значений свойств TimeZone и

IsDST объекта.Сразу после создания объекта свойство ZoneTime возвращает то же, что и свойство

LocalTime. Но если вы затем методом convertToZone измените значения свойств TimeZone и IsDST, то значение свойства ZoneTime изменится, однако значение свойства LocalTime останется прежним.

© Свойство IsValidDate - «корректно ли создан объект NotesDateTime» LotusScript: flag = notesDateTime.IsValidDateTrue означает, что строка, использованная для создания объекта NotesDateTime,

содержала корректное дата-временное значение, false - не корректное.«Пустая строка» считается корректной. Если же строка некорректна, то компоненты даты

и времени в объекте «отсутствуют», а точнее содержат специальные значения, трактуемые как «неопределенная дата» и «неопределенное время».

© InterTrust Co. Тел. (095) 9567928

Page 184: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формуды, LotusScript, встроенные классы LotusScript и Java 679

3.29.2. Методы" "'* i*.1' : ' • ."-...'•'". - '

Методы adjustYear, adjustMonth, adjustDay, adjustHour, adjustMinute, adjustSecond - «сдвиг даты или времени»LotusScript: Call notesDateTime.adjustYear( n% [, preserveLocalTime ]) Call

wotesDafcr™e.adjustMorith( n% [, preserveLocalTime ] ) Call

notesDateTime.adiusiDay( n% [, preserveLocalTime ] ) Call

notesDateTime.adjusiH.our( n% [, preserveLocalTime ]) Call

/7oteiDa/e77/we.adjustMinute( n% [, preserveLocalTime ] ) Call

notesDateTime.adiust8eKond( n% [, preserveLocalTime ])

Java: void DateTime.ad'j№iYcar(int n [, boolean preserveLocalTime^)

void DateTime.adjustMonih(int n [, boolean preserveLocalTime}) void

DateTime.»djusiD&y(mt n [, boolean preserveLocalTime])

vo/Ј/Dater/7Me.adjustHour(m/ n [, boolean preserveLocalTime]) void

DateTime.mdjustM.mute(int n [, boolean preserveLocalTime]) void Date

71me.»d j ustSecond( int n [, boolean preserveLocalTime})Изменяют значение «даты-времени» объекта на п лет (Year), месяцев (Month), дней (Day),

часов (Hour), минут (Minute), секунд (Second).

Параметр п типа Integer/int и может быть как положительным, так и отрицательным. При операциях учитываются високосные годы, летнее время, количество дней в месяцах и т.п. Если объект имеет только компоненту времени или только компоненту даты, то методы, соответственно изменяющие дату или время, не имеют эффекта.

Параметр preserveLocalTime («сохранить местное время») влияет на корректировку указанной в параметрах метода «даты-времени», приходящейся на день перехода с летнего времени на зимнее или наоборот. Если параметр равен true, в объекте происходит увеличение или уменьшение времени по Гринвичу на час, в результате чего сдвиг от этой «даты-времени» на 24 часа даст то же местное время на следующий день. Если же параметр равен false или опущен, то время по Гринвичу в объекте не корректируется, а местное время при сдвиге от этой «даты-времени» на 24 часа «получает или теряет» час.

Пример. Скрипт демонстрирует влияние параметра preserveLocalTime. Переход на летнее время происходил 29.03.99 в 02:00:00. Дата-временное значение, получаемое из значения 28.03.99 01:00:00 сдвигом на сутки вперед, будет иметь разные свойства в зависимости от значения параметра preserveLocalTime.

______________ PreserveLocalTime = false PreserveLocalTime = true _______ IsDST _________ False _____________________________ FalseIsDST+1 _______ True________________________________True________________________________GMT Time_______28.03.99 22 : OoToO ________________ 28. 03. 99 21: 00; 00_______________LocalTime _J29J33_. 99 02 :00•_: 00 ZE3~ ____ 29 . ОзТэЭ 01: 00 : 00 ZE3 __^__

Dim dateTime As New NotesDateTime( " 2 8 . 0 3 . 9 9 0 1 : 0 0 : 0 0 " )Msgbox dateTime.IsDST, ,"IsDST"Call dateTime.adjustDay(1,True или False)Msgbox dateTime.IsDST,,"IsDST+1" Msgbox dateTime.GMTTime,,"GMTTime" Msgbox dateTime . LocalTime, , "LocalTirne"

© InterTrust Co. Тел. (095) 9567928

Page 185: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

680 Встроенные классы LotusScript u Java

Метод setNow - «текущие дата и время»

LotusScript: Call notesDateTime.setNow

Java: void DateTime.$eiNo-w()

Устанавливает значение объекта в текущие дату и время. Это момент выполнения метода по часам исполняющего его компьютера, а в случае «удаленных» (НОР) вызовов - по часам сервера Domino.

Пример 1. Скрипт получает объект с текущим временем. В диалоговых окнах может быть выведено соответственно 16.06.99 09:03:17 ZE3 и True.Dim dateTime As New NotesDateTime( "" ) Call dateTime.SetNowMsgbox dateTime. LocalTime ; .- • •' . •-.,- '•' Msgbox dateTime.IsDST

Пример 2. Java-агент создает в текущей базе новый документ и в его поле PurgeDate заносит текущее время плюс два месяца. Можно предположить, что в этой базе существует и другой агент, который удаляет документы, значение в поле PurgeDate которых стало меньше времени запуска этого агента.

// Java-DateTime/setNowDatabase db = agentContext.getCurrentDatabase(); • /Document doc = db.createDocument();doc. appendlternValue ("Form", "Main Topic");doc. appendltemValue ("Subject", "2-month document"); ,;.,DateTime dt = session.createDateTime("Today");dt.setNow();dt.adjustMonth(2, true); •. • - :

doc.appendltemValue("PurgeDate", dt); .doc.save(true, true);

Метод setAnyDate - «неопределенная дата»

LotusScript: Call notesDateTime.setA.nyDate

Java: void DateTime.setAnyDateQУстанавливает компоненту даты в специфическое значение, трактуемое как

«неопределенная дата». Не меняет компоненту времени.

Метод setAnyTime;- «неопределенное время»LotusScript: Call notesDateTime.setAnyTime

Java: void DateTime.setA.nyTimeQУстанавливает компоненту времени в специфическое значение, трактуемое как

«неопределенное время». Не меняет компоненту даты.

Пример. Java-агент устанавливает компоненты даты и времени в неопределенное значение. В окно Java-консоли выводится приблизительно следующее:

Time.LocalTime =10:19:00 . :

Time.toString = 10:19:00 Date.LocalTime = 16.06.99 Date.toString = 1 6 . 0 6 . 9 9

// Java-DateTime/AnyDateTimeDateTime dt = session.createDateTime("Today");

© InterTrust Co. Ten. (095)9567928

Page 186: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 681

dt. setNow () ; . . . . . . . - . •dt. setAnyDate() ; // «неопределенная дата»System, out.println ( "Time . LocaiTime = " + dt. getLocaiTime () ) ; ' • • :•,.System.out.println("Time.toString = " + dt.toString () );dt.setNowf); ' .dt. setAnyTime(); // «неопределенное время»System, out .println ( "Date.LocaiTime = " + dt. getLocaiTime Ob-System, out .println ( "Date . toString - " f dt.toString());

© Методы timeDifference и tiraeDifferenceDouble - «разность в секундах»LotusScript: differenced = notesDateTime.tlmet)iffcrence( notesDateTime )

differenced = nolesDateTime.timeDifferenceDouble( notesDateTime ) ;

Java: int difference = DateTime.timeDifference(DateTime dt)

double difference = DateTime.timeDifferenceDoub\K(DateTime df)

Возвращает разность в секундах (тип Long/int или Double/double) между объектом, к которому применяется метод, и объектом, указанным параметром метода.

Метод timeDifferenceDouble для LotusScript добавлен в Domino версии 5.0.

Пример 1. Скрипт проверяет, изменился ли документ за последние семь дней. Если этого не произошло, скрипт отправляет по почте напоминание авторам документа.

Dim session As New NotesSessionDim db As NotesDatabaseDim doc As NotesDocument .Dim newDoc As NotesDocumentDim weekDateTime As NotesDateTimeDim modifiedDateTime As NotesDateTime •Set db = session.CurrentDatabase . -' . ..set value of doc...Set weekDateTime = New NotesDateTime( "Today" )Set modifiedDateTime = New NotesDateTime ( "" ) ' ' '•'''•"Call weekDateTime.AdjustDay( -7 ) ' set to one week agomodifiedDateTime.LSLocalTime = doc.LastModifiedIf weekDateTime.TimeDifference( modifiedDateTime ) > 0 Then •

Set newDoc = New NotesDocument ( db ) . ' . - , 'newDoc.Form = "Memo"newDoc.Subject = "Напоминание: обработайте документ!"Call newDoc.Send( False, doc.Authors )

End If

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

// Java-DateTime/timeDifferenceDatabase db = agentContext.getCurrentDatabase();DateTime createdDateTime = db.getCreated() ;DateTime nowDateTirne = session.createDateTime("Today");nowDateTime.setNow();int daysSinceCreated =

nowDateTime.timeDifference(createdDateTime) / 86400; System.out.println("Database \"" + db.getTitle(} +

"\" was created " + daysSinceCreated + " days ago.");

Метод convertToEone - «преобразовать в другую временную зону»LotusScript: Call notesDateTime.con\ertToZone( newZone, isDST)

© InterTrust Co. Тел. (095) 9567928

Page 187: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

682 Встроенные классы LotusScript и Java

Java: void DateTime.convertToZone^nt newZone, boolean isDST)

Изменяет в объекте значения часового пояса и учета перехода на летнее/зимнее время. Параметр newZone задает часовой пояс (от -12 до 12). Если isDST = true, переход на летнее/зимнее время учитывается, если false - нет.

Применение метода изменит значение свойства ZoneTime, но не отразится на значениях свойств GMTTime и LocalTime.

Пример. Скрипт создает дата-временное значение 16.06.99 06:00:00 (часовой пояс Москвы, свойство IsDST = True) и преобразует его в Центрально-Европейское время (часовой пояс -1, свойство IsDST = False). В диалоговых окнах будут выведены следующие результаты.

00 СЕТ '-OOZE3 '<, •iCQGMT '•

i i

Dim dateTime As New NotesDateTime("Today 06:00")Messagebox "TimeZone: " & dateTime.TimeZone & Chr(lO) & _

"ZoneTime: " & dateTime.ZoneTime & Chr(lO) & _ "LocalTime: " & dateTime.LocalTime & Chr(lO) & _ "GMTTime: " & dateTime.GMTTime

Call dateTime.ConvertToZone(-1, False)Messagebox "TimeZone: " & dateTime.TimeZone & Chr(lO) & _

"ZoneTime: " & dateTime.ZoneTime & Chr(lO) & _ "LocalTime: " & dateTime.LocalTime & Chr(lO) & _ "GMTTime: " & dateTime.GMTTime

Метод toJavaDate - «объект класса java.util.Date»Java: Java. util.Date dt = Z)ate7Yme.toJavaDate()

Возвращает объект класса java.util.Date, «содержащий» то же время и дату, что и объект класса DateTime.

© InterTrust Co. Тел. (095) 9567928

Page 188: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @~формулы, LotusScript, встроенные классы LotusScript и Java 683

3.30. «Диапазон времени» - класс [NotesjDateRange гПредставляет «отрезок времени», то есть содержит в себе два объекта класса

[NotesJDateTime - «начало отрезка» и «конец отрезка».

«Контейнерная иерархия» • , , . ;•;«...,;.

LotusScript NotesSession _> NotesDateRange -> NotesDateTime

Java Session —» DateRange —> DateTime

Для создания нового объекта [NotesjDateRange используется метод createDateRange класса [Notes]Session. Если был использован вариант метода createDateRange без параметров, то после создания объект должен быть «проинициализирован» свойствами StartDateTime и EndDateTime или свойством Text.

3.30.1. Свойства

Свойство Parent - «родитель»Java: Session session - DateRange.geiParentQ

Объект класса Session, являющийся «родителем» данного объекта DateRange.

Свойство StartDateTime - «начало диапазона» LotusScript: notesDateTime ~ notesDateRange.StariDateTime

notesDateRange.StariDateTime = notesDateTime

Java: \ DateTime startDT = DateRange.getStartDateTimeQvoid DateRange.setStariDaieTim^DateTime startDT)

Объект класса [NotesjDateTime, определяющий начало диапазона.

Свойство EndDateTime - «конец диапазона»LotusScript: notesDateTime = notesDateRange.EndDnteTime

notesDateRange.EndDateTime = notesDateTime

Java: DateTime startDT = DateRange.getEndDateTimeQ

void DateRange.seiEndDateTime(DateTime startDT)

Объект класса [NotesjDateTime, определяющий конец диапазона.

Свойство Text - «строковое представление диапазона»

LotusScript: text$ = notesDateRange.Text

notesDateRange.Text = text

Java: String text ~- DateRange.getTiKiitQ

void DateRange,setTe\t(String text)

© InterTrust Co. Тел. (095) 9567928

Page 189: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

684 Встроенные классы LotusScript и Java

Строковое представление диапазона, содержащее разделенные знаком «-» времена начала и окончания. Например: "18.08.96 01:36:22 ZE3 - 19.08.96 15:36:22 ZE3" для диапазона «дат-времен» или "01.01.97 - 27.02.97" для диапазона дат.

Пример 1. Скрипт создает два объекта NotesDateTime со значениями сегодняшней и завтрашней даты, затем новый «неинициализированный» объект NotesDateRange. После этого скрипт инициализирует объект NotesDateRange и выводит в окне его текстовое представление. Затем скрипт изменяет один из объектов NotesDateTime - при этом изменяется и соответствующее значение объекта NotesDateRange.Dim dateRange As NotesDateRangeDim session As New NotesSessionDim dateTimel As New NotesDateTime("Today")Dim dateTime2 As New NotesDateTime("Tomorrow")Set dateRange = sess ion.CreateDateRange ()Set dateRange.StartDateTime = dateTimelSet dateRange.EndDateTime = dateTime2Messagebox dateRange.TextCall dateTime2.AdjustDay( 1 )Messagebox dateRange.Text i

Пример 2. Сначала Java-агент создает два объекта DateTime, первый из которых содержит время создания текущей базы, а второй - текущее время. Затем создается «неинициализированный» объект DataRange, который далее инициализируется свойством Text. Примененный в агенте подход к созданию объекта DataRange едва ли можно считать практически целесообразным - он «хорош» только для демонстрации применения свойства Text.

// Java-DateRange\createDatabase db = agentContext.getCurrentDatabase();DateTime dtdb = db.getCreated();DateTime dtnow = session.createDateTime("Today") ;dtnow.setNow();DateRange dr = session.CreateDateRange();dr.setText(dtdb.getLocalTimeO + " - " + dtnow.getLocalTime());System.out.println("Start date = "+dr.getStartDateTime().getLocalTime());System.out.println("End date = " +dr.getEndDateTime().getLocalTime());

i

© InterTrust Co. Тел. (095) 9567928

Page 190: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 685

3.31. «Имя или адрес пользователя или сервера» - класс [NotesjNameОбъект этого класса предназначен для работы с именами пользователей и серверов, а так

же работы с internet-адресами. Имеет только свойства, позволяющие «извлекать»необходимые компоненты из имен и адресов, .-,..,•

«Контейнерная иерархия» •

LotusScript NotesSession --> NotesName

Java Session —» Name —>. Session____________I___________________________________________________________________

В LotusScript и Java объект класса [NotesjName может быть получен методом createName или свойством UserNameList класса [Notes]Session.

В LotusScript для получения объекта класса NotesName можно так же использовать метод New, параметр пате$ которого задает имя (в формате Abbreviated или Canonical) или адрес «как строку»:

Dim variableName As New NotesName( nameS ) или

Set notesName = New NotesName( name$ )

Кроме того, в Java для получения объекта класса Name может использоваться метод getUserNameObject класса Session.

3.31.1. Свойства

@ Свойство Parent - «родитель»Java: Session session = TVawe.getParentQ

Объект класса Session, являющийся «родителем» данного объекта класса Name.

Свойство [«Hierarchical - «иерархическое ли имя»LotusScript: flag — notoVVame.isHierarchicalJava: boolean flag- Name .isHierarchicaI()True, если имя иерархическое, или false, если нет.

Свойство Canonical - «имя в каноническом формате»

LotusScript: stringS - notesName.Canonical ;i ,ч>> :, -..

Java: String string = Afame.getCanonicalQИерархическое имя в каноническом формате или ""/null, если свойство не определено.

Например, «CN=Ivan I. Ivanov/OU=Unit4/OU=Unit3/OU=Unit2/OU=Unitl/O=OrgName/C=RU».

Свойство Abbreviated - «имя в формате Abbreviated»LotusScript: string$ = #otesjVa/we.Abbreviated n

Java: String string - jVame.getAbbreviatedOИерархическое имя в формате Abbreviated или ""/null, если свойство не определено.

Например, «Ivan I. Ivanov/Unit4/Unit3/Unit2/Unitl/OrgName/RU».

© InterTrust Co. Тел. (095)9567928

Page 191: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

686 Встроенные классы LotusScript и Java

Свойство Keyword - «компоненты имени в обратном порядке»LotusScript: stringS = notesName.KeywordJava: String string = Atowe.getKeyword()Компоненты иерархического имени, но не включая общее имя, в «обратном порядке

через обратный слеш», или ""/null, если имя неиерархическое. Например, «RU\OrgName\Unitl\Unit2\Unit3\Unit4».

Свойство Country - «код страны (С—)»LotusScript: stringS = notesName. CountryJava: String string = ./Vame.getCountry()Код страны (С=) из иерархического имени или ""/null, если свойство не определено.

Например, «RU».

Свойство Organization - «название организации (О=)» LotusScript: string$ = notesName.OrganijOition

Java: String string = TVof/we-getOrganizationQНазвание организации (О=) из иерархического имени или ""/null, если свойство не

определено. Например, «OrgName».

Свойство OrgUnitl - «оргединица первого уровня (ОШ=)»LotusScript: stringS - notesName.OrgUnitlJava: String string = Name.getOrgUnitlQНазвание оргединицы первого уровня (ОШ=) из иерархического имени или ""/null, если

свойство не определено. Например, «Unitl».

Свойство OrgUnitl - «оргединица второго уровня (OU2=)>>LotusScript: string$ = notesName.DrgUnit2Java: String string — 7Va#ze.getOrgTJnit2()Название оргединицы второго уровня (OU2=) из иерархического имени или ""/null, если

свойство не определено. Например, «Unit2».

Свойство OrgUnit.1 - «оргеднница третьего уровня (ОШ=)»LotusScript: stringS = notesName.OrgUnit3Java: String string = A'a/we.getOrgUnitSQНазвание оргединицы третьего уровня (ОШ=) из иерархического имени или ""/null, если

свойство не определено. Например, «Unit3».

Свойство QrgUnit4 - «оргединица четвертого уровня (OU4=)»LotusScript: stringS = notesName.OrgVmt4Java: String string = Afowe.getOrgUnit4()Название оргединицы четвертого уровня (OU4=) из иерархического имени или ""/null,

если свойство не определено. Например, «Unit4».

© InterTrust Co. Тел. (095) 9567928

Page 192: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @гформулы, LotusScript, встроенные классы LotusScript и Java 687

Свойство Common - «общее имя (CN=)»

LotusScript: string$ ~ notesName.Common

Java: String string = Aawe.getCommonQ

Общее имя (CN=) из иерархического имени или полное имя, если оно неиерархическое. Например, «Ivan I. Ivanov».

Свойство SurName - «фамилия (S=)» LotusScript: stringS - notesName.Surname

Java: String string - MwKe.getSurNameOФамилия (S=) или ""/null, если свойство не определено. Например, «Ivanov» для имени

G=Ivan/I=I./S=lvanov/Q=Mr./CN=IvanI. Ivanov/OU=Unitl/O=OrgName/C>RU.

Свойство Given - «собственно имя (G=)»LotusScript: string$ = notesName.Given .

Java: String nameGiven = yVawe.getGivenQСобственно имя (G=) или ""/null, если свойство не определено. Например, «Ivan» для

имени G=lvan/I=l./S=Ivanov/Q=Mr./CN=Ivan I. Ivanov/OU=Unit1/O=OrgName/C=RU.

Свойство Initials - «буква отчества (1=)»LotusScript: stringS — notesName.Initials

Java: String namelnitials = TVawe.getlnitialsQБуква отчества (1=) или ""/null, если свойство не определено. Например, «I.» для имени

G=IvanA=I./S=Ivanov/Q=Mr./CN=Ivan I. Ivanov/OU=UnitI/OOrgName/C=RU.

Свойство Generation - «желательная форма обращения (Q=)»LotusScript: stringS = notesName.Generation

Java: String nameGeneration = /Vawe.getGenerationQЖелательная форма обращения (Q=), наподобие "Mr." или "Jr.", содержащаяся в имени

или ""/null, если свойство не определено. Например, «Mr.» для имени G=IvanA=I./S=lvanov/Q=Mr./CN=Ivan I. Ivanov/OU=Unitl/O=OrgName/C=RU.

Свойство ADMD - «название домена административного управления (А=)»LotusScript: string$ ~ notesName.ADMD

Java: String nameADMD = jVame.getADMDQ

Название домена административного управления Х.400 (ADMD, A=), ассоциированное с именем, или ""/null, если свойство не определено. Например, SprintMail для имени A=SprintMail/P=IT400/G=Ivan/I=I./S=lvanov/CN=IvanI. Ivanov/O=OrgName/C=RU.

Свойство PRMD-«название частного домена (Р=)>>LotusScript: string$ = notesName.PRMD

Java: String namePRMD = Name.getPRMDQ

© InterTrust Co. Тел. (095) 9567928

Page 193: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

688 Встроенные классы LotusScript и Java

Название частного домена Х.400 (PRMD, Р=), ассоциированное с именем, или ""/null, если свойство не определено. Например, «IT400» для имени A=SprintMail/P=IT400/G=Ivanfl=I./S=Ivanov/CN=IvanI. lvanov/O=OrgName/C=RU.

Пример. Java-агент выводит всевозможные варианты представления и составляющие имени. Результат выполнения будет выглядеть следующим образом:

Canonical name = С=1уапЛ=1./8=1уапоу/д=Мг./С^1уап I. Ivanov/OU=Unit4/OU=Unit3/OU=Unit2/OU=Unitl/ O=OrgName/P=IntTrust/A=SprintMail/C=RUAbbreviated name =

A=SprintMail/P=IntTrust/Q=Mr./G=Ivan/I=I./S=Ivanov/CN=IvanI.

Ivanov/OU4=Unit4/OU3=Unit3/OU2=Unit2/OU=Unitl/O=OrgName/C=RUKeyword RU\OrgName\LTnitl\Unit2\Unit3\Unit4Common name = Ivan I. IvanovOrganization = OrgNameOrgUnitl = UnitlOrgUnit2 = Unit2OrgUnit3 = Unit3OrgUnit4 = Unit4Given = IvanSurname = Ivanovlnitials = I.Generation = Mr.ADMD = SprintMailPRMD = IntTrust

//Java-Name/AllPropsString name = "A=SprintMail/P=IntTrust/Q=Mr./G=Ivan/I=I./S=Ivanov/" +

"CN=Ivan I. Ivanov/OU4=Unit4/OU3=Unit3/OU2=Unit2/OUl=Unitl/" + "0=OrgName/C=RU";

Name n = session.createName(name); if (n.isHierarchical{))

{ ,System.out.println("Canonical name = " + n.getCanonical());System.out.println("Abbreviated name = " + n.getAbbreviated());} •

if (n.getKeyword() != null)System.out.println("Keyword = " + n.getKeyword());

System.out.println("Common name = " + n.getCommon()); if (n.getOrganization() != null)System.out.println("Organization = " + n.getOrganization());

if (n.getOrgUnitlO != null)System.out.println("OrgUnitl = " + n.getOrgUnitl());

if (n.getOrgUnit2 () != null) • -• , -System.out.println("OrgUnit2 = " + n.getOrgUnit2());

if (n.getOrgUnit3() != null)System.out.println("OrgUnitS = " + n.getOrgUnitS());

if (n.getOrgUnit4() != null)System.out.println("OrgUnit4 = " + n.getOrgUnit4());

if (n.getGiven() != null)System.out.println("Given = " + n.getGivenО);

if (n.getSurname() != null)System.out.println("Surname = " +

n.getSurname()); if (n.getlnitialsO ! = null)System, out .println ( "Initials = " + n.getlnitialsO);

if (n.getGeneration() != null)System.out.println("Generation = " + n.getGeneration{));

if (n.getADMDO != null)System, out .println ("ADMD = " + n.getADMDO); if

(n.getPRMDO != null)System, out .print In ("PRMD = " + n.getPRMDO);

© Свойство Language - «язык для альтернативного имени»LotusScript: string$ = notesName.l*anguage

Java: String nameLanguage = ./Vofffze.getLanguageO

Код языка, ассоциированного с именем, или ""/null, если свойство не определено. Свойство вернет «непустое значение», если текущий ID-файл имеет альтернативные имена,

© InterTrust Co. Тел. (095) 9567928

Page 194: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 689

свойством UserNameList был получен «массив» объектов [Notes]Name для этого ID-файла, и свойство Language применяется к объекту [Notes]Name, соответствующему альтернативному имени (не первый элемент «массива»).

Рис. 3.42 В окне свойств ID-файла с альтернативными именами присутствует болееодного имени . . . . . .

Пример. Скрипт выводит составляющую CN= и код языка для всех имен текущего пользователя. Результат выполнения скрипта на станции может выглядеть следующим образом:

Common name is Nikolay N. lontsevLanguage is (основное имя) ••-.•'•-.Common name is Николай Н. Ионцев ;

Language is ru (первое альтернативное имя) ,ц? ' •

Dim session As New NotesSession ..„ '.....Dim nameslist As variant nameslist = session.UserNameList Forall nname in nameslist

print ("Common name is " & nname.common) ,print ("Language is " & nname.Language)

end Forall ,

© Свойство Addr821 - «internet-адрес в формате RFC821»LotusScript: stringS - notesName.Addr82l ,. . ,

Java: String string = ATawe.getAddr8210 '•"•Internet-адрес в формате RFC821. Например, «[email protected]» для адреса Nikolay N.

Iontsev/InterTrustCorp/SU<[email protected]>.

© InterTrust Co. Тел. (095) 9567928

Page 195: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

690 Встроенные классы LotusScript и Java

0 Свойство Addr822LocaIPart - «компонента LocalPart из internet-адреса в формате RFC 822»LotusScript: string$ = «o/es./Vame.Addr822LocalPart

/Java: String string = 7Vame.getAddr822LocaIPart()

Компонента LocalPart из internet-адреса в формате RFC 822. Например, «NIontsev» для адреса Nikolay N. 1оп18еуЛп1егТш51Соф/8и<Моп18еу@тйгш1.ги>.

© Свойство Addr822Phrase - «компонента Phrase из internet-адреса в формате RFC 822»LotusScript: stringS = H0tesJVawe.Addr822Phrase

Java: String string = Afome.getAddr822Phrase()Компонента Phrase из internet-адреса в формате RFC 822. Например, «Nikolay N.

lontsevfinterTrustCorp/SU» для адреса Nikolay N. lontsev/lnterTrustCorp/SU <[email protected]>.

© Свойства Addr822Commentl, Addr822Comment2, Addr822Comment3 -«комментарии из internet-адреса в формате RFC 822»LotusScript: stringS = note,s./Vame.Addr822Commentl

stringS = no/eЈ/Va#ze.Addr822Comment2

string$ = notesAfawe.Addr822Comment3

Java: String string = 7Vame.getAddr822Commentl()

String string = M?me.getAddr822Comment20

Siring string = Afa/»e.getAddr822Comment3()Компоненты Commentl, Comment2 и Comments из internet-адреса в формате RFC 822.

Например, соответственно «Postmaster», «Administrator» и «Admin» для адреса Nikolay N. Iontsev/InterTrustCorp/SU<[email protected]>(Postmaster) (Administrator)(Admin).

Пример. Скрипт создает объект NotesName «по строке с internet-адресом» и выводит в диалоговых окнах соответствующие свойства этого объекта. Результат окажется следующим:

Addr821 = [email protected] = NIontsevAddr822Phrase = Nikolay N. lontsev/lnterTrustCorp/SUCommentl = PostmasterComment2 = AdministratorComments = AdminCommonName = Nikolay N. lontsev

Dim userName As New NotesName( _"Nikolay N. Iontsev/InterTrustCorp/SU<NIontsev@inttrust .ru>" & _"(Postmaster) (Administrator)(Admin)" )

Messagebox userName.Addr821,, "Addr821"Messagebox userName.Addr822LocalPart, , "Addr822LocalPart" Messagebox userName.Addr822Phrase,, "Addr822Phrase" Messagebox userName.Addr822Commentl,, "Addr822Commentl" Messagebox userName.Addr822Comment2,, "Addr822Comment2" Messagebox userName.Addr822Comment3,, "Addr822Comment3" Messagebox userName.Common,, "CommonName"

© InterTrust Co. Тел. (095) 9567928

Page 196: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 691

3.32. «Характеристики среды» - класс [Notes]InternationalОбъект класса [Notes]InternationaI позволяет получить некоторые характеристики среды

(платформы), в которой функционирует клиент или сервер Domino и происходит выполнение скрипта или Java-приложения. При «удаленных» (ПОР) операциях это всегда характеристики среды для сервера Domino.

На платформе Windows эти характеристики среды задаются «через пиктограмму» Regional Settings в Windows Control Panel. Когда любая из этих характеристик изменяются в среде, Domino сразу «узнает» об изменениях и начинает использовать новые характеристики.

«Контейнерная иерархия»

LotusScript NotesSession —> Noteslnternational

Java Session —> International —> Session

Для получения объекта создания нового объекта [Notes]International используется свойство International класса [Notes]Session.

3.32.1. Свойства

Свойство Parent - «родитель»Java: Session session = InternationaLgeiPa.rentQ

Объект класса Session, «содержащий» данный объект International.

Свойство IsTime24Hour- «24-часовой ли формат времени»"S

LotusScript: flag — notesInternational.lsTime24№.our

Java: boolean flag = International.isTime24Hour()

Если применяется 24-часовой формат времени, возвращается true, если 12-часовой - false.

Свойства AMString и PMString - «строки для обозначения времени до и после полудня»LotusScript: string = notesInternational.AMString

string = notesInternational.PMString

Java: String string - International.getAMStringQ

String string = International.getPMStringQ Строки с обозначением

времени до полудня и после полудня, например, "AM" или "РМ".

Свойства Yesterday, Today и Tomorrow- «Строки для обозначения «вчера», «сегодня», «завтра»»LotusScript: string = notesInternational.Yesterday

string = notesInternalional.'Tod'Ay

© InterTrust Co. Тел. (095) 9567928

Page 197: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

692 Встроенные классы LotusScript и Java

string = notesInternational.Tomorrow

Java: String string — International.getYesterdayQ

String string = International.getTodayQ

String string = /л/ег/га/шиа/.getTomorrowQ

Строки с обозначением «вчера, сегодня, завтра» в дата-временых форматах, например, "Yesterday", "Today" и "Tomorrow".

Свойства IsDateDMY, IsDateMDY и IsDateYMD - «формат представления даты»LotusScript: flag - notesInternational.IsDnteDMY

flag = notesInternational.~lsDateMBY

flag — notesInternational.lsD&te'YMD

Java: boolean flag = International.isDateDMYQ

boolean flag = International.isDateMDYQ

boolean flag = /n?ema//o«a/.isDateYMD()Свойства возвращают true, если дата представляется в формате «день-месяц-год» (DMY),

«месяц-день-год» (MDY) или «год-месяц-день» (YMD),

Свойства DateSep, TimeSep, DecimalSep и ThousandsSep- «символы-разделители в дате, времени и десятичном числе: десятичная точка и разделитель тысяч»LotusScript: string = noteslnternationaLDateSep

string = noteslnternational.TimeSep

string = notesInternational.DecimalSep

string = notesInternationai.ThousandsSep

Java: String string = International.geiDateSepQ

String string = International.getTimeSepQ

String string - International.getDecimalSepQ

String string = Intemational.getThousandsSepQ

Символы-разделители в записи даты, времени и десятичного числа: десятичная точка и разделитель тысяч. Например, соответственно "/",":", "." и ",".

Свойство TimeZone - «часовой пояс»LotusScript: integerZone% ~ notes-International,TimeZone

Java: int zone = Inlernational.getTimeZ,oneQ

Возвращает целое, определяющее установку часового пояса на компьютере. Часто, но не всегда, это количество часов, которое надо «прибавить» к времени по Гринвичу, чтобы получить местное время. Может быть как положительным, так и отрицательным.

© InterTrust Co. Тел. (095) 9567928

Page 198: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 693

Свойство IsDST - '«летнее ли время» • " . - : . • ;~~:':• :• '•• '•'. '• ••''• :;:; ;: :.'... • '•..::..;::• • ;.-':".-::•'•:•."•:•'. '••'•.

'.•...LotusScript: flag - notesInternational.IsDST

Java: boolean flag = International.isDSTQ

Возвращает true, если формат времени отражает летнее время, или false, если нет.

Свойства. CurrencyDigits, CurrencySymbol, IsCurrencySpace, IsCurrencySuffix и IsCurrencyZero - «характеристики денежных форматов»LotusScript: integerDigits% — notesInternational.CurrencyD'igits

siring = notesInternational.CurrencySymbol

flag ~ notesInternational.lsCurrencySpace

flag = notesInternationaLIsCurrencySuffix.

flag - notesInternationaLIsCurrencyljero

Java: int digits = /«/emctf/oTza/.getCurrencyDigitsQ

String string = /n/er«afr'owa/.getCurrencySymbol()

boolean flag = /wteraafr'oMa/.isCurrencySpaceQ

boolean flag = International.isCurrencySuffixQ

boolean flag = International.isCurrencyZeroQ

Характеристики применяемых денежных форматов.• CurrencyDigits - количество разрядов после десятичной точки в «денежных» форматах

(Integer/int).

• CurrencySymbol - строка (символ), обозначающий используемую валюту в «денежных»форматах, например, "$".

• IsCurrencySpace - если в «денежных» форматах между записью числа и обозначениявалюты необходим пробел, возвращается true, иначе - false. На платформах UNIX этосвойство зависит от языковой поддержки, установленной на компьютере, и определяетсяпеременной окружения LANG.

• IsCurrencySuffix - если в «денежных» форматах обозначение валюты следует зазаписью числа, возвращается true, если же предшествует записи числа - false.

• IsCurrencyZero - если в «денежных» форматах перед десятичной точкой долженотображаться нуль, возвращается true, иначе - false. На платформах UNIX это свойствоне имеет смысла.

Пример 1. Скрипт выводит значения всех свойств объекта класса Noteslnternational.

Dim session As New NotesSession • •Dim international As NoteslnternationalSet international = session,International .If international.IsDateDMY Then • i : ' .

Messagebox "DMY",, "Format of date" Elseif international.IsDateMDY Then

Messagebox "MDY",, "Format of date" .-.-Elseif international. IsDateYMD Then . ••

Messagebox "YMD",, "Format of date" Else

© InterTrust Co. Тел. (095) 9567928

Page 199: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

694 Встроенные классы LotusScript и Java

Messagebox "Unknown",, "Format of date"End If ' 'Messagebox international.DateSep,, "Date separator" Messagebox international.Yesterday & Chr(lO) & international.Today & Chr(10) &

international.Tomorrow ,, "Text of date keywords" If international.IsTime24Hour Then

Messagebox "24-hour",, "Time format" Else

Messagebox "12-hour",, "Time format" Messagebox international.AMString & Chr(10) &

international.PMString,, "AM and РМ notation" End IfMessagebox international.TimeSep,, "Time separator" Messagebox international.TimeZone,, "Time zone" If international.IsDST Then

Messagebox "Time reflects daylight savings",, "DST" Else

Messagebox "Time does not reflect daylight savings",, "DST" End IfMessagebox international.CurrencySymbol,, "Currency symbol" If international.IsCurrencySpace Then

Messagebox "Yes",, "Space between currency symbol and number?" Else

Messagebox "No",, "Space between currency symbol and number?" End If If international.IsCurrencySuffix Then

Messagebox "Yes",, "Currency symbol follows number?" Else

Messagebox "No",, "Currency symbol follows number?" End IfMessagebox international.CurrencyDigits,, "Number of decimal digits" Messagebox international.DeeimalSep,, "Decimal separator" Messagebox international.ThousandsSep,, "1000s separator" If international.IsCurrencyZero Then

Messagebox "Yes",, "Leading zero?" Else

Messagebox "No",, "Leading zero?" ,End If ' '

Пример 2. Java-агент выводит значения всех свойств класса International. При выполнении в окно Java-консоли может быть выведено следующее:

Format of date is "DMY"Date separator is "."Text of date keywords: Yesterday, Today, TomorrowTime format is 24-hourTime separator is ":"Time zone is -3Time reflects daylight savingsCurrency symbol is "p."No space between currency symbol and numberCurrency symbol follows numberNumber of decimal digits: 01000s separator: " "Leading zeroDecimal separator is,

© InterTrust Co. Тел. (095) 9567928

Page 200: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: ^формулы, LotusScript, встроенные классы LotusScript и Java 695

// Java-International\PropsInternational inat = session.getlnternational();if (inat.isDateDMYO} System.out.println("Format of date is \"DMY\""J;if (inat.isDateMDYO) System.out.println("Format of date is \"MDY\"");if (inat.isDateYMDO) System.out.println("Format of date is \"YMD\"");System.out.println("Date separator is \"" + inat.getDateSep() + "\"");System.out.println("Text of date keywords: " + inat.getYesterday() + ", "

+ inat.getToday() + ", " + inat.getTomorrow{)); if (inat.isTime24Hour())

System.out.println("Time format is 24-hour"); else {

System.out.println("Time format is 12-hour");System.out.println("AM notation is \"" + inat,getAMString() + "\"");System, out .println ( "РМ notation is \"" + inat. getPMStririg () +

"\""); }System.out.println("Time separator is \"" + inat.getTimeSep() + "\""); System.out.println("Time zone is " + inat,getTimeZone()); ff (inat.isDSTO )

System.out.println("Time reflects daylight savings"); else

System.out.println("Time does not reflect daylight savings"}; System.out.println("Currency symbol is \""+inat.getCurrencySymbol()+"\""); i f (inat.isCurrencySpace())

System.out.println("Space between currency symbol and number"); else

System.out.println("No space between currency symbol and number"); i f (inat.isCurrencySuffix())

System.out.println("Currency symbol follows number"); else

System.out.println("Currency symbol does not follow number"); System.out.println("Number of decimal digits: " +

inat.getCurrencyDigits()); System.out.println

("1000s separator: \"" + inat.getThousandsSepO + "\""); if (inat.isCurrencyZero())

System.out.println("Leading zero"); •- •else

System.out.println("No leading zero"); System.out.println("Decimal separator is " + inat.getDecimalSep());

© InterTrust Co. Тел. (095) 9567928

Page 201: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

696 Встроенные классы LotusScript и Java

3.33. «Таймер» - класс NotesTimerЭтот класс реализует «таймер» - механизм для получения событий через установленный

интервал времени. Таймер может функционировать только в интерфейсе пользователя, он не функционирует в агентах.

«Контейнерная иерархия»

| LotusScript I NotesSession _> NotesTimer

I

Объект класса NotesTimer создается или методом New, или методом createTimer класса NotesSession.

Dim notesTimer As New NotesTimer( interval% [, comment} ) или Set

notesTimer = New NotesTimer( interval% [, comment} )

Параметр interval% конструктора задает количество секунд между возникновением событий. Учтите, что строгое соблюдение интервала не гарантируется - «параллельная» работа, выполняемая как компьютером, так и клиентом Notes, может задержать возникновение и обработку события. Параметр comments представляет собой произвольный комментарий.

Set notesTimer — wo/esSe.v,y/o«.createTimer( )

Поскольку метод createTimer не имеет параметров, созданный объект будет непригоден для использования, пока не будет установлено его свойство Interval.

3.33.1. Свойства и событие

Свойство Interval - «интервал таймера»interval% — notesTimer.lntervsil

notesTimer.Interval = interval%

Интервал в секундах, с которым должно возникать событие Alarm, т.е. вызываться подпрограмма-обработчик этого события.

Свойство Comment - «комментарий»comments = notesTimer.Comment

notesTimer.Comment = comment^

Комментарий о таймере.

Свойство Enabled - «состояние: включен/выключен»flag - notesTimer'.Enabled

notesTimer.J^nabled -flag

Таймер может находиться в одном из двух состояний: «включен», т.е. генерирует события, и «выключен», т.е. не генерирует события. После создания таймер находится в

© InterTrust Со. Тел. (095) 9567928

Page 202: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 697

состоянии «включен». Свойство возвращает true, если таймер включен, или false, если он выключен. Установка свойства в значение true «включает» таймер, а в значение false -«выключает» его.

С о б ы т и е A l a r m - « с и г н а л о т т а й м е р а » • ..; ;...:"-•: ,..•••:•-''- .•/• .'.•;.—•'••' ••:•:/•." -j ''••:••'• .••'-Alarm( Source as NotesTimer )

Событие возникает с интервалом времени, выбранным в свойствах таймера. Аргумент Source (объект класса NotesTimer, только чтение) - ссылка на данный таймер.

Для назначения подпрограммы обработки этого события используется оператор On Event:

On Event Alarm From ссылка _на__таймер Call имя ^подпрограммы ^обработки

Заголовок подпрограммы обработки должен иметь вид Sub имя подпрограммы

_рбработки( Source as NotesTimer)

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

Следующие объявления даны в псевдособытии (Globals) (Declarations) формы. Переменная elapsedTime используется для подсчета времени работы с документом. Переменная elapsedTimer -ссылка на объект класса NotesTimer - таймер. Эти переменные доступны всем скриптам данной формы.

Dim e lapsedTime As Integer Dim elapsedTimer As NotesTimer% INCLUDE "Isconst.lss"

Скрипт события Postopen выполняется в завершающей фазе открытия документа по форме. Скрипт создает новый объект класса NotesTimer - таймер - и устанавливает для таймера частоту прерываний «раз в секунду». Счетчик секунд elapsedTime инициализируется нулем. На событие Alarm от таймера elapsedTimer назначается подпрограмма обработки события с именем elapsedTimerHandler.

Sub Postopen(Source As Notesuidocument)Dim session As New NotesSessionSet elapsedTimer = session.CreateTimer()elapsedTimer.Interval = 1elapsedTimer.Comment = "Время после открытия документа"elapsedTime = ОOn Event Alarm From elapsedTimer Call elapsedTimerHandler

End Sub

Подпрограмма обработки события вызывается по каждому событию Alarm таймера, происходящему раз в секунду, и всякий раз увеличивает счетчик секунд elapsedTime на единицу.

Sub elapsedTimerHandler(Source As NotesTimer)elapsedTime = elapsedTime + 1

End Sub

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

Sub Click(Source As Button) Dim etime As Integer Dim minutes As Integer

© InterTrust Co. Тел. (095) 9567928

Page 203: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

698 Встроенные классы LotusScript и Java

etirne = elapsedTime If etime < 60 Then

Messagebox etime & " секунд",,"После открытия документа прошло" Else

minutes = ОDo While etime > 59

minutes = minutes + 1 . . . . . .etime = etirne - 60 Loop Messagebox minutes & " минут и "

& etime & " секунд",, __"После открытия документа прошло" End

If End Sub

В форме также имеется еще одна кнопка, скрипт которой позволяет пользователю отключить таймер (при этом таймер перестает генерировать события) или снова включить его (таймер снова начинает генерировать события).

Sub Click(Source As Button)If elapsedTimer.Enabled Then

If Messagebox("Отключить его?", MB_YESNO + MB__ICONQUESTION, "Таймер включен") = IDYES ThenelapsedTimer.Enabled = False End

If ElseIf Messagebox("Включить его?", MB_YESNO + MB ICONQUESTION,

"Таймер выключен") = IDYES ThenelapsedTimer,Enabled = True End If

End If End Sub

1

© InterTrust Co. Тел. (095) 9567928

Page 204: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

Lotus Domino R. S: (^-формулы, LotusScript, встроенные классы LotusScript и .tavu «у?

3.34. «Интерфейс пользователя (рабочее пространство)» - классNotesUIWorkspace

Объект класса NotesUIWorkspace используется для манипуляций с основной составляющей интерфейса пользователя Notes - «рабочим пространством». Его свойства позволяет получить доступ к текущим базе, виду и документу в интерфейсе пользователя. Методы класса NotesUIWorkspace позволяют добавить пиктограмму базы в рабочее пространство, открыть текущий документ рабочего пространства в нужном режиме (просмотр или редактирование) по предопределенной форме или по заданной форме в диалоговом окне, создать новый документ в любой базе по указанной форме, «перезагрузить» информацию в текущем окне, открыть указанный вид из указанной базы на заданном документе и обновить текущий вид, открыть набор фреймов или страницу, управлять целевым фреймом, использовать различные диалоговые окна, создать или открыть профильный документ, поместить или переместить документ в папку, сменить текущее местоположение, получить список «звуков» и проиграть «звук», управлять демоном предупреждений.

«Контейнерная иерархия»

LotusScript NotesSession —> NotesUIWorkspace —> NotesUIDatabaseNotesUIView NotesUIDocument

__j;________________________________________________________NotesDocumentCo 1 lection

Для создания объекта класса NotesUIWorkspace используют метод New.

Dim variableName As New NotesUIWorkspace

3.34.L Свойства

© Свойство CurrentDatabase- «текущая база в интерфейсе пользователя»Set notesUIDatabase = notesUIWorkspace.CurreniDat&base

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

Пример. Скрипт открывает вид «By Category» в текущей базе рабочего пространства.

Dim ws As New NotesUIWorkspaceDim uidb As NotesUIDatabase • . -Set uidb = ws.CurrentDatabaseCall uidb.OpenView("By Category")

© Свойство CurrentView - «текущий вид в интерфейсе пользователя»Set notesUIView — notesUIWorkspace.CurrentVie'w

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

Пример. Скрипт выводит в диалоговом окне имя текущего вида из рабочего пространства.

Dim ws As New NotesUIWorkspace Dim uiview As NotesUIView Set uiview = ws.CurrentViewMessagebox uiview.ViewName

© InterTrust Co. Тел. (095) 9567928

Page 205: itpmr.ruitpmr.ru/docs/500-700.doc  · Web viewwhile (agents.hasMoreElements()) {Agent agent = (Agent)agents.nextElement(); String tg="", tr--""; switch (agent.getTarget()) {case

700 Встроенные классы LotusScript и Java

Свойство CurrentDocument - «текущий документ в интерфейсе пользователя»Set notesUIDocument - notesUIWorkspace.CurrentDocament

Возвращает ссылку на объект класса NotesUIDocument, соответствующий текущему документу в рабочем пространстве. Может использоваться для получения текущего документа во всех событиях класса NotesUIDocument, включая QueryOpen.

Текущим считается документ, который в настоящее время открыт в активном окне (для просмотра или редактирования) или «выделен» прямоугольной рамкой курсора в текущем виде или папке.

Пример. Скрипт получает ссылку на текущий документ в рабочем пространстве и выводит в диалоговом окне содержимое поля Subject этого документа.Dim ws As New NotesUIWorkspace Dim uidoc As NotesUIDocument Set, uidoc = ws . CurrentDocumentMessagebox uidoc.FieldGetText( "Subject" )

Свойство CurrentCalendarDateTime - «время текущей области календарного вида»date V- notesUlWorkspace.CurrentCalendarDateTimeВозвращает дату и время (как Variant of type DATE) текущей («выделенной» рамкой

курсора) области в календарном виде.

Пример. Скрипт акции по календарному виду выводит в диалоговом окне дату и время текущей области этого вида.Sub Click(Source As Button) ~Dim ws As New NotesUIWorkspace Messagebox ws.CurrentCalendarDateTime,, "Date and time for the current region"

End Sub

3.34.2, Методы»

Метод editDocument - «открыть документ в заданном режиме»Set notesUIDocument = notesUIWorkspace.ediiDocument( [editMode [, notesDocument [,

notesDocumeniReadOnly [, documentanchorS ]]]] )

Открывает текущий или специфицированный параметром notesDocument (объект класса NotesDocument) документ в заданном параметром editMode режиме: true - режим редактирования, false - режим просмотра. Если параметр notesDocument опущен, открывается текущий документ рабочего пространства. Если параметр editMode опущен, документ открывается в режиме редактирования.

Когда явно задан параметр notesDocument, параметр editMode равен false, а параметр notesDocumentReadOnly равен true, то после открытия документа в режиме просмотра пользователь не сможет перевести этот документ в режим редактирования. Если же в этих предусловиях параметр notesDocumentReadOnly равен false, то после открытия документа в режиме просмотра у пользователя сохраняется возможность перевести документ в режим редактирования. Если же предусловия не выполнены, параметр notesDocumentReadOnly не имеет эффекта.

Параметр documentanchor$ (тип String) задает местоположение (анктор), в которое позиционируется открываемый документ.

© InterTrust Co. Тел. (095) 9567928