2010-10-27 6 views
1

J'utilise un document non traité pour qu'il ne s'exécute que sur un document sélectionné, mais après sélection il recherche des valeurs de colonne dans une vue pour exporter un document vers Excel. J'utilise le code ci-dessous qui fonctionne bien, mais mon premier document est toujours affiché en dernier après tous les autres documents exportés dans la feuille Excel. Toute idée de ce qui peut être fait avec le code afin que le document exporté s'affiche parfaitement dans l'ordre comme dans la vue.Blocage d'un document non traité dans Lotus Notes

Regardez le code ci-dessous que j'ai utilisé pour l'exportation -

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 
+0

Vos boucles sont bloquées, et vous avez une logique étrange - par ex. pourquoi vérifier la taille de la collection * dans * la boucle? Pourquoi vérifier la valeur de 'resp' * dans la boucle *? Si vous nettoyez comment vous itérez vos documents, tout le reste suivra. – Ben

Répondre

0

Je pense que vous pouvez supprimer toute cette section:

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

Je ne suis pas sûr de ce que vous vouliez, mais il semble que vous étiez en train de tester que plus d'un document est sélectionné. Vous pouvez le faire facilement en testant la propriété doccoll.count:

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

Ensuite il suffit de changer votre déclaration Forall pour travailler sur doc au lieu de otherdoc:

Forall colval In doc.ColumnValues ... 
+0

Salut Ken, les valeurs de colonne ne fonctionnent pas pour le document non traité .J'ai essayé et constaté qu'il ne récupérait pas la valeur de la colonne, si cela serait vraiment facile pour moi d'exporter le document vers Excel. – Rupesh

0

Je ne comprends pas tout à fait aussi ce que cela la boucle est pour. UnprocessedDocuments est juste un NotesDocumentsCollection. Vous naviguez en utilisant GetFirstDocument/GetNextDocument dans une boucle while ou similaire. L'avertissement indiquant qu'aucun document n'a été sélectionné devrait venir en premier lieu, pas dans la boucle.

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

après que vous faites votre initialisation Excel et boucle

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

    Set doc = doccoll.GetNextDocument(doc) 
Wend 

En ce qui concerne les colonnes je vérifier. NotesDocument est juste un objet qui devrait toujours se comporter de la même manière. Mais Notes est Notes ... Je vais aussi vérifier et vous donner un retour.

+0

Merci ... Alexey .. – Rupesh

1

Même si je suis d'accord avec les points de Ben, Alexey et Ken, je pense qu'une partie du problème n'a pas été modifié - comment voulez-vous exporter ColumnValues, lorsque le NotesDocumentCollection vous avez:

  1. Contient ` Objets NotesDocument`, dont la propriété `ColumnValues` n'est pas définie. `ColumnValues` est seulement défini pour les documents que vous obtenez à travers un objet` NotesView`. C'est ce que Rupesh essaie de résoudre avec la partie doc/otherdoc désordonnée.
  2. Il n'est pas garanti d'être trié comme il est affiché dans la vue.

Ce qui précède est vrai si vous obtenez les documents sélectionnés en utilisant NotesDatabase.UnprocessedDocuments ou NotesUIView.Documents, les deux qui renvoient les documents sélectionnés lorsqu'ils sont utilisés dans une action de la vue.
J'ai eu le même problème dans le passé et alors que je n'ai pas le code que je vais essayer de décrire une solution viable:

  1. Obtenez les documents sélectionnés à l'aide soit `` NotesDatabase.UnprocessedDocuments` ou NotesUIView .Documents`
  2. Dressez une liste avec les `UniversalId`s des documents sélectionnés
  3. Obtenez le` ViewEntryCollection` de toutes les entrées dans la vue
  4. boucle par toutes les entrées du `ViewEntryCollection`
  5. Pour chaque` ViewEntry` vérifier si `ViewEntry.IsDocument`
  6. Si vrai, vérifier si` ViewEntry.UniversalId` fait partie de la liste précédemment construite
  7. Si vrai, exporter la `ViewEntry.ColumnValues`

Voici un test de travail avec une approche alternative pour vérifier si le ViewEntry courant dans la boucle est en fait l'un des documents sélectionnés

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 

Note: Ceci est une question assez vieux, mais je poste cette réponse parce que de la partie délicate d'aller des documents sélectionnés à les exporter dans l'ordre où ils apparaissent dans la vue.

Questions connexes