** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Error consulta SQL pocos parámetros
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoError consulta SQL pocos parámetros

 Responder Responder
Autor
Mensaje
koldo Ver desplegable
Habitual
Habitual
Avatar

Unido: 12/Febrero/2008
Estado: Sin conexión
Puntos: 58
Enlace directo a este mensaje Tema: Error consulta SQL pocos parámetros
    Enviado: 25/Marzo/2019 a las 23:05
Hola a todos
A ver si me pueden ayudar

Tengo un form que en el quiero ejecutar una consulta para que luego me muestre un campo de esa consulta  pero me error 3061 pocos parámetros. se esperaba 2

Private Sub Cmd16_Click()
Dim db as database, rs As Recordset
Dim strSQL As String, Dim intCnt As Integer

strSQL = "SELECT IdEmpG, FchaG, GuardTH FROM Guard WHERE (([FchaG]=[Forms]![Cal]![Fecha]) AND ([GTH]=[Forms]![Emp]![TH]))"

Set db = CurrentDb()
Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)

intCnt = DCount("*", "strSQL")

El cmd16 esta en el form Cal y el form Emp esta abierto debajo del form Cal

Muchas gracias
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: en línea
Puntos: 13125
Enlace directo a este mensaje Enviado: 25/Marzo/2019 a las 23:37
Hola,

Ahí veo varias cosas...

1. La asignación del recordset parece ser la que arroja el error. Pon un punto de interrupción en el código. Ejecuta paso a paso. Al pasar la línea de asignación de la variable strSQL, recupera su valor desde la ventana de inmediato y analiza si es correcta. La puedes copiar  y pegar para probarla.
2. Yo prefiero que la SQL, en la WHERE, se construya concatenando. Esos [Forms] por ahí en medio no me acaban de convencer. El "problema" es que los criterios debe construirse con cuidado.
strSQL = "SELECT ...... WHERE FchaG = #" & Format(Me!Fecha, "mm/dd/yyyy") & "# AND GTH = " & Forms("Emp")!TH
En este punto es dónde podría producirse algún error si el control TH contiene algun valor decimal.
3. (buenas prácticas) Declarar las variables mejor. me refiero a que las variables db y rs deberian ir con el prefijo adecuado: DAO. Con eso evitas que, si algún día marcaras la referencia a ADO, el sistema no tendría dudas:
Dim db As DAO.Database, rs As DAO.Recordset
4. Si db es la propia base de datos, no seria necesario utilizar la variable. En la asignación del recordset se cambia a CurrentDb y listo:
Set rs = CurrentDb.OpenRecordset(...)
5. intCnt =DCount("*", "strSQL")
Aquí me matas. Entiendo que esa línea pretende devolver la cuenta de registros de la SQL que hemos creado.
5.1. Esa instrucción devolverá la cuenta de registros de una consulta/tabla llamada strSQL... cosa que me temo que no tenemos y, de tenerla, no tiene nada que ver con lo que hemos hecho hasta ahora
5.2. Un DCount no funciona contra una SQL. Debes apuntar a una tabla o a una consulta existente.
5.3. Para contar registros tienes 2 opciones: 
5.3.1. Una consulta de totales
5.3.2. Un DCount sobre la tabla aplicando criterios.

En definitiva, todo ese código podría (si lo he interpretado bien) ser sustituible por esta línea:

intCnt = DCount("*", "Guard", "FchaG = #" & Format(Me!Fecha, "mm/dd/yyyy") & "# AND GTH = " & Forms("Emp")!TH)


Un saludo (y perdón por el ladrillo)
Xavi, un minyó de Terrassa

Mi web
Arriba
koldo Ver desplegable
Habitual
Habitual
Avatar

Unido: 12/Febrero/2008
Estado: Sin conexión
Puntos: 58
Enlace directo a este mensaje Enviado: 26/Marzo/2019 a las 22:16
Hola Xavi
De ladrillo nada, ha sido de mucha ayuda y muy instructivo al menos para mi y funciona perfectamente.
Dim rs as DAO.Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)
El TH es texto y lo he dejado así
strSQL = "SELECT ...... WHERE FchaG = #" & Format(Me!Fecha, "mm/dd/yyyy") & "# AND GTH = '" & Forms("Emp")!TH & "'"
Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)

Quiero que me muestre el valor IdEmpG y he hecho lo siguiente

Dim X as string
X = rs("IdEmpG")
MsgBox X

El problema que tengo ahora es que cuando no hay registros me da un error 

Saludos 
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 11809
Enlace directo a este mensaje Enviado: 27/Marzo/2019 a las 09:00
Controla la existencia de registros con EOF:

Do Until Rs.EOF
    ... aqui mis instrucciones
    Rs.MoveNext
Loop
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
koldo Ver desplegable
Habitual
Habitual
Avatar

Unido: 12/Febrero/2008
Estado: Sin conexión
Puntos: 58
Enlace directo a este mensaje Enviado: 27/Marzo/2019 a las 22:22
Muchas gracias por el aporte a los dos, es un placer contar con vuestro apoyo 

al final lo he dejado así:

Dim db As DAO.Database, rs As DAO.Recordset
Dim intCnt As Integer
Dim strSQL, X As String

intCnt = DCount("*", "Guard", "FechaG = #" & Format(Me!Fecha, "mm/dd/yyyy") & "# AND GuardiaTH = '" & Forms("Emp")!TH & "'")

If intCnt >= 1 Then
    strSQL = "SELECT IdEmpG, FchaG, GuardTH FROM Guard WHERE FchaG = #" & Format(Me!Fecha, "mm/dd/yyyy") & "# AND GuardTH = '" & Forms("Emp")!TH & "'"
    Set db = CurrentDb
    Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)
    Do Until rs.EOF
        X = rs("IdEmpG")
        rs.MoveNext
    Loop
    MsgBox  X 
   
    rs.Close: Set rs = Nothing
    db.Close: Set db = Nothing

    DoCmd.CancelEvent
    Exit Sub
Else
........
Se puede cerrar este hilo
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable