Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Error 3001

Estas en el tema de Error 3001 en el foro de Visual Basic clásico en Foros del Web. Que tal de nuevo aqui consultandolos estoy realizando una consulta q con ayuda de gente de este foro he logrado ir avanzando pero ahora me ...
  #1 (permalink)  
Antiguo 11/06/2008, 12:56
 
Fecha de Ingreso: abril-2008
Mensajes: 281
Antigüedad: 16 años, 1 mes
Puntos: 1
Error 3001

Que tal de nuevo aqui consultandolos estoy realizando una consulta q con ayuda de gente de este foro he logrado ir avanzando pero ahora me marca un error

3001 "argumentos incorrectos, fuera del intervalo permitido o en conflicto con otros y me lo señala en esta parte del codigo

En esta parte de mi codigo ojala alguien me pueda ayudar de antemano muchas gracias

Código:
Private Sub Combo1_Click()
RecBD.AbsolutePosition = Combo1.ItemData(Combo1.ListIndex)
End Sub
Saludos
  #2 (permalink)  
Antiguo 12/06/2008, 00:47
Avatar de Txoco  
Fecha de Ingreso: junio-2008
Ubicación: Perdido en tierras Quijotescas
Mensajes: 189
Antigüedad: 15 años, 11 meses
Puntos: 7
Respuesta: Error 3001

Dependiendo de a qué tipo de base de datos estés accediendo, es posible que no puedas establecer la propiedad AbsolutePosition porque sea de sólo lectura.

Si quieres cambiar de registro, deberías utilizar los métodos Find* o Move* del recordset, que también funcionarán dependiendo del gestor de base de datos y de la definición con que hayas abierto el recordset.
  #3 (permalink)  
Antiguo 12/06/2008, 04:14
Colaborador
 
Fecha de Ingreso: enero-2008
Ubicación: Unas veces aquí, otras veces allí
Mensajes: 1.482
Antigüedad: 16 años, 3 meses
Puntos: 37
Respuesta: Error 3001

Tiene razón Txoco, seguramente estás haciendo la conexión a la base de datos con ODBC que no admite la propiedad AbsolutePosition.
Tendrías que conectar mediante OLE DB o buscar una solución alternativa, como te sugiere Txoco.

  #4 (permalink)  
Antiguo 12/06/2008, 13:29
 
Fecha de Ingreso: abril-2008
Mensajes: 281
Antigüedad: 16 años, 1 mes
Puntos: 1
Respuesta: Error 3001

Que tal Gracias por sus respuestas la base de datos q ocupo es MySql y bueno la conexion la hago con puro codigo sin control ADO o Data, por lo q no se si me acepte la propiedad AbsolutePosicition, y bueno investigare otra alternativa y si por hay tuvieran algun ejemplo o link para saber como funciona el Find y Move se los agradeceria mucho.

Saludos y Gracias por la ayuda
  #5 (permalink)  
Antiguo 12/06/2008, 17:31
Avatar de Txoco  
Fecha de Ingreso: junio-2008
Ubicación: Perdido en tierras Quijotescas
Mensajes: 189
Antigüedad: 15 años, 11 meses
Puntos: 7
Respuesta: Error 3001

Hola de nuevo!

A mí me sucede que en ocasiones trabajo contra una base de datos cuyo ODBC no me permite el uso de AbsolutePosition, que me devuelve siempre -1, por lo que ni siquiera me sirve como referencia.

Los métodos Move (MoveFirst, MovePrevious, MoveNext y MoveLast) te permiten desplazarte incondicionalmente por el recordset y no requieren parámetros: si quisieras recorrer el recordset entero de principio a fin, tendrías que hacer algo como:

Código:
    RecBD.MoveFirst
    Do While Not RecBD.EOF
        .... ' Aquí haces cosas con el registro actual
        RecBD.MoveNext
    Loop
¡Pero con cuidado! Si al abrir el recordset lo has creado como "ForwardOnly" (necesitamos saber cómo has creado RecBD para explicártelo mejor), no podrás utilizar MoveFirst ni MovePrevious.

Por cierto: MoveFirst va al primer registro, MovePrevious al anterior al actual, MoveNext al siguiente al actual y MoveLast al último de todos. También tienes el método Move a secas, que te permite avanzar o retroceder el número de registros que quieras: RecBD.Move(-3) retrocede tres registros, y RecBD.Move(1) es exactamente lo mismo que RecBD.MoveNext.

El método Find te permite buscar un registro concreto dándole una condición, que es igual que lo que pondrías en el WHERE de una instrucción SQL, pero sin el "WHERE", por ejemplo:

Código:
    RecBD.Find("codigo='UNO'")
te seleccionaría el primer registro con el valor "UNO" en el campo "código". Ten en cuenta si utilizas este método que busca a partir del registro actual, por lo que para buscar en todo el recordset, primero tendrías que hacer un RecBD.MoveFirst y luego el RecBD.Find. Esto es así porque si por ejemplo, quieres buscar a todas las personas llamadas "JOSE", puedes encontrarlas y tratarlas a todas con algo así:

Código:
    RecBD.MoveFirst
    RecBD.Find("nombre='JOSE'")
    Do While Not RecBD.EOF
        ' Aquí, por ejemplo, le mandas un e-mail para 
        '  felicitarle por participar en un ejemplo de VB :-)
        RecBD.Find("nombre='JOSE'")
    Loop
Find tiene más parámetros, pero por no alargarme más, te recomiendo que le eches un vistazo a la ayuda.

Espero no haberte liado mucho! (hoy no puedo dormir y tiendo a divagar...)
  #6 (permalink)  
Antiguo 13/06/2008, 10:50
 
Fecha de Ingreso: abril-2008
Mensajes: 281
Antigüedad: 16 años, 1 mes
Puntos: 1
Respuesta: Error 3001

Que tal Txoco muchas gracias por la explicacion y bueno lo primero mi recorset lo creo de esta manera

Cita:
Set RecBD = New ADODB.Recordset
RecBD.Open "select * from pacientes", BD, adOpenStatic, adLockOptimistic
y bueno estuve analizando los ejemplos q me ponias y bueno no se si esta forma me sirva para mi busqueda ya q yo quiero de un combo q cargo con un campo de mi tabla seleccionarlo y de esta manera me cargue los demas campos en textbox, y si fuera asi pues no si me pudieras ayudar con algun ejemplo, ya q te nunca he ocupado esta nueva forma de busqueda q me explicas.

Y de nuevo te agradesco tu ayuda.

Saludos
  #7 (permalink)  
Antiguo 13/06/2008, 12:33
Avatar de Txoco  
Fecha de Ingreso: junio-2008
Ubicación: Perdido en tierras Quijotescas
Mensajes: 189
Antigüedad: 15 años, 11 meses
Puntos: 7
Respuesta: Error 3001

Hola!

Ok: el cursor de tipo Static no debería darte problemas para moverte por él hacia adelante o hacia atrás, por lo que todos los métodos que te comenté deberían funcionarte si los necesitas. Aunque no los tienes que usar para esto que quieres hacer.

Para empezar, tienes que tener la combo bien cargada, es decir, conteniendo tanto la descripción (que es lo que se mostrará al desplegarla) como el código del elemento, que el usuario no necesita verlo, pero es esencial para hacer la búsqueda.

Como sabes, la propiedad ItemData sólo puede almacenar números (de tipo Long, 32 bits), por lo que si el código con el que intentas relacionar las tablas también es numérico, pues miel sobre hojuelas, pero si es de tipo texto... tenemos un problema, Houston...

Eso sí, no es un problema insalvable, pero necesitamos algo más de código.

Para no liarte con más ejemplos, necesitamos saber de qué tipo es el campo que quieres usar para hacer la búsqueda (numérico o no), y con una cosa u otra, te explicamos cómo hacerlo.

Nos vemos!
  #8 (permalink)  
Antiguo 14/06/2008, 10:26
 
Fecha de Ingreso: abril-2008
Mensajes: 281
Antigüedad: 16 años, 1 mes
Puntos: 1
Respuesta: Error 3001

Que tal pues mira Txoco ya tengo cargado mi combo con el campo de apellidos, y lo q necesito es q cuando selecciones algun apellido me muestre toda la informacion en los textbox correspodientes y pues si efectivamente mis campos no son solo numericos sino son de todos tengo un campos numericos un campo de fecha, y los demas son de texto, por lo q supongo q efectivamente el codigo debe de ser diferente o por lo menos la propiedad itemdata no me va a funcionar para recueprar mis registros.

Bueno reitero mi agradeciemiento por la ayuda proporcionada.

Saludos....
  #9 (permalink)  
Antiguo 16/06/2008, 11:21
Avatar de Txoco  
Fecha de Ingreso: junio-2008
Ubicación: Perdido en tierras Quijotescas
Mensajes: 189
Antigüedad: 15 años, 11 meses
Puntos: 7
Respuesta: Error 3001

Bueno, te voy a pasar una función que he preparado y que puede serte útil en este caso. Copia y pega el siguiente código en el formulario que lo necesites (si vas a utilizar la función en más de un formulario, copia sólo la función, no el array de String, en un módulo y declárala como Public):

Código:
' Esto es un array de String, que usaremos para almacenar
'   el código de cada fila insertada en la ComboBox.
'   Necesitamos un array distinto por cada Combo que
'   queramos usar.
Private ItemDataApellido() As String

Private Function AgregaAComboConReferencia(ByRef Cmb As ComboBox, ByRef CodigoArray() As String, ByVal Texto As String, ByVal Codigo As String) As Long

' Necesitamos comprobar el error 9, que seguro que salta al menos una vez =]
On Error GoTo TError

    ' Asignamos el código pasado al último elemento del array. Si el array
    '   está vacío, generará el error 9, que interceptamos en TError
    CodigoArray(UBound(CodigoArray)) = Codigo
    
    Call Cmb.AddItem(Texto)
    
    ' Guardamos en ItemData el índice que acabamos de usar en el array
    Cmb.ItemData(Cmb.NewIndex) = UBound(CodigoArray)
    
    ' Devolvemos ese mismo índice, por si fuera de utilidad para otra cosa
    AgregaAComboConReferencia = UBound(CodigoArray)
    
    ' Hacemos el array un poco más grande, por si vamos a
    '   seguir añadiendo cosas
    ReDim Preserve CodigoArray(UBound(CodigoArray) + 1)
    
Exit Function
    
TError:
    Select Case Err
        Case 9: ' El subíndice está fuera del intervalo
            ' Probablemente, el array está vacío. Lo inicializamos, pues:
            ReDim CodigoArray(0)
            Resume  ' Y seguimos en la misma instrucción que falló
        Case Else
            Call MsgBox("AgregaAComboConReferencia " & Err & " - " & Err.Description, vbCritical + vbOKOnly, "Error gordo")
            Debug.Assert False  ' Esta línea detiene el entorno, de forma
                                ' que puedes hacer comprobaciones para ver
                                ' qué ha fallado, si ha fallado algo =]
    End Select
End Function
Aunque está comentado, te explico: la idea es mantener un array con los códigos de los datos que agregamos a una combo. Puesto que la propiedad ItemData sólo puede contener números, los utilizaremos para referenciar el índice del array que corresponde a cada entrada en la lista de la combo.

Es decir, en la combo tendremo esto:

Línea 1 = "Descripción Uno"; ItemData = 0
Línea 2 = "Descripción Dos"; ItemData = 1
Línea 3 = "Descripción Tres"; ItemData = 2
etc

Y en el array, esto:

ItemDataApellido(0) = "Código Uno"
ItemDataApellido(1) = "Código Dos"
ItemDataApeliido(2) = "Código Tres"
etc

Cuando selecciones la segunda opción de la combo ("Descripción Dos"), la propiedad ItemData contendrá el valor 1, que en el array ItemDataApellido corresponde al código relacionado con esa descripción ("Código Dos").

Para verla en marcha, agrega los datos recorriendo el recordset y llamando a la función para cada registro:

Código:
    Call AgregaAComboConReferencia(<nombre de la combobox>, ItemDataApellido, <apellido>, <código del apellido>)
Por ejemplo, si la combo se llama "cmbApellido", sería algo así (revisa el recordset!):

Código:
Call AgregaAComboConReferencia(cmbApellido, ItemDataApellido, RecBD!apellido, RecBD!codigo)
Después, para obtener el código de texto correspondiente, necesitas obtener la entrada del array correspondiente al valor almacenado en ItemData del elemento seleccionado en la combo:

Código:
Private Sub Combo1_Click()
    Call RecBD.Find("codigo='" & ItemDataApellido(cmbApellido.ItemData(cmbApellido.ListIndex)) & "'")
End Sub
"Y ya está". Como ves, lo complicado es la función, y entender lo que queremos hacer, pero es muy sencillo de utilizar. De todas formas, si no entiendes algo, pregunta, que para eso estamos, y reconozco que con esto igual te lías un poco
  #10 (permalink)  
Antiguo 16/06/2008, 13:35
 
Fecha de Ingreso: abril-2008
Mensajes: 281
Antigüedad: 16 años, 1 mes
Puntos: 1
Respuesta: Error 3001

Que tal Txoco pues si efectivamente me hice un lio, a ver si entendia con la funcion lo q voy hacer es q en mi combo me cargue mis apellidos y q con cada apellido me cargue sus demas campos para q al momento q seleccione alguno ya esten cargados los demas campos???...

Bueno eso fue lo q yo entendi respecto a la funcion, y bueno aqui la pregunta tambien seria estas lllamadas en donde las asigno:

Cita:
Call RecBD.Find("codigo='" & ItemDataApellido(cmbApellido.ItemData(cmbApellido. ListIndex)) & "'")
Cita:
Call AgregaAComboConReferencia(<nombre de la combobox>, ItemDataApellido, <apellido>, <código del apellido>)
y bueno tambien no entendi en donde asignamos los campos a los textbox

Gracias por la ayuda y espero no estarte haceindo batallar mucho, y gracias por tus respuestas

Saludos
  #11 (permalink)  
Antiguo 16/06/2008, 15:22
Avatar de Txoco  
Fecha de Ingreso: junio-2008
Ubicación: Perdido en tierras Quijotescas
Mensajes: 189
Antigüedad: 15 años, 11 meses
Puntos: 7
Respuesta: Error 3001

Quería resumirlo para no extenderme demasiado, y tendría que haberlo explicado mejor... disculpas...

Y más disculpas, porque acabo de releer todo el hilo, y creo que entendí mal la idea...

Veamos; todo el post que te envié se basaba en la idea de que tuvieses una tabla que tuviese, entre otros datos, un apellido y un código no numérico. Pongamos por caso una tabla de pacientes en la que la clave es el DNI. Puesto que el DNI acaba en una letra, no puede ser numérico, por lo que no puedes asignarlo a la propiedad ItemData de la combo, y por eso tendrías que guardarlo aparte para poder obtenerlo seleccionando el apellido. Efectivamente, un lío, porque malinterpreté el ejemplo con que abriste el hilo.

Asi que, si lo que quieres hacer es simplemente obtener un registro seleccionando el apellido de una combo, olvida todo lo que te he dicho y sigue estos pasos:

- Primero tienes que cargar la lista de la combo, obteniendo todos los apellidos de la tabla y agregándolos de uno en uno con el método .AddItem de la propia combo.

- Después, por ejemplo en el evento Click de la combo, tienes que llamar al método Find del recordset:

Código:
    Call RecBD.Find("apellido='" & Combo1.List(Combo1.ListIndex) & "'")
Con "Combo1.List(Combo1.ListIndex)" tienes el apellido que ha seleccionado el usuario, así que sólo tienes que buscarlo en el recordset, y ya podrías obtener todos los demás datos.

Otro tema distinto es el de asignar los campos a las textboxes, que de eso no había dicho nada. Si lo haces manualmente, como comentaste, puedes hacerlo justo a continuación del .Find (dentro del mismo evento), poniendo el nombre del recordset, una admiración de cierre, y el nombre del campo:

Código:
    Call RecBD.Find... ' Igual que arriba
    ' <textbox> = <recordset>!<campo>
    txtNombre = RecBD!Nombre
    txtFechaAlta = RecBD!FechaAlta
De todas formas, mi recomendación es que utilices controles Data, porque te realizan la asignación automáticamente; te bastaría con buscar el registro con .Find para que te apareciesen los datos en pantalla sin hacer nada más.

Y tranquilo, que batallaremos lo que haga falta , perdóname por haber liado el tema más de lo necesario, a veces me emociono tecleando y acabo siendo un poco bruto u^^
  #12 (permalink)  
Antiguo 17/06/2008, 08:43
 
Fecha de Ingreso: abril-2008
Mensajes: 281
Antigüedad: 16 años, 1 mes
Puntos: 1
Respuesta: Error 3001

Que tal no pues o te preocupes para que pides disculpas si al contrario gracias por seguir contestando y ayudandome, mira ya hice esto ultimo q me dices y me marca un error q es el :

"3021", El valor del BOF o EOF es true, o el actual registro se elimino;la operacion solicitada requiere un registro actual.

Este es mi codigo
Cita:
Private Sub Combo1_Click()
RecBD.Find ("apellidos='" & Combo1.List(Combo1.ListIndex) & "'")
text1(0) = RecBD!Id------------------------------------------------>Aqui es donde me marca el error
text1(1) = RecBD!fecha
text1(2) = RecBD!nombre
text1(3) = RecBD!apellidos
text1(4) = RecBD!ocupacion
text1(5) = RecBD!recomendado
text1(6) = RecBD!nacimiento
text1(7) = RecBD!edad
text1(8) = RecBD!sexo
text1(9) = RecBD!proxima
text1(10) = RecBD!tel1
text1(11) = RecBD!tel2
text1(12) = RecBD!tel3
text1(13) = RecBD!tel4
text1(14) = RecBD!calle
text1(15) = RecBD!colonia
text1(16) = RecBD!municipio
text1(17) = RecBD!estado
text1(18) = RecBD!pais
text1(19) = RecBD!antecedentes
End Sub
Ahora no se si sea por q ese valor es autonumerico, me lo asignda la base de de datos, no se si tenga q trabajar ese textbox de forma diferente.

Saludos y Gracias
  #13 (permalink)  
Antiguo 17/06/2008, 09:55
Colaborador
 
Fecha de Ingreso: enero-2008
Ubicación: Unas veces aquí, otras veces allí
Mensajes: 1.482
Antigüedad: 16 años, 3 meses
Puntos: 37
Respuesta: Error 3001

Prueba así:

RecBD.Find "apellidos='" & Combo1.Text & "'"

  #14 (permalink)  
Antiguo 17/06/2008, 11:00
 
Fecha de Ingreso: abril-2008
Mensajes: 281
Antigüedad: 16 años, 1 mes
Puntos: 1
Respuesta: Error 3001

Gracias Avellaneda ya probe de la forma q me dijiste y me marca el mismo error

saludos
  #15 (permalink)  
Antiguo 17/06/2008, 11:25
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Exclamación Respuesta: Error 3001

Cita:
Iniciado por spiderman78 Ver Mensaje
Gracias Avellaneda ya probe de la forma q me dijiste y me marca el mismo error

saludos
Según lo que entiendo no está encontrando el valor que estás buscando, debes comprobar si encuentra (si no mal lo recuerdo con Match), de lo contrario salir del procedimiento...
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #16 (permalink)  
Antiguo 17/06/2008, 11:37
 
Fecha de Ingreso: abril-2008
Mensajes: 281
Antigüedad: 16 años, 1 mes
Puntos: 1
Respuesta: Error 3001

Si efectivamente no lo esta encontrado el valor.... pero el problema es q si exite ese valor dentro de la base de datos, y sobre el match q comentas la verdad no se su funcionamiento

saludos
  #17 (permalink)  
Antiguo 17/06/2008, 11:46
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Pregunta Respuesta: Error 3001

Cita:
Iniciado por spiderman78 Ver Mensaje
Si efectivamente no lo esta encontrado el valor.... pero el problema es q si exite ese valor dentro de la base de datos, y sobre el match q comentas la verdad no se su funcionamiento

saludos
¿Has intentado de esta manera?:
Código:
 
RecDB.Find "apellidos LIKE '" & Combo1.Text & "'"
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #18 (permalink)  
Antiguo 17/06/2008, 11:47
 
Fecha de Ingreso: abril-2008
Mensajes: 281
Antigüedad: 16 años, 1 mes
Puntos: 1
Respuesta: Error 3001

Listo!!!! ya se pudo hacer la busqueda muchas gracias a todos por sus comentario y Txcoco muchas gracias por todas la explicaciones ahora si podre seguir con mi programa para eliminar y modificar registros espero q no se me complique mucho y sino pues aqui estare molestandolos.........

Por cierto ya despues de tu ultima explicacion Txcoco mi codigo quedo asi para poder realizar la consulta.

Cita:
Private Sub Combo1_Click()
Call VisualizarPacientes
RecBD.Find ("apellidos='" & Combo1.List(Combo1.ListIndex) & "'")
Text1(0) = RecBD!Id
Text1(2) = RecBD!nombre
Text1(3) = RecBD!apellidos
Text1(4) = RecBD!ocupacion
Text1(5) = RecBD!recomendado
Text1(6) = RecBD!nacimiento
Text1(7) = RecBD!edad
Text1(8) = RecBD!sexo
Text1(9) = RecBD!proxima
Text1(10) = RecBD!tel1
Text1(11) = RecBD!tel2
Text1(12) = RecBD!tel3
Text1(13) = RecBD!tel4
Text1(14) = RecBD!calle
Text1(15) = RecBD!colonia
Text1(16) = RecBD!municipio
Text1(17) = RecBD!estado
Text1(18) = RecBD!pais
Text1(19) = RecBD!antecedentes
End Sub

Saludos y Gracias
  #19 (permalink)  
Antiguo 17/06/2008, 12:02
Avatar de Txoco  
Fecha de Ingreso: junio-2008
Ubicación: Perdido en tierras Quijotescas
Mensajes: 189
Antigüedad: 15 años, 11 meses
Puntos: 7
Respuesta: Error 3001

Qué rápido, justo ahora estaba escribiendo la respuesta
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:28.