Выгрузить представление в word

  • Автор темы Автор темы Ruska132
  • Дата начала Дата начала
Мне показалось там все за мудрено и слишком умно.
т.е. прям из сложно, издеваетесь?
тупо вставить это код в java агент, а link removed скачать и распаковать в <NOTESPROGRAM>/jvm/lib/ext
 
проблема в том как организовать отбор в представление документов удовлетворяющий условию, и потом вывести их поочередно.
Не умеете найти документы в базе? Это можно сделать либо по специально для этого построенной вьюхе по ключу, совпадающему с критерием поиска, либо функцией Search. Вы пробовали что-нибудь из этого? Что-то не получилось? Какие-то ошибки? Вы пишите подробнее что не получается, что уже пробовали, в чём проблема - не экономьте буквы. Расскажите конкретнее о задаче, которую вы пытаетесь решить. Вы так и не ответили на мой вопрос "что вы собираетесь потом делать с этим вордовым документом, вам его печатать или "посмотреть", а от этого сильно зависят варианты решения вашей проблемы.
 
День добрый
Вывести надо в ворд для печати.
документы нахожу в базе по форме и по статусу, но вот найти по переменным даты что то не получается. что тут не так. может не доглядываю.


Set CollectZayv = Session.CurrentDatabase.Search("select form='FMain'& Status = '2' & Fdatabegin>=('"+wsCurrent.CurrentDocument.FieldGetText("DataStart")+"') & Fdatabegin<=('"+wsCurrent.CurrentDocument.FieldGetText("DataEnd")+")",Nothing,0)

Fdatabegin - переменная в документе.
 
@Ruska132,
  1. Для вывода на печать Word не нужен вообще. Лучше сформировать PDF файл - смотрите iText, Apache FOP, xdocreport, Jasper Report и пр. Проще сформировать HTML файл, но придётся вручную настроить параметры печати в броузере (колонтитулы, хедеры, футеры, размеры полей). Можно в Lotus Notes сделать специальную форму исключительно для печати.
  2. В поиске даты обычно берутся в квадратные скобки, а ещё лучше явно привести значение к типу "дата" при помощи функции @Date, что бы не было проблем с различиями текстового формата даты.
 
@Ruska132,
  1. Для вывода на печать Word не нужен вообще. Лучше сформировать PDF файл - смотрите iText, Apache FOP, xdocreport, Jasper Report и пр. Проще сформировать HTML файл, но придётся вручную настроить параметры печати в броузере (колонтитулы, хедеры, футеры, размеры полей). Можно в Lotus Notes сделать специальную форму исключительно для печати.
  2. В поиске даты обычно берутся в квадратные скобки, а ещё лучше явно привести значение к типу "дата" при помощи функции @Date, что бы не было проблем с различиями текстового формата даты.

а какие могут быть проблемы если поиск я осуществляю вот так:
Set CollectZayv = Session.CurrentDatabase.Search("select form='FMain'& Status = '2' & Fdatabegin>=@TextToTime('"+wsCurrent.CurrentDocument.FieldGetText("DataStart")+"') & Fdatabegin<=@TextToTime('"+wsCurrent.CurrentDocument.FieldGetText("DataEnd")+"')",Nothing,0)
 
@Ruska132, потрудитесь наглядно записывать формулы вместе с LS, строки LS берите в {}, в формулах оставляйте "
 
@TextToTime('"+wsCurrent.CurrentDocument.FieldGetText("DataEnd")+"')
Вы берёте текстовое значение поля "DataEnd" и преобразуете его в тип "Дата" с помощью функции @TextToTime, которая воспринимает дату в виде строки в зависимости от настроек операционной системы. Вы уверены что 01.12.2016 - это всегда 1-е декабря 2016 года, а не 12-е января?

И, к стати, в вашем первоначальном варианте нет @TextToTime. Что вы там ещё не договариваете? Давайте выкладывайте...
 
Собственно и скрывать та нечего
вся процедура кнопки ниже


Код:
Sub Click(Source As Button)
'Текущая сессия Lotus
Dim Session As New  NotesSession
'Текущий рабочее простпранство Lotus -то в котором мы визуально работаем 
Dim wsCurrent As New NotesUIWorkspace
Dim WS As New NotesUIWorkspace
Dim VwSotr, VwMarsh, VwZayv As NotesView
Dim CollectZayv, CollectMarsh, CollectSotr As NotesDocumentCollection
 
'Представление заявка
Set VwZayv = Session.CurrentDatabase.GetView("(VZayv)")
'Представление по сотрудникам
Set VwSotr = Session.CurrentDatabase.GetView("(Vsotrudnik)")
'Представление Masrh
Set VwMarsh = Session.CurrentDatabase.GetView("(VMarsh)")
 
'Переменные для Word
Dim WrdApp, WrdDoc As Variant
'Это документы с заявки
Dim docZayvTmp As NotesDocument
  'Это документы с сотрудниками
Dim docSotrTmp As NotesDocument
'Это документы с маршрутами
Dim docMarshTemp As NotesDocument
'переменные для цикла
Dim i,j,g As Integer
 
 
'***********************************************************************************
'Это готовый рабочий кусок кода для использования шаблона отчета,
'который запихивается в БД Шаблоны
Dim Db_Tmpl As NotesDatabase
Dim Vw_Tmpl As NotesView
Dim Dc_Tmpl As NotesDocument
Dim NmRpt As String
Dim NumPos As Integer
 
Set Db_Tmpl = New NotesDatabase(Session.CurrentDatabase.Server, "TemplatesAktZF.nsf")
 
'БД Шаблоны отчетов
If Not  Db_Tmpl.IsOpen Then
Msgbox( "Ошибка при открытии БД Шаблоны отчетов")
Exit Sub
End If
Set Vw_Tmpl = Db_Tmpl.GetView("ViewMainTmpl")
' В БД Шаблоны отчет созранен под кодом 27
Set Dc_Tmpl = Vw_Tmpl.GetDocumentByKey(27)
Print ""
If  Dc_Tmpl Is Nothing Then
Msgbox( "Не найден шаблон отчета с кодом №27")
Exit Sub
End If
'Сохраняем локально шаблон у пользователя C:\Documents and Settings\Администратор\Local Settings\Temp
Print "Сохранение шаблона отчета..."
 
Set RTI = Dc_Tmpl.GetFirstItem( "Body" ) 
If (RTI.Type = RICHTEXT) Then
Forall Obj In RTI.EmbeddedObjects
If ( Obj.Type = EMBED_ATTACHMENT )  Then
NmRpt = Environ("Temp") & "\RepBron" & Format(Now, "ddmmyyyyhhmmss") &".tmp"
 
Print "Формирование временного файла: " & NmRpt
Call Obj.ExtractFile(NmRpt)
End If
End Forall	 
End If
Print "Формирование отчета..."
'***********************************************************************************
 
'Создаем документ Word
Set WrdApp = CreateObject("Word.Application")
'Для примера делаю его сразу видимым. В рабочей версии здесь лучше сделать False
WrdApp.Visible = True 'false
'Присваиваю сохраненный шаблон нашему ворду
Call WrdApp.Documents.Add(NmRpt)
Set WrdDoc = WrdApp.ActiveDocument
 
 
 
'Поиск документов по условию
Print "Поиск документов..."
 
Set CollectZayv = Session.CurrentDatabase.Search("select form='FMain'& Status = '2' & Fdatabegin>=@TextToTime('"+wsCurrent.CurrentDocument.FieldGetText("DataStart")+"') & Fdatabegin<=@TextToTime('"+wsCurrent.CurrentDocument.FieldGetText("DataEnd")+"')",Nothing,0) 
 
Print "Найдено заявок: ", CollectZayv.Count
Set docZayvTmp = CollectZayv.GetFirstDocument()
For i=1 To CollectZayv.Count
 
WrdDoc.Tables.Item(1).Cell(WrdDoc.Tables.Item(1).Rows.Count, 1).Range.Text=docZayvTmp.RegNum(0)
WrdDoc.Tables.Item(1).Cell(WrdDoc.Tables.Item(1).Rows.Count, 2).Range.Text=docZayvTmp.Fdatabegin(0)
 
Set CollectSotr =VwSotr.GetAllDocumentsByKey(docZayvTmp.UniversalID, False)
Print "Найдено сотрудников: ", CollectSotr.Count
 
'сотрудник
Set docSotrTmp = CollectSotr.GetFirstDocument()
 
For j=1 To CollectSotr.Count
Print "   ", + docSotrTmp.P_fio(0)
WrdDoc.Tables.Item(1).Cell(WrdDoc.Tables.Item(1).Rows.Count, 3).Range.Text=docSotrTmp.P_fio(0)
 
'маршрут
Set CollectMarsh =VwMarsh.GetAllDocumentsByKey(docSotrTmp.UniversalID, False)
' Print "Найдено сотрудников: ", CollectMarsh.Count
 
Set docMarshTemp = CollectMarsh.GetFirstDocument()
' WrdDoc.Tables.Item(1).Rows.Add
For g=1 To CollectMarsh.Count
' Print "   ", + docMarshTemp.F_Marsh_ub(0)
WrdDoc.Tables.Item(1).Cell(WrdDoc.Tables.Item(1).Rows.Count, 4).Range.Text=docMarshTemp.F_Marsh_ub(0) + " -  " + docMarshTemp.F_Marsh_pr(0)
WrdDoc.Tables.Item(1).Cell(WrdDoc.Tables.Item(1).Rows.Count, 5).Range.Text=docMarshTemp.F_DateMarsh(0)
WrdDoc.Tables.Item(1).Cell(WrdDoc.Tables.Item(1).Rows.Count, 6).Range.Text=docMarshTemp.F_Comp(0)
WrdDoc.Tables.Item(1).Cell(WrdDoc.Tables.Item(1).Rows.Count, 7).Range.Text=docMarshTemp.F_Klass(0)
WrdDoc.Tables.Item(1).Cell(WrdDoc.Tables.Item(1).Rows.Count, 8).Range.Text=docMarshTemp.F_Cen_Bil(0)
If docMarshTemp.F_nazad(0) = "1" Then
WrdDoc.Tables.Item(1).Rows.Add
WrdDoc.Tables.Item(1).Cell(WrdDoc.Tables.Item(1).Rows.Count, 4).Range.Text=docMarshTemp.F_Marsh_ub_ob(0) + " -  " + docMarshTemp. F_Marsh_pr_ob(0)
WrdDoc.Tables.Item(1).Cell(WrdDoc.Tables.Item(1).Rows.Count, 5).Range.Text=docMarshTemp.F_DateMarsh_ob(0)
WrdDoc.Tables.Item(1).Cell(WrdDoc.Tables.Item(1).Rows.Count, 6).Range.Text=docMarshTemp.F_Comp(0)
' WrdDoc.Tables.Item(1).Cell(WrdDoc.Tables.Item(1).Rows.Count, 7).Range.Text=docMarshTemp.F_Klass(0)
' WrdDoc.Tables.Item(1).Cell(WrdDoc.Tables.Item(1).Rows.Count, 8).Range.Text=docMarshTemp.F_Cen_Bil(0)
End If
Set docMarshTemp = CollectMarsh.GetNextDocument (docMarshTemp)
WrdDoc.Tables.Item(1).Rows.Add
Next
 
Set docSotrTmp = CollectSotr.GetNextDocument (docSotrTmp)
Next
Set docZayvTmp = CollectZayv.GetNextDocument (docZayvTmp)
' WrdDoc.Tables.Item(1).Rows.Add
Next
 
End Sub
 
мое занудство...
вот так писать код - это себе дороже, чтобы что-то исправить - тонну текста придется перелопатить
простой пример
Set Dc_Tmpl = Vw_Tmpl.GetDocumentByKey(27)
Print ""
If Dc_Tmpl Is Nothing Then
Msgbox( "Не найден шаблон отчета с кодом №27")
Код:
Const REPCODE27=27
Const CM_ERR_FINDREPCODE={Не найден шаблон отчета с кодом №}
...
Set Dc_Tmpl = Vw_Tmpl.GetDocumentByKey(REPCODE27)
Print ""
If  Dc_Tmpl Is Nothing Then
Msgbox(  CM_ERR_FINDREPCODE &Cstr(REPCODE27))
и да - если есть выход из ф-ции по условию, возможно лучшим будет выход по ошибке
Код:
Error 1024, CM_ERR_FINDREPCODE &Cstr(REPCODE27)
и обработчик ошибки всегда нужен!
В константы необходимо выносить все строки (заискл. отладочных)
 
еще момент - писать таким образом получение вьюшек - потенциально проблемно (лучше вовсе оформлять классом, с сохранением БД)
ИБО они привязаны к БД, ёе инстанс м.б. разрушен (вызов к-л ф-ции) как результат - долго искать ошибку
 
мое занудство...
вот так писать код - это себе дороже, чтобы что-то исправить - тонну текста придется перелопатить
простой пример

Код:
Const REPCODE27=27
Const CM_ERR_FINDREPCODE={Не найден шаблон отчета с кодом №}
...
Set Dc_Tmpl = Vw_Tmpl.GetDocumentByKey(REPCODE27)
Print ""
If  Dc_Tmpl Is Nothing Then
Msgbox(  CM_ERR_FINDREPCODE &Cstr(REPCODE27))
и да - если есть выход из ф-ции по условию, возможно лучшим будет выход по ошибке
Код:
Error 1024, CM_ERR_FINDREPCODE &Cstr(REPCODE27)
и обработчик ошибки всегда нужен!
В константы необходимо выносить все строки (заискл. отладочных)


честно обработчик ошибок не использовал не разу.
не подскажите куда лучше вписать строчки.
 
честно обработчик ошибок не использовал не разу.
не подскажите куда лучше вписать строчки.
как привык я (есть др. способы)
в начале ф-ции
On Error Goto ErrH
в конце
Quit:
Exit Function
ErrH:
Error Err, ... здесь формирование строки и текста ошибки
можно подавлять ошибку, тогда вместо Error ... - Resume Quit
[DOUBLEPOST=1458296958,1458296828][/DOUBLEPOST]пример формирования строки https://codeby.net/threads/41201/#post-201459
 
т.е. можно вызывать Error Err, RaiseError
 
Собственно и скрывать та нечего
вся процедура кнопки ниже
Ну, отлично. Что из этого не работает? Документы в поиске находятся те, которые надо? Таблица в Word'е формируется?

И хочу ещё раз заметить, тут уже указывали выше, но вы не обратили внимание - если внутри строки необходимо использовать кавычки, то саму строку можно взять в фигурные скобки, чтобы не городить огород с двойными кавычками внутри строки. Ваша строка в search должна выглядеть так:
Код:
{select form = "FMain" &  Status = "2" &  Fdatabegin >= @TextToTime("} + wsCurrent.CurrentDocument.FieldGetText("DataStart") + {")  &  Fdatabegin <= @TextToTime("} + wsCurrent.CurrentDocument.FieldGetText("DataEnd") + {")}
 
А ещё лучше построить вьюху с формулой
Код:
select form = "FMain" & Status = "2"
со столбцами DataStart и DataEnd. И искать так:
Код:
Dim key(1) as Variant
key(0) = doc.getItemValue("DateStart")(0)
key(1) = doc.getItemValue("DateEnd")(0)
Dim dc as NotesDocumentCollection
Set dc = view.GetAllDocumentsByKey(key, true)
Будет сильно быстрее

P.S. А в вашей строке search "select" лишнее кмк.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!