Розробка додатків для Lotus Notes / Domino в середовищі Borland Delphi, Delphi, Програмування, статті

Lotus Notes / Domino – Прекрасна платформа для створення потужних корпоративних інформаційних систем, орієнтованих на групову роботу з електронними документами. У своїй роботі над комплексної медичної інформаційної системою “Кондопога” ми на основі ретельного аналізу засобів розробки і наявних на ринку СУБД вибрали Lotus Notes / Domino в якості основи всієї системи. Розробка здійснюється з 1999 року, за цей час ми поступово перейшли з версії 4.6 на версію R 5, а потім – на R 6. В даний момент йде тестування R 6.5 на сумісність з існуючим ПЗ.


Lotus Notes / Domino повністю відповідає ключовим вимоги до створення медичної інформаційної системи по надійності, безпеки, відмовостійкості та масштабуванню. Робота користувача в цьому середовищі в максимальному ступені наближена до звичної роботи з документами – фактично, папір і авторучка у медичних працівників замінена на комп’ютер. Форми електронних документів можуть бути розроблені по точної аналогії з їх паперовими аналогами (при необхідності), а стандартні засоби для роботи з документами (створення, редагування, друк, відправка по e-mail, електронний цифровий підпис і т.д.) вимагають від користувача мінімального обсягу навчання.


Однак, як і в будь-якої інформаційної технології, є ряд недоліків, з якими доводиться миритися і шукати шляхи їх подолання. Основною їх недоліків Lotus Notes / Domino для застосування в медичній сфері – це слабка підтримка таблиць в електронних документах. На практиці навіть з точки зору користувача вбудовані в клієнтське програмне забезпечення Lotus Notes засоби для роботи з таблицями значно поступаються аналогічним інструментам в Microsoft Office. А з точки зору інструментарію розробника кошти для управління таблицями тим більше є малоефективними. Деякі зміни в цьому напрямку були зроблені у версії R 6 Domino, однак і вони є недостатніми. Фактично, в Lotus Notes таблиця, як засіб відображення, управління та зберігання інформації, відсутній як клас. Але це і зрозуміло – Адже Lotus Notes – це, перш за все, об’єктно-орієнтована СУБД, призначена для групової роботи над документами.


Разом з тим в нашій роботі підтримка табличного формату зберігання інформації є невід’ємною функцією системи. Деякі документи (лист призначень, наприклад) і деякі додатки (бухгалтерія, аптека, склад, автоматизація служби харчування і т.д.) незрівнянно більш ефективно працюю під управлінням реляційної СУБД, ніж в середовищі Lotus Notes / Domino. Все це породило необхідність спільного використання Lotus Notes / Domino і реляційної СУБД, в якості якої був обраний Microsoft SQL Server. Як засіб розробки в Lotus Notes / Domino використовується спеціальне програмне забезпечення Lotus Designer, що дозволяє створювати мультиплатформенні програми на Visual Basic-подібному мовою Lotus Script, @-формулах або Java Script. Це потужна програма дозволяє за дуже невеликий час розробляти необхідні програми як для виконання в середовищі Lotus Notes, так і для роботи в звичайному браузері Internet. Однак для створення програми для реляційної СУБД його можливостей явно недостатньо. Тому в якості додаткового інструментарію ми використовуємо Borland Delphi (В даний час – версію 6.0).


Одним із серйозних перешкод на використанні Delphi є завдання спільного доступу як до інформації в реляційної бази даних, так і для доступу до баз даних Lotus Notes / Domino. Для вирішення цього завдання є кілька підходів:



  1. Використання компонентів сторонніх виробників (www.torry.net/index.htm, www.geocities.com/SiliconValley/Peaks/8307/)
  2. Використання програми Lotus Notes SQL (www-10.lotus.com/ldd)
  3. Розробка власних компонентів, використовуючи Notes API (www.notesnet.ru/)
  4. Доступ до ресурсів Lotus Notes за допомогою OLE.

Перший підхід передбачає використання компонентів для доступу до Lotus Notes. При цьому програми можуть звертатися до баз даних і документів, використовуючи інкапсульовані в ці компоненти властивості і методи. Ми апробували що були свого часу пропозиції і не знайшли рішення, повністю задовольняє наші вимоги. Використання компонентів вносило нестабільність в створювані додатки, які нам не вдавалося швидко локалізувати і виправити, тому що або з розробниками не можливо було налагодити контакт, або тех.підтримка вимагала додаткових фінансових витрат і часу.


Другий підхід також, на жаль, не відповідав вимогам. При цьому Notes SQL фактично емулює звернення до бази даних Lotus Notes, як до звичайної реляційної таблиці. Тестування різних версій Notes SQL показала нестабільність цього програмного забезпечення. Особливо яскраво недоліки Notes SQL виявлялися при обробці великих обсягів інформації – у випадкові моменти роботи програми виникали непереборні помилки, які приводили до повному припиненню роботи програм.


Третій підхід є кращим, однак і від нього ми з часом відійшли в силу його трудомісткості, великий складно написання програми, маси низькорівневого коду і високих вимог до знання внутрішній архітектури Lotus Notes.


Перший час доступ до Lotus Notes за допомогою OLE здавався нам неприйнятним варіантом з точки зору швидкості роботи. Однак наш 5-річний досвід роботи довів високу стійкість програм на основі цього підходу і цілком прийнятну швидкість обробки інформації.


Далі ми на прикладах покажемо, як написати додаток в середовищі Borland Delphi для баз даних Lotus Notes.


1. Ініціалізація сесії


Основний принцип в написанні програм полягає у використанні вбудованих класів Lotus Notes в коді програм. Для цього в першу чергу необхідно ініціалізувати сесію зв’язку з Lotus Notes. Для цього потрібно, щоб клієнтське програмне забезпечення Lotus Notes було інстальоване на кожному комп’ютері, що використовує програму і підключено до одного або декількох серверів Domino.


Створимо новий додаток. У розділі uses головного вікна програми вкажемо ComOBJ – це бібліотека, що дозволяє викликати і звертатися до OLE-об’єктів.


У розділі public оголосимо змінні, загальні для всього програми:

public
{ Public declarations } MySession: OLEVariant; / / поточна сесія Lotus Notes MyLNDataBase: OLEVariant; / / база даних Lotus Notes …

Тепер необхідно написати обробник події OnCreate головної форми програми, в якому ми повинні створити об’єкт NotesSession, щоб, використовуючи його в подальшому, мати можливість в рамках однієї програми звертатися відразу до кількох баз даних, серверів, документам, уявленням і т.д. Обробник повинен мати наступний вигляд:

procedure TfmMain.FormCreate(Sender: TObject);
begin
MySession:= createOLEObject(“Notes.Notessession”);
if varisempty(MySession) then
begin ShowMessage (“Не можу створити сесію з сервером Lotus Notes”);
Exit;
end;
end;

Слід мати на увазі, що в рамках однієї програми слід тільки один раз ініціалізувати об’єкт Notessession, т.к. кожна наступна ініціалізація буде закривати попередню сесію, а всі об’єкти, створені на основі цієї сесії, втратять свою актуальність і їх обробка буде неможлива.


2. Доступ до бази даних


Після того, як ми ініціалізували сесію зв’язку з Lotus Notes, ми можемо звертатися до будь-яких серверів Lotus Domino і баз даних на них. Принципово отримати доступ до БД Lotus Notes можна 2 способами – Або звернутися до поточної базі даних, відкритої в Lotus Notes, або викликати відповідний метод NotesSession і відкрити будь-яку іншу БД. Останній випадку є найбільш затребуваним, тому розглянемо його:

procedure TMyButtomClick(Sender: TObject);
var MyServer: string;
begin / / Необхідно обчислити ім’я сервера, / / На якому знаходиться необхідна нам БД
MyServer:=… / / Тепер відкриваємо БД – наприклад, відкриємо адресну книгу сервера
MyLNDataBase:=MySession.GetDataBase(MyServer, ‘names.nsf’);
end;

Ми в своїй роботі використовуємо реєстр Windows, в якому зберігаємо ім’я сервера Domino за замовчуванням, до якого підключаються програми. Для спрощення розробки та адміністрування програм ми використовую функцію GetDefaultServerName, яка працює за наступним алгоритмом:



  1. При виконанні функції вона перевіряє наявність певного ключа в реєстрі Windows.
  2. Якщо цей ключ відсутній або він містить пусте значення, функція звертається до файлу notes.ini і зчитує з нього значення параметра поштового сервера Notes. Ім’я сервера записується як значення ключа Windows
  3. Якщо ключ в реєстрі Windows є і не містить пусте значення, функція зчитує його і повертає в якості відповіді.

Таким чином, при першому старті програми воно самостійно виконує настройку реєстру Windows на підключення до поточного сервера Domino. Якщо надалі потрібно перенаправити роботу програми на інший сервер, то або користувач за допомогою вбудованих в додаток візуальних засобів, або адміністратор мережі вручну змінюють значення ключа. Т.ч. з наступного запуску починає звертатися до іншого серверу – забезпечує підтримка мультисерверної конфігурації інформаційної системи.


3. Робота з базою даних


З програми, написаної в Borland Delphi, доступні практично всі властивості і методи, передбачені розробниками Lotus Notes / Domino. У тому числі Ви можете здійснювати навігацію по уявленням, здійснювати пошук документів в базі даних, у тому числі і гіпертекстовий пошук і т.д. Особливостей по роботі з базою даних внаслідок використання Delphi ми не виявили. Тому як приклад наведемо фрагмент коду, який здійснює послідовний перебір і зчитування документів з колекції документів NotesDocumentCollection бази даних адресної книги сервера.

procedure TfmMainWindow.BitBtn1Click(Sender: TObject); var DocumCount: longint; / / кількість документів в колекції i: longint; / / крок циклу B1: OLEVariant; / / мінлива для об’єкта NotesDatabase
BodyQuery: ansistring; C1: OLEVariant; / / мінлива для об’єкта NotesDocumentCollection D1: OLEVariant; / / мінлива для об’єкта NotesDocument
begin
DocumCount:=0; / / Отримуємо доступ до БД.
B1:= MySession.GetDatabase(GetDefaultServerName,”names.nsf”);
BodyQuery:=”Form = “Person””; / / Для пошуку використовуємо спеціальну функцію LNSearch C1: = LNSearch (MySession, B1, ‘Приклад запиту’, BodyQuery);
DocumCount:=C1.Count; if DocumCount = 0 then Exit; / / шукані документи не знайдені
D1:=C1.GetFirstDocument;
for i:=1 to DocumCount do begin …. тут здійснюється обробка документа
D1:=C1.GetNextDocument(D1);
end;
end;

У цьому прикладі програма звертається до поточного сервера і відкриває на ньому базу даних адресної книги. Потім, використовуючи спеціально розроблену функцію LNSearch, виробляє пошук документів в базі даних. Якщо не знайдено жодного документа, то робота процедури завершується. Якщо якісь документи знайдені, то вони послідовно обробляються в циклі. Застосування спеціальної функції LNSearch обумовлено тим, що стандартний метод Search в класі NotesDatabase, крім формули для пошукового запиту, вимагає передати дату самого старого документа, який цей запит зможе повернути в якості результату. При цьому дата повинна бути передана не в якості змінної типу TDate або TDateTime, а в якості OLEVariant-змінної, створеної як об’єкт класу NotesDataTime.

function LNSearch(LNSession, LNDataBase: OLEVAriant;
Logo: string;query: string):OLEVariant;
var r1:WideString;
r2: OLEVariant;
r3: Smallint;
C1: OleVariant;
begin
r1:=query; r2: = LNSession.CreateDateTime (“01.01.1990”); / / тут може бути будь-яка дата
r3:=0;
C1:=LNDataBase.SEARCH(r1,r2,r3);
Result:=C1;
end;

Зазначимо, що за нашими спостереженнями, при написанні програм в Borland Delphi слід прагнути використовувати навігацію по уявленням замість використання методу search. При цьому швидкість обробки однієї і тієї ж колекції документів, отриманої з уявлення, приблизно на 40% вище, ніж при обробці документів, отриманих пошуком в базі даних.


4. Робота з документами


На відміну від роботи з базами даних, обробка документів Lotus Notes має масу підводних каменів. При цьому в програмах доводиться виконувати багато однакових операцій, які доцільно виділяти в окремі функції. Спочатку розглянемо стандартну функцію зчитування текстового значення поля з документа.

function LNGetFieldStrValue(Document: OLEVariant;
FieldName: string;
DefaultValue: string): AnsiString;
var SendValue, RetValue: OLEVariant;
TmpS: Ansistring;
MyPos: integer;
begin
TmpS:=” “;
if FieldName<>”” then
begin
SendValue:=FieldName;
if not varisempty(Document) then
begin
Try
RetValue:=Document.HasItem(FieldName);
except
begin
RetValue:=false;
end; // do
end; // Try
if RetValue then
begin
RetValue :=Document.GetFirstItem(SendValue);
try
TmpS:=RetValue.Text;
except
TmpS:=DefaultValue;
end;
end else TmpS:=DefaultValue;
end else TmpS:=DefaultValue; // varisempty chek
end else TmpS:=DefaultValue;
if TmpS=”” then TmpS:=DefaultValue;
Result :=tmpS;
end;

Ця проста функція дозволяє значно спростити написання програм, особливо у випадку, коли документ містить велику кількість полів, значення яких необхідно вважати й обробити. Необхідно зазначити, що дуже часто в полях документів Lotus Notes зберігається кілька значень або значення записані з символами, що перешкоджають коректній роботі з рядками в Borland Delphi. Ми в такому разі використовуємо перевантажену версію представленої функції, яка може повертати “очищену” рядок або певну підрядок.


За аналогією з представленим прикладом розроблені і версії для числових полів, а також полів з датою або часом, що представляє особливу складність при написанні програм. В такому разі, крім стандартних перевірок на коректність документа, наявності в ньому зазначеного поля, функція може перевірити тип значення, що повертається або виконати необхідні перетворення. Наприклад, можлива конвертація строкового значення в число або зміна символу роздільника розрядів на підставі поточних налаштувань операційної системи.


Кілька ускладнений приклад – це зчитування значення поля в профайлі. Як відомо, Lotus Notes, крім стандартних документів, дозволяє підтримувати зберігання інформації в т.зв. профайлах – документах, до яких можна звернутися по імені форми і, як доповнення, на ім’я поточного користувача. Для читання текстового значення з профайла розглянемо наступну функцію:

function LNGetProfileField(MySession, MyDBName: OLEVariant;
MyServerName, MyProfileName, MyUserName, MyFieldName: string):string;
var D1: OLEVariant;
tmpS: AnsiString;
begin
if MyServerName=”” then
tmpS:= GetDefaultServerName else tmpS:=MyServerName;
if varisempty(MyDBName) then
begin ShowMessage (“Фатальна помилка! Переданий об’єкт <База даних> порожній. Продовження неможливо! “);
Exit;
end;
D1:=MyDBName.GetProfileDocument( MyProfileName, MyUserName);
if varisempty(D1) then
begin ShowMessage (“Помилка при отриманні профайла” + MyProfileName + ” з базі даних “+ MyServerName + “/” + MyDBName.Name + “. Продовження неможливо!”);
Exit;
end;
tmpS:=LNGetFieldStrValue(D1,MyFieldName,””,False);
Result :=tmpS;
end;

Як видно з прикладу, ця функція використовує стандартну функцію LNGetFieldStrValue, представлену раніше, але перед цим виконує ряд додаткових перевірок і операцій.


5. Висновки


Ми використовуємо представлену технологію в практичній розробці медичної інформаційної системи “Кондопога” ось уже протягом 5 років. За цей час багато разів переконалися в прекрасній стійкості і прийнятною швидкості роботи програм, написаних на Borland Delphi для баз даних Lotus Notes / Domino. Фактично ми переконалися, що здатні створювати програми на Borland Delphi, які використовують весь арсенал вбудованих в Lotus Notes класів.


Зазначимо, що з часом в арсеналі програміста накопичується найрізноманітніша маса готових функцій і процедур, які доцільно акумулювати або у вигляді підключаються бібліотек, або у вигляді окремих модулів (pas-файлів). При цьому, за нашими спостереженнями, час на розробку нової програми можна скоротити в кілька разів саме за рахунок використання готових і налагоджених додатків. А це дозволяє знизити вартість розробки і підвищити стійкість додатків, що є вже не стільки інструментарієм розробника, скільки економічним стимулом.


Поступово нами була накопичена ціла бібліотека класу middleware, яка реалізує практично весь необхідний функціонал для написання програм в Borland Delphi для середовища Lotus Notes. Це дозволило розробити нашу інформаційну систему таким чином, що взаємні недоліки реляційних і об’єктно-орієнтованих баз даних фактично повністю компенсуються взаємними достоїнствами. Тому користувачі ІВ “Кондопога” однаково комфортно використовують і можливості спільної роботи над електронними документами Lotus Notes і вбудовані в бази даних Domino додатки, що мають розширені можливості роботи з таблицями реляційних баз даних, миттєве побудова діаграм на основі даних з документів Lotus Notes і т.д.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*