Visual Basic - Eventos a partir de combox

Life is soft - evento anual de software empresarial
 
Vista:
sin imagen de perfil
Val: 53
Ha disminuido 1 puesto en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Eventos a partir de combox

Publicado por Emilio (27 intervenciones) el 16/11/2019 20:05:37
Hola, soy novato y lucho con mi primer intento de aplicación en VB 6. Tengo un Combo1 que despliega unos items de texto y, según el seleccionado, quiero traer (uso ADO) de una BD local uno o varios campos de una o varias tablas y volcarlos en una ListBox.
No sé reaccionar después de que el usuario ha hecho su selección en el Combox. ¿Ha de ir el código en Sub Combo1_Change() o en Sub Combo1_Clic() o en el formulario que contiene el combox?

Los items desplegados en el combo son texto (digamos diez familias), pero en la BD se buscan por número. Cada familia puede tener varios cientos de artículos cuyo nombre y otros datos quiero volcar sobre una caja de lista.

Soy mayor, pero quiero aprender. Muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Andres Leonardo
Val: 3.117
Oro
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Eventos a partir de combox

Publicado por Andres Leonardo (1798 intervenciones) el 18/11/2019 14:51:10
Hola EMilio Como estas

Vamos por partes ....

No sé reaccionar después de que el usuario ha hecho su selección en el Combox. ¿Ha de ir el código en Sub Combo1_Change() o en Sub Combo1_Clic() o en el formulario que contiene el combox?
De este punto recomiendo llamar a la funcion en los eventoos .. una manera facil de hacer esto es programar estructurada mente .... es decir que hagas un procedimiento ,y lo reutilices y no programar por cada combo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sub combo1_change ()
  procedimiento("CHANGE" )
End sub
 
sub combo1_click (p as string)
  procedimiento("CLICK" )
End sub
 
sub Procedimiento (p as string)
  msgbox "Cuando me invocan desde " & p
  'Aqui pueden ir mas cosas 
End sub
 
 
'Si te das cuenta con un solo procedimiento te sirve para cualquier cosa asi podrias programar por si acaso se ejecute el uno o el otro.

Sobre el tema del codigo ...
.
'Digamos tabla llamado parametros donde hay muchas familias ... Genero (Masculino - Femenino - No Especificado ) , Estado (Activo - Inactivo - Pendoiente - Otro), etc etc etc ... donde haya una cabeza de parametro y sus respectivos detalles ... yo lo que hago es indicar que me de segun lo qeu escoja uno llene otro combo .. tu podrias llenar una lista ....

Bueno lo importante es cuando llenes el combo ... tengas una linea puedes leer de esto ... esto te da el codigo de ese registro

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sub llenacombo(cmb As ComboBox, CodigoBuscar As Integer, order As Integer)
    SQL = "Select codigo,Nombre,IdCodigo from PARAMETRO where IdCodigo= " & CodigoBuscar & " order by " & order
        Rs.Open SQL, conexion
 
        If Rs.EOF = True And Rs.BOF = True Then
 
        Else
        Rs.MoveFirst
         While Not Rs.EOF
          cmb.AddItem UCase(Rs(1))
          cmb.ItemData(cmb.NewIndex) = Rs(0) ' Esta linea atacha a la descripcion el codigo y con eso haces la otra busqueda
          Rs.MoveNext
         Wend
        End If
         Rs.Close
End Sub


Espero queu esto te vaya ilustrando la idea .. cualquier duda me avisas.....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 53
Ha disminuido 1 puesto en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Eventos a partir de combox

Publicado por Emilio (27 intervenciones) el 18/11/2019 19:07:59
Muchas gracias, Andrés. Es genial que haya gente como vosotros, tan generosa y abierta a compartir conocimiento. Creo anticipar que me van a venir muy bien tus indicaciones. Ahora voy a estar ocupado unos días, pero en cuanto pueda me pondré a aplicar lo que me dices. Muchas gracias y hasta pronto, porque volveré por aquí.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Andres Leonardo
Val: 3.117
Oro
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Eventos a partir de combox

Publicado por Andres Leonardo (1798 intervenciones) el 18/11/2019 19:12:29
Muchas gracias por tus palabras ... espero que te ayuden con tu aprendizaje

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 355
Bronce
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Eventos a partir de combox

Publicado por raul (160 intervenciones) el 18/11/2019 18:29:11
HOLA Emilio, aunque LEO te dio una solución adsequible y entiendo que estas en fase de aprendisaje creo que debieras replantear una cuestión "Visualizar en un listbox" esto no te ayudará, veras los listbox solo te permiten mostrar una columna los DATALIST te permitiran más de una columna; pero te resultara más complicado.

Te sugiero emplees el objeto el DBGRID o DATAGRID como quieras llamarlo si te animas usa el siguiente codigo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Option explict
Dim RS as recordset, SQL as string
 
private sub FORM_LOAD
    set rs = new recordset
end if
 
private sub COMBOBOX_CLICK
    CALL CARGAR(
end if
 
private sub CARGAR()
   if rs.state <> 0 then
      rs.close
   end if
   SQL = "SELECT * FROM TABLA_DATOS WHERE FAMILIA = '" & COMBOBOX.TEXT & "'"
   rs.open SQL, CONEXIÓN_DATABASE
   set DBGRID.datasource = rs
end sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 53
Ha disminuido 1 puesto en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Eventos a partir de combox

Publicado por Emilio (27 intervenciones) el 18/11/2019 19:22:41
Hola, Raúl, otro en la lista del altruismo. Qué bien que me dices eso, pues tengo previsto usar cajas de lista para mostrar vario campos e intuyo que necesitaré el datagrid. Pasaremos ese puente cuando lleguemos a ese río, que será pronto, espero.
Ahora tengo una pregunta para ambos.
En esta consulta,
1
rs.Open "SELECT #31/12/2020#,Articulos.Id_articulo, Articulos.nombre,Stock.cantidad FROM Articulos, Stock WHERE Articulos.Id_articulo=Stock.Id_articulo and Articulos.Id_articulo>56700 ", cn

no sé si se puede mezclar SQL y VB así, pero me gustaría que la fecha que introduzco para que figure en el primer campo del rs fuera la recogida en un inputbox previo. De otro modo, cada vez que quiero crear la tabla de stock (que he de usar más tarde en consultas) tengo que hacerlo vía código. Tiene que haber una manera, pero me rechaza la introducción de una variable 'fecha' obtenida por inputbox.
Gracias anticipadas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 355
Bronce
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Eventos a partir de combox

Publicado por raul (160 intervenciones) el 18/11/2019 21:55:00
Emilio no creo que eso funcione adecuadamente.

Aunque no sé nunca he probado una sintaxis como esa realmente creo que devolbera FAIL. lo correcto debia ser

1
rs.Open "SELECT Articulos.Id_articulo, Articulos.nombre,Stock.cantidad FROM Articulos, Stock WHERE Articulos.Id_articulo=Stock.Id_articulo and Articulos.Id_articulo>56700 and fecha = #31/12/2020# ", cn

o sea escribir el nombre del campo que tiene la fecha y a esta pasarle el parametro y respondiendo a tu pregunta

1
2
3
4
5
6
7
8
9
10
11
12
Option explicit
Dim ME_FECHA as variant, SQL as string 'Unas Variables cualquieras
 
private sub RUTINA()
me_fecha = inputbox("Dime la fecha")
if isdate(me_fecha) = true then      'Para evitar el macanazo ante un error
 
        sql = ""SELECT Articulos.Id_articulo, Articulos.nombre,Stock.cantidad FROM Articulos, Stock WHERE
        Articulos.Id_articulo=Stock.Id_articulo and Articulos.Id_articulo>56700 and fecha = #" &     format(me_fecha, "dd/mm/yyy")    &  "# "
       rs.open sql, CONEXION
end if
end sub


Otra sugerencia; cuando empleas consultas entre 2 o más tablas sin relacionar [FROM Articulos, Stock] los resultados a veces no son lo que tu esperas porque el motor "jet 4.0" se pierde o sea que evalua bien este aspecto. No se al menos para mi, yo evito este tipo de consultas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 53
Ha disminuido 1 puesto en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Eventos a partir de combox

Publicado por Emilio (27 intervenciones) el 18/11/2019 22:41:29
Raúl, de nuevo muchas gracias.

Me nivel es bajísimo, va por delante, pero todo el mundo comenzó a ese nivel. Por eso no comprendo bien algunas expresiones. Pero antes de comentar las que no entiendo, va una pregunta previa. Dices que evitas consultas sobre tablas no relacionadas. Entonces ¿cómo hago para sacar datos de distintas tablas aunque éstas estén en la misma BD?

A mí esa consulta me funciona perfectamente, por eso mi pregunta no iba sobre ese tema, sino por el de la fecha. Tu respuesta sobre la fecha me hace pensar que o no me he expresado bien o no he captado bien tu solución. Voy con la primera hipótesis y repito la pregunta.

La consulta, tal como te la envié, funciona, añadiendo al mismo una primera columna con la fecha especificada. El rs generado lo salvo en un .csv que luego espero me sirva para montar informes con los movimientos de inventario de un artículo determinado, partiendo del stock recogido en ese archivo. Hasta aquí todo bien. El archivo se crea, pero la consulta me obliga a que si en un momento posterior quiero refrescar el inventario inicial, digamos al cambiar el trimestre, porque quiero que los informes de movimientos de los artículos partan del inicio de ese trimestre, tengo que modificar la fecha entrando al código. Lo que pretendo, es que la consulta, en lugar de explicitar la fecha, la tome de una variable recibida meiante inputbox.

Tu propuesta no la entiendo, pues no veo que cree un campo añadido en el rs, y la fecha figura como una condición. La fecha no es una condición, sino un dato a cargar en un campo del rs.

Un poco largo, ya lo siento. Pero resumo esta nota así:

1 ¿Cómo obtengo datos de varias tablas que están en la misma BD?
2 ¿En una SQL puedo añadir un campo que no figura en la BD y llenarlo con una fecha obtenida por inputbox?

Si has llegado hasta aquí y no te he liado, eres un genio, muchacho. Yo ahora me voy a la cama, que en España ya va siendo hora para los que peinamos canas.
Muchas gracias por tu atención y paciencia.
Emilio
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 355
Bronce
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Eventos a partir de combox

Publicado por raul (160 intervenciones) el 18/11/2019 23:21:14
Hola Emilio !MUCHAS GRACIAS ANTE TODO!

Veras, nunca concideres que tu nivel es malo; todo lo contrario "Tu punto de vista es solo diferente"; con el tiempo y con el aprendisaje te vuelbes un poco maniatico del control y buscas otras formas más seguras de plantear un problema, razon por lo cual terminas complicando una solución; que deberia ser practica, sencilla y brillante como la que tu has logrado.

Mi primer error fue suponer que era una condición cuando realmente era un campo, y nunca se me ocurriria plantearlo de una forma tan simple a como la solucionaste. Gracias!

Mi segundo error fue trasmitirte mis mañas de crear tablas relacionadas atoda costa y evitar el tipo de consulta propuesta por tí [algo heredado de mi trabajo y tropiezos con SQL SERVER]; pero la realidad es que como bien has dicho FUNCIONA y fuera de eso nada importa.

O sea que realmente el que aprendio y recordo algunas cosas hoy; fui YO. Por eso gracias.

Del codigo propuesto solo tienes que modificar la linea

1
2
sql = ""SELECT #" & format(me_fecha, "dd/mm/yyy") & "# , Articulos.Id_articulo, Articulos.nombre,Stock.cantidad FROM Articulos, Stock WHERE 
Articulos.Id_articulo=Stock.Id_articulo and Articulos.Id_articulo>56700;


de esta forma cada vez que el recordset [RS] cargue los datos estará actualizado con la información del inputbox.

Algo más; tienes mi correo, si quieres compartir el proyecto o la database o preguntar cualquier cosa eres bien venido.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar