Войти
 
 
   
 
  
Новости Notes.ру Библиотека Биржа труда Вопрос - ответ Форум Регистрация Поиск О проекте
Разделы
О Notes
Советы
Шаблоны и примеры
Литература
Презентации
 
Всё о задаче AdminP. Часть вторая   Во второй части мы завершаем рассмотрение AdminP. В ней рассмотрены запросы междоменного администрирования и способы управления функциями AdminP с помощью настроек документа сервера, команд консоли сервера, файла Notes.ini и интервалов очистки базы данных. В этой статье предполагается, что вы опытный администратор Domino и прочитали первую часть
О Notes Читать статью
 
Всё о задаче AdminP. Proxy-действия в R5 и Domino 6   Приложение к статье об административном процессе
О Notes Читать статью
 
Всё о задаче AdminP. Часть первая   Перевод классической статьи 2003-его года о задаче административного процесса (AdminP). Очень полезна для понимания работы механизма этой задачи. В первой части статьи описаны компоненты задачи AdminP, как они работают, и как их использование помогает сделать работу администратора Domino проще. Задача AdminP (сакращённо от Administration Process, Административный процесс) работает с базой административных запросов (Administration Requests, admin4.nsf)
О Notes Читать статью
 


Шаблоны и примеры

Главная   Библиотека   Шаблоны и примеры

Экспорт выделенных документов в электронную таблицу

Николай Норкин
Вятские Информационные Технологии, г. Киров
Предыдущее решение (>>>) описывало экспорт всего представления в электронную таблицу. Какие трудности возникают для случая экспорта выделенных документов?
Во-первых, коллекция выделенных документов несортирована (вернее, сортирована по noteId – времени создания документа в данной реплике)
Во-вторых, в коллекцию документов не попадают строки категорий и строка Total
Таким образом, решить задачу в лоб, даже имея опыт экспорта представления, не представляется возможным
Для решения поставленной задачи предлагается использовать работу со SPOFU (shared, private on first use) папкой. Алгоритм обработки будет следующим:

  • Очистить приватную папку от документов
  • Заменить дизайн приватной папки
  • Поместить выделенные документы в папку
  • Выполнить экспорт папки в электронную таблицу, использовав предыдущее решение
  • Очистить приватную папку
Для работы с приватной папкой нужно выполнить ряд предварительных процедур
Для того, чтобы можно было работать с папкой в пользовательском интерфейсе, включите в основной фрейм приложения фрейм для папки высотой (шириной) в 1 пиксел (в примере высота равна 100 пикселей) – фрейм searchFrame, содержащий папку (Пустая)|empty
Фрейм для представления стандартно называется NotesView
SPOFU-папка хранится в базе desktop, для того, чтобы обращаться к ней в коде, необходимо идентифицировать её среди элементов дизайна других баз, использующих данное решение
Создаётся папка (поиск)|search, у которой блокируется наследование дизайна
В базе размещается шедульный агент (работающий раз в час), изменяющий наименование представления (дописывает в $TITLE ещё один алиас - searchreplicaID)
Sub Initialize
On Error Resume Next
Dim session As New NotesSession
Dim curdb As NotesDatabase
Dim agent As NotesAgent
Dim view As NotesView
Dim folder As NotesDocument
Set curdb = session.currentDatabase
Set view = curdb.getView("Views")
If view Is Nothing Then Exit Sub
Set folder = view.getDocumentByKey("(поиск)|search", False)
If folder Is Nothing Then Exit Sub
On Error Goto red
Dim title As String
title = folder.getItemValue("$TITLE")(0)
If title = "(поиск)|search|search" & curdb.replicaId Then Exit Sub
Call folder.removeItem("$Signature")
Dim item As NotesItem
Set item = folder.replaceItemValue("$TITLE", "(поиск)|search|search" & curdb.replicaId)
item.isSigned = True
If Not folder.save(True, True) Then Exit Sub
Exit Sub
red:
Exit Sub
Resume Next
End Sub

И теперь код, реализующий описанный выше алгоритм экспорта
Агент Экспорт выдел. док-тов MS Excel
@SetTargetFrame("searchFrame"); rem "перевод курсора в скрытый фрейм";
@Command([OpenView]; "search"); rem "открытие папки для экспорта";
@Command( [EditSelectAll] ); rem "выделение всех содержащихся в ней документов";
@Command( [RemoveFromFolder] ); rem "очистка папки";
@Command([OpenView]; "empty"); rem "открытие папки Пустая";
@SetTargetFrame("NotesView"); rem "перевод курсора в фрейм представления";
vt := @ViewTitle; rem "получение имени текущего представления";
@Command([OpenView]; vt); rem "курсор помещается в представление – в противном случае он где-то теряется";
@UpdateViewDesign("search"; vt); rem "замена дизайна приватной папки – сейчас в ней будет те же данные и тот же порядок сортировки";
@Command( [FolderDocuments] ; "search" ; "0" ); rem "помещение выделенных документов в папку";
@SetTargetFrame("searchFrame"); rem "снова переход в скрытый фрейм";
@Command([OpenView]; "search"); rem "открытие приватной папки в скрытом фрейме";
@Command([ToolsRunMacro]; "(selectedDocs_createReport)"); rem "исполнение кода продолжается в агентах";
@Command([ToolsRunMacro]; "(selectedDocs_clearSearchFolder)")

Агент (selectedDocs_createReport) вызывает метод createReport() класса DesktopPrivateView
SPOFU-папка размещается в базе desktop (файл desktop.dsk для версии R4, desktop5.dsk для версии R5, desktop6.ndk – для версий R6 и выше)

Public Class DesktopPrivateView
Private session As NotesSession
Private currentDatabase As NotesDatabase
Private desktop As NotesDatabase
Sub New
Set Me.session = New NotesSession
Set Me.currentDatabase = Me.session.currentDatabase
Set Me.desktop = Me.session.getDatabase("", Me.getDesktopDatabaseName(Me.getNotesRelease))
If Me.desktop Is Nothing Then Exit Sub
On Error Resume Next
If Not Me.desktop.isOpen Then Call desktop.open("", getDesktopDatabaseName(getNotesRelease))
End Sub

Private Property Get getNotesRelease As String
' возвращает 5 - R5 и ниже, 6 - R6 и выше (хватает для определения имени desktop.dsk???)
On Error Goto errhandler
Dim result As Variant
result = Evaluate({@Version})
result = Cint(result(0))
If result < 136 Then getNotesRelease = "3" : Exit Property
If result < 166 Then getNotesRelease = "4" : Exit Property
If result < 190 Then getNotesRelease = "5" : Exit Property
If result < 200 Then getNotesRelease = "6" : Exit Property
getNotesRelease = "6"
Exit Property
errhandler:
Exit Property
Resume Next
End Property
Private Function getDesktopDatabaseName(notesRelease As String) As String
Select Case notesRelease
Case "3", "4" : getDesktopDatabaseName = "desktop.dsk"
Case "5" : getDesktopDatabaseName = "desktop5.dsk"
Case "6" : getDesktopDatabaseName = "desktop6.ndk"
End Select
End Function

Public Sub createReport()
' выгрузка выделенных документов в Excel
Dim reportFormat As String
Dim retCode%

On Error Resume Next
If Not report Is Nothing Then Delete report
On Error Goto 0
reportFormat = session.getEnvironmentString("MedicalReportType")
Select Case reportFormat
Case "", "MS Office 2003 (XML)":
retCode% = Execute( |use "createReportOLEforDesktopSpofu"
call createReport("OLE", "MS Excel", report)|)
Case "MS Office XP (RTF, OLE)":
retCode% = Execute( |use "createReportOLEforDesktopSpofu"
call createReport("OLE", "MS Excel", report)|)
Case "OpenOffice (XML)":
retCode% = Execute( |use "createReportOLEforDesktopSpofu"
call createReport("OLE", "OpenOffice Calc", report)|)
End Select
End Sub
End Class

Функция обращения к spofu-папке
Private Function searchFolder(currentDatabase As NotesDatabase, desktop As NotesDatabase) As NotesView
' поиск папки в базе Desktop
Dim view As NotesView
Dim views As Variant
an$ = "search" & currentDatabase.ReplicaID
views = desktop.Views
If Isempty(views) Then Exit Function
Forall v In views
If Not Isempty(v.Aliases) Then
Forall a In v.Aliases
If a = an$ Then
Set view = v
Exit Forall
End If
End Forall
End If
If Not view Is Nothing Then Exit Forall
End Forall
Set searchFolder = view
End Function

Агент (selectedDocs_clearSearchFolder)
@Command( [EditSelectAll] );
@Command( [RemoveFromFolder] ); rem "очистка папки";
@SetTargetFrame("searchFrame");
@Command([OpenView]; "empty"); rem "открытие папки Пустая";
@SetTargetFrame("NotesView"); rem "перевод курсора в фрейм представления";
vt := @ViewTitle;
@Command([OpenView]; vt); rem "курсор помещается в представление – в противном случае он где-то теряется";

База примера скачать >>>

Автор выражает признательность Юле Шибановой за разработку кода на основе его идей

Предыдущий материал:
Экспорт представления в электронную таблицу >>>
 
  Опубликовано — 05/29/2009 |    



Добавить комментарий
Имя * :
e-mail
Комментарий * :
Код подтверждения * :

Мероприятия
Пресс-релизы
Биржа труда
Последнее на форуме
 
А так же:
Как удалить профиль?
16.04.2016 00:08:51
Скопировать в буфер поле документа
24.05.2015 08:55:52
Импорт DXL-описания документов в Lotus Domino. Одноимённые поля
16.04.2015 16:49:58
 
© LOGOSPHERE.RU