Solved

runtime error 3061 too few parameters expected one

Posted on 2011-03-09
20
501 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
  • 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
 
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 57
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
U.S. Department of Agriculture and Acronis Access

With the new era of mobile computing, smartphones and tablets, wireless communications and cloud services, the USDA sought to take advantage of a mobilized workforce and the blurring lines between personal and corporate computing resources.

 
LVL 57
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 57
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 57
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 57

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

Complete VMware vSphere® ESX(i) & Hyper-V Backup

Capture your entire system, including the host, with patented disk imaging integrated with VMware VADP / Microsoft VSS and RCT. RTOs is as low as 15 seconds with Acronis Active Restore™. You can enjoy unlimited P2V/V2V migrations from any source (even from a different hypervisor)

Question has a verified solution.

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

In Debugging – Part 1, you learned the basics of the debugging process. You learned how to avoid bugs, as well as how to utilize the Immediate window in the debugging process. This article takes things to the next level by showing you how you can us…
I see at least one EE question a week that pertains to using temporary tables in MS Access.  But surprisingly, I was unable to find a single article devoted solely to this topic. I don’t intend to describe all of the uses of temporary tables in t…
Familiarize people with the process of utilizing SQL Server views from within Microsoft Access. Microsoft Access is a very powerful client/server development tool. One of the SQL Server objects that you can interact with from within Microsoft Access…
With Microsoft Access, learn how to specify relationships between tables and set various options on the relationship. Add the tables: Create the relationship: Decide if you’re going to set referential integrity: Decide if you want cascade upda…

919 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

Need Help in Real-Time?

Connect with top rated Experts

19 Experts available now in Live!

Get 1:1 Help Now