Access - Traer datos de una tabla e insertarlos en varios caption de botones de comando

 
Vista:
sin imagen de perfil

Traer datos de una tabla e insertarlos en varios caption de botones de comando

Publicado por Oscar (48 intervenciones) el 26/03/2022 07:31:48
Equipo buena noches, tengo el sgte. codigo para traer datos de una tabla y jugar con ellos para ponerlos en los caption de unos botones de comando que tengo en mi form, sin embargo, solo me pega el dato de un solo registro de la tabla que llamo...su ayuda validando como puedo mejorar este codigo para que cada boton de comando tenga su propio caption de acuerdo a la cantidad de registros que estoy llamando....muchas gracias de antemano
Private Sub Comando40_Click()
Dim sql As String
Dim rsprod As DAO.Recordset
Dim botones As Variant

botones = Array(btn1, btn2, btn3, btn4, btn5, btn6)
sql = "select * from productos where [idcateg] = 2"
Set rsprod = CurrentDb.OpenRecordset(sql)

rsprod.MoveLast
rsprod.MoveFirst
Do While Not rsprod.EOF

For i = LBound(botones) To UBound(botones)

botones(i).Caption = rsprod!producto
Next

rsprod.MoveNext
DoEvents
Loop
rsprod.close
Set rsprod = Nothing

End Sub
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

Traer datos de una tabla e insertarlos en varios caption de botones de comando

Publicado por Anonimo (3316 intervenciones) el 26/03/2022 12:24:03
La asignación del valor al objeto no parece correctamente definida, por otra parte el Array ¿no debería tener valores de tipo alfanumérico?.

Tal como esta programado, el ciclo For...Next no esta sincronizado con el Do ... Loop.

Se deberá recorrer las etiquetas y a la vez (en cada ciclo) avanzar el recordset.

Tal como se ha programado por cada ciclo del 'Do ... Loop' se recorren todas las etiquetas asignándole a todas el valor actual (se quedaran con el ultimo asignado)
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

Traer datos de una tabla e insertarlos en varios caption de botones de comando

Publicado por Oscar (48 intervenciones) el 26/03/2022 16:29:26
Gracias por tu respuesta, ya me hiciste dudar de lo que tengo estructurado jajaj...mira te explico y me dices si voy por el camino correcto:

Al array botones le estoy asignando los 6 botones de comando que tengo en mi form y que se llaman bt1 hasta btn6
Luego hago un recordset de la tabla productos y quiero recorrer ese recordset para ir asignando a cada boton (en la propiedad caption)los diferentes ID que he capturado, espero me puedas dar una mano

Muchas Gracias!
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

Traer datos de una tabla e insertarlos en varios caption de botones de comando

Publicado por Anonimo (3316 intervenciones) el 26/03/2022 23:22:22
No se precisa el Array, ojea este hilo y saca conclusiones:
https://www.lawebdelprogramador.com/foros/Access/2125183-Usar-nombres-de-campo-variables.html

No se precisa un Array, con el For-Next se recorren los objetos del formulario y en cada ejecucion del bucle se asigna el titulo y se desplaza al siguiente valor a asignar (del recordset)

Problemas que se pueden dar ... que si el origen de datos (el recordset que se supone esta filtrado) tiene menos registros que el numero de etiquetas, se ha de adaptar el numero de interacciones, aclaro este punto

Tenemos seis botones a los que asignar etiqueta.

Si el recordset (que contiene los datos a asignar) tiene seis o mas registros 'no pasa nada', tomara los seis primeros y despreciara el resto.

Si el recordset tiene menos de 6 registros (supongamos cuatro) al intentar asignar el quinto dara error, error que se puede evitar si se evalua el numero de registros y de ser inferior a seis se utiliza como limite del FOR, pero en el caso de que lo supere se ha de utilizar como 'limite fisico' el numero de objetos maximo disponible (sean seis o sesenta)


Algo como:

1
2
3
4
5
6
7
8
9
10
11
12
......
Set rsprod = CurrentDb.OpenRecordset("select * from productos where [idcateg] =" & Categoria) ' categoría en el ejemplo publicado es '2' pero puede ser cualquiera
If rspropd.recordcount =0 Then Exit Sub ' no hay registros, salimos del sub
rsprod.MoveLast : rsprod.MoveFirst 'hay registros verifiquemos cuantos
 
Max = IIF (rspropd.recordcount >5 ,6, rspropd.recordcount) ' si hay menos de seis: los que tenga, en otro caso: seis
 
For I = 1 to Max
- -aplicar el metodo del enlace -- 'se asigna el primer titulo
rspropd.MoveNext  ' nos desplazamos al siguiente registro
Next I
....

Rellena lo que falta (variables ... etc.) y disfrútalo, este ejemplo es una guía o borrador, no un ejemplo finalizado
Queda a tu elección publicar la solución aplicada (o exponer dudas si no se alcanza)
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 Eduardo

Traer datos de una tabla e insertarlos en varios caption de botones de comando

Publicado por Eduardo (317 intervenciones) el 27/03/2022 01:44:26
Creo que le respondi algo muy similar en TodoExpertos.

El For debe ir de 1 hasta 6 y de pasar la instrucción

rsprod.MoveNext

Antes del Next. Y despues debe abortar el Do o sino puede obtener error. Tambien pude limitar los registros en la instruccion Select. Algo como


sql = "select top 6 * from productos where [idcateg] = 2"
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

Traer datos de una tabla e insertarlos en varios caption de botones de comando

Publicado por Oscar (48 intervenciones) el 27/03/2022 05:35:04
Sres. muchisimas gracias por el aporte, funciona (adjunto el código completo), sin embargo, me pone los caption a partir del segundo botón de comando y no del primero como debería ser, si pongo el For iniciando en cero (0) si me inicia los caption en el primer botón de comando, sin embargo, me genera error (13)


Dim rsprod As DAO.Recordset
Dim botones As Variant
Dim i As Integer

botones = Array(btn1, btn2, btn3, btn4, btn5, btn6)

Set rsprod = CurrentDb.OpenRecordset("select * from productos where [idcateg] = 2")

If rsprod.RecordCount = 0 Then Exit Sub
rsprod.MoveLast: rsprod.MoveFirst
max = IIf(rsprod.RecordCount > 5, 6, rsprod.RecordCount)

For i = 1 To max
botones(i).Caption = rsprod!producto
rsprod.MoveNext
Next i

rsprod.close
Set rsprod = Nothing
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

Traer datos de una tabla e insertarlos en varios caption de botones de comando

Publicado por Anonimo (3316 intervenciones) el 27/03/2022 09:46:57
El valor cero como índice de una serie .... existe como elemento de ese conjunto.

De uno a seis hay
1, 2, 3, 4, 5, 6 ===> seis elementos

Si se inicia en cero y se mantiene el limite en seis hay:
0, 1, 2, 3, 4, 5,6 ===> siete elementos

La solución ... la que tu imaginación alcance
(lo que a los demás les funciona parece que en este caso no lo hace, para que seguir ....)
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

Traer datos de una tabla e insertarlos en varios caption de botones de comando

Publicado por Anonimo (3316 intervenciones) el 27/03/2022 10:09:41
Limitar con el clásico 'TOP' el numero de elementos máximo, no soluciona 'el numero mínimo' que habrá que calcular.

Y ¿para que molestarse en limitarlo si no se necesitan dos bucles para recorrer ese conjunto de datos?.

El limite máximo lo impone -en este caso- el FOR (un sencillo bucle incremental), cuando llegue a su fin despreciara a los que no necesite (sean estos mas o menos que los seis disponibles).
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

Traer datos de una tabla e insertarlos en varios caption de botones de comando

Publicado por Oscar (48 intervenciones) el 29/03/2022 03:11:30
Muchas gracias por todo el soporte...aun persiste el error:
Se ha producido el error '13' en tiempo de ejecución :
No coinciden los tipos


Adjunto el codigo final que llevo :

Dim rsprod As DAO.Recordset
Dim botones As Variant
Dim textb As Variant
Dim i As Integer
Dim max As Integer
Dim y As Integer

botones = Array(btn1, btn2, btn3, btn4, btn5, btn6)
textb = Array(txt1, txt2, Txt3, Txt4, Txt5, Txt6)

Set rsprod = CurrentDb.OpenRecordset("select * from productos where [idcateg] = 2")

If rsprod.RecordCount = 0 Then Exit Sub
rsprod.MoveLast: rsprod.MoveFirst
max = IIf(rsprod.RecordCount > 5, 7, rsprod.RecordCount)

For y = LBound(botones) To UBound(botones)
botones(y).Caption = ""

Next

For i = 0 To max

botones(i).Caption = rsprod!producto
textb(i).Value = rsprod!IDProd
rsprod.MoveNext
Next i

rsprod.close
Set rsprod = Nothing
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

Traer datos de una tabla e insertarlos en varios caption de botones de comando

Publicado por Anonimo (3316 intervenciones) el 29/03/2022 04:09:49
Mi punto de vista es que el (los) Array no son correctos

botones = Array(btn1, btn2, btn3, btn4, btn5, btn6) ==> botones = Array("btn1", "btn2", "btn3", "btn4", "btn5", "btn6")

No se que devolverá el array original, pero si garantizo que el propuesto devolverá un texto (aunque el array no tiene sentido practico)

Otra forma de hacerlo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Private Sub Anotar(RefeRencia As Long)
Dim rsprod As DAO.Recordset, i As Integer, max As Integer
 
 
' ****** opcional, 'limpiar' los cuadros de texto ******
For i = 6 To 1 Step -1
Me.Controls("btn" & i).Caption = ""
Me.Controls("txt" & i) = ""
.MoveNext
Next i
' ***** se puede hacer cualquier cosa, por ejemplo hacer invisibles los objetos y volverlos visibles si se les asigna valor *****
 
Set rsprod = CurrentDb.OpenRecordset("select * from productos where [idcateg] =" & RefeRencia)
With rsprod
If .RecordCount = 0 Then Exit Sub
.MoveLast: .MoveFirst
max = IIf(.RecordCount > 5, 6, .RecordCount)
For i = 1 To max
Me.Controls("btn" & i).Caption = !producto
Me.Controls("txt" & i) = !IDProd
.MoveNext
Next i
.Close
End With
Set rsprod = Nothing
End Sub

Para utilizar esa subfunción:
1
Anotar [aquí la codición para la SQL]

También se puede utilizar sustituyendo a lo actual (ojo con la condición en la SQL antes '2' ahora 'RefeRencia'
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

Traer datos de una tabla e insertarlos en varios caption de botones de comando

Publicado por Oscar (48 intervenciones) el 29/03/2022 05:13:14
Maestro funciona perfecto...solo removí el .Movenext del primer For por que me daba error...lo de ocultar los botones ya lo tenia en el radar
aunque no de esa forma tan abreviada y fácil ...es perfecto todo, mil gracias...ahora intentare crear un solo Sub procedimiento para llamarlo desde cualquier botón y no tener que hacer el mismo código para cada uno....ves esto beneficioso para el rendimiento del aplicativo, asi sea que el form que estoy trabajando no tiene origen de datos y ya de por si esto me da un buen performance

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

Traer datos de una tabla e insertarlos en varios caption de botones de comando

Publicado por Anonimo (3316 intervenciones) el 29/03/2022 12:09:38
Correcto:
Sobra el MoveNext dado que no se utiliza o manipula el recordset, solo los objetos del formulario.
-(el código esta escrito sobre la marcha, no se dispone de una copia del original ni se ha emulado, se reutiliza lo que ya existe y algún gato se puede escapar)-.

Si se desea velocidad en la ejecución, lo adecuado es eliminar en la medida de lo posible los objetos 'estéticos' del formulario, dejar solo los cuadros de texto y asimilados (fuera etiquetas y demás) pues le hacen perder tiempo al tener que refrescarlos, una imagen de fondo permite una enorme creatividad.

Si se desea reutilizar ese código para varios formularios, solo se necesita pasar como parámetros los datos indispensables tal como en el ejemplo se envía la condición (la tabla para el recordset, el formulario, el numero de elementos ... etcétera).
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