Solved

runtime error 3061 too few parameters expected one

Posted on 2011-03-09
20
505 Views
Last Modified: 2013-11-27
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
Comment
Question by:coconutt
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 6
  • 5
  • 5
  • +3
20 Comments
 
LVL 17

Expert Comment

by:JezWalters
ID: 35084058
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
 
LVL 74

Expert Comment

by:Jeffrey Coachman
ID: 35084066
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
 

Author Comment

by:coconutt
ID: 35084369
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
SharePoint Admin?

Enable Your Employees To Focus On The Core With Intuitive Onscreen Guidance That is With You At The Moment of Need.

 
LVL 74

Expert Comment

by:Jeffrey Coachman
ID: 35084810
Well,  ...is this form open and is a value entered into the PatientId control, at the time the recordset is being created?
0
 

Author Comment

by:coconutt
ID: 35084839
The form is open, and the patient record is visible.
0
 
LVL 58
ID: 35084982

 Is the form really called Form6?

JimD.
0
 

Author Comment

by:coconutt
ID: 35085048
yes the form is really called form6 ( I always meant to rename)
0
 
LVL 1

Expert Comment

by:kavik379
ID: 35085085
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
 

Author Comment

by:coconutt
ID: 35085136
tried that, nothing new. Look at image please
objvar.bmp
0
 
LVL 75
ID: 35085322
In Your SQL, Try changing:

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

To

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

mx
0
 
LVL 58
ID: 35085377
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
 
LVL 75
ID: 35085423
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
 
LVL 58
ID: 35085453

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
 
LVL 75
ID: 35085502
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
 

Author Comment

by:coconutt
ID: 35085581
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
 
LVL 75
ID: 35085603
"mx the last bit of code indicates in valid reference. "
See my correct post just below that.  It works ... I tested it.

mx
0
 
LVL 75
ID: 35085616
And see http:#a35085322  using the Eval() function in your SQL.  That also works.

mx
0
 
LVL 58
ID: 35085765
<<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
 
LVL 58

Accepted Solution

by:
Jim Dettman (Microsoft MVP/ EE MVE) earned 500 total points
ID: 35085801

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
 
LVL 75
ID: 35085843
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

Salesforce Has Never Been Easier

Improve and reinforce salesforce training & adoption using WalkMe's digital adoption platform. Start saving on costly employee training by creating fast intuitive Walk-Thrus for Salesforce. Claim your Free Account Now

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

It’s been over a month into 2017, and there is already a sophisticated Gmail phishing email making it rounds. New techniques and tactics, have given hackers a way to authentically impersonate your contacts.How it Works The attack works by targeti…
Microsoft Access is a place to store data within tables and represent this stored data using multiple database objects such as in form of macros, forms, reports, etc. After a MS Access database is created there is need to improve the performance and…
In Microsoft Access, learn how to “cascade” or have the displayed data of one combo control depend upon what’s entered in another. Base the dependent combo on a query for its row source: Add a reference to the first combo on the form as criteria i…
With Secure Portal Encryption, the recipient is sent a link to their email address directing them to the email laundry delivery page. From there, the recipient will be required to enter a user name and password to enter the page. Once the recipient …

617 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question