Интеграция IBM Lotus Notes и IBM Lotus Symphony с использованием инструментария LotusScript и Lotus Symphony

Научитесь использовать инструментарий IBM Lotus Symphony LotusScript для публикации информации из IBM Lotus Notes в приложения Lotus Symphony, такие как Lotus Symphony Documents и Lotus Symphony Spreadsheets.

Майк Марони, штатный инженер-программист, IBM

Майк Марони (Mike Maroney) работает инженером-программистом в группе технической поддержки IBM Lotus. Он сертифицированный разработчик Lotus Notes, начиная с версии 3. С Майком можно связаться по адресу: maroney@us.ibm.com.



25.08.2010

Примечание редактора: Эта тема вам хорошо знакома? Хотите поделиться своим опытом? Примите участие в вики-программе по IBM Lotus.

Вики по IBM Lotus Notes и Domino Вики по Lotus Symphony

Введение

Большинству разработчиков Lotus Notes знакомы трудности публикации данных из Lotus Notes. Разработчикам часто приходится объединять данные в приложениях Lotus Notes, создавать отчеты определенного формата или добавлять такие функции, как таблица DataPilot. Lotus Notes не поддерживает эти возможности стандартно.

Начиная с версии 8, в Lotus Notes входит бесплатный набор деловых инструментов IBM Lotus Symphony, который можно установить с клиентом Lotus Notes. Он включает следующие приложения:

  • текстовый процессор Lotus Symphony Documents;
  • программа для работы с электронными таблицами Lotus Symphony Spreadsheets;
  • программа для создания презентаций Lotus Symphony Presentations.

Как разработчик Lotus Notes, вы можете создавать решения для публикации данных с помощью инструментария Lotus Symphony для Lotus Notes. Такие решения могут публиковать информацию, хранящуюся в базах данных Lotus Notes. Инструментарий поддерживается в Lotus Notes 8.5.1 и более поздних версиях. Эта статья посвящена публикации документов с помощью Lotus Symphony Documents и Lotus Symphony Spreadsheets.

Она содержит фрагменты кода, примеры и предлагает образец базы данных, который можно загрузить. В примере приложения Lotus Notes используются следующие агенты:

  • Создание документа Lotus Symphony. Простой агент для генерации документа Lotus Symphony. В этот агент входят также полезные советы по созданию документов и работе с ними в скрытом режиме.
  • Создание электронной таблицы Lotus Symphony. Простой агент для генерации электронной таблицы Lotus Symphony.
  • Пример отчета в форме документа. Агент, который продолжает работу с примером документа Lotus Symphony, создавая отчет на основе данных Lotus Notes.
  • Пример отчета в форме электронной таблицы. Агент, который продолжает работу с примером электронной таблицы Lotus Symphony, создавая отчет на основе данных Lotus Notes.

Требования и ограничения

Чтобы использовать код, представленный в этой статье, нужно разрешить работу инструментария Lotus Symphony. Это необходимо, так как примеры написаны в виде агентов, вызываемых пользователем, которые работают на локальной системе.

И этот инструментарий поддерживается только на системах Microsoft Windows и Linux.

Наконец, Lotus Symphony поддерживает следующие форматы файлов:

  • Open Document Format (ODF) 1.1 – чтение/запись;
  • Microsoft 97-2003 – чтение/запись;
  • Microsoft 2007 DOCX – чтение;
  • Lotus SmartSuite – чтение;
  • Comma-separated value (CSV) / Tab-separated value (TSV) – чтение.

Предположения

В данной статье предполагается, что вы знакомы с LotusScript и идеей объектных моделей.


Начало работы

Данный раздел посвящен основам создания дескрипторов приложений Lotus Symphony и связанных с ними объектов. Для справок приведен пример кода; все примеры содержатся в образце приложения.

Создание ссылок на приложения Lotus Symphony

Первым шагом в обмене данными между Lotus Notes и другими приложениями является получение ссылки на целевое приложение. Хотя в простом приложении создавать ссылку не обязательно, включение ссылки на файл Lotus Symphony LSS позволяет использовать константы, связанные с обычными действиями, такими как определение форматов шрифтов, указание типов диаграмм и задание форматов файлов.

(Options)
%INCLUDE "symphonylsx.lss"

Чтобы определить размер переменных объекта для представления приложений Lotus Symphony и типы объектов, создадим ссылку на приложение Lotus Symphony:

'Следующая строка создает дескриптор
'объекта приложения Symphony.
Dim symphony As New SymphonyApplication

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

Листинг 1. Создание ссылки на документы и нового документа
'Следующие строки будут отображать 
'коллекцию документов и объект документа.
Dim symDocuments As SymphonyDocuments
Dim symDocument As SymphonyDocument

Вот список из трех классов объектов приложений Lotus Symphony, которые можно использовать:

  • SymphonyApplication.Documents
  • SymphonyApplication.Spreadsheets
  • SymphonyApplication.Presentations

Создание документа Lotus Symphony

Отталкиваясь от предыдущего фрагмента кода, можно передать текст в документ Lotus Symphony с использованием LotusScript. Однако сначала необходимо получить ссылку на новый документ, как показано в листинге 2.

Листинг 2. Получение ссылки на новый документ
'Следующая строка создает дескриптор 
'коллекции документов Symphony, а также
'новый документ
Set symDocuments = symphony.Documents
Set symDocument = symDocuments.AddDocument()

Во второй строке мы опускаемся вниз по объектной модели Lotus Symphony от объекта приложения к коллекции документов внутри этого приложения. Затем используем метод Add, который создает документ и возвращает ссылку на него.

Чтобы увидеть объектную модель документа или приложения Lotus Symphony, можно открыть документ и выбрать из меню Tools – Macros – Macro. Откроется окно, показанное на рисунке 1.

Рисунок 1. Окно Macro
Окно Macro

При нажатии кнопки Edit откроется окно редактора BASIC, показанное на рисунке 2.

Рисунок 2. Окно редактора BASIC Lotus Symphony
Окно редактора BASIC Lotus Symphony

Затем нажмите кнопку Object Catalog, которая выделена на рисунке 3.

Рисунок 3. Кнопка Object Catalog
Кнопка Object Catalog

Откроется окно Object Organizer, как показано на рисунке 4.

Рисунок 4. Окно объектов
Окно объектов

В окне приведен список всех существующих объектов в иерархическом представлении. При двойном щелчке на списке открываются подчиненные объекты.

Другой вариант заключается в использовании вкладки ссылок Lotus Domino Classes, как показано на рисунке 5. Эта вкладка доступна при редактировании агента LotusScript в IBM Lotus Domino Designer.

Рисунок 5. Вкладка Reference в Lotus Domino Designer отображает классы Lotus Symphony
Вкладка Reference в Lotus Domino Designer отображает классы Lotus Symphony

Использование метода select

Объект SymphonyDocument содержит множество методов, которые стоит просмотреть. Однако прежде чем начать ввод текста в документ, нужно подумать о том, где находится курсор. Даже если вы выполняете действия с документом программно, Lotus Symphony ведет себя так, как будто человек работает с ним вручную.

Например, при создании документа Lotus Symphony в Lotus Notes курсор отображается в верхней части страницы. То же самое происходит и при программном создании документа. Поэтому давайте воспользуемся объектом Selection.Range:

Dim txtRange As SymphonyTextRange
Set txtRange = symDocument.Selection.Range

Эти две строки кода предоставят ссылку на объект SymphonyTextRange. Теперь можно использовать свойство Text для ввода текста в документ.

Ввод текста

В объект Selection входит свойство Text, которое используется для передачи документу строки символов в текущем диапазоне:

txtRange.Text = "Hello, world!"

Этот код передает пресловутую текстовую строку "Hello, world!" в активный документ, начиная с текущей позиции курсора.

Форматирование

Если нужно отформатировать текст в документе Lotus Symphony, выберите текст, а затем примените форматирование. Например, можно выделить только что введенную строку "Hello, world!" жирным шрифтом.

txtRange.Font.Bold = True

Этот код применяет форматирование bold к выбранному диапазону.

Создание электронной таблицы Lotus Symphony

С помощью аналогичного кода можно создавать таблицы Lotus Symphony, как показано в листинге 3.

Листинг 3. Создание электронной таблицы Lotus Symphony
(Options)
%Include "symphonylsx.lss"

Dim symphony As New SymphonyApplication
Dim symSheeets As SymphonySpreadsheets
Dim symSheet As SymphonySpreadsheet

Set symSheets = symphony.Spreadsheets()
Set symSheet = symDocuments.AddSpreadsheet()

Подведение итогов

Итак, мы следовали процессу, начав с самой высокоуровневой объектной модели (объект SymphonyApplication) и опускаясь вниз. Используя переменные Variant, мы получили ссылки на различные часто используемые объекты. Полный код приведен в листинге 4. Вы можете скопировать и вставить его в агент, а затем шаг за шагом проследить его в действии с помощью отладчика LotusScript.

Листинг 4. Полный код для ознакомления
Dim symphony As New SymphonyApplication
Dim symDocuments As SymphonyDocuments
Dim symDocument As SymphonyDocument

Set symDocuments = symphony.Documents
Set symDocument = symDocuments.AddDocument()

Dim txtRange As SymphonyTextRange
Set txtRange = symDocument.Selection.Range
txtRange.Text = "This is my first Symphony document!"
txtRange.Font.Bold = True
Set txtRange = symDocument.Paragraphs.Item(2).Range
txtRange.Font.Bold = False
txtRange.Text = "This is great!"

Создание отчета в форме документа Lotus Symphony

Рассмотрим такой сценарий: вы руководите разработкой программы и используете приложение Lotus Notes для отслеживания проектов этой программы. Вам регулярно требуется информация об одном или нескольких проектах и связанных с ними затратах.

Создание отчета по документам

Вы знакомы с работой с объектами Lotus Notes и объектами Lotus Symphony, предоставляемыми этим инструментарием. С помощью кода, аналогичного коду из листинга 5, можно создать агент, который создает желаемый отчет. В образце базы данных есть представление All Projects и образец агента Sample Document Report.

Листинг 5. Пример кода для создания отчета в форме документа Lotus Symphony
%REM
	Agent 3) Sample Document Report
	Created Jul 23, 2009 by Symphony Developer/Symphony Developer
	Description: Comments for Agent
%END REM
Option Public
Option Declare
%Include "symphonylsx.lss"
Sub Initialize()
	'Declare the Notes object variables
	Dim sess As New NotesSession
	Dim db As NotesDatabase
	Dim v As NotesView
	Dim vnav As NotesViewNavigator
	Dim entry As NotesViewEntry
	Dim doc As NotesDocument
	Dim colCosts As NotesDocumentCollection
	Dim cost As NotesDocument
	Dim mgr As String
	Dim planned As Currency
	Dim actual As Currency
	Dim variance As Currency
	Dim cuser As NotesName
	
	Set db = sess.Currentdatabase
	Set v = db.GetView("All Projects")
	Set vnav = v.Createviewnav()
	Set entry = vnav.Getfirstdocument()
	
	If entry Is Nothing Then
		MsgBox "No documents found", , "Exiting"
		Exit sub
	End If
	
	'Declare the Symphony object variables
	Dim symphony As New SymphonyApplication
	Dim rptDoc As SymphonyDocument
	
	%REM
	Generally, I would create the document in "invisible" mode. To
	see this is action, uncomment the following line and comment the 
	line after the next REM block.
	%END REM
	'Set rptDoc = symphony.Documents.AddDocument("", False, False)
	
	%REM
	I typically use the following line during development/debugging,
	then switch to the line above for production.
	%END REMП
	Set rptDoc = symphony.Documents.AddDocument()
	
	Dim txtRange As SymphonyTextRange
	Set txtRange = rptDoc.Selection.Range
	txtRange.Text = "Project Summary Report"
	txtRange.Horialignment = SYMPHONY_TEXT_HORI_ALIGN_CENTER
	txtRange.Font.Bold = True
	txtRange.Font.Height = 16 
	Call txtRange.InsertBreak(txtRange.End, SYMPHONY_TEXT_BREAK_PARAGRAPH)
	Set txtRange = rptDoc.Paragraphs.Item(2).Range
	txtRange.Text = "prepared " & CStr(Today)
	Call txtRange.InsertBreak(txtRange.End, SYMPHONY_TEXT_BREAK_APPEND_PARAGRAPH)
	Set txtRange = rptDoc.Paragraphs.Item(3).Range
	Set cuser = New NotesName(sess.Commonusername)
	txtRange.Text = "by " & cuser.Common
	Call txtRange.InsertBreak(txtRange.End, SYMPHONY_TEXT_BREAK_APPEND_PARAGRAPH)
	Call txtRange.InsertBreak(txtRange.End, SYMPHONY_TEXT_BREAK_APPEND_PARAGRAPH)
	
	Set txtRange = rptDoc.Paragraphs.Item(5).Range
	txtRange.Horialignment = SYMPHONY_TEXT_HORI_ALIGN_LEFT
	txtRange.Font.Bold = False
	txtRange.Font.Height = 12
	
	'Begin walking the documents in the view, and passing the
	'values into the Symphony document.
	Do Until entry Is Nothing
	 Set doc = entry.Document
	 Set txtRange = rptDoc.Paragraphs.Item(rptDoc.Paragraphs.Count).Range.End

	 Select Case doc.Form(0)
	 Case "ProjectSummary"
	 'Print desired information for Project documents
	 If (mgr = "") Or (mgr <> doc.PrjMgr(0)) Then
	 mgr = doc.PrjMgr(0)
	 Call txtRange.InsertBreak(txtRange.End, _
	 SYMPHONY_TEXT_BREAK_APPEND_PARAGRAPH)
	 Set txtRange = rptDoc.Paragraphs.Item(rptDoc.Paragraphs.Count).Range.End
	 txtRange.Text = "Projects managed by " & mgr
	 Call txtRange.InsertBreak(txtRange.End, _
	 SYMPHONY_TEXT_BREAK_APPEND_PARAGRAPH)
	 txtRange.Font.Bold = True
	 End If
	 Call txtRange.InsertBreak(txtRange.End, _
	 SYMPHONY_TEXT_BREAK_APPEND_PARAGRAPH)
	 Set txtRange = rptDoc.Paragraphs.Item(rptDoc.Paragraphs.Count).Range.End
	 txtRange.Text = doc.PrjName(0) & " – " & doc.PrjStatus(0)
	 Call txtRange.InsertBreak(txtRange.End, _
	 SYMPHONY_TEXT_BREAK_APPEND_PARAGRAPH)
	 txtRange.Font.Italic = True
	 Case "Task"
	 'Print desired information for Task documents
	 Set txtRange = rptDoc.Paragraphs.Item(rptDoc.Paragraphs.Count).Range.End
	 txtRange.Text = "- " & doc.TaskDesc(0)
	 Call txtRange.InsertBreak(txtRange.End, _
	 SYMPHONY_TEXT_BREAK_APPEND_PARAGRAPH)
	 'Calculate and print desired information for Cost documents
	 planned = 0
	 actual = 0
	 variance = 0
	 Set colCosts = doc.Responses()
	 If colCosts.Count > 0 Then
	 Set cost = colCosts.Getfirstdocument()
	 Do Until cost Is Nothing
	 If IsNumeric(cost.CapPln(0)) Then
	  planned = planned + cost.CapPln(0)
	 End If
	 If IsNumeric(cost.ExpPln(0)) Then
	  planned = planned + cost.ExpPln(0)
	 End If
	 If IsNumeric(cost.CapAct(0)) Then
	  actual = actual + cost.CapAct(0)
	 End If
	 If IsNumeric(cost.ExpAct(0)) Then
	  actual = actual + cost.ExpAct(0)
	 End If
	 Set cost = colCosts.Getnextdocument(cost)
	 Loop
	 variance = planned – actual
	 End If
	 Set txtRange = rptDoc.Paragraphs.Item(rptDoc.Paragraphs.Count).Range.End
	 txtRange.Text = " Planned: " & Format$(planned, "$#,##0") & _
	 " Actual: " & Format$(actual, "$#,##0") & _
	 " Variance: " & Format$(variance, "$#,##0")
	 Call txtRange.InsertBreak(txtRange.End, _
	 SYMPHONY_TEXT_BREAK_APPEND_PARAGRAPH)
	 End Select
	 Set entry = vnav.Getnextdocument(entry)
	Loop
	
	'Clean up
	Print "Cleaning up..."
	Set txtRange = Nothing
	Set rptDoc = Nothing
	Set symphony = Nothing
	Set cost = Nothing
	Set colCosts = Nothing
	Set doc = Nothing
	Set entry = Nothing
	Set vnav = Nothing
	Set v = Nothing
	Set db = Nothing
	Set sess = Nothing
	
	MsgBox "Complete", , "You report is now complete."
End Sub

Создание отчета в форме электронной таблицы Lotus Symphony

Рассмотрим такой сценарий: Вы – директор по продажам в небольшой компании и хотите рассмотреть в разных разрезах свои последние продажи. База данных Lotus Notes содержит заказы за прошлый месяц.

Создание отчета в форме электронной таблицы

Как и в предыдущем примере, можно использовать NotesViewNavigator для доступа к нужным данным из Lotus Notes и ввести эти данные в электронную таблицу Lotus Symphony. Уникальным аспектом в данном случае является то, что для отображения и анализа данных можно использовать таблицу DataPilot.

Это мощный инструмент для быстрого объединения, сравнения и анализа больших объемов данных. Эти данные можно организовывать, менять местами или суммировать с разных точек зрения. Подробнее о таблицах DataPilot можно узнать в информационном центре IBM Lotus Symphony.

В образце базы данных есть представление Orders и пример агента Sample Document Report.

В листинге 6 показан код, который можно использовать для создания отчета в форме электронной таблицы Lotus Symphony.

Листинг 6. Пример кода для создания отчета в форме электронной таблицы Lotus Symphony
%REM
	Agent 4) Sample Spreadsheet Report
	Created Jul 23, 2009 by Symphony Developer/Symphony Developer
	Description: Comments for Agent
%END REM
Option Public
Option Declare
%Include "symphonylsx.lss"
Sub Initialize()
	'Declare the Notes object variables
	Dim sess As New NotesSession
	Dim db As NotesDatabase
	Dim v As NotesView
	Dim vnav As NotesViewNavigator
	Dim entry As NotesViewEntry
	Dim row As long
	
	'These lines obtain a handle to the 'Orders' view,
	'and the first entry in it.
	Set db = sess.Currentdatabase
	Set v = db.GetView("Orders")
	Set vnav = v.Createviewnav()
	Set entry = vnav.Getfirstdocument()
	
	If entry Is Nothing Then
		MsgBox "No documents found", , "Exiting"
		Exit Sub
	End If
	
	'Declare the Symphony object variables
	Dim symphony As New SymphonyApplication
	Dim rptSht As SymphonySpreadsheet
	Dim dataSheet As Symphonysheet
	Dim dpSheet As Symphonysheet
	
	'Variables below are for the DataPilot
	Dim dataPilotTables As SymphonyDataPilotTables
	Dim dataPilotTable As SymphonyDataPilotTable
	Dim src As SymphonyRange
	Dim dst As SymphonyRange
	%REM
	Generally, I would create the document in "invisible" mode. To
	see this is action, uncomment the following line and comment the 
	line after the next REM block.
	%END REM
	'Set rptSht = symphony.Spreadsheets.AddSpreadsheet("", False, False)
	
	%REM
	I typically use the following line during development/debugging,
	then switch to the line above for production.
	%END REM
	Set rptSht = symphony.Spreadsheets.Addspreadsheet("")
	
	%REM
	The next few lines of code create and name 2 sheets. The first sheet
	is called 'Data' and will contain the actual data used as the source for
	the second sheet.
	
	The second sheet will be used to display and manipulate the DataPilot. 
	%END REM
	Set dataSheet = rptSht.Activesheet
	dataSheet.Name = "Data"
	Call rptSht.Sheets.Addto(dataSheet, 1, False)
	Set dpSheet = rptSht.Sheets.Item(2)
	dpSheet.Name = "DataPilot"
	
	'The following lines create the header row in the source table.
	With dataSheet
		.Cells(1, 1).Text = "Rep"
		.Cells(1, 2).Text = "Customer"
		.Cells(1, 3).Text = "Region"
		.Cells(1, 4).Text = "Product"
		.Cells(1, 5).Text = "Num Units"
		.Cells(1, 6).Text = "Price"
		.Cells(1, 7).Text = "Total"
		.Range("A1:G1").Font.Bold = True
	End With
	
	' The next lines pass the data from Notes into the spreadsheet.
	row = 1
	Do Until entry Is Nothing
		row = row + 1
		dataSheet.Cells(row, 1).Text = entry.Columnvalues(0)
		dataSheet.Cells(row, 2).Text = entry.Columnvalues(1)
		dataSheet.Cells(row, 3).Text = entry.Columnvalues(2)
		dataSheet.Cells(row, 4).Text = entry.Columnvalues(3)
		dataSheet.Cells(row, 5).Value = entry.Columnvalues(4)
		dataSheet.Cells(row, 6).Value = entry.Columnvalues(5)
		dataSheet.Cells(row, 7).Value = entry.Columnvalues(6)
		Set entry = vnav.Getnextdocument(entry)
	Loop
	
	'Finally, these lines create the DataPilot.
	Set dataPilotTables = dpSheet.DataPilotTables
	Set src = dataSheet.Range("A1:G" & CStr(row))
	Set dst = dpSheet.Cells(1, 1)
	Set dataPilotTable = dataPilotTables.Add(src,"DPT_ORDERS",dst)
	Dim rowFieldsString(0) As String
	rowFieldsString(0) = "Rep"
	Dim colFieldsString(0) As String
	colFieldsString(0) = "Region"
	Dim dataFieldsString(0) As String
	dataFieldsString(0) = "Total"
	Dim pageFieldsString(0) As String
	pageFieldsString(0) = "Product"
	Call dataPilotTable.AddFields(rowFieldsString, colFieldsString, _
		dataFieldsString, pageFieldsString, SYMPHONY_GENERAL_FUNCTION_SUM)
End Sub

Заключение

IBM Lotus Symphony представляет собой мощный инструмент, который позволяет опытным разработчикам LotusScript быстро освоить создание широкого спектра издательских решений. Из этой статьи вы узнали, как опубликовать содержимое базы данных Lotus Notes в различных форматах. Теперь вы умеете создавать отчеты в форме документа Lotus Symphony, выполнять анализ или даже строить диаграммы с помощью электронных таблиц Lotus Symphony.


Загрузка

ОписаниеИмяРазмер
Образец кодаSymphInt.nsf448 КБ

Ресурсы

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Lotus
ArticleID=513206
ArticleTitle=Интеграция IBM Lotus Notes и IBM Lotus Symphony с использованием инструментария LotusScript и Lotus Symphony
publish-date=08252010