Asignar el campo de una consulta a una variable

Me urge. Tengo un formulario con un procedimiento de evento en un campo que se ejecuta al hacer clic. Dentro de este procedimiento intento poner un IF con una variable cuyo resultado es un campo en una consulta de agrupación (el campo en cuestión "cuenta" registros). Si no hay registros a contar el resultado del campo es igual a 0 y, sino, el resultado es diferente a 0. ¿Cómo puedo conseguir que el "If Campo = 0 then" del procedimiento me reconozca el valor del campo de esta consulta?

3 respuestas

Respuesta
1
Este ejemplo:
Este ejemplo muestra el número de empleados y el promedio de los salarios y el máximo.
Sub SelectX3()
Dim dbs As Database, rst As Recordset
' Modifique esta línea para incluir la ruta de
' acceso a la base de datos Neptuno en su equipo.
Set dbs = OpenDatabase("Neptuno.mdb")
' Cuenta el número de empleados, calcula el
' promedio de los salarios y devuelve el más alto.
Set rst = dbs.OpenRecordset("SELECT Count (*) " _
& "AS TotalEmpleados, Avg(Salario) " _
& "AS PromedioSalario, Max(Salario) " _
& "AS SalarioMáximo FROM Empleados;")
' Llena el Recordset.
Rst. MoveLast
' Llama a EnumCampos para imprimir el contenido del
' Recordset. Transfiere el objeto Recordset y el
' tamaño de campo deseado.
EnumCampos rst, 17
Dbs. Close
End Sub
El procedimiento Sub EnumCampos se transfiere a un objeto Recordset desde el procedimiento que llama. El procedimiento da formato e imprime los campos del Recordset en la ventana Debug. La variable intLonCmp tiene el tamaño de campo impreso deseado. Algunos campos se podrían truncar.
Sub EnumCampos(rst As Recordset, intLonCmp As Integer)
Dim lngRegistros As Long, lngCampos As Long
Dim lngContadorReg As Long, lngContadorCmp As Long
Dim strTítulo As String, strTemp As String
' Establece en la variable lngRegistros el número
' de registros del Recordset.
lngRegistros = rst.RecordCount
' Establece en la variable lngCampos el número de
' campos del Recordset.
lngCampos = rst.Fields.Count
Debug.Print "Hay " & lngRegistros _
& " registros que contienen " & lngCampos _
& " campos en el recordset."
Debug.Print
' Genera una cadena para imprimir el encabezado de la columna.
strTítulo = "Registro "
For lngContadorCmp = 0 To lngCampos - 1
strTítulo = strTítulo _
& Left(rst.Fields(lngContadorCmp).Name _
& Space(intLonCmp), intLonCmp)
Next lngContadorCmp
' Imprime el encabezado de la columna.
Debug.Print strTítulo
Debug.Print
' Hace un bucle entre el Recordset; imprime el
' número de registro y los valores del campo.
rst.MoveFirst
For lngContadorReg = 0 To lngRegistros - 1
Debug.Print Right(Space(6) & _
Str(lngContadorReg), 8) & " ";
For lngContadorCmp = 0 To lngCampos - 1
' Comprueba los valores Null.
If IsNull(rst.Fields(lngContadorCmp)) Then
strTemp = "<null>"
Else
' Establece en strTemp el contenido del campo.
Select Case _
rst.Fields(lngContadorCmp).Type
Case 11
strTemp = ""
Case dbText, dbMemo
strTemp = _
rst.Fields(lngContadorCmp)
Case Else
strTemp = _
str(rst.Fields(lngContadorCmp))
End Select
End If
Debug.Print Left(strTemp _
& Space(intLonCmp), intLonCmp);
Next lngContadorCmp
Debug.Print
rst.MoveNext
Next lngContadorReg
End Sub
Henrry,
Continua pidiendo, al compilar, un "case" seleccionando la instrucción "count" en negrita.
Te adjunto el código para ver si encuentras el motivo.
Dim x
select Count(*) as control
from pepe
into x
If x = 0 Then
MsgBox "no hay valor"
Else
MsgBox "existe mas de un valor"
End If
Atentamente,
Midma
Tendrías que crear primero la consulta así:
dim x
select count(*) from cliente
into x
luego si hago la validación:
if x = 0 then
else
x = 1
end if
Más o menos es la idea delo que debes hacer.
Hola Henrry,
La instrucción "count" da:
"Error de compilación.
Se esperaba: Case".
¿Sabes a lo que se refiere?
Atentamente,
Midma
Prueba así:
SELECT Count(*) AS cantidad
FROM productos;
Hola Henrry,
Agradezco tu colaboración. Espero que me sirva para entender lo que significa un "case". Has de saber, no obstante, que ya he podido resolver la duda que planteaba.
De todos modos gracias otra vez.
Atentamente,
Midma
Respuesta
1
Suponiendo que tengas access2000 o superior (no me has contestado):
Sustituyes:
valori = "control""pepe"
por:
Dim rs As ADODB.Recordset
Set rs = CurrentProject.Connection.Execute("select pepe from control")
valori = rs!pepe
De todas formas, también hay una función dcount que puedes usar en cualquier version de access, esta cuenta registros de tablas y consultas, sería algo como
valori=dcount("*","tabla";"criterios")
En criterios pones lo mismo que en una clausula where de SQL (sin incluir la palabra clave where)
Hola soria4xse
Tienes razón y disculpa. Mi versión de access es 2000 y me ha funcionado perfectamente. Te agradezco el tiempo y la dedicación que me has prestado. Te pediría, no obstante, y ya que tengo resuelto el problema y que con la ayuda del office no termino de aclarar, que si pudieses me aclarases, a partir de mi interpretación, lo que indica el código que me has facilitado.
Mi interpretación es la siguiente:
"Dim rs As ADODB.Recordset" rs es un lugar donde grabar donde ¿ADODB és ...?
"Set rs = CurrentProject.Connection.Execute("select pepe from control")" ¿selecciona rs que será igual a el proyecto actual conectado y ejecutado de la consulta control y el campo pepe?
"valori = rs!pepe" que "valori" es igual a rs lo entiendo lo que no entiendo es que significa "!pepe".
De todos modos gracias otra vez.
Atentamente,
Midma
PD: mi correo es [email protected]
Cópiame aquí el procedimiento de evento que tienes hasta ahora para poder hacerme una idea.
También necesito saber que version de access usas
para ver si el código de acceso a datos que necesitas te lo debo hacer en DAO o ADO
(A partir de Access 2000, o sea en Access XP y Access 2003 -este no lo tengo pero lo supongo- se usa el ADO por defecto)
Respuesta
1
A ver tengo una duda, ¿cuándo dices que el "If Campo = 0 then" del procedimiento me reconozca el valor del campo de esta consulta?
Si te olvidas un momento del if, ¿campo tiene algún valor después de la consulta?, esto lo puedes saber si hacer por ejemplo msgbox campo
Es que sino toma ningún valor es que la consulta no devuelve nada y entonces el if no te funciona.
Hola keok,
Te agradezco el tiempo y la dedicación que me has prestado. Me ha dado un problema en "set bda=currenDB" donde dice que "error tipo 13" "no coinciden los tipos". No obstante ya tengo resuelto el "if" reconociendo "valori" el valor de la consulta.
Gracias otra vez.
Atentamente,
Midma
Hoa Keok
El procedimiento es el siguiente:
Private Sub Procesaltaparametres_Click()
On Error GoTo Err_Procesaltaparametres_Click
Dim valori As Integer
valori = "control""pepe"
MsgBox valori
If valori = 0 Then
MsgBox "no hay valor"
Else
MsgBox "existe mas de un valor"
End If
Exit_Procesaltaparametres_Click:
Exit Sub
Err_Procesaltaparametres_Click:
MsgBox Err.Description
Resume Exit_Procesaltaparametres_Click
Donde "valori" tendría que recoger el valor del campo "control" de la consulta "pepe". El campo "control" es el resultado de "cuenta" (si no hay ningún valor pone 0 y si hay los cuenta). ¿Cómo debo escribir los campos de la consulta "pepe" para que me los reconozca "valori"?
Atentamente,
midma
End Sub
A ver si es esto lo que necesitas, siento no haberte contestado antes pero no he tenido tiempo.
Private Sub Procesaltaparametres_Click()
On Error GoTo Err_Procesaltaparametres_Click
Dim valori As Integer
Dim dba, rsa
set dba=CurrenDb
set rsa=dba.openrecordset("Select count(control)as valor from nombredetutabla ")
valori=rsa!valor
rsa.close
dba.close
If valori = 0 Then
MsgBox "no hay valor"
Else
MsgBox "existe mas de un valor"
End If
Exit_Procesaltaparametres_Click:
Exit Sub
Err_Procesaltaparametres_Click:
MsgBox Err.Description
Resume Exit_Procesaltaparametres_Click
End Sub
Bueno esto: ("Select count(control)as valor from nombredetutabla ") lo puedes cambiar y poner el select de tu consulta pepe.
1 saludo de keok.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas