Tema: Error 3001
Ver Mensaje Individual
  #9 (permalink)  
Antiguo 16/06/2008, 11:21
Avatar de Txoco
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