• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

можно ли открыть документ скрытно?

  • Автор темы Автор темы deeeman
  • Дата начала Дата начала
D

deeeman

Привет всем!

может как нибудь можно открыть документ, чтобы получить у него uiDoc, но чтобы его не было видно...

PS
и это нужно делать в цикле... =)
 
Идейно вот так


coll=getalldocbykey(key)
set doc = coll.getfirstdoccument
while not doc is nothing
uind = doc.universalid
wend
set doc = coll.getnextdoccument(doc)
 
deeeman
А зачем? См. notesDocument.ComputeWithForm, может это поможет.
 
мне нужно в виде перебирать все документы, откывать их, копировать содержимое в буфер обмена, потом буфер вставлять в word документ - отправлять на печать... и т далее

именно через буфер (потому что так более красиво), через заполнение полей на форме word не устаривает.
 
копировать содержимое документа в UI в буфер без отображения самого дока не получится, ИМХО.
 
deeeman

После открытия документа в UI и копирования его в буфер обмена сразу же закрывате его Call NotesUIDocument.Close(True). Если машины мощные, то даже моргать почти не будет :happy:

Свойства Visible у NotesUIDocument'а к сожалению нет...
 
ну с морганием должно устроить...
накатал код, подскажите в чем ошибка:

вываливается на строке: Call uiDoc.Copy
команда не может быть выполнена...

Код:
Sub Click(Source As Button)
On Error Goto ErrLabel

Dim wObj As Variant
Dim ws As New NotesUIWorkspace
Dim uiDoc As NotesUIDocument
Dim doc As NotesDocument
Dim view As NotesView

Set wObj = CreateObject("Word.Application")
Set view = ws.CurrentView.View
Set doc = view.GetFirstDocument
While Not doc Is Nothing 
With wObj
.Documents.Add
Set uidoc = ws.EditDocument(False, doc)
Call uiDoc.Copy
.Selection.Paste
'.printOut
.ActiveDocument.Close(False)
Call uiDoc.Close
End With
Set doc = view.GetNextDocument(doc)
Wend


EndSub:
Exit Sub
ErrLabel:
Msgbox "Error! Печать документов' " & Err() & " at line " & Erl() & ": " & Error() 
If Not Isempty(wObj) Then wObj.Quit(0)
Resume EndSub
End Sub
 
Видимо, Лотус не знает, что копировать. Нужно сперва как-то выделить копируемый текст.
 
Call uidoc.SelectAll

если ставлю эту строку то на ней сваливается

Добавлено: Причем, если такой же код повесить на кнопку на форме, и при открытом документе, то все работает.
может как то нужно фокусировать что открыт документ
 
deeeman
Может документ просто не успевает открыться? Можно попробовать Sleep, но кмк это не поможет.

Добавлено: можно попробовать вешать копирование в ворд на постопен формы. Необходимость отработки данного фрагмента кода проверять с помощью очередей, темпового поля самого документа, профилей, переменных окружения...
 
попробовал с паузой, все равно....

ошибка на строке Call uiDoc.Copy
Document command is not available

Если ли еще способы в буфер загнать содержимое UiDoc?
 
Добавлено: можно попробовать вешать копирование в ворд на постопен формы. Необходимость отработки данного фрагмента кода проверять с помощью очередей, темпового поля самого документа, профилей, переменных окружения...
+1. Юзать события формы. Тока не надо трогать код формы. Достаточно on event
Код:
Function copyDocContent( i_doc As NotesDocument )
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = ws.EditDocument(False, i_doc , False , , True )
On Event queryclose From uidoc Call myQueryClose ' кармообразующее дейстиве 
Call uidoc.Close
End Function
Sub myQueryClose(source As NotesUIDocument , continue )
Dim ws As New NotesUIWorkspace ' использование source у меня не заработало ( 7.0.3 )
Call ws.CurrentDocument.SelectAll
Call ws.CurrentDocument.Copy
End Sub
 
Если ли еще способы в буфер загнать содержимое UiDoc?
В цикле перед
Код:
 Set uidoc = ws.EditDocument(False, doc)
пишем
Код:
 doc.ReplaceItemValue("$$CopyAll", "1").SaveToDisk = False
В PostOpen формы пишем:
Код:
Sub Postopen(Source As Notesuidocument)
If Source.Document.HasItem("$$CopyAll") Then
Source.SelectAll
Source.Copy
'вставляем в ворд и печатаем
Source.Close
End If
End Sub
Если будет работать, очень удивлюсь :happy:
Добавлено: Пока писал turumbay уже всё решил ;).
 
turumbay, сделал как ты велел ))
та же ошибка:

на строке Call ws.CurrentDocument.SelectAll

код:

Код:
Dim wObj As Variant

'как глобальные
Dim ws As NotesUIWorkspace
Dim uiDoc As NotesUIDocument
Dim doc As NotesDocument
Dim view As NotesView

Sub Click(Source As Button)
On Error Goto ErrLabel

Set ws = New NotesUIWorkspace
Set wObj = CreateObject("Word.Application")


Set view = ws.CurrentView.View
Set doc = view.GetFirstDocument

While Not doc Is Nothing 
With wObj
.Documents.Add

Set uidoc = ws.EditDocument(False, doc , False , , True )
On Event queryclose From uidoc Call myQueryClose
Call uidoc.Close

End With
Set doc = view.GetNextDocument(doc)
Wend


EndSub:
Exit Sub
ErrLabel:
Msgbox "Error! Печать документов3' " & Err() & " at line " & Erl() & ": " & Error() 
If Not Isempty(wObj) Then wObj.Quit(0)
Resume EndSub
End Sub

Sub myQueryClose(source As NotesUIDocument , continue )
On Error Goto ErrLabel

'тут сваливается...
Call ws.CurrentDocument.SelectAll
Call ws.CurrentDocument.Copy

wObj.Selection.Paste
wObj.printOut
wObj.ActiveDocument.Close(False)

EndSub:
Exit Sub
ErrLabel:
Msgbox "Error! myQueryClose' " & Err() & " at line " & Erl() & ": " & Error() 
If Not Isempty(wObj) Then wObj.Quit(0)
Resume EndSub
End Sub
 
turumbay, сделал как ты велел ))
та же ошибка:

на строке Call ws.CurrentDocument.SelectAll
Попробуй мой вариант.
Добавлено: В принципе в постопене можно с вордом ничего не делать, документ мы уже скопировали, пастить в ворд и печать можно и в теле цикла.
 
Попробуй пройтись по полям.
uidoc.GotoField("Нужное поле")
uidoc.selectall
 
Это что, проверка на документ в режиме редактирования?
GotoField
This method is valid only when the document is in Edit mode.
 
turumbay, сделал как ты велел ))
не. я не так велел :-)
я велел ws инстанцировать внутре myQueryClose. и уж точно не велел юзать глобальные переменные, и тем более сувать в мой пушистый кроссплатформенный код какие-то wObj :-)
P.S. возьми код из этого поста link removed
и замени
Код:
Set uidoc = ws.EditDocument(False, doc)
Call uiDoc.Copy
на
Код:
copyDocContent( doc )
P.S. На пальцах: глобальный ws.currentDocument не указывает куда следует... Т.о. нужно принудительно пересоздать ws, чтобы подсосался uidoc.
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab