La verdad es que no entendi muy bien que es lo que queres hacer, si no me decis va a estar jodido.
Ahora bien en tu codigo tenes
No tenes campos aunque abajo decis que tenes .
Código:
rs.Open StrSql, cn, adOpenDynamic, adLockOptimistic
Aclaranos esto.
Ahora bien, por lo que entendi del codigo, lo que vos tenes son varios "option" el circulito del multiple chooise.
Bueno el codigo que tenes es muy repetitivo, ademas que usas varios objetos para un mismo trabajo.
Lo que te recomiendo es hacer lo siguiente antes de buscar el error que te tira.
Nº1 - Borra todos los option que tenes.
Pone un Option1 nuevo y renombralo a "OptDatos" (Ponele el nombre que quieras, yo use ese de ejemplo).
Luego agrega otro y ponele TAMBIEN "OptDatos", si le pusiste otro nombre al primero, ponele el mismo nombre.
Cuando haces eso, te va a saltar un cartel diciendote que "ya existe un objeto con ese nombre ¿desea crear una matriz de cotrol?".
Vos dale que si.
Luego segui agregando objetos con el mismo nombre.
Como notaras ahora tenes objetos como OptDatos(0) - OptDatos(1)-OptDatos(2)- etc...
El (Numero) -> (0)-(1)-(2)-etc. son el Index.
Al hacer esto vos tenes 1 OBJETO, pero VISIBLEMENTE o VISUALMENTE vemos varios.
Cada uno de esos OBJETOS VISUALES tiene un INDEX, dado que ¿Como hago para escribirle un codigo particular a cada uno?.
Bueno por medio del index podemos hacerlo, dado que si te das cuenta al hacerles click lo unico que ves es
Código:
Private Sub OptDatos(Index As Integer)
End Sub
Bueno a este Index, que parece que nos fuera a incomodar la vida, en realidad le vamos sacar provecho y nos vamos a facilitar las cosas, tanto en codigo como en organizarnos.
Asi no nos complicamos tanto la vida.
Suponiendo que el
OptCodId, lo reemplazaste por OptDatos(0)
OptApe, lo cambiaste por OptDatos(1)
OptNom, tambien fue cambiado por OptDatos(2)
Y finalmente OptTel fue intercambiado por OptDatos(3)
Podemos usar en el Boton Consultar o en la funcion "CargarGrilla" poner el siguente codigo:
Código:
Private Function CargarGrilla(Index As Integer)
Dim Cade As String
Cade = "1234567890"
Select Case Index
Case 0
If txtOpcion = Empty Then
StrSql = "Select id, Nombre, Apellido, Telefono, Direccion, Fecha de Alta from Personas"
Else
If Not IsNumeric(Me.txtOpcion) Then
StrSql = "Select id, Nombre, Apellido, Telefono,Direccion, Fecha de Alta from Personas" & Me.txtOpcion.Text
Else
MsgBox "El codigo de cliente solo puede ser numérico", vbInformation, "RMC Systems"
txtOpcion = Empty
txtOpcion.SetFocus
End If
End If
Case 1
If txtOpcion = Empty Then
StrSql = "Select id, Nombre, Apellido, Telefono, Direccion, Fecha de Alta from Personas"
Else
StrSql = "Select id, Nombre, Apellido, Telefono, Direccion, Fecha de Alta from personas where apellido like '%" & txtOpcion.Text & "%'"
End If
Case 2
'StrSql = "Select id, Nombre, Apellido, Telefono, Direccion, Fecha de Alta from personas where fechahora like '" & Fecha & "%'"
StrSql = "Select id, Nombre, Apellido, Telefono, Direccion, Fecha de Alta from personas where Nombre='" & Nombre.Text & "'"
Case 3
StrSql = "Select id, Nombre, Apellido, Telefono, Direccion, Fecha de Alta from personas where Telefono ='" & txtOpcion.Text & "'"
End Select
rs.Open StrSql, Cn, adOpenDynamic, adLockReadOnly
grilla.Clear
grilla.Rows = 1
grilla.FormatString = "ID | Nombre |Apellido | Teléfono | Direccion | Fecha de Alta "
Do While Not rs.EOF
grilla.AddItem rs!id & vbTab & rs!Nombre & vbTab & rs!Apellido & vbTab & rs!Telefono & vbTab & rs!Direccion & vbTab & rs!Fecha_de_Alta
rs.MoveNext
Loop
rs.Close
End Function
Bueno, algunas respuestas antes de que preguntes porque seguro las vas a hacer.
Código:
If Not IsNumeric(Me.txtOpcion) Then
IsNumeric(Variable) ... es una funcion de Visual basic, que retorna True o False y verifica si es numerico o no el campo o variable.
Ejemplo. Si text1.text = "121211" o "000000" o "
-214411" ---> True
Si text1.text = "Pepe123" o "Juan2003" o "Juan morales"----> False
Esta función, reconoce inclusive numeros negativos que tienen el ' - ' como signo negativo.
Ahora ¿Como funciona?.
Bueno, si ponemos
Código:
Dim AAA As String
Text1.Text = "123456"
AAA= IsNumeric(Text1)
la variable AAA, va a tener "True."
Ahora en el IF, nosotros no asiganos a ninguna variable el IsNumeric, sin embargo el Valor te lo da.
Ese "true o false" que devuelva, esta en el IF por unos instantes, para que se haga la evaluacion
Ahora lo que "VE" el compilador en realidad es esto.
Código:
If Not IsNumeric(Me.txtOpcion) = True Then
Junto con el "Not", la frase en "castellano" o "logicamente" vendria a ser:
Si NO es Numerico ENTONCES ....
Tu codigo Original, no es muy necesario
Código:
If InStr(Cade, Right(Me.txtOpcion, 1)) <> 0 Then
Antes que nada, te recalco que el "<>" puede ser reemplazado por un "Not" adente del If y un "=" en donde pones el "<>"
Lo que evalua es si el PRIMERO de los numeros es un numero.
Ahora ¿Que pasaria si escribo "123pepe" ? eso funcionaria.
En el remoto caso que tu "CodId" se componga de numeros y letras, sin incluir signos podrias usar lo siguiente
Código:
Cade = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
If Not InStr(Cade, Trim(Me.txtOpcion)) = 0 Then Asi de esta Manera, tu codigo solo acepta Numeros y Letras y no tolera signos o simbolos.
Si usas codigos como "AFR-344" AGREGALE EL ' - '
ASI;
Cade = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLM NOPQRSTUVWXYZ
-"
Otra de las cuestiones. Vos agregas el ".text" al final de cada textbox.
Los objetos tienen un "option default", esto quiere decir que cuando escribis el nombre del objeto:
Ejmplo; "Text1"
No es necesario escribir el "option default" para el los "texbox" como los "text1" o "txtOption" o todo lo que sea texbox (cuadro de texto) el "option default" es el ".text1".
Por ello, escribir
Text1.text = "pepe"
es lo mismo que escribir
Text1 = "pepe"
Lo Importante.
Como veras yo reemplace, todos los IF de los 'Option', por un Select Case Index.
Bueno, como habiamos dicho los OptDatos o como los hayas llamado, se manejaban por un "Index".
En el cabezal de la funcion puse un argumento que se llama "index" tambien aunque lo pude haber llamdo "pepe", "a", "VariableLoca",etc...
A lo que me refiero a "Cabezal" y "Argumentos" es:
Código:
Private Function CargarGrilla(Index As Integer)
Lo subrayado es "Cabezal" y lo que esta entre parentesis es "Argumento".
Cuando llamas a la funcion, por ejemplo desde el Command1 pones
Código:
Private Sub Command1_Click()
CargarGrilla 1
End Sub Cuando haces eso, llama a la funcion y automaticamente la variable "Index" en la funcion vale "1", si le hubieramos puesto "2000" en el Command1, cuando llamamos a la funcion, luego la variable Index valdria "2000".
Lo mejorcito, que se podria hacer para que esta funcion funcione bien seria en el Comman1 o en el boton que usas o objeto que usas para llamar a la funcion poner:
Código:
Private Sub Command2_Click()
Dim i As Byte
For i = 1 To OptDatos.Count
If OptDatos = True Then CargarGrilla i
Next i
End Sub
Una de las cosas que no entendi es porque en el "optNom" ahora llamado OptDatos(2)
Que esta en el "Case 2", donde estaba el "If OptNom = True". pones:
'StrSql = "Select id, Nombre, Apellido, Telefono, Direccion, Fecha de Alta from personas where fechahora like '" & Fecha & "%'"
Si era "Nom" = "Nombre" vos pones "WHERE FECHAHORA LIKE..." ???.
No tiene sentido que si buscan por "Nombre", la consulta se haga por "fechas".
Ademas cuando Buscas un dato presiso, te recomiendo que pongas " WHERE NOMBRE= ' ' "
Porque por ejemplo, con los nombres una vez tuve problemas con
"Juan".
"
Juanicio".
Un nombre es "Parte" de otro nombre, entonces cuando haces la consultas y buscar nombres por "Juan" te sale "Juanicio" o demas.
Si tambien
"Maxi" por lo general, como los campos no son de muchos caracteres, a ese nombre se hace la excepción y se lo abrevia,
Entonces al poner "LIKE" y no usar = ' '.
Te saldrian
"
Maximiliano"
"
Maximo"
Sin tomar en cuenta que algunos figuran en los documentos como MAX, como nombre completo y si tenes algun MAX en la base de datos, te salen "maximiliano" y "maximo".
Por ello usar "LIKE" para por ejemplo "Materiales de una fabrica" seria lo mas elocuenta, incluso es mejor usar LIKE que usar = ' ', en ese caso.
Sin embargo con nombres es mejor hacer la busqueda directa con " = ' nombre ' ".
Lo mismo para los telefonos y/o datos de una Persona.
Con los registros de personas, te recomiendo evitar en lo posible, usar el LIKE, ahora si es para productos, para consultar las regiones de un mapa, para hacer la consulta sobre una flota de autos.
Para la division de tareas de un sector de empresas, etc.
Al no ser Datos de personas, si queres usa LIKE, pero con personas te recomiendo no usarlo por una cuestion de "buena gestion de consulta de datos".
RECORDATORIO.
Subi el proyecto y pasamelo y tambien fijate la linea del "Rs.open" que en tu codigo que nos pasaste, esta vacia.