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

Тема в разделе "Lotus - Программирование", создана пользователем deeeman, 30 апр 2010.

  1. deeeman

    deeeman Well-Known Member

    Регистрация:
    4 дек 2007
    Сообщения:
    382
    Симпатии:
    0
    Привет всем!

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

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

    allex Гость

    Идейно вот так


    coll=getalldocbykey(key)
    set doc = coll.getfirstdoccument
    while not doc is nothing
    uind = doc.universalid
    wend
    set doc = coll.getnextdoccument(doc)
     
  3. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    deeeman
    А зачем? См. notesDocument.ComputeWithForm, может это поможет.
     
  4. deeeman

    deeeman Well-Known Member

    Регистрация:
    4 дек 2007
    Сообщения:
    382
    Симпатии:
    0
    мне нужно в виде перебирать все документы, откывать их, копировать содержимое в буфер обмена, потом буфер вставлять в word документ - отправлять на печать... и т далее

    именно через буфер (потому что так более красиво), через заполнение полей на форме word не устаривает.
     
  5. Darker

    Darker Гость

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

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    deeeman

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

    Свойства Visible у NotesUIDocument'а к сожалению нет...
     
  7. deeeman

    deeeman Well-Known Member

    Регистрация:
    4 дек 2007
    Сообщения:
    382
    Симпатии:
    0
    ну с морганием должно устроить...
    накатал код, подскажите в чем ошибка:

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

    Код (LotusScript):
    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
     
  8. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Видимо, Лотус не знает, что копировать. Нужно сперва как-то выделить копируемый текст.
     
  9. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    Call UIDoc.SelectAll ?
     
  10. deeeman

    deeeman Well-Known Member

    Регистрация:
    4 дек 2007
    Сообщения:
    382
    Симпатии:
    0
    Call uidoc.SelectAll

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

    Добавлено: Причем, если такой же код повесить на кнопку на форме, и при открытом документе, то все работает.
    может как то нужно фокусировать что открыт документ
     
  11. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    deeeman
    Может документ просто не успевает открыться? Можно попробовать Sleep, но кмк это не поможет.

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

    deeeman Well-Known Member

    Регистрация:
    4 дек 2007
    Сообщения:
    382
    Симпатии:
    0
    попробовал с паузой, все равно....

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

    Если ли еще способы в буфер загнать содержимое UiDoc?
     
  13. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    +1. Юзать события формы. Тока не надо трогать код формы. Достаточно on event
    Код (Text):
    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
     
  14. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    В цикле перед
    Код (LotusScript):
     Set uidoc = ws.EditDocument(False, doc)
    пишем
    Код (LotusScript):
     doc.ReplaceItemValue("$$CopyAll", "1").SaveToDisk = False
    В PostOpen формы пишем:
    Код (LotusScript):
    Sub Postopen(Source As Notesuidocument)
    If Source.Document.HasItem("$$CopyAll") Then
    Source.SelectAll
    Source.Copy
    'вставляем в ворд и печатаем
    Source.Close
    End If
    End Sub
    Если будет работать, очень удивлюсь :happy:
    Добавлено: Пока писал turumbay уже всё решил ;).
     
  15. Klido

    Klido Гость

  16. deeeman

    deeeman Well-Known Member

    Регистрация:
    4 дек 2007
    Сообщения:
    382
    Симпатии:
    0
    turumbay, сделал как ты велел ))
    та же ошибка:

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

    код:

    Код (LotusScript):
    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
     
  17. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Попробуй мой вариант.
    Добавлено: В принципе в постопене можно с вордом ничего не делать, документ мы уже скопировали, пастить в ворд и печать можно и в теле цикла.
     
  18. Darker

    Darker Гость

    Попробуй пройтись по полям.
    uidoc.GotoField("Нужное поле")
    uidoc.selectall
     
  19. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    Это что, проверка на документ в режиме редактирования?
    GotoField
    This method is valid only when the document is in Edit mode.
     
  20. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    не. я не так велел :)
    я велел ws инстанцировать внутре myQueryClose. и уж точно не велел юзать глобальные переменные, и тем более сувать в мой пушистый кроссплатформенный код какие-то wObj :)
    P.S. возьми код из этого поста http://codeby.net/ipb.html?s=&sh...st&p=168705
    и замени
    Код (Text):
    Set uidoc = ws.EditDocument(False, doc)
    Call uiDoc.Copy
    на
    Код (Text):
    copyDocContent( doc )
    P.S. На пальцах: глобальный ws.currentDocument не указывает куда следует... Т.о. нужно принудительно пересоздать ws, чтобы подсосался uidoc.
     
Загрузка...

Поделиться этой страницей