Застрял с необработанным документом в Lotus Notes - PullRequest
1 голос
/ 27 октября 2010

Я использую необработанный документ, чтобы он работал только на выбранном документе, но после выбора он ищет значения столбцов в представлении для экспорта документа в Excel.Я использую приведенный ниже код, он работает нормально, но мой первый документ всегда отображается последним после всех других экспортируемых документов в листе Excel.Любая идея, что можно сделать с помощью кода, чтобы экспортированный документ отображался идеально по порядку, как на виде.

Посмотрите на приведенный ниже код, который я использовал для экспорта -

Sub Initialize

 'On Error Goto errhandler
 On Error Resume Next
 Dim session As New NotesSession
 Dim db As NotesDatabase
 Dim doccoll As NotesDocumentCollection
 Dim view As NotesView 
 Dim doc As NotesDocument
 Dim otherdoc As NotesDocument

 Set db = session.CurrentDatabase 
 Set view = db.GetView("CRMOpenIssue") 
 Set doccoll=db.UnprocessedDocuments

 Set oExcel = CreateObject ( "Excel.Application" )
 Set oWorkbook = oExcel.Workbooks.Add
 Set oWorkSheet= oWorkbook.Sheets ( 1 )


 oWorkSheet.Cells(1,1).value="Quote# "
 oWorkSheet.Cells(1,2).value="Quote Line#" 
 oWorkSheet.Cells(1,3).value="Customer - fab"
 oWorkSheet.Cells(1,4).value="OppNum"
 oWorkSheet.Cells(1,5).value="OppLine#" 
 oWorkSheet.Cells(1,6).value="Open Issue#"
 oWorkSheet.Cells(1,7).value="Open Issue"
 oWorkSheet.Cells(1,8).value="Category"
 oWorkSheet.Cells(1,9).value="Due date"
 oWorkSheet.Cells(1,10).value="Owner to resolve issue"
 'oWorkSheet.Cells(1,11).value="Owner/PME Verify when closed"
 oExcel.Worksheets(1).Range("A1:J1").Font.Bold = True

 oExcel.columns("A:A").ColumnWidth=15.00
 oExcel.columns("B:B").ColumnWidth=8.00
 oExcel.columns("C:C").ColumnWidth=15.00
 oExcel.columns("D:D").ColumnWidth=10.00
 oExcel.columns("E:E").ColumnWidth=8.00
 oExcel.columns("F:F").ColumnWidth=8.00 
 oExcel.columns("G:G").ColumnWidth=30.00
 oExcel.columns("H:H").ColumnWidth=30.00
 oExcel.columns("I:I").ColumnWidth=15.00
 oExcel.columns("J:J").ColumnWidth=15.00
 'oExcel.columns("K:K").ColumnWidth=30.00

 row% = 1
 offset% = 0
 lastOffset% = 0 

 If doccoll.count >1 Then 'if more than one doc selected then confirm 
  resp = Messagebox("Do you want to export only the " & _
  "selected " & doccoll.count & " documents?", 36, "Selected only?" )
 Else
  Messagebox "Exporting all rows. (To export only selected " & _
  "rows tick those required in the left margin first.)"
 End If  '6= yes 

 oExcel.visible=True
 Dim i As Integer
 If resp=6 Then 'selected documents
  Set doc = doccoll.GetFirstDocument   
  While Not doc Is Nothing
   If resp=6 Then  

    'row% = offset% + 2
    If y="" Then
     row% = row% + 2
    Else 
     row%=row%+y+1
    End If
    col% = 0 'Reset the Columns
    Set otherdoc = view.getnextdocument(doc)
    If otherdoc Is Nothing Then
     Set otherdoc = view.getprevdocument(doc)
     If otherdoc Is Nothing Then
      Print " >1 doc should be selected"
      End
     Else
      Set otherdoc = view.getnextdocument(otherdoc)
     End If
    Else 'got next doc
     Set otherdoc = view.getprevdocument(otherdoc)
    End If        
   End If
   Forall colval In otherdoc.ColumnValues
    col% = col% + 1

    If Isarray(colval) Then
     ''If col%=10 Then   ''''''''
     columnVal=Fulltrim(colval)
     For y = 0 To Ubound(columnVal)
      offset% = row% + y +lastOffset%   
      'offset% = row% + y  
      oWorkSheet.Cells(offset%,col%).value = columnVal(y) 
      'i=offset%
     Next
    Else
     oWorkSheet.Cells(row%, col%).value = colval 
     'offset% = offset% + 1
    End If
    '''' oWorkSheet.Cells(row%, col%).value = colval '''''
    '''''''End If''''''''
   End Forall

   Set doc = doccoll.GetNextDocument(doc)       
  Wend
 End if

Ответы [ 3 ]

1 голос
/ 07 марта 2011

Хотя я согласен с мнением Бена, Алексея и Кена, я думаю, что часть проблемы осталась нетронутой - как вы можете экспортировать ColumnValues, когда NotesDocumentCollection у вас есть:

  1. Содержит объекты `NotesDocument`, для которых свойство` ColumnValues` не установлено.ColumnValues ​​устанавливается только для документов, которые вы получаете через объект NotesView.Это то, что Rupesh пытается решить с помощью грязной части doc / otherdoc.
  2. Не гарантируется сортировка по способу отображения в представлении.

Вышеприведенное верно лиВы получаете выбранные документы, используя NotesDatabase.UnprocessedDocuments или NotesUIView.Documents, оба возвращают выбранные документы при использовании в действии просмотра.
У меня была похожая проблема в прошлом, и хотя у меня нет кода, который яПопробуем описать работоспособное решение:

  1. Получить выбранные документы с помощью `NotesDatabase.UnprocessedDocuments` или` NotesUIView.Documents`
  2. Создать список с помощью `UniversalId`sиз выбранных документов
  3. Получить `ViewEntryCollection` всех записей в представлении
  4. Перебрать все записи в` ViewEntryCollection`
  5. Для каждого `ViewEntry` проверить, если`ViewEntry.IsDocument`
  6. Если True, проверьте, является ли `ViewEntry.UniversalId` частью ранее созданного списка
  7. Если True, экспортируйте` ViewEntry.ColumnValues`

Вот рабочий тест с альтернативным подходом для проверки того, является ли текущий ViewEntry в цикле одним из выбранных документов:

Sub Click(Source As Button)
    Dim selectedDc As NotesDocumentCollection
    Dim tempDoc As NotesDocument
    Dim allVec As NotesViewEntryCollection
    Dim tempVe As NotesViewEntry
    Dim thisView As NotesView
    Dim thisDb As NotesDatabase
    Dim session As New NotesSession

    Dim ws As New NotesUIWorkspace
    Dim thisUiView As NotesUIView

    Set thisUiView = ws.CurrentView
    Set selectedDc = thisUiView.Documents

    If (selectedDc.Count = 0) Then
        Messagebox "No selected documents!"
        Exit Sub
    End If

    Set thisDb = session.CurrentDatabase
    Set thisView = thisUiView.View
    Set allVec = thisView.AllEntries

    Set tempVe = allVec.GetFirstEntry
    While Not tempVe Is Nothing

        If (tempVe.IsDocument) Then
            Set tempDoc = selectedDc.GetDocument(thisDb.GetDocumentByUNID(tempVe.UniversalID))
            If Not (tempDoc Is Nothing) Then
                Messagebox Cstr(tempVe.ColumnValues(1))
            End If
        End If

        Set tempVe = allVec.GetNextEntry(tempVe)
    Wend

End Sub

Примечание. Это довольно старый вопрос,но я публикую этот ответ из-за сложной процедуры перехода от выбранных документов к экспорту в том порядке, в котором они отображаются в представлении.

0 голосов
/ 29 октября 2010

Я также не совсем понимаю, для чего этот цикл.UnprocessedDocuments - это просто коллекция NotesDocumentsCollection.Вы перемещаетесь по нему, используя GetFirstDocument / GetNextDocument в цикле while или аналогичном.Предупреждение о том, что ни один документ не был выбран, должно стоять на первом месте, а не в цикле.

Set db = session.CurrentDatabase
Set doccoll = db.UnprocessedDocuments
If doccoll.Count = 0 Then
  Print " >1 doc should be selected"
  Exit Sub
End If

, после этого вы выполняете инициализацию Excel и цикл

Set doc = doccoll.GetFirstDocument
While Not doc Is Nothing
  ' enter code here'

  Set doc = doccoll.GetNextDocument(doc)
Wend

Что касается столбцов, я бы удвоилпроверять.NotesDocument - это просто объект, который всегда должен вести себя одинаково.Но Notes - это Notes ... Я тоже проверю и дам вам отзыв.

0 голосов
/ 27 октября 2010

Я думаю, что вы можете удалить весь этот раздел:

Set otherdoc = view.getnextdocument(doc)
If otherdoc Is Nothing Then
 Set otherdoc = view.getprevdocument(doc)
 If otherdoc Is Nothing Then
  Print " >1 doc should be selected"
  End
 Else
  Set otherdoc = view.getnextdocument(otherdoc)
 End If
Else 'got next doc
 Set otherdoc = view.getprevdocument(otherdoc)
End If        

Конец Если

Я не уверен, для чего вы шли, но, похоже, вы тестировали более одногодокумент выбран.Это легко сделать, протестировав свойство doccoll.count:

If doccoll.count <=1 Then  'etc...

Затем просто измените выражение Forall, чтобы оно работало с doc вместо otherdoc:

Forall colval In doc.ColumnValues ...
...