VBA访问SQL查询问题

时间:2014-06-01 18:27:18

标签: sql vba ms-access access-vba

我需要你的帮助,我的SQL请求中有一个严重的问题,它应该向我显示服务Nephro的患者列表,但它显示了所有患者的列表,所以我认为SQL查询根本不起作用

这是代码:

Private Sub btnConnexion_Click()

Dim Categ As Integer
Dim Service As String
Dim IdProf As Integer

Dim db As DAO.Database
Dim rs As DAO.Recordset

Dim strSQL As String
Set db = CurrentDb


'vérification que l'utilisater a bien entrer e login et le mot de passe
Me.txtlogin.SetFocus
If IsNull(Me.txtlogin) Then
MsgBox "svp entrer votre login ", vbInformation, "login required "
Me.txtlogin.SetFocus
ElseIf IsNull(Me.txtmdp) Then
MsgBox "svp entrer votre mots de passe ", vbInformation, "mdp required "
Me.txtmdp.SetFocus
Else
'vérification que le login et le mdp sont corrects
If (IsNull(DLookup("login", "dbo_Authentification", "login='" & Me.txtlogin.Value & "'"))) Or _
    (IsNull(DLookup("mdp", "dbo_Authentification", "mdp='" & Me.txtmdp.Value & "'")))    Then
    MsgBox "login ou mdp incorrect"
Else
'récupération de l'IdCatégorie dans Categ, pour préciser les sessions des acteurs selon  leurs catégories professionneles
    Categ = DLookup("IdCategorie", "dbo_Professionnel", "IdProfessionnel = " &   DLookup("IdCompte", "dbo_Authentification", "login='" & Me.txtlogin.Value & "'"))
    'DoCmd.Close
    If Categ = 3 Then
        DoCmd.OpenForm "role"
        Else
        DoCmd.OpenForm "ListingPatients"

        'Service récupère le service du professionnel authentifié pour l'afficher à l'entete du formulaire "ListingPatients"
        Service = Nz(DLookup("IntituleServ", "dbo_Service", "IdService = " & DLookup("IdService", "dbo_Professionnel", "IdProfessionnel = " & DLookup("IdCompte", "dbo_Authentification", "login='" & Me.txtlogin.Value & "'"))), "inconnu")
        Forms![ListingPatients]![txtIntituleServ] = Service



        strSQL = "SELECT dbo_Patient.*, dbo_Service.IntituleServ, dbo_HospitalisatAcuelle.lit, dbo_Professionnel.IdProfessionnel, dbo_HospitalisatAcuelle.DateEntree, dbo_HospitalisatAcuelle.DateSortie FROM dbo_Service INNER JOIN ((dbo_Professionnel INNER JOIN dbo_Authentification ON dbo_Professionnel.IdProfessionnel = dbo_Authentification.IdCompte) INNER JOIN (dbo_Patient INNER JOIN (dbo_HospitalisatAcuelle INNER JOIN dbo_DonneePatientActuelles ON dbo_HospitalisatAcuelle.IdHosp = dbo_DonneePatientActuelles.IdHosp) ON dbo_Patient.IdPatient = dbo_DonneePatientActuelles.IdPatient) ON dbo_Professionnel.IdProfessionnel = dbo_HospitalisatAcuelle.IdProfessionnel) ON dbo_Service.IdService = dbo_Professionnel.Idservice WHERE (((dbo_HospitalisatAcuelle.DateEntree)<=Now()) AND ((dbo_HospitalisatAcuelle.DateSortie)>Now())) OR (((dbo_HospitalisatAcuelle.DateSortie) Is Null))"
        strSQL = strSQL & " AND [dbo_Service]![IntituleServ] = ' " & Service & " ' "


       Set rs = db.OpenRecordset(strSQL)

       rs.Close

       Set rs = Nothing
       Set db = Nothing
   End If
End If
End If

End Sub

非常感谢

2 个答案:

答案 0 :(得分:0)

检查VBA记录集SQL查询的WHERE子句。您的括号集可能出现故障。如您所见,dbo_Service![IntituleServ]字段未包含但在OR语句中挂起。

考虑将DateSortie&gt; = Now()之后的最后一个括号移到DateSortie为Null之后。

WHERE 

(
 (
   (dbo_HospitalisatAcuelle.DateEntree)<=Now()
 ) AND 

 (
   (dbo_HospitalisatAcuelle.DateSortie)>Now()
 )
) 

OR 
 (
  (
   (dbo_HospitalisatAcuelle.DateSortie) Is Null
  )
 )

AND 

[dbo_Service]![IntituleServ] = ' " & Service & " ' "

答案 1 :(得分:0)

数据库对象不支持查询,它只能用于打开整个表。

相反,请使用QueryDef对象。所以下面的代码:

Set rs = db.OpenRecordset(strSQL)

应该是

'up at the top
Dim qdf as QueryDef
'... code

Set qdf = db.CreateQueryDef("",strSQL)
set rs = qdf.OpenRecordSet(DbOpenSnapshot)
'... at the bottom
qdf.close

此外,您的SQL存在问题,WHERE部分应该是

" WHERE (dbo_HospitalisatAcuelle.DateEntree<=Now() " & _
" AND (dbo_HospitalisatAcuelle.DateSortie>Now() OR dbo_HospitalisatAcuelle.DateSortie Is Null)) " & _
" AND [dbo_Service].[IntituleServ] = ' " & Service & " ' "

(注意括号()

的位置