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

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

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

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

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

deeeman

Привет!

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

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

Решал:
-дополнительными задержками (тупо цикл по всем документам базы с сохранением)
-через таймер, по 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
 
А что если не открывать каждый документ и сделать так:
Код:
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)
 
странно это как-то)
If doc1 Is Nothing Then
...
Call doc1.PutInFolder("Распечатанные")
и т.д.


Добавлено: и это
Set doc = uiDoc.Document Set doc = view.GetFirstDocument

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

Код:
 Call uiview.SelectDocument(doc)
Call uiview.Print(1)

за это спс! но дело наверное не в этом...

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

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


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

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

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

как быть?
 
мб какие-то проблемы именно с кодом, не тот doc в последнем случае получаете (если обработка ошибок есть какая-то или переходы по меткам)? Или, может, при открытии документа теряется аттач?
возможно это связанно с проверками, которые вы не указали, но я думаю, что можно перекидывать в папку (кусок 'отправляем в другую папку) сразу после получения следующего док-та из папки, перед концом цикла Wend? или сразу получать следующий док-т и перекидывать текущий doc...
 
скрепка не будет отображаться на письмах с майм вложениями (индусы не знали об этом :) )
link removed
вот это может помочь
аттачнэм нужен с (0)
 
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
 
Причем, получается такая фишка с документом:

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

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

Код:
Call doc.ComputeWithForm(False,False)
Call doc.Save(True,True)

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

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

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

скрипт упорно не видит у них аттачи, приходиться открывать их в uiDoc и пересохранять(скриптом.все мелькает)... но это идиотизм... ИМХО
 
Хммм, а это часом не inline attachment? Тогда все хуже...
как определить что письмо типа майм?
Посмотрите в свойствах док-та поля Body - там данные в формате MIME (есть строки типа "BOUNDARY=", "content-type"?) или обычный текст?
 
deeeman Может тут что полезное найдётся:
link removed
 
Мыш

поле боди содержит 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

т е нужно просто все документы конвертнуть в рт? а не пофигачиться ли при этом часть инфы?
стили уже пофигачились... без этого никак? можно как то отобрать те документы которые нужно конвертить? чтобы минимизировать потери...
 
ну яж грил - маймы, для индусов, это что-то... ;)
мобуть сделать скрипт, кот. будет дергать из маймов аттачи...?
 
Господа!

помог этот волшебный код: ( link removed)
спс 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


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

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