Embeddedobjects

  • Автор темы LIGHT
  • Дата начала
L

LIGHT

#1
Господа, столкнулся с непонятной фигней.

Есть форма в ней два ричтекстовых поля для аттачментов.

В определенный момент нужно сделать проверку на расширение файла в одном из поле.
Повесил такую функцию:

Set rtitem = doc.GetFirstItem( "F1" )
If Not (Isempty(rtitem.EmbeddedObjects)) Then
If ( rtitem.Type = RICHTEXT ) Then
Forall o In rtitem.EmbeddedObjects
If Ucase(Right (o.Name,3)) = "PDF" Or Ucase(Right (o.Name,3)) = "TIF" Then
ObjFound = True
'Print o.Name & " - " & o.Type
Else
ObjFound = False
'Print o.Name & " - " & o.Type
'1454
Exit Forall
End If
End Forall
End If
End If


If ObjFound = False Then
textSub = textSub & {Прикрепите электронный образ строго в PDF или TIF формате }
End If
Все бы хорошо, проверочка работает как нужно!

Но, если происходит копирование вложения из поля F2 или еще какого либо в проверяемое поле ObjFound всегда = False
 

Omh

Lotus team
04.07.2007
2 210
1
#2
Может после копирования какой-нибудь uidoc.Refresh(True) сделать?
Или RTItem.Update?

Можно было бы отписать, как копируешь, кстати.
 
L

LIGHT

#3
Копируют люди правой кнопкой - копировать/вставить. Следовательно получается два файла с одинаковыми именами, очевидно по этому и возникает ошибка. Если посмотреть свойства документа то поля $File имею различные
File Name:

File Name: Выписка из ЕГРЮЛ.tif
File Name: ATTXNSJ01 или нечто подобное

Очевидно, что лотус так разруливает конфликты имен вложений. Вложения имеют одинаковые имена.
 

Omh

Lotus team
04.07.2007
2 210
1
#4
Проверил, похоже на то.
Но если надо будет сделать это под страхом смертной казни, но имя таки можно вытащить, экспортнув док в DXL и проверив теги типа
Код:
<attachmentref name='ATT4FPUZ' displayname='номальное_имя.jpg'>
 

Omh

Lotus team
04.07.2007
2 210
1
#6
Ну где-то на QuerySave делаешь
Код:
uidoc.Refresh(True)
, что бы перенести RT изменения в background документ.
Потом экспортишь примерно так:
Код:
Dim DXLExp As NotesDXLExporter
Set DXLExp = sess.CreateDXLExporter
Call DXLExp.SetInput(doc)
Dim DXL As String
DXL = DXLExp.Export()
В данный момент в переменной DXL у тебя XML описывающий документ.
Парсишь как строку, либо, если есть желание/умение, парсишь через NotesDOMParser.
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#7
думаю, что в данном случае лучше NotesSAXParser, т.к. не надо ходить искать нужные элементы, они сами найдутся :)
 

Omh

Lotus team
04.07.2007
2 210
1
#8
Чёт я туплю, а NotesEmbeddedObject.Source это не то, что тебе надо?
Эта пропертя разве не имя файла возвращает (даже в нашем случае)?
Правда, я не уверен.
-------------------------------
Посмотрел хелп:
NotesEmbeddedObject.Name
For file attachments, this property returns the name of the file unless the attachment is a duplicate. If the attachment is a duplicate, this property returns an internal name. (The Source property returns the file name in all cases.)
-------------------------------
Вообщем, надо использовать EO.Source, а не EO.Name
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#9
Omh, скажу честно! из твоего поста не ясно возвращает ли NotesEmbeddedObject.Source действительное имя файла, или же внутренее имя, при ситуации по теме...
 

Omh

Lotus team
04.07.2007
2 210
1
#10
Подмандил пост :)
Надеюсь, стало понятнее.

Я там погорячился, что не указал, что этот кусок из хелпа к NotesEmbeddedObject.Name, который как раз использует LIGHT.
Поэтому у него и вылазят всякие "AF322GY"
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#11
теперь понятнее, спасибо :) возьми с полки пирожок ;)

зы: надо как-то взяться и написать класс для работы с вложениями через DXL :)
 
L

LIGHT

#12
Спасибо за мысли, но

....
....

Dim object As NotesEmbeddedObject
Dim objectName As String
Dim rt As Variant

Set rt = doc.GetFirstItem( "F1" )
If ( rt.Type = RICHTEXT ) Then
Set object = rt.GetEmbeddedObject( "F1" )
Print object.Name
End If
Вылетает ошибка на Print object.Name - Variable not set :)


Поборол!!! Всем спасибо.

ObjFound = False
Set rtitem = doc.GetFirstItem( "F1" )
If Not (Isempty(rtitem.EmbeddedObjects)) Then
If ( rtitem.Type = RICHTEXT ) Then
Forall o In rtitem.EmbeddedObjects
Set object = rtitem.GetEmbeddedObject( o.Name )
Print "NAME: " & o.Name & " | SOURCE: " & object.Source
If Ucase(Right (object.Source,3)) = "PDF" Or Ucase(Right (object.Source,3)) = "TIF" Then
ObjFound = True
Else
ObjFound = False
Exit Forall
End If
End Forall
End If
End If

If ObjFound = False Then
textSub = textSub & {Прикрепите электронный образ строго в PDF или TIF формате } & Chr(10)
End If
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 583
269
#13
неа - не поборол, коды "они" засейвят так что вылетит из РТ, еще кружок пройти прийдется :(
правда - не помню в каких ситуевинах рассогласуются бэкэнд и фронтэнд (но с участием кода - точно может)