Combobox en Visual basic 6.0

Estoy haciendo una aplicación en visual basic 6.0 conectado con una base de datos en sql 2000. Lo que pasa es lo siguiente:
Quisiera que al momento de cargar el combobox me aparezca los nombres, pero que al momento de guardar el combobox se guarde con el código de ese nombre.
Te adjunto el código para ver que me esta faltando. Agradeciéndote de antemano.
Private Sub Form_Load()
Dim BD As ADODB.Connection
Dim rs As ADODB.Recordset
Set BD = New ADODB.Connection
Set rs = New ADODB.Recordset
BD.Open "Provider= SQLOLEDB; Initial Catalog= BETTELING;Data Source= (local); integrated security=SSPI; persist security info= true;"
rs.CursorLocation = adUseClient
rs.Open "SELECT * FROM Proveedor", BD, adOpenStatic, adLockOptimistic
With rs
Do Until .EOF
Combo4.AddItem .Fields(1)
.MoveNext
Loop
End With

Rs. Close
La parte de negro es donde cargo el combo con el campo 1 de la tabla proveedor.

5 respuestas

Respuesta
1
Te comento como lo trabajo yo,
la lógica que uso es como la de vectores paralelos
cargo 2 combos 1 con el id_proveedor y el otro con el nombre del proveedor
por supuesto el combo1 de id tiene que estar visible=false
entonces al cargar el combo los 2 se cargan al mismo tiempo teniendo el mismo indice
cuando vos elegís un nombre de la lista de proveedores y después quieres usar ese código tienes que poner así:
Comboidprofe. List(combonombreprov. Listindex)
Aca tenemos que te muestre el codigo del combo de id profe en la posicion que seleccionaste del combo de nombre de proveedores
me funciona excelente y lo uso muchisimo.
Probalo primero en un textbox normal y despues pasalo a la base.
Me sale uso invalido de la propiedad Combo1. ¿List?
Pero como lo estas asignando ¿?
Pásame solamente ese pedazo de código
Private Sub Form_Load()
Dim BD As ADODB.Connection
Dim rs As ADODB.Recordset
Set BD = New ADODB.Connection
Set rs = New ADODB.Recordset
BD.Open "Provider= SQLOLEDB; Initial Catalog= BETTELING;Data Source= (local); integrated security=SSPI; persist security info= true;"
rs.Open "SELECT * FROM Proveedor", BD, adOpenStatic, adLockOptimistic
With rs
Do Until .EOF
Combo4.AddItem .Fields(1)
Combo1.AddItem .Fields(1)
Combo1.List (Combo4.ListIndex)
.MoveNext
Loop
End With
El error me vota ahí en esa parte de negrita
Pero no lo estas asignando a nada, ni a una variable, ni a un text a nada.
Ahí lo que veo que haces es llenar los combos, borra la sentencia en negrita.
Una vez que tienes llenado los combos vas a usar esa opción pero lo tienes que programar en el evento click del combo o en algún evento que uses de un comando.
Amigo lo puse en el evento click y sigue el error
Private Sub Combo4_Click()
Combo1.List (Combo4.ListIndex)
End Sub
Me vota lo siguiente
Error de compilación: Uso no válido de propiedad
y lo enmarca en el .List
Gracias de antemano amigo espero poder solucionarlo =(
Estas interpretando mal el concepto del combobox.
textbox = Combo1.List (Combo4.ListIndex)
label = Combo1.List (Combo4.ListIndex)
Combo1. List (Combo4. ListIndex), esta es la parte del codigo para obtener el codigo pero solo no funciona, lo tenes que asignar a una variable, campo de sql etc.
Ya amigo entendí, pero ahora esa cadena a donde pongo, por que la puse en el evento click del combo nombre proveedor y nada en el form_load y nada, ¿de ahí otra pregunta los dos combos se tienen que cargar en nombre proveedor o uno en nombre y el otro en el código? Espero que m soluciones esta ultima pregunta disculpas!
Arranquemos devuelta porque no estas entendiendo la lógica de como funciona y vas a perder la idea de usar los combo como vectores paralelos.
Te lo voy a hacer el código vos trata de adaptarlo a tu sistema
tienes 2 combos uno para nombres de proveedor, vamos a llamarlo cmbnombreprov y el otro para el código de proveedor lo llamamos cmbidprov
vamos a cargar los combos
BD.Open "Provider= SQLOLEDB; Initial Catalog= BETTELING;Data Source= (local); integrated security=SSPI; persist security info= true;"
Rs. Open "SELECT idprov, nombre_prov FROM Proveedor", BD, adOpenStatic, adLockOptimistic
consejo el select * no se utiliza, se tiene que detallar los campos.
Do Until .EOF
Cmbidprov. AddItem rs! Idprov
Cmbnombreprov. AddItem rs!nombre_prov
. MoveNext
Loop
Ahí tenemos cargado los combos
Ahora yo quiero que al elegir el nombre de un proveedor me muestre el id proveedor en un textbox
Private Sub cmbnombre_prov_Click()
text1.text = Cmbidprov.List (Cmbnombre_prov.ListIndex)
End Sub
Reemplaza los nombres por lo de tu sistema y avisame cualquier duda.
Respuesta
1
Agrega a tu código:
Combo4.ItemData(Combo4.NewIndex) = .Fields("ID_Nombre").Value
Donde "ID_Nombre" es el nombre del campo que contiene el código.
Si tienes dudas me lo haces saber.
Hola amigo Eduardo gracias por el código pero al momento de entrar en el formulario me suelta el siguiente error
Error '13' en tiempo de ejecución: No coinciden los tipos
¿A qué se debe?
Pues que el tipo de datos que intentas poner no corresponde al del objeto.
Debes convertir el valor.
Te dejo algunos links para que estudies más el caso:
http://msdn.microsoft.com/es-es/library/cc451022(VS.71).aspx
http://www.todoexpertos.com/categorias/tecnologia-e-internet/bases-de-datos/sql-server/respuestas/450314/como-lleno-el-itemdata-de-un-combobox
Para que veas más ejemplos de utilización:
http://www.google.com/search?aq=f&sourceid=chrome&ie=UTF-8&q=itemdata
Si tienes dudas me lo haces saber.
Hola Eduardo muchas gracias por los Links, pero quisiera saber si tiene que ver con el tipo de dato de mi código, el tipo de dato de mi código es varchar(50) . ya que tengo un código autogenerado.
Te adjunto el código para saber que dato debería convertirlo
Option Explicit
Public con As ADODB.Connection
Public com As ADODB.Command
Public rs As ADODB.Recordset
Public cod As String
Public fecha As Date
Public tipo As String
Public Num As String
Public prov As String
Public concep As String
Public ruc As String
Public impo As Double
Public obs As String
Private Sub Command1_Click()
Dim rs As ADODB.Recordset
fecha = Me.DTPicker1.Value
tipo = Me.Combo3.Text
Num = Me.Text6.Text
prov = Me.Combo4.Text
concep = Me.Text8.Text
ruc = Me.Text10.Text
cod = ruc & Left(tipo, 3) ' 14 espacios
impo = Val(Me.Text11.Text)
obs = Me.Text12.Text
Set con = New ADODB.Connection
con.Open "Provider= SQLOLEDB; Initial Catalog= BETTELING;Data Source= (local); integrated security=SSPI; persist security info= true;"
Set com = New ADODB.Command
com.CommandText = "INSERT INTO
FACBOL(Codigo,Fecha,Tipo,Num,Prove,Concepto,RUC,Importe,Observacion)VALUES ('" & cod & "','" & fecha & "','" & tipo & "','" & Num & "','" & prov & "','" & concep & "','" & ruc & "','" & impo & "','" & obs & "')"
com.ActiveConnection = con
com.Execute
con.Close
MsgBox ("Registro Realizado Con Exito")
Me.DTPicker1.CheckBox = True
Me.DTPicker1.CheckBox = False
Me.Combo3.Text = ""
Me.Text6.Text = ""
Me.Combo4.Text = ""
Me.Text8.Text = ""
Me.Text10.Text = ""
Me.Text11.Text = ""
Me.Text12.Text = ""
End Sub
Sr. ¿Eduardo lo que esta en negrita es mi código que debería cambiar quisiera saber como convertirlo? Disculpe las molestias
Lo que pasa que ItemData es de tipo Integer, si tu le pasas o asignas de tipo String da el error que mencionas.
Debes convertir el valor a Integer, CInt te puede ayudar.
Si tienes dudas me lo haces saber.
Muchas Gracias amigo Eduardo, pero de verdad me sigue botando el error el problema es que yo tengo dos formularios en uno registro el código del proveedor, ¿la pregunta es donde va el CInt? en donde lo registro o donde =S
Que perdido andas, de verdad... XD
CINT es una función de VB que devuelve una cadena en Integer (Entero), siempre y cuando esta se pueda convertir, es decir, si le pasas letras dará error.
Uso:
Dim Entero As Integer
Entero = CInt("9829")
En tu caso sería para el valor que le darás al Item Data desde la variable.
Combo4.ItemData(Combo4.NewIndex) = CInt(.Fields("ID_Nombre").Value)
Si tienes dudas me lo haces saber.
¿Disculpa pucha pero sigue saliendo error del desbordamiento mira yo tenia un código que hacia con el ruc + PR + 1 ia lo kite y sale que erro de tipo de datos dime en sql tengo que poner tipo de dato INT al código de proveedor o puede ser varchar?
¿Error de desbordamiento o error de tipo de datos?
Son cosas diferentes.
El código del proveedor puede ser Varchar sin problemas, pero si tiene letras no podrás pasarlo a número entero.
¿Cómo es un código de proveedor?, ponme 1 para verlo.
Si tienes dudas me lo haces saber.
Respuesta
Podrias poner un insert con codigo asi:
  rs2.MoveFirst
        While Not rs2.EOF
            rsSelect.Close
            rsSelect.Open "Select * From Medicamentos where CodigoMedicamento=" &
            DataGrid1.Columns.Item(0).Text, cn, adOpenStatic, adLockOptimistic
            cn.Execute "Update Medicamentos Set CantidadExistencias = " & (Val
            (DataGrid1.Columns.Item(2).Text) + rsSelect(2)) & ", PrecioCompra = " & (Val
            (DataGrid1.Columns.Item(3).Text)) & ", PrecioVenta = " & (Val
            (DataGrid1.Columns.Item(4).Text)) & " Where CodigoMedicamento = " & 
            DataGrid1. Columns. Item(0).Text
            Rs2. MoveNext
        Wend
Este ejemplo lo hice para un programa que se realizo a una farmacia, lo que hace es que selecciona todos loa elementos de la tabla Medicamentos que se seleccionaron y con el update los compara, tu puedes hacer que compare el nombre del proveedor y seleccione solo su código, se que puedes hacerlo, esto es para actualizar en tu caso seria un INSERT.
Si tienes algún otro problema no duces en preguntarme.
Respuesta
Al seleccionar el dato en el combo debes hacer una query que te traiga ese código, por ejemplo
rs.Open "SELECT * FROM Proveedor WHERE nombre_campo_1='" & trim(combo4.text) & "'", BD, asOpenStatic, adLockOptimistic
Una vez hecho eso debes hacer lo siguiente, con un label con la opción Visible en FALSE le pasas el valor de la siguiente manera:
label1.caption = rs!campo_codigo
Entonces cuando tengas eso, al momento de guardar le pasas el parámetro del label al INSERT INTO o como lo guardes, prueba primero con la opción Visible en TRUE para que veas si realmente te trae el dato que quieres...
Gracias por el truco lifecanaca, ¿pero quería consultarte el where nombre_campo_1 no se refiere al campo código verdad si no al que le sigue al código?... y otra pregunta el label1. caption = rs! ¿campo_codigo se pone después del additem? ... te adjunto el código como me quedo.
Private Sub Form_Load()
Dim BD As ADODB.Connection
Dim rs As ADODB.Recordset
Set BD = New ADODB.Connection
Set rs = New ADODB.Recordset
BD.Open "Provider= SQLOLEDB; Initial Catalog= BETTELING;Data Source= (local); integrated security=SSPI; persist security info= true;"
rs.Open "SELECT * FROM Proveedor Where Codigo ='" & Trim(Combo4.Text) & "'", BD, adOpenStatic, adLockOptimistic

With rs
Do Until .EOF
'suponemos que la columna a cargar es la primera
Combo4.AddItem .Fields(1)
Label1.Caption = rs!Codigo
.MoveNext
Loop
End With
Las letras negritas son lo que agregue.
¿Al correr el programa no me carga ningún registro que sera?
Esos son nombres de ejemplo por que no se los nombres de su BD por tal motivo ese nombre debes cambiarlo por que quieres que te muestre los datos en el label, con respecto a label1. caption = rs! Campo_codigo tiene que ser en el evento change del combobox, ahí cada vez que selecciones un valor te mostrar el la información que necesites y después la puedas guardar.
Respuesta
-1
No recuerdo bien, pero creo que hay una propiedad DataItem o Itemdata en al cual se coloca el código que quieres guardar.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas