1. Уважаемые участники и гости, 19 октября codeby будет работать в режиме "Только чтение". Регистрация новых участников будет закрыта. 20 октября портал продолжит работу в прежнем режиме.

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

Тема в разделе "Lotus - Программирование", создана пользователем PavelT100, 28 ноя 2007.

  1. PavelT100

    PavelT100 Well-Known Member

    Репутация:
    0
    Регистрация:
    9 июл 2007
    Сообщения:
    103
    Симпатии:
    0
    В поле richtext есть таблица. В ячейках таблицы приаттачены файлы. Как мне отобрать только те файлы которые приатачены в одной конкретной ячейки, а не все файлы приаттаченные в этом документе ?
    Как я понял, читая документацию, с помощью NotesRichTextNavigator можно перебрать все ячейки, все файлы, все таблицы в в NotesRichTextItem, а как отобрать файлы из данной ячейки не понятно.
     
  2. Omh

    Omh Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Полагаю так: NotesRichTextNavigator'ом находишь нужную ячейку, ограничиваешь поиск методами SetBegin и SetEnd (у RTNavigator'a) и ищешь уже по ограниченному куску.
    Чую заранее, красных экранов смерти получишь предостаточно :)
     
  3. Sandr

    Sandr Гость

    Репутация:
    0
    ого.. изврат...
     
  4. Omh

    Omh Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Для: Sandr
    Зато интересно. Хоть какой-то челинж :)
     
  5. PavelT100

    PavelT100 Well-Known Member

    Репутация:
    0
    Регистрация:
    9 июл 2007
    Сообщения:
    103
    Симпатии:
    0
    Вот что у меня получилось. 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 раза, но первое имя файла - это имя файла из третьей ячейки, второе имя файла - это имя файла из четвертой ячейки и третье имя файла - первый файл из пятой ячейки, увы я ожидал что будут три файла из пятой ячейки. В чем здесь ошибка или глюк лотуса ?
     
  6. Omh

    Omh Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Я так сразу не могу сказать, в чём проблема, но на правильном пути ты - 100%
    Я не думаю, что это глюк лотуса, хотя именно такую задачу мне решать не приходилось...
     
  7. PavelT100

    PavelT100 Well-Known Member

    Репутация:
    0
    Регистрация:
    9 июл 2007
    Сообщения:
    103
    Симпатии:
    0
    Я провел аналогичные экперименты с параграфами - все работает правильно.

    Код:
    	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)
    а с приаттаченными файлами не получается.
     
  8. Omh

    Omh Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Для: PavelT100
    Ну как, победил затык?
    Я тут на досуге подумал и понял, что эту проблему можно решить ещё одним способом:
    выгрузить док в DXL и распарсить.
    Там точно можно будет сказать в какой ячейке что лежит.
     
  9. PavelT100

    PavelT100 Well-Known Member

    Репутация:
    0
    Регистрация:
    9 июл 2007
    Сообщения:
    103
    Симпатии:
    0
    Решил именно таким способом. я использовал 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
     
  10. PavelT100

    PavelT100 Well-Known Member

    Репутация:
    0
    Регистрация:
    9 июл 2007
    Сообщения:
    103
    Симпатии:
    0
    Эх, а теперь у меня другая проблема - а как приаттачить файл в заданную ячейку таблицы ?
     
  11. Sandr

    Sandr Гость

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

    PavelT100 Well-Known Member

    Репутация:
    0
    Регистрация:
    9 июл 2007
    Сообщения:
    103
    Симпатии:
    0
    Их пользователи руками туда запихнули, а теперь задача у меня стоит прогаммно с ними работать - сравнивать и обновлять, если надо.
     
  13. Akupaka

    Akupaka А че я?.. О.о

    Репутация:
    0
    Регистрация:
    4 окт 2007
    Сообщения:
    3.360
    Симпатии:
    2
    ох и издеваются над Вами эти пользователи :)

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

    PavelT100 Well-Known Member

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

    morpheus скриптописец

    Репутация:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    3.915
    Симпатии:
    1
    <!--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


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

    Medevic Что это ? :)
    Lotus team

    Репутация:
    0
    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
  17. Omh

    Omh Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Для: PavelT100
    Ну а вообще вкладывать через DXL
    Возможно, но я считаю, что действительно что-то немного не так напроектировано.
     
  18. PavelT100

    PavelT100 Well-Known Member

    Репутация:
    0
    Регистрация:
    9 июл 2007
    Сообщения:
    103
    Симпатии:
    0
    Через DXL -это значит сохранять и обновлять весь документ целиком ? Это как-то несоразмерно поставленной задаче, СЛИШКОМ много возни и суеты.
     
  19. Omh

    Omh Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Сложно, но "в информатике нет ничего невозможного!"
     
Загрузка...

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