在Lotus Notes中粘贴未处理的文档

时间:2010-10-27 11:42:26

标签: lotus-notes lotus-domino lotusscript

我正在使用未经处理的文档,因此它仅在选定文档上运行,但在选择后,它会在视图中查找列值以将文档导出到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 个答案:

答案 0 :(得分:1)

虽然我同意Ben,Alexey和Ken的观点,但我认为问题的一部分未被触及 - 当你ColumnValues时,你如何导出NotesDocumentCollection:< / p>

  1. 包含`NotesDocument`对象,其中未设置`ColumnValues`属性。 `ColumnValues`仅为您通过`NotesView`对象获取的文档设置。这就是Rupesh试图用doc / otherdoc凌乱的部分解决的问题。
  2. 不保证按照通过视图显示的方式进行排序。
  3. 无论您是使用NotesDatabase.UnprocessedDocuments还是NotesUIView.Documents获取所选文档,以上情况都是如此,两者都会在查看操作中使用时返回所选文档。
    我过去遇到过类似的问题,虽然我没有代码,但我会尝试描述一个可行的解决方案:

    1. 使用`NotesDatabase.UnprocessedDocuments`或`NotesUIView.Documents`
    2. 获取所选文档
    3. 使用所选文档的“UniversalId”构建列表
    4. 获取视图中所有条目的`ViewEntryCollection`
    5. 遍历`ViewEntryCollection`
    6. 中的所有条目
    7. 对于每个`ViewEntry`检查`ViewEntry.IsDocument`
    8. 如果为True,请检查`ViewEntry.UniversalId`是否是之前构建的列表的一部分
    9. 如果为True,则导出`ViewEntry.ColumnValues`
    10. 这是一个工作测试,使用另一种方法检查循环中的当前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
      

      注意:这是一个相当古老的问题,但是我发布这个答案是因为从选定的文档到按照它们在视图中出现的顺序导出它们的棘手部分。

答案 1 :(得分:0)

我认为你可以删除整个部分:

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 ...

答案 2 :(得分:0)

我也完全不明白这个循环的用途。 UnprocessedDocuments只是一个NotesDocumentsCollection。您可以在while循环或类似循环中使用GetFirstDocument / GetNextDocument来浏览它。警告表示没有选择任何文件应该放在第一位,而不是在循环中。

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 ...我也会检查并给你一个反馈。