2016-01-17 1 views
0

J'ai un formulaire et je veux afficher un message lorsqu'il n'y a pas d'enregistrements. Le code SQL dans le code suivant n'affiche aucun enregistrement (Null) (comme il devrait le faire actuellement). La fonction ne fonctionne pas comme je le souhaite. Il ne renvoie aucun nombre ni affiche le message. Si je mets la fonction sous une forme qui a des enregistrements, elle les compte avec précision.Recordset BOF/EOF ne peut pas gérer Nulls

Public Function NumRecs() As Integer 

Dim rs As DAO.Recordset 

Set rs = CurrentDb.OpenRecordset("SELECT tblClient.ClientName, tblInvoices.SentToPayer, [Adjustment]+[MyFee]+[DBSFee] AS TotFees, tblClient.ClientID, tblDisclosure.ApplicantForenames, tblDisclosure.AppEmail " & _ 
          "FROM ((tblInvoiceDetails INNER JOIN tblDisclosure ON tblInvoiceDetails.DiscLookup = tblDisclosure.ID) INNER JOIN tblInvoices ON tblInvoiceDetails.InvoiceLookup = tblInvoices.ID) INNER JOIN ((tblOfficerDetails INNER JOIN tblOfficers ON tblOfficerDetails.OfficerLookup = tblOfficers.ID) INNER JOIN tblClient ON tblOfficerDetails.ClientLookup = tblClient.ClientID) ON tblInvoices.AppLookup = tblClient.ClientID " & _ 
          "WHERE (((tblInvoices.DatePaid) Is Null)) ") 

If Not rs.BOF And Not rs.EOF Then 
    NumRecs = Me.Recordset.RecordCount 
Else 
    DisplayMessage ("No records.") 
    NumRecs = 0 
End If 

rs.Close 
Set rs = Nothing 

End Function 

Répondre

1

"J'ai une forme et que vous souhaitez afficher un message quand il n'y a pas de dossiers".

Vous pouvez accomplir cette tâche sans en ouvrir une autre DAO.Recordset. Utilisez simplement RecordsetClone, qui existe déjà.

Private Sub Form_Load() 
    Dim lngRowCount As Long 

    lngRowCount = 0 
    With Me.RecordsetClone 
     If Not (.BOF And .EOF) Then 
      .MoveLast 
      lngRowCount = .RecordCount 
     End If 
    End With 
    MsgBox lngRowCount & " records" 
End Sub 
+0

Cela fonctionne. Je vous remercie. –

0

Afin d'obtenir le compte rendu avec DAO, vous devez MoveLast. Aussi, essayez de changer le chèque EOF (voir ci-dessous):

Public Function NumRecs() As Integer 
Dim dbs As DAO.Database 
Dim rs As DAO.Recordset 
Dim strSQL as String 

strSQL = "SELECT tblClient.ClientName, tblInvoices.SentToPayer, [Adjustment]+[MyFee]+[DBSFee] AS TotFees, tblClient.ClientID, tblDisclosure.ApplicantForenames, tblDisclosure.AppEmail " & _ 
"FROM ((tblInvoiceDetails INNER JOIN tblDisclosure ON tblInvoiceDetails.DiscLookup = tblDisclosure.ID) INNER JOIN tblInvoices ON tblInvoiceDetails.InvoiceLookup = tblInvoices.ID) INNER JOIN ((tblOfficerDetails INNER JOIN tblOfficers ON tblOfficerDetails.OfficerLookup = tblOfficers.ID) INNER JOIN tblClient ON tblOfficerDetails.ClientLookup = tblClient.ClientID) ON tblInvoices.AppLookup = tblClient.ClientID " & _ 
"WHERE (((tblInvoices.DatePaid) Is Null))" 

Set dbs = CurrentDB 
Set rs = dbs.OpenRecordset(strSQL) 

If Not rs.EOF Then 
    rs.MoveLast   ' ADD THIS LINE 
    NumRecs = rs.RecordCount 
Else 
    DisplayMessage ("No records.") 
    NumRecs = 0 
End If 

rs.Close 
Set rs = Nothing 
dbs.Close 
Set dbs = Nothing 

End Function` 
+0

Merci. J'ai déjà essayé MoveLast. Néanmoins, j'ai essayé l'ensemble de votre code et j'ai toujours le même résultat (faux). –

+0

"Mauvais" comme dans comment? Si aucun enregistrement n'est renvoyé, obtenez-vous l'affichage "No Records"? Si des enregistrements sont renvoyés, aucun écran n'est spécifié. Avez-vous 'Option Explicit' et avez compilé? –

+0

Le même que dans ma question d'origine: Il ne renvoie ni un nombre ni affiche le message. J'ai l'option explicite et ai compilé. dans peu de temps je vais essayer une décompilation de l'ensemble du frontend. –

0

Chaque fois que je besoin d'un nombre record en DAO je toujours MoveLast puis MoveFirst cependant

Dim db as DAO.Database 
Dim rst as DAO.Recordset 
Dim strSQL as string 

strSQL = "" ' your query here 

Set db=CurrentDB() 
    Set rst=db.OpenRecordset(stSQL,dbOpenDynaSet) 
     With rst 
     If NOT (.EOF and .BOF) Then ' There are records to be had 
      Dim iRecCount as Integer 
      .MoveLast: .MoveFirst  
       ' DAO typically requires the all records before the count 
       ' count is correct 
      iRecCount = .RecordCount 

     Else ' There are NOT records to be had 
      ' ADD YOUR MESSAGE HERE FOR NO RECORDS. 
     End If 
     .Close 
     End with 
    Set rst=nothing 
Set db=nothing 

En option Je construis ma requêtes externes à VBA et ajouter des paramètres. C'est pourquoi je sais que ma requête produit les résultats attendus. Vous pouvez ensuite référencer votre requête en tant qu'objet de QueryDefs de l'objet CurrentDB(). Puis adressez-vous les paramètres en tant que propriété de QueryDef.

Ce qui suit est une excellente lecture d'Allen Browne sur Recordsets. http://allenbrowne.com/ser-29.html

0

Tout ce que vous avez vraiment besoin est:

Public Function NumRecs() As Integer 

    Dim rs As DAO.Recordset 

    Set rs = Me.RecordsetClone 
    If rs.RecordCount = 0 Then 
     DisplayMessage ("No records.") 
    Else 
     rs.MoveLast 
     NumRecs = rs.RecordCount 
    End If 
    rs.Close  
    Set rs = Nothing 

End Function