Россия, Омск |
Использование интеграции с DB2 для улучшения приложения ITSO Electronics
2.3.3 Создание Query View с помощью оператора Union
Компания ITSO Electronics настаивает на том, чтобы все ее внешние контакты были объединены в одно представление. При этом информация о поставщиках хранится в базе данных Products, а данные покупателей хранятся в базе данных Customer. В Lotus Notes и Domino Release 6 данную задачу можно выполнить, лишь сохранив всю информацию в одной базе данных. Однако с появлением Lotus Domino 7 у нас появилась возможность создать Query View с помощью оператора Union в пределах нашего SQL-выражения. На рис. 2.11 показано, как с помощью оператора Union происходит создание Query View из отдельных DB2 Access View.
В примере 2.6 показано SQL-выражение, используемое для сбора данных представления, в котором содержатся все внешние контакты компании ITSO Electronics. Для того чтобы оператор Union заработал, необходимо, чтобы каждая формула отбора возвращала одинаковое число столбцов с одинаковыми именами столбцов. К тому же у соответствующих столбцов каждого набора результатов должны быть соответствующие типы полей.
"SELECT " + "C.CUSTOMERNUMBER as NO, C.CUSTOMERNAME as EXTERNALNAME, "+ "C.CUSTOMERADDRESS as ADDRESS, C.CUSTOMERDESCRIPTION as Description, "+ "C.Form as form "+ "FROM "+ "CUSTOMER.CUSTOMERDAV C " + "WHERE "+ "C.FORM='Customer' "+ "UNION ALL "+ "SELECT "+ "S.SUPPLIERNUMBER as NO, S.SUPPLIERNAME as EXTERNALNAME, "+ "S.SUPPLIERADDRESS as ADDRESS, S.SUPPLIERDESCRIPTION as Description, "+ "S.Form as form "+ "FROM "+ "PRODUCTS.PRODUCTDAV S " + "WHERE "+ "FORM ='Supplier'"Пример 2.6. SQL-выражение для объединения
На рис. 2.12 показан Query View, отображающий данные поставщиков и покупателей компании ITSO Electronics, располагающиеся в различных базах с использованием SQL-кода, приведенного в примере 2.6.
2.3.4 Динамическое создание Query Views с помощью @-формул
Во всех приведенных и использованных до сих пор примерах применялись статические SQL-выражения. Однако во многих случаях лучше создавать SQL-выражения на лету, во время открытия Query View. К счастью, Lotus Domino 7 позволяет составлять текст Query View на языке @-формул.
В примере 2.7 представлено простое SQL-выражение, которое "собирает" все мероприятия по сбыту для покупателя "ITSO" из DB2 Access View SALESDAV. Для этой цели в нем используется условие S.CUSTOMERNAME='ITSO'.
""SELECT "+ "S.CUSTOMERNAME, S.ATYPE,S.ANumber , S.MADESALE "+ "FROM "+ "SALES.SALESDAV S "+ "WHERE S.FORM='Sales Activity' AND S.CUSTOMERNAME='ITSO'"Пример 2.7. Статическое SQL-выражение
Вместо этого статического выражения вы можете динамически выбрать название компании при открытии представления. Для достижения этой цели вам необходимо добавить в код команду @Prompt, чтобы пользователь смог ввести название компании, информацию о которой он ищет. См. пример 2.8.
_CUSTOMER:=@Prompt([OKCANCELEDIT];"Выбор компании"; "Пожалуйста, укажите название компании, которую хотели бы найти.";""); "SELECT "+ "S.CUSTOMERNAME, S.ATYPE,S.ANumber , S.MADESALE "+ "FROM"+ " SALES.SALESDAV S "+ "WHERE S.FORM='Sales Activity' AND S.CUSTOMERNAME='"+_CUSTOMER+"'"Пример 2.8. Динамически составляемое SQL-выражение, использующее язык формул
Теперь каждый раз при запуске этого кода перед пользователем будет появляться запрос на ввод имени покупателя.
Как уже было отмечено в "Использование интеграции с DB2 для улучшения приложения ITSO Electronics" , "Создание Query View", вы не можете быть уверены в том, что название схемы SQL для базы данных останется тем же после того, как она будет скопирована или продублирована на другом сервере. Поэтому рекомендуется избегать статических ссылок на схему базы данных в ваших SQL-выражениях. Способ обхождения этого ограничения состоит в использовании функции @DB2Schema которая была внедрена в Lotus Notes и Domino 7. Описание данной функции см. в "Применение новых элементов разработки в приложении ITSO Electronics" , "Дополнения к языку формул". Чтобы получить SQL DB2Schema для текущей базы данных, необходимо использовать команду @DB2Schema вместе с функцией @DBName. Если поместить эти команды в SQL-выражение из примера 2.7, мы получим код, похожий на тот, что представлен в примере 2.9.
_Schema:= @DB2Schema(@DBname); "SELECT "+ "S.CUSTOMERNAME, S.ATYPE,S.ANumber , S.MADESALE "+ "FROM "+ _Schema +".SALESDAV S "+ "WHERE S.FORM='Sales Activity' AND S.CUSTOMERNAME='ITSO'"Пример 2.9. Динамически вычисляемая схема текущей базы данных
Также может возникнуть необходимость написать SQL-выражение, позволяющее получить доступ к DB2 Access View в другой базе данных. Если предположить, что эта база данных находится в той же папке, что и текущая, то SQL-выражение, основанное на примере 2.7, будет похоже на решение, представленное в примере 2.10.
_pathOnly:=@LeftBack(@Subset(@DbName;-1);"\\");_path:=@If(_pathOnly="";"";_ pathOnly+"\\");_Server:=@Subset(@DbName;1);_Schema:= @DB2Schema(_Server:@ Trim(_path+"Sales.nsf"));"SELECT "+"S.CUSTOMERNAME, S.ATYPE,S.ANumber , S. MADESALE "+"FROM "+_Schema +".SALESDAV S "+ "WHERE S.FORM='Sales Activity' "Пример 2.10. Динамическая ссылка на базу данных, находящуюся в той же папке, что и сервер Lotus Domino
Если при создании SQL-выражения вы не будете уверены в том, по какому пути находится база данных, к которой необходимо получить доступ, можно воспользоваться одной из приведенных ниже команд для получения информации о пути интересующей вас базы данных из конфигурационных документов:
- @DBLookup
- @Environment
- @GetProfileField
2.3.5 Открытие документов из Query Views
В классическом представлении Lotus Notes каждая запись связана с документом напрямую. Таким образом, вы можете открывать, копировать и удалять документы из каждого представления. Однако для Query View, основанном на SQL-операторах, так бывает не всегда. Перед тем как вы сможете открывать, копировать и удалять какие-либо данные из Query View, необходимо выполнить ряд определенных условий. Строка Query View будет соединена с документом, находящимся в базе данных Notes, если вы включите столбец #NOTEID из DB2 Access View в ваш запрос и этот #NOTEID будет являться корректным Note ID в открытой базе данных Notes.
Например, в нашем исходном Query View, приведенном в качестве примера, мы выполнили следующий запрос:
SELECT * FROM SALES.SALESDAV
По сути этот запрос выбирает столбец #NOTEID из DB2 Access View, следовательно, создается связь между строками Query View и связанными с ними документами Notes. Приведенный ниже запрос не выбирает #NOTEID из DB2 Access View, поэтому строки в этом Query View не будут связаны с соответствующими документами и сгенерируется ошибка, если вы попытаетесь ими манипулировать (например, дважды щелкнете левой кнопкой мыши):
> SELECT CUSTOMERNAME FROM SALES.SALESDAV
Если вы выбираете ограниченное число столбцов из DB2 Access View, вам следует отдельно выбрать столбец #NOTEID, например:
> SELECT CUSTOMERNAME, #NOTEID FROM SALES.SALESDAV
Если вы выполняете операцию JOIN с несколькими DB2 Access Views, убедитесь в том, что вы точно выбрали столбец #NOTEID, который является корректным Note ID (идентификатором записи) в текущей базе данных Notes.
Простейшую связь между видом и документом Notes представляет собой #NOTEID. Тем не менее, некоторые функции, такие как копирование или создание ссылки на документ, требуют OID (идентификатор автора документа). Если вашему приложению требуется такого рода функциональность (или же вы хотите, чтобы взаимодействие с Query View было больше похоже на взаимодействие с обычными представлениями), включите опцию экспортирования #OID в DB2 Access View (ее можно включить на дополнительной закладке окна свойств DB2 Access View), а также включите в ваши запросы #OID.
Обратите внимание на то, что при выборе данных из разных DB2 Access View, необходимо конкретно указать, из каких DB2 Access View выбирать соответствующие столбцы, например:
SELECT S.AType, S.Anumber,S.Product1 , C.CUSTOMERNAME, C.OWNERNAME, C.#NOTEID, C.#OID, S.CUSTOMERNUMBER, S.MadeSale FROM SALES.SALESDAV S Left outer JOIN CUSTOMER. CUSTOMERDAV C ON S.CustomerNumber=C.CustomerNumber WHERE C.OWNERNAME<>''
2.3.6 Открытие Query View с помощью Web-браузеров
В начальном релизе Lotus Domino 7.0, к сожалению, функция просмотра Query View через Web-браузеры недоступна. Корпорация IBM планирует внедрить поддержку Web-браузеров в последующих релизах Lotus Domino. Для получения дополнительной информации, касающейся обновлений, которые позволяют обеспечить поддержку Web-браузеров, посетите Web-сайт IBM с документацией по продуктам линейки Lotus: http://www.lotus.com/ldd/doc.
2.3.7 Query View и LotusScript
Несмотря на то, что Query View позволяет открывать документы в представлении, доступ к ним можно получить и с помощью LotusScript (см. "Использование интеграции с DB2 для улучшения приложения ITSO Electronics" , "Открытие документов из Query Views"). В нашем случае подойдет простой скрипт, приведенный в примере 2.11. Если вы не можете открыть документы из Query View, то скрипт вызовет ошибку времени выполнения "Object variable not set".
Sub Click(Source As Button) Dim session As New notessession Dim db As NotesDatabase Dim view As NotesView Dim doc As notesdocument Dim Item As notesitem Set db=session.currentdatabase Set view =db.Getview("<ПРЕДСТАВЛЕНИЕ>") Set doc=view.GetFirstDocument ' <=========================================== Do While Not doc Is Nothing Set Item =doc.GetFirstItem("<ЭЛЕМЕНТ В БАЗЕ ДАННЫХ>") Print(item.text) Set doc=view.GetNextDocument(doc) Loop End SubПример 2.11. Простой LotusScript, организующий циклическое прохождение через представление
Существует еще один способ получить доступ к данным в Query Views, не позволяющих открыть документы с помощью LotusScript. Доступ к таким представлениям необходимо осуществлять через класс View Entry, как показано в примере 2.12.
Sub Click(Source As Button) Dim session As New notessession Dim db As NotesDatabase Dim view As NotesView Dim doc As notesdocument Dim Item As notesitem Dim entry As NotesViewEntry Set db=session.currentdatabase Set view =db.Getview("<Имя Вашего представления>") Set Entry = View.GetEntryByKey( "<Имя элемента представления>", True) Msgbox(entry.ColumnValues(1)) End SubПример 2.12. Простой скрипт, позволяющий получить доступ к элементам представления
2.3.8 Внедрение Query Views в приложение ITSO Electronics
Как и любое другое представление, вы можете внедрить Query Views в форму, подформу, страницу или в документ. В нашем приложении ITSO Electronics в качестве примера мы выполнили внедрение представления Customer Sales Query View в форму Sales Person. Пользователи, обращающиеся к документу Sales Person, теперь могут без труда увидеть информацию из представления Customer Sales, не закрывая документ (см. рис. 2.13). Для получения дополнительной информации о создании внедренных представлений, обратитесь к справке Lotus Domino 7 Designer, доступной по следующему адресу: http://www.lotus.com/ldd/doc/domino_notes/7.0/help7_designer.nsf
увеличить изображение
Рис. 2.13. Query View, внедренный в форму Sales Person приложения ITSO Electronics
2.3.9 Подробный анализ Query Views
В этом разделе приведены дополнительные аспекты, касающиеся Query View.
Разделение списковых элементов
В DB2 Access Views текстовые списки хранятся в виде текстовой строки, и поскольку Query View считывает данные из DB2 напрямую, именно эта текстовая строка и возвращается в Query View. Таким образом, если у вас есть списковый элемент, который вы хотите разделить в вашем Query View, необходимо использовать функцию @Explode в столбце, содержащем несколько значений. Чтобы убедиться в том, что представление способно работать с несколькими строками данных, в окне свойств View выберите закладку Style, после чего установите параметры Row Height и Shrink Rows to Content в соответствии с вашими данными.
Обновление Query Views
Учитывая то, что Query Views можно построить из комбинаций данных Notes и интегрированных данных, обновление Query View зависит от содержания добавленных или измененных данных и от того, как эти данные были добавлены.
Установка максимального числа строк в запросах SQL
По умолчанию максимальное количество строк, возвращаемых по запросу SQL, равно 500. Существует два способа изменения этой величины:
- Параметр DB2QueryViewRowLimit=величина в файле NOTES.INI.
Установите значение величины, равное нулю, если хотите снять ограничение с количества возвращаемых строк.
- В закладке Options окна свойств View выберите параметр Maximum rows returned by a SQL query (Максимальное количество строк, возвращаемое по SQL-запросу) и задайте количество строк (см. рис. 2.14).