печать документов из вида

deeeman

Well-known member
04.12.2007
383
0
#1
Привет!

Есть вид в почтовой бд "Входящие". В клиенте по кнопке из этого вида делается обработка коллекции имеющихся в этой папке документов и выводиться на печать документы и аттачи (если есть). одним разом нужно обработать все документы.

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

Решал:
-дополнительными задержками (тупо цикл по всем документам базы с сохранением)
-через таймер, по 5 документов посылаю через 5 секунд

не решает проблему, она возникает непонятно от куда, закономерности нет, выводит на печать левое.

код такой:

Код:
flagP = False
Set doc = uiDoc.Document
Set doc = view.GetFirstDocument
While Not doc Is Nothing

'отправляем в другую папку
Set doc1 = db.getDocumentbyUNID(id)
If doc1 Is Nothing Then
If flagP Then
Call doc1.PutInFolder("Распечатанные")
Else
Call doc1.PutInFolder("Не распечатанные")
End If
Call doc1.RemoveFromFolder("($Inbox)")
End If

flagP = False

if (выполнены условия) then

'ставим флаг что печатаем
flagP = True

Set uidoc = ws.EditDocument(True,doc,True)

Call StopF()

Call uiDoc.Print(1)

Call StopF()

uidoc.Close True		


Call StopF()

'печатаем вложения .doc  если есть

'если не выполнены условия
Else
'что то делаем
End If		

'запоминаем документ
id = doc.UniversalID

Set doc = view.GetNextDocument(doc)
Wend
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#2
А что если не открывать каждый документ и сделать так:
Код:
Dim ws As New NotesUIWorkspace
Dim uiview As NotesUIView
Dim doc As NotesDocument

Set uiview = ws.CurrentView
Set doc = uiview.View.GetFirstDocument()
Do Until (doc Is Nothing)
Call uiview.SelectDocument(doc)
Call uiview.Print(1)

Set doc = uiview.View.GetNextDocument(doc)
Loop
Можно было бы выделить все документы и обойтись без Call uiview.SelectDocument(doc)
 

hosm

* so what *
18.05.2009
2 442
6
#3
странно это как-то)
If doc1 Is Nothing Then
...
Call doc1.PutInFolder("Распечатанные")
и т.д.

Добавлено: и это
Set doc = uiDoc.Document Set doc = view.GetFirstDocument
'запоминаем документ
id = doc.UniversalID
Set doc = view.GetNextDocument(doc)
получается, последний документ коллекции не попадает в нужную папку???
 

deeeman

Well-known member
04.12.2007
383
0
#4
Medevic

Код:
 Call uiview.SelectDocument(doc)
Call uiview.Print(1)
за это спс! но дело наверное не в этом...

OKEN
>получается, последний документ коллекции не попадает в нужную папку???

спасибо! Но фиг с ним с последним.. дело в другом...


Такая мура твориться в базе:
я тут нашел документ в котором есть аттач но в папке "Входящие" он не отображен как документ с аттачем(не показыватеся значек скрепка.)
у него есть поле $File

далее проверяю его скриптом,

-Если этот документ в виде один, то скрипт видит аттач (методы: Evaluate({@AttachmentNames},doc) и doc.HasEmbedded работают )
-Если в виде несколько документов и этот документ первый то все ок
-Если в виде несколько документов и этот документ НЕ первый то все печально! методы показывают что нет там ничего аттачного...

как быть?
 

hosm

* so what *
18.05.2009
2 442
6
#5
мб какие-то проблемы именно с кодом, не тот doc в последнем случае получаете (если обработка ошибок есть какая-то или переходы по меткам)? Или, может, при открытии документа теряется аттач?
возможно это связанно с проверками, которые вы не указали, но я думаю, что можно перекидывать в папку (кусок 'отправляем в другую папку) сразу после получения следующего док-та из папки, перед концом цикла Wend? или сразу получать следующий док-т и перекидывать текущий doc...
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
271
#6
скрепка не будет отображаться на письмах с майм вложениями (индусы не знали об этом :) )
http://codeby.net/ipb.html?s=&sh...st&p=175812
вот это может помочь
аттачнэм нужен с (0)
 

deeeman

Well-known member
04.12.2007
383
0
#7
lmike

странно но это не помогло... все методы перечисленные ниже показывают пусто, хотя аттач явно есть в документе. и поле $File не пусто и еще название аттача прописывается в самом конце поля Body

doc.HasEmbedded
res = Evaluate({@AttachmentNames(0)},doc)
doc.GetItemValue("$File")(0)

Даже когда документ 1 в папке

код:

Код:
Set doc = view.GetFirstDocument
While Not doc Is Nothing

res = Evaluate({@AttachmentNames(0)},doc)

Msgbox "doc.HasEmbedded=" & doc.HasEmbedded

Msgbox "$File=" & doc.GetItemValue("$File")(0)

Msgbox "Join(res)=" & Join(res)

'Нет аттачей
If Join(res) = "" Then
Msgbox "Нет аттачей"
End If		

Set doc = view.GetNextDocument(doc)

Wend
 

deeeman

Well-known member
04.12.2007
383
0
#8
Причем, получается такая фишка с документом:

если смотреть свойства полей из вида, то поля $File нет, если документ открыть то поле появляется. (и если документ пересохранить вручную то аттач будет нормальный)
т е по видимому документ приходит из вне в каком то непонятном для лотуса виде, и аттач не виден.

как можно это победить? пробовал сделать:

Код:
Call doc.ComputeWithForm(False,False)
Call doc.Save(True,True)
но документ не хотит пересохраняться скриптом.
как можно превратить его в нормальный вид?
 

deeeman

Well-known member
04.12.2007
383
0
#9
товарисчи!

как определить что письмо типа майм?
есть какое то отличие от обычного письма??

еще когда его открываю появляется сообщение в логе:
Begin MIME to CD Conversion (Process: ? (00000E04:00000002), Database: ***.nsf, Note: 00017D62)

скрипт упорно не видит у них аттачи, приходиться открывать их в uiDoc и пересохранять(скриптом.все мелькает)... но это идиотизм... ИМХО
 

Мыш

Премиум
12.02.2008
1 097
10
#10
Хммм, а это часом не inline attachment? Тогда все хуже...
как определить что письмо типа майм?
Посмотрите в свойствах док-та поля Body - там данные в формате MIME (есть строки типа "BOUNDARY=", "content-type"?) или обычный текст?
 

deeeman

Well-known member
04.12.2007
383
0
#12
Мыш

поле боди содержит 4 куска текста см ниже:

Field Name: Body
Data Type: MIME Part
Data Length: 148 bytes
Seq Num: 1
Dup Item ID: 4
Field Flags: SIGN SEAL

"Content-Type: multipart/mixed;
boundary="------------050605060400090104000808"

This is a multi-part message in MIME format."


но скриптом то это не видно... а надо бы увидеть хотя бы. как мне определить скриптом, что именно этот документ содержит майм и его надо конвертнуть?


nvy

т е нужно просто все документы конвертнуть в рт? а не пофигачиться ли при этом часть инфы?
стили уже пофигачились... без этого никак? можно как то отобрать те документы которые нужно конвертить? чтобы минимизировать потери...
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
271
#14
ну яж грил - маймы, для индусов, это что-то... ;)
мобуть сделать скрипт, кот. будет дергать из маймов аттачи...?
 

deeeman

Well-known member
04.12.2007
383
0
#15
Господа!

помог этот волшебный код: (ссыль)
спс nvy и автор кода: ToxaRat


Код:
Function ConvertRTDoc(Doc As NotesDocument) As String ' Конверт Mime в РТ
'	ses.ConvertMIME = False
Dim mime As NotesMIMEEntity, v1 As Variant
Set mime = doc.GetMIMEEntity
v1 = ""
If Not(mime Is Nothing) Then
Call mime.DecodeContent
v1 = mime.ContentAsText
End If
If Len(v1)>64000 Then v1 = Left(v1, 64000)
Let Doc.ReplaceItemValue("Body2", v1).Issummary = False
ConvertRTDoc = v1
'	ses.ConvertMIME = True
End Function

им можно конвертить все подряд, хоть и есть потери стиля и значков аттачей, переживут, но зато документ превращается хоть во что то родное =))