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

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

  1. PavelT100

    PavelT100 Well-Known Member

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

    Omh Lotus team
    Lotus team

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

    Sandr Гость

    ого.. изврат...
     
  4. Omh

    Omh Lotus team
    Lotus team

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

    PavelT100 Well-Known Member

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

    Код (Text):
    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 Lotus team
    Lotus team

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

    PavelT100 Well-Known Member

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

    Код (Text):
        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 Lotus team
    Lotus team

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

    PavelT100 Well-Known Member

    Регистрация:
    9 июл 2007
    Сообщения:
    105
    Симпатии:
    0
    Решил именно таким способом. я использовал SAX. Вот примерно так берутся файлы из ячеки с именем
    "FDB", может что и упустил в коде, но идея понятна. Огорчает, что этот метод искусственный, вынужденный необходимостью бороться с несовершенством Лотуса, признающий что у Лотуса ГЛЮК.

    Код (Text):
    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

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

    Sandr Гость

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

    PavelT100 Well-Known Member

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

    Akupaka А че я?.. О.о

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

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

    PavelT100 Well-Known Member

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

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

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

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

    Omh Lotus team
    Lotus team

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

    PavelT100 Well-Known Member

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

    Omh Lotus team
    Lotus team

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

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