Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 515
  • Last Modified:

runtime error 3061 too few parameters expected one

I am trying to execute this code:

Function FixLabels()
    If Not IsNull(DLookup("PatientID", "Qry_OverdueAppointments")) Then
        Dim dbs As Database
        Dim rs As Recordset
        Set dbs = CurrentDb
        Set rs = dbs.OpenRecordset("Qry_OverdueAppointments")
        MsgBox "The total for " & rs!PatientName & " for the " & rs!CountofAppointmentDate & "is " & rs!PatientID
        rs.Close
        dbs.Close
        Set rs = Nothing
        Set dbs = Nothing
 
   
        Forms!Form6!OverdueLab.FontBold = True
        Forms!Form6!OverdueLab.ForeColor = 195
   Else
        Forms!Form6!OverdueLab.FontBold = False
        Forms!Form6!OverdueLab.ForeColor = 0
    End If
End Function

I get the dreaded error. 3061

Any thoughts?
Scott
0
coconutt
Asked:
coconutt
  • 6
  • 5
  • 5
  • +3
1 Solution
 
JezWaltersCommented:
It looks like you're simply not supplying the required parameters to your Qry_OverdueAppointments query - can you post the SQL for this query?
0
 
Jeffrey CoachmanMIS LiasonCommented:
FWIW, most developers will force newly created recordsets to the last record to get an accurate record count, so try something like this:

Function FixLabels()
    If Not IsNull(DLookup("PatientID", "Qry_OverdueAppointments")) Then
        Dim dbs As Database
        Dim rs As Recordset
        Set dbs = CurrentDb
        Set rs = dbs.OpenRecordset("Qry_OverdueAppointments")
        rs.movelast
        rs.MoveFirst
        MsgBox "The total for " & rs!PatientName & " for the " & rs!CountofAppointmentDate & "is " & rs!PatientID
        rs.Close
        dbs.Close
        Set rs = Nothing
        Set dbs = Nothing
 
   
        Forms!Form6!OverdueLab.FontBold = True
        Forms!Form6!OverdueLab.ForeColor = 195
   Else
        Forms!Form6!OverdueLab.FontBold = False
        Forms!Form6!OverdueLab.ForeColor = 0
    End If
End Function

Also the "To  few parameters" error typically indicates that the query needs a parameter and you did not supply the parameter at the time the recordset was created.
So look into this as well.

JeffCoachman
0
 
coconuttAuthor Commented:
The parameter comes from a list box on my form, here is the sql behind Qry_OverdueAppointments

SELECT Appointments.AppointmentID, Count(Appointments.AppointmentDate) AS CountOfAppointmentDate, Appointments.AppointmentKept, patients.PatientID, patients.FirstName, patients.LastName, [FirstName] & " " & [LastName] AS PatientName
FROM patients INNER JOIN Appointments ON patients.PatientID = Appointments.PatientID
GROUP BY Appointments.AppointmentID, Appointments.AppointmentKept, patients.PatientID, patients.FirstName, patients.LastName, [FirstName] & " " & [LastName]
HAVING (((Count(Appointments.AppointmentDate))<Date()) AND ((Appointments.AppointmentKept)=No) AND ((patients.PatientID)=[Forms]![Form6]![PatientId]));
0
Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

 
Jeffrey CoachmanMIS LiasonCommented:
Well,  ...is this form open and is a value entered into the PatientId control, at the time the recordset is being created?
0
 
coconuttAuthor Commented:
The form is open, and the patient record is visible.
0
 
Jim Dettman (Microsoft MVP/ EE MVE)PresidentCommented:

 Is the form really called Form6?

JimD.
0
 
coconuttAuthor Commented:
yes the form is really called form6 ( I always meant to rename)
0
 
kavik379Commented:
What type of a field is Appointments.AppointmentKept? In the query you are having it = No. If that is a text field, there needs to be quotes. If it is a Boolean field, try change it to FALSE
0
 
coconuttAuthor Commented:
tried that, nothing new. Look at image please
objvar.bmp
0
 
DatabaseMX (Joe Anderson - Microsoft MVP, Access and Data Platform)Commented:
In Your SQL, Try changing:

AND ((patients.PatientID)=[Forms]![Form6]![PatientId]));

To

AND ((patients.PatientID)=EVAL("[Forms]![Form6]![PatientId]") ));

mx
0
 
Jim Dettman (Microsoft MVP/ EE MVE)PresidentCommented:
Change the code to the following:

Function FixLabels()

  Dim dbs As Database
  Dim rs As Recordset
  Dim qdef As QueryDef
  Dim prm as Parameter

   If Not IsNull(DLookup("PatientID", "Qry_OverdueAppointments")) Then
        Set dbs = CurrentDb
        Set qdef = db.QueryDefs("Qry_OverdueAppointments")
        For Each prm in qdf.Parameters
          prm.Value = Eval(prm.Name)
        Next prm
        Set rs =  qdef.OpenRecordset()  
        MsgBox "The total for " & rs!PatientName & " for the " & rs!CountofAppointmentDate & "is " & rs!PatientID
        rs.Close
        Set prm = Nothing
        Set qdf = Nothing
        Set rs = Nothing
        Set dbs = Nothing
 
       Forms!Form6!OverdueLab.FontBold = True
        Forms!Form6!OverdueLab.ForeColor = 195
   Else
        Forms!Form6!OverdueLab.FontBold = False
        Forms!Form6!OverdueLab.ForeColor = 0
    End If

End Function


0
 
DatabaseMX (Joe Anderson - Microsoft MVP, Access and Data Platform)Commented:
Also, all that code can be simplified to:

Function FixLabels()
    If Not IsNull(DLookup("PatientID", "Qry_OverdueAppointments")) Then
       With .OpenRecordset("Qry_OverdueAppointments")
             .MoveLast  ' get record count
        MsgBox "The total for " & rs!PatientName & " for the " & rs!CountofAppointmentDate & "is " & rs!PatientID
     End With

   
        Forms!Form6!OverdueLab.FontBold = True
        Forms!Form6!OverdueLab.ForeColor = 195
   Else
        Forms!Form6!OverdueLab.FontBold = False
        Forms!Form6!OverdueLab.ForeColor = 0
    End If
End Function

mx
0
 
Jim Dettman (Microsoft MVP/ EE MVE)PresidentCommented:

and BTW, this:

MsgBox "The total for " & rs!PatientName & " for the " & rs!CountofAppointmentDate & "is " & rs!PatientID

looks wrong.  Think it should be:

MsgBox "The total for " & rs!PatientName & " is " & rs!CountofAppointmentDate

  and why not just a DCount() or is it because of the patient name?

also for this, you don't need to return the first / last name as seperate fields, but rather simply:

SELECT Appointments.AppointmentID, Count(Appointments.AppointmentDate) AS CountOfAppointmentDate, Appointments.AppointmentKept, patients.PatientID, [FirstName] & " " & [LastName] AS PatientName
FROM patients INNER JOIN Appointments ON patients.PatientID = Appointments.PatientID
GROUP BY Appointments.AppointmentID, Appointments.AppointmentKept, patients.PatientID
HAVING (((Count(Appointments.AppointmentDate))<Date()) AND ((Appointments.AppointmentKept)=No) AND ((patients.PatientID)=[Forms]![Form6]![PatientId]));

JimD.
0
 
DatabaseMX (Joe Anderson - Microsoft MVP, Access and Data Platform)Commented:
I need to correct my last post:



Function FixLabels()
    If Not IsNull(DLookup("PatientID", "Qry_OverdueAppointments")) Then
       With .OpenRecordset("Qry_OverdueAppointments")
             .MoveLast  ' get record count
       MsgBox "The total for " & ![PatientName] & " for the " & ![CountofAppointmentDate] & "is " & ![PatientID]
     End With
   
        Forms!Form6!OverdueLab.FontBold = True
        Forms!Form6!OverdueLab.ForeColor = 195
   Else
        Forms!Form6!OverdueLab.FontBold = False
        Forms!Form6!OverdueLab.ForeColor = 0
    End If
End Function
0
 
coconuttAuthor Commented:
mx the last bit of code indicates in valid reference.

 JDettman: yours worked, thank you. Yes I didnt ust dcount because of the patient name. But I really need to display the count of un-kept appointments.
0
 
DatabaseMX (Joe Anderson - Microsoft MVP, Access and Data Platform)Commented:
"mx the last bit of code indicates in valid reference. "
See my correct post just below that.  It works ... I tested it.

mx
0
 
DatabaseMX (Joe Anderson - Microsoft MVP, Access and Data Platform)Commented:
And see http:#a35085322  using the Eval() function in your SQL.  That also works.

mx
0
 
Jim Dettman (Microsoft MVP/ EE MVE)PresidentCommented:
<<But I really need to display the count of un-kept appointments. >>

  This is what you want then:

SELECT patients.PatientID, Last([FirstName] & " " & [LastName]) AS PatientName,
Count(Appointments.AppointmentDate) AS CountOfAppointmentDate
FROM patients INNER JOIN Appointments ON patients.PatientID = Appointments.PatientID
WHERE Appointments.AppointmentDate<Date() AND Appointments.AppointmentKept=No AND patients.PatientID =[Forms]![Form6]![PatientId]
GROUP BY patients.PatientID;

and

Function FixLabels()

  Dim dbs As Database
  Dim rs As Recordset
  Dim qdef As QueryDef
  Dim prm as Parameter

   If Not IsNull(DLookup("PatientID", "Qry_OverdueAppointments")) Then
        Set dbs = CurrentDb
        Set qdef = db.QueryDefs("Qry_OverdueAppointments")
        For Each prm in qdf.Parameters
          prm.Value = Eval(prm.Name)
        Next prm
        Set rs =  qdef.OpenRecordset()  
        MsgBox "The total for " & rs!PatientName & " is " & rs!CountofAppointmentDate
        rs.Close
        Set prm = Nothing
        Set qdf = Nothing
        Set rs = Nothing
        Set dbs = Nothing
 
       Forms!Form6!OverdueLab.FontBold = True
        Forms!Form6!OverdueLab.ForeColor = 195
   Else
        Forms!Form6!OverdueLab.FontBold = False
        Forms!Form6!OverdueLab.ForeColor = 0
    End If

End Function

0
 
Jim Dettman (Microsoft MVP/ EE MVE)PresidentCommented:

BTW, this would be better:

Function FixLabels()

  Dim dbs As Database
  Dim rs As Recordset
  Dim qdef As QueryDef
  Dim prm as Parameter

  Set dbs = CurrentDb
  Set qdef = db.QueryDefs("Qry_OverdueAppointments")
  For Each prm in qdf.Parameters
      prm.Value = Eval(prm.Name)
  Next prm
  Set rs =  qdef.OpenRecordset()  
  If rs.recordCount>0 then
        MsgBox "The total for " & rs!PatientName & " is " & rs!CountofAppointmentDate
 
        Forms!Form6!OverdueLab.FontBold = True
        Forms!Form6!OverdueLab.ForeColor = 195
   Else
        Forms!Form6!OverdueLab.FontBold = False
        Forms!Form6!OverdueLab.ForeColor = 0
    End If

    rs.Close
    Set prm = Nothing
    Set qdf = Nothing
    Set rs = Nothing
    Set dbs = Nothing

End Function

  Your not executing the query 2X that way.

JimD.
0
 
DatabaseMX (Joe Anderson - Microsoft MVP, Access and Data Platform)Commented:
Well ... one-more-time:


Function FixLabels()
    If Not IsNull(DLookup("PatientID", "Qry_OverdueAppointments")) Then
       With CurrentDB.OpenRecordset("Qry_OverdueAppointments")
             .MoveLast  ' get record count
       MsgBox "The total for " & ![PatientName] & " for the " & ![CountofAppointmentDate] & "is " & ![PatientID]
     End With
   
        Forms!Form6!OverdueLab.FontBold = True
        Forms!Form6!OverdueLab.ForeColor = 195
   Else
        Forms!Form6!OverdueLab.FontBold = False
        Forms!Form6!OverdueLab.ForeColor = 0
    End If
End Function
0

Featured Post

What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

  • 6
  • 5
  • 5
  • +3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now