Доступ к приаттаченым файлам

  • Автор темы PavelT100
  • Дата начала
P

PavelT100

В поле richtext есть таблица. В ячейках таблицы приаттачены файлы. Как мне отобрать только те файлы которые приатачены в одной конкретной ячейки, а не все файлы приаттаченные в этом документе ?
Как я понял, читая документацию, с помощью NotesRichTextNavigator можно перебрать все ячейки, все файлы, все таблицы в в NotesRichTextItem, а как отобрать файлы из данной ячейки не понятно.
 
O

Omh

Полагаю так: NotesRichTextNavigator'ом находишь нужную ячейку, ограничиваешь поиск методами SetBegin и SetEnd (у RTNavigator'a) и ищешь уже по ограниченному куску.
Чую заранее, красных экранов смерти получишь предостаточно :)
 
S

Sandr

В поле richtext есть таблица. В ячейках таблицы приаттачены файлы. Как мне отобрать только те файлы которые приатачены в одной конкретной ячейки, а не все файлы приаттаченные в этом документе ?
Как я понял, читая документацию, с помощью NotesRichTextNavigator можно перебрать все ячейки, все файлы, все таблицы в в NotesRichTextItem, а как отобрать файлы из данной ячейки не понятно.

ого.. изврат...
 
O

Omh

Для: Sandr
Зато интересно. Хоть какой-то челинж :)
 
P

PavelT100

Вот что у меня получилось. Lotus 7.0.3. В документе лотуса есть таблица из пяти ячеек. В третьей ячейке приаттачен файл, в четвертой ячейке приаттачен файл и в пятой ячейки приатаччено 3 файла.
Мне нужно работать с тремя файлами из пятой ячеки. Я напиcал агент:

Код:
Sub Initialize
Dim session As New NotesSession
Dim db As NotesDatabase	
Dim doc As NotesDocument
Dim body As NotesRichTextItem
Dim rtnav As NotesRichTextNavigator
Dim rtt As NotesRichTextTable
Dim rtRangeTable As NotesRichTextRange
Dim rtRangeCell As NotesRichTextRange
Dim rtNavTable As NotesRichTextNavigator
Dim rtNavCell As NotesRichTextNavigator

Dim cellCounter As Integer

Set db = session.CurrentDatabase

Dim view As NotesView
Set view = db.GetView("ConvertionsCat")
Set doc = view.GetDocumentByKey("Caduciel", True)	

Set body = doc.GetFirstItem("Fichiers")		
Set rtnav = body.CreateNavigator
Set rtRangeCell = body.CreateRange		
cellCounter = 0
Call rtnav.FindFirstElement(RTELEM_TYPE_TABLECELL)
Do		
cellCounter = cellCounter + 1
If cellCounter = 5 Then			
Call rtRangeCell.SetBegin(rtNav)			
Call rtRangeCell.SetEnd(rtNav)
Set rtNavCell = rtRangeCell.Navigator			
flag = rtNavCell.FindFirstElement(RTELEM_TYPE_FILEATTACHMENT)
While flag								
Dim rtobj As NotesEmbeddedObject			
Set rtobj = rtNavCell.GetElement			

If rtobj.Type = EMBED_ATTACHMENT Then	Msgbox rtobj.Source				
flag = rtNavCell.FindNextElement(RTELEM_TYPE_FILEATTACHMENT)		
Wend
End If		
Loop While rtnav.FindNextElement(RTELEM_TYPE_TABLECELL)
End Sub

он работает своебразно. MsgBox вызывается 3 раза, но первое имя файла - это имя файла из третьей ячейки, второе имя файла - это имя файла из четвертой ячейки и третье имя файла - первый файл из пятой ячейки, увы я ожидал что будут три файла из пятой ячейки. В чем здесь ошибка или глюк лотуса ?
 
O

Omh

Я так сразу не могу сказать, в чём проблема, но на правильном пути ты - 100%
Я не думаю, что это глюк лотуса, хотя именно такую задачу мне решать не приходилось...
 
P

PavelT100

Я провел аналогичные экперименты с параграфами - все работает правильно.

Код:
	Call rtNav.FindFirstElement(RTELEM_TYPE_TABLECELL)
Do
msg = ""
cellCounter = cellCounter + 1
If cellCounter=5 Then
Call rtRangeCell.SetBegin(rtNav)
Call rtRangeCell.SetEnd(rtNav)
Set rtNavCell = rtRangeCell.Navigator
Call rtNavCell.FindFirstElement(RTELEM_TYPE_TEXTPARAGRAPH)
Do
Call rtRangePara.SetBegin(rtNavCell)
msg = msg & rtRangePara.TextParagraph & Chr(13)
Msgbox rtRangePara.TextParagraph				
Loop While rtNavCell.FindNextElement(RTELEM_TYPE_TEXTPARAGRAPH)
Messagebox msg,, "Cell " & cellCounter
End If	

Loop While rtNav.FindNextElement(RTELEM_TYPE_TABLECELL)
а с приаттаченными файлами не получается.
 
O

Omh

Для: PavelT100
Ну как, победил затык?
Я тут на досуге подумал и понял, что эту проблему можно решить ещё одним способом:
выгрузить док в DXL и распарсить.
Там точно можно будет сказать в какой ячейке что лежит.
 
P

PavelT100

Для: PavelT100
Ну как, победил затык?
Я тут на досуге подумал и понял, что эту проблему можно решить ещё одним способом:
выгрузить док в DXL и распарсить.
Там точно можно будет сказать в какой ячейке что лежит.
Решил именно таким способом. я использовал SAX. Вот примерно так берутся файлы из ячеки с именем
"FDB", может что и упустил в коде, но идея понятна. Огорчает, что этот метод искусственный, вынужденный необходимостью бороться с несовершенством Лотуса, признающий что у Лотуса ГЛЮК.

Код:
Dim isFDB As Boolean

Class FileFDB
Public name As String
Public isSave As Boolean	
End Class

Class ArFileFDB
Public files() As FileFDB	
End Class

Dim glArFDB As ArFileFDB
Dim iFile As Integer 'количество файлов в ячеке FDB для текущей конверсии

Function GetFileFDB(doc As NotesDocument) As ArFileFDB		
Dim session As New NotesSession
Dim db As NotesDatabase	
Set db = session.CurrentDatabase

Dim nc As NotesNoteCollection
Set nc = db.CreateNoteCollection(False)
Call nc.BuildCollection
c = nc.Count
Call nc.Add(doc)	
c = nc.Count

iFile = 0

Dim exporter As NotesDXLExporter
Set exporter = session.CreateDXLExporter(nc)
exporter.OutputDOCTYPE = False	

Dim saxParser As NotesSAXParser
Set saxParser=session.CreateSAXParser(exporter)

On Event SAX_EndElement From saxParser Call SAXEndElement
On Event SAX_Error From saxParser Call SAXError
On Event SAX_FatalError From saxParser Call SAXFatalError
On Event SAX_StartDocument From saxParser Call SAXStartDocument
On Event SAX_StartElement From saxParser Call SAXStartElement	
exporter.Process	

Set GetFileFDB = glArFDB
End Function

Sub SAXStartDocument (Source As Notessaxparser)	
isFDB= False
End Sub
Sub SAXEndElement (Source As Notessaxparser, Byval ElementName As String)	
If ElementName = "tablerow" Then
If isFDB Then isFDB = False		
End If
End Sub

Sub SAXStartElement (Source As Notessaxparser, Byval ElementName As String, Attributes As NotesSaxAttributeList)
Dim i As Integer
If ElementName = "tablerow" Then
If Attributes.Length > 0 Then
For i=1 To Attributes.Length
If Attributes.GetName(i) = "tablabel" And Attributes.GetValue(i) ="FDB" Then
isFDB = True
End If
Next
End If
End If

If isFDB Then
If ElementName = "attachmentref" Then
If Attributes.Length > 0 Then
For i=1 To Attributes.Length
If Attributes.GetName(i) = "name"  Then
'						Msgbox Attributes.GetValue(i)	
iFile = iFile +1
Redim Preserve glArFDB.files(1 To iFile)
Set glArFDB.files(iFile) = New FileFDB
glArFDB.files(iFile).name = Attributes.GetValue(i)							
glArFDB.files(iFile).isSave = False
End If
Next
End If			
End If
End If	
End Sub
 
P

PavelT100

Эх, а теперь у меня другая проблема - а как приаттачить файл в заданную ячейку таблицы ?
 
S

Sandr

В первом посте эти файлы там были.. как Вы их туда запихнули? Или забыли уже? :)
 
P

PavelT100

В первом посте эти файлы там были.. как Вы их туда запихнули? Или забыли уже? :)
Их пользователи руками туда запихнули, а теперь задача у меня стоит прогаммно с ними работать - сравнивать и обновлять, если надо.
 
A

Akupaka

Их пользователи руками туда запихнули, а теперь задача у меня стоит прогаммно с ними работать - сравнивать и обновлять, если надо.
ох и издеваются над Вами эти пользователи :)

а не пробовали изменить концепцию вообще?
 
P

PavelT100

а не пробовали изменить концепцию вообще?
Думаем над этим, но это уже признание капитуляции перед IBM :D. Это не вопрос программирования. Собственно если я получу для себя квалифицированный ответ - что это не возможно, то тогда так и будет. Хотя мне говорили что "в информатике нет ничего невозможного!" (с)
 
M

morpheus

<!--QuoteBegin-PavelT100+18:12:2007, 14:21 -->
<span class="vbquote">(PavelT100 @ 18:12:2007, 14:21 )</span><!--QuoteEBegin-->Думаем над этим, но это уже признание капитуляции перед IBM
[snapback]90383" rel="nofollow" target="_blank[/snapback]​
[/quote]
ниху... отнюдь, это лиш красивый финт ушами :D


а вообще то точто шо издеваютсья юзвери ад Вами
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
Я бы посоветовал вообще отказаться от такого способа.
Иначе можно схватить интересную ошибку (Reason #4)
 
O

Omh

Для: PavelT100
Ну а вообще вкладывать через DXL
Возможно, но я считаю, что действительно что-то немного не так напроектировано.
 
P

PavelT100

Для: PavelT100
Ну а вообще вкладывать через DXL
Возможно, но я считаю, что действительно что-то немного не так напроектировано.
Через DXL -это значит сохранять и обновлять весь документ целиком ? Это как-то несоразмерно поставленной задаче, СЛИШКОМ много возни и суеты.
 
O

Omh

Сложно, но "в информатике нет ничего невозможного!"
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!