使用NotesViewNavigator在视图中的两个日期之间搜索文档

时间:2015-01-16 14:59:56

标签: lotus-domino navigator notesview

我尝试获取所有创建日期在两个日期(开始和结束)之间的文档。

我有时候有日期的错误。如果最后一个类别是2015年1月15日,那么当我将开始日期或/和结束日期与15/01/2015放在一起时:"对象变量未设置"。我不明白。

我在所有文件中都有一个视图。这是一个分类的视图。 我想用notesviewnavigator讨论这个视图。

当我的文档的创建日期等于或在开始日期或最终日期之间时,我将此文档放入我的集合final。 在我的程序结束时,我将所有内容放在一个文件夹中,然后显示视图。

这是我的代码:

    Function RechercheDocParDate(dateDebut As String, dateFin As String, nomFolder1 As String, nomFolder2 As String, nomFolder3 As String, nomVue As String, numColonne As Integer) As Integer
' recherche les documents d'une vue en fonction de dates passées en paramètre pour les créer dans un folder privé

    Dim vueRech As NotesView    
    Dim j As Integer
    Dim collecEntryFinal As NotesViewEntryCollection
    Dim entry As NotesViewEntry
    Dim colonDate As String 
    Dim nbDocTrouve As Integer
    Dim flag As Boolean
    Dim nav As NotesViewNavigator
    Dim dbb As NotesDatabase    
    Dim Session As New NotesSession

    Set dbb = session.CurrentDatabase
    ' Récupération des données de la vue    
    Set vueRech = dbb.GetView(nomVue)   
    Call vueRech.Refresh    

    nbDocTrouve = 0

    ' a revoir : initialisation de la création d'entry
    ' création d'une collection d'entry (moins consommateur car le document n'est pas ouvert)   
    Set collecEntryFinal = vueRech.GetAllEntriesByKey("_gdfgdfg")   
    j = 1
    flag = True     

    ' création d'un navigateur de catégorie d'entry
    Set nav = vueRech.CreateViewNav
    Set entry = nav.GetFirst

'   si on n'est pas rendu à la fin de la vue (penser aux hors catégories)   
    While ( (Not (entry Is Nothing) ) And ( flag = True ) )  
'       si c'est bien une categorie
        If entry.IsCategory Then            
            'récupère la colonne de date 
            colonDate =  entry.ColumnValues(numColonne) 
            If ( colonDate >= dateDebut ) Then
                If  ( colonDate > dateFin ) Then                    
                    flag = False
                Else    
                    Set entry = nav.GetNext(entry)
                    's'il y a des documents
                    While ( (Not (entry Is Nothing) ) And (entry.IsDocument) )
                        'recupere les documents de la catégorie                     
                        Call collecEntryFinal.AddEntry(entry)                   
                        nbDocTrouve = nbDocTrouve + 1           
                        Set entry = nav.GetNext(entry) 
                        '//ALERT
                        ' it finds the documents but in the end of the list of document it crashes here
                        '//ALERT

                    Wend  
                    Set entry = nav.GetPrev(entry)      
                    End If              
                End If
            Else            
                'recupere les documents hors catégorie
                While ( (Not (entry Is Nothing) ) And (entry.IsDocument) )      
                    Call collecEntryFinal.AddEntry(entry)                   
                    nbDocTrouve = nbDocTrouve + 1       
                    Set entry = nav.GetNext(entry)      
                Wend    
            End If
            Set entry = nav.GetNextCategory(entry)  
        Wend    

        'on crée le dossier  privé pour l'utilisateur
        'si on trouve des résultats ils sont ajoutés dans le folder
        If Not Isempty(collecEntryFinal)  Then
            If nomFolder1 <> ""  Then               
                collecEntryFinal.PutAllInFolder(nomFolder1) 
            End If
            If nomFolder2 <> ""  Then       
                collecEntryFinal.PutAllInFolder(nomFolder2) 
            End If
            If nomFolder3 <> ""  Then           
                collecEntryFinal.PutAllInFolder(nomFolder3) 
            End If
        End If  
        Call vueRech.Refresh
        RechercheDocParDate = nbDocTrouve

    End Function

当我一步一步地理解它时,但是在最后一段时间(在代码中查看,我发出警报)

1 个答案:

答案 0 :(得分:1)

不确定您是否仍然遇到此问题,但为了将来参考,解决方案很简单。

您有一个嵌套的while / wend循环来遍历导航器的每个类别中的文档。这个内部while / wend可以耗尽导航器中的所有可用文档,导致“输入”变为“无”。然后在此嵌套的同时调用nav.getPrev()或nav.GetNextCategory(),导致异常,因为无法使用undefined或“nothing”参数调用nav.getPrev()nav.GetNextCategory()。

The documentation concerning the "entry" parameter for GetNextCategory明确声明“如果指定Nothing,则此方法会生成错误。”

The documentation concerning the "entry" parameter for GetPrev说明了相同的内容。

解决问题的代码:

Function RechercheDocParDate(dateDebut As String, dateFin As String, nomFolder1 As String, nomFolder2 As String, nomFolder3 As String, nomVue As String, numColonne As Integer) As Integer
    ' recherche les documents d'une vue en fonction de dates passées en paramètre pour les créer dans un folder privé

    Dim vueRech As NotesView    
    Dim j As Integer
    Dim collecEntryFinal As NotesViewEntryCollection
    Dim entry As NotesViewEntry
    Dim colonDate As String 
    Dim nbDocTrouve As Integer
    Dim flag As Boolean
    Dim nav As NotesViewNavigator
    Dim dbb As NotesDatabase    
    Dim Session As New NotesSession

    Set dbb = session.CurrentDatabase
    ' Récupération des données de la vue    
    Set vueRech = dbb.GetView(nomVue)   
    Call vueRech.Refresh    

    nbDocTrouve = 0

    ' a revoir : initialisation de la création d'entry
    ' création d'une collection d'entry (moins consommateur car le document n'est pas ouvert)   
    Set collecEntryFinal = vueRech.GetAllEntriesByKey("_gdfgdfg")   
    j = 1
    flag = True     

    ' création d'un navigateur de catégorie d'entry
    Set nav = vueRech.CreateViewNav
    Set entry = nav.GetFirst

    '   si on n'est pas rendu à la fin de la vue (penser aux hors catégories)   
    While ( (Not (entry Is Nothing) ) And ( flag = True ) )  
    '       si c'est bien une categorie
        If entry.IsCategory Then            
            'récupère la colonne de date 
            colonDate =  entry.ColumnValues(numColonne) 
            If ( colonDate >= dateDebut ) Then
                If  ( colonDate > dateFin ) Then                    
                    flag = False
                Else    
                    Set entry = nav.GetNext(entry)
                    's'il y a des documents
                    While ( (Not (entry Is Nothing) ) And (entry.IsDocument) )
                        'recupere les documents de la catégorie                     
                        Call collecEntryFinal.AddEntry(entry)                   
                        nbDocTrouve = nbDocTrouve + 1           
                        Set entry = nav.GetNext(entry) 
                    Wend
                    ' ---FIRST FIX HERE---
                    If (Not (entry Is Nothing) ) Then
                        Set entry = nav.GetPrev(entry)
                    End If
                End If              
            End If
        Else            
            'recupere les documents hors catégorie
            While ( (Not (entry Is Nothing) ) And (entry.IsDocument) )      
                Call collecEntryFinal.AddEntry(entry)                   
                nbDocTrouve = nbDocTrouve + 1       
                Set entry = nav.GetNext(entry)      
            Wend    
        End If
        ' ---SECOND FIX HERE---
        If (Not (entry Is Nothing) ) Then
            Set entry = nav.GetNextCategory(entry)  
        End If
    Wend    

    'on crée le dossier  privé pour l'utilisateur
    'si on trouve des résultats ils sont ajoutés dans le folder
    If Not Isempty(collecEntryFinal)  Then
        If nomFolder1 <> ""  Then               
            collecEntryFinal.PutAllInFolder(nomFolder1) 
        End If
        If nomFolder2 <> ""  Then       
            collecEntryFinal.PutAllInFolder(nomFolder2) 
        End If
        If nomFolder3 <> ""  Then           
            collecEntryFinal.PutAllInFolder(nomFolder3) 
        End If
    End If  
    Call vueRech.Refresh
    RechercheDocParDate = nbDocTrouve

End Function

注意有两处变化,都是Nothing的简单测试。这应该可以解决您的问题或类似问题。请记住,导航器导航方法都不接受任何操作,并且您应该能够避免将来出现类似问题。