Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Seleccionar registro en listbox

417 views
Skip to first unread message

sebastico

unread,
Dec 3, 2009, 9:40:01 PM12/3/09
to
Patxi me facilitó un código para mostrar en un ListBox los registros
encontrados en una Tabla. El código -que he ido mejorando- es el siguiente:

lsbAut.RowSource = "SELECT AuID, AutNomb FROM TAut WHERE Left(AutNomb, 1) =
'A';"

Ahora busco lo siguiente:

1. Si selecciono un registro del listbox, necesito la instrucción que lea el
campo AutID
2. Que vaya a la Tabla AutID_ObID y busque el AuID
3. Si encuentra registros en el campo AutID mostrar en el lsbObID los campos
4.AuID, ObID de la Tabla AutID_ObID con orden ascendente por ObID


Para el lsb he diseñado la siguiente búsqueda:
strSQL = "SELECT [Aut_Ob].[AuID], [Aut_Ob].[ObID] FROM [Aut_Ob] ORDER BY
[AuID], [ObID]; & " ORDER BY ObID;"

Mi problema es que desconozco cuál es la instrucción que selecciona con el
puntero un registro en la lsbAut

Me pueden ayudar con esta inquietud.

Muchas gracias de antemano

Patxi Sanz

unread,
Dec 4, 2009, 10:51:54 AM12/4/09
to
Hola Sebastico:

El "puntero" de un registro en un cuadro de lista, lo da la propiedad Value
o la propiedad Column del cuadro de lista.

Para saber si hay registros, lo mismo que te dije anteriormente: DLookup o
DCount.

Para cargar los registros con el código que se ha seleccionado en el primer
cuadro de lista, revisa el ejemplo Combos del maestro Chea. Es para cuadros
combinados, pero se puede usar también con cuadros de lista:

- http://www.jbengoechea.com/RptCp.htm

--
Un saludo,


Patxi Sanz
Tudela (NA)
http://pasa.hostzi.com/

sebastico

unread,
Dec 7, 2009, 8:21:02 AM12/7/09
to
Hola

He bajado el archivo, lo indica que hace me parece muy interesante, sin
embargo, no he podido usarlo en mi bd. Espero revisarlo con mayor detalle.

Ahora quisiera saber si en un formulario se puede tener dos listbox que
muestren datos de tablas diferentes. En mi caso tengo:

1. Un listbosx que filtra datos de una tabla. De esa tabla muestre en el
listbox dos campos (por ejemplo A y B). Necesito seleccionar con el puntero
un registro para buscar en otra tabla aquellos registros que sean iguales en
el campo A.

Tengo un código para alcanzar mi propósito, pero, muestra todos los
registros de la segunda tabla en el otro listbox llamado lsbAutOb :

'En after update
strSQL = "SELECT AuID, ObrID FROM TablaA WHERE AuID = '" & Me.lsbAutOb(0) &
"';"

¿Me puedes ayudar con esta inquietud?

Gracias por tu atención

Patxi Sanz

unread,
Dec 7, 2009, 9:53:06 AM12/7/09
to
Si la columna dependiente del lsbAutOb es la que guarda el AuID, no
necesitas los paréntesis:

strSQL = "SELECT AuID, ObrID FROM TablaA WHERE AuID = '" & Me.lsbAutOb &
"';"

Y si es otra columna la que hay que usar, utiliza la propiedad Column:

strSQL = "SELECT AuID, ObrID FROM TablaA WHERE AuID = '" &

Me.lsbAutOb.Column(0) & "';"

Y por supuesto, supongo que actualizas la propiedad RowSource del segundo
cuadro de lista:

Me.ElNombreDelSegundoCuadroDeLista.Rowsource = strSQL

sebastico

unread,
Dec 7, 2009, 1:47:01 PM12/7/09
to
Hola
Estoy confundido y voy a resumir lo que estoy tratando de hacer.
Tengo un botón cmd que muestra registros el el lsbAu.
Las propiededas de lsbAu son:
Name: lsbAu
Row Source Type : Table/Query
Row Source: AutOb

Como te dije la idea es seleccionar un registro en la lsbAu y que todos los
registros que coincidan con respecto al campo AuID, mostrarlos en el
lsbObrsxAut.

Tratando de seleccionar el registro en lsbAu, he escrito este código en
After Update del lsb
Sub AfterUpdat()
Dim strSQL As String
strSQL = "SELECT AuID, ObID FROM TablaA WHERE AuID = '" &
Me.lsbAutOb.Column(0) & "';"
End Sub

Mi problema es que al escribir en Row Source del segundo cuadro de lista
(lsbAutOb) se muestra el siguiente mensaje:
Me.lsbAutOb.Rowsource = strSQL
'specified on this form or report does not exist.
'You misspelled the name, or it was deleted or renamed in the current
database, or it exost in a different database.
In the form or Report's Design view, display the property sheet by clicking
the Prperties button, an then set the recordSOurce porperty to an existing
table or query.'

No entiendo la razón de que al seguir lo indicado, aparece ese mensaje. Me
podrías indicar que es lo que estoy haciendo mal.

Muchas gracias

Patxi Sanz

unread,
Dec 10, 2009, 5:52:53 AM12/10/09
to
Parece que estás indicando directamente en la propiedad RowSource y en vista
diseño, que use la variable strSQL, lo cual no es correcto.

Como te dije antes, revisa el ejemplo combos del maestro Chea, para que veas
cómo lo hace para filtrar uno dependiendo del valor seleccionado en otro.

sebastico

unread,
Dec 11, 2009, 11:06:02 AM12/11/09
to
Hola Patxi.
He revisado en detalle el ejemplo que sugieres, he aprendido mucho paro, no
he logrado alcanzar mi necesidad.

El ejemplo que recomiendas es muy interesante. Después de revisar con
cuidado y de adaptarlo al mio ocurre lo siguiente.
El código de Bengoechea tiene dos lisxbos que toman datos de una tabla,el
mio, tiene, también, dos lisbox.
En el lsbAut, una vez seleccionado el campo A.a debe dirigirse a la Tabla A,
buscar los registros A.a y
mostraros todos los que concidan (en los dos campos) en la lsbObrxAut.

Mi base de datos es relacional los datos mostrados en el lsbAu vienen de la
tabla B que está relacionada 1 a muchos con la A.

La base de datos de Bengoechea no veo que sea relacional, ignoro si esto es
importante.Las llaves de las dos tablas son de tipo texto, no obstante,
veo que la tabla cuentas el ID es autonumerico, no se si esto tiene peso en
mi caso.

Para comparar lo recomendado por Bengoechea y lo adaptado en mi caso, he
colocado entre paréntesis las letras B y S respectivamente
Bengoechea= (B)
Mi código = (S)

(B)
SELECT DISTINCTROW cuentas.ID_CUENTA, cuentas.CUENTA FROM cuentas WHERE
(((cuentas.ID_CUENTA) In (0)));

(B)
Private Sub Comando4_Click()

Dim Vitem As Variant, selecc As String
selecc = ""
For Each Vitem In Me.Lista0.ItemsSelected
selecc = selecc & "," & Me.Lista0.ItemData(Vitem)
Next
selecc = Right(selecc, Len(selecc) - 1) ' Así quitamos la primera coma


Me.Lista2.RowSource = "SELECT DISTINCTROW cuentas.ID_CUENTA, cuentas.CUENTA
FROM cuentas WHERE (((cuentas.ID_CUENTA) In (" & selecc & ")));"


Me.Lista2.Requery
End Sub
---------------------------------------------

(S)

lsbAut tiene este código
SELECT [B].a, [B].b FROM B;

Este lsbAut se llena con el siguiente código del botón CmdA_Click()
Private Sub CmdA_Click()
Dim strSQL As String
Dim db As DAO.Database
Dim rs As DAO.Recordset
strSQL = "SELECT Ba,Bb FROM B WHERE Bb LIKE 'A*'" _
& " ORDER BY AuID;"
Set db = CurrentDb
Set rs = db.OpenRecordset(strSQL)
If rs.RecordCount > 0 Then
Me!lsbAut.RowSource = strSQL
Else
MsgBox "No hay registros con letra A en la base de datos"
End If
rs.Close
Set rs = Nothing


Una vez que el lsbAut muestra datos, el usuario selecciona una fila y da
click en cmdOpenObr_Aut_Click(), entonces el lsbObrxAut debe mostrar los
datos encontrados.

SELECT DISTINCTROW A.a, A.b FROM A WHERE (((A.a) In (0)));

Para mostrar los registros en el lsbObrxAut tengo este código siguiendo lo
indicado en Sub Comando4_Click() de Bengoechea.

Private Sub cmdOpenObr_Aut_Click()
Dim Vitem As Variant, selecc As String
selecc = ""
For Each Vitem In Me.lsbAut.ItemsSelected
selecc = selecc & "," & Me.lsbAut.ItemData(Vitem)
Next
selecc = Rigth(selecc, Len(selecc) - 1)

Me.lsbObrxAut.RowSource = "SELECT DISTINCTROW A.a, A.b FROM A WHERE (((A.a)
In (" & selecc & ")));"

Me.lsbObrxAut.Requery
End Sub

Ahora bien con el código anterior, el Rigth me da error *Data type mismatch
in criteria expression", pero, no con el Left, sin embargo,con este último no
se muestra datos.
He revisado con cuidado que todas las propiedades del ejemplo de Bengoechea
(formulario, listbox y botones)estén adaptadas en mi caso.

Me puedes orientar a corregir lo que esté haciendo incorrecto.

Muchas gracias

Patxi Sanz

unread,
Dec 12, 2009, 1:49:21 PM12/12/09
to
> Mi base de datos es relacional los datos mostrados en el lsbAu vienen de
> la
> tabla B que está relacionada 1 a muchos con la A.

> La base de datos de Bengoechea no veo que sea relacional, ignoro si esto
> es
> importante.

Las 2 bases de datos son relacionales. Otra cosa es que tú "declaras" esas
relaciones directamente y las guardas junto con las tablas, mientras que
Chea "declara" las relaciones cuando las precisa.

> Las llaves de las dos tablas son de tipo texto, no obstante,
> veo que la tabla cuentas el ID es autonumerico, no se si esto tiene peso
> en
> mi caso.

¿En tu caso? En tu caso tienen muchísimo peso: no es lo mismo filtrar por
textos que por números, la sintaxis no es la misma.

1.- Una consulta SQL filtrando por textos:

SELECT Ba,Bb FROM B WHERE Bb = 'Sebastico'

2.- Una sintaxis SQL filtrando por números:

SELECT Ba,Bb FROM B WHERE OtroCampo = 1

¿Cuál es la diferencia? Que al número 1 no lo hemos delimitado, mientras que
al texto Sebastico tenemos que delimitarlo para decirle a Access que es un
texto, no un parámetro, o un nombre de un campo, o ...

Por lo tanto, cuando construyes la sentencia SQL, debes delimitar cada
nombre:

For Each Vitem In Me.lsbAut.ItemsSelected

selecc = selecc & "," & Chr(34) & Me.lsbAut.ItemData(Vitem) & Chr(34)
Next

Nota: El chr(34) sirve para insertar una comilla doble en el texto.

sebastico

unread,
Dec 14, 2009, 6:57:01 PM12/14/09
to

Aunque aun no he podido alcanzar lo que necesito, sigo trabajando para
lograrlo.
Sobre el peso de string y número, lo pasé por alto, el no saber leer aun
código en vba es una desventaja para mi.

No me queda claro si en el mismo formulario, se puede tener dos listbox: uno
para mostrar datos de una tabla y el otro para desplegar datos de otra,
tomando en cuenta que, el Record Source del formulario se ha asignado a una
tabla.
Como se puede asignar dos tablas en el record source.

Me parece que una salida es construir una consulta que con las dos tablas y
asignando los respectivos campos. Así, podría asignar esa consulta en el
Record Source. Haré una copia de la bd de datos en caso de que no se pueda
hacer.

Salud2

Patxi Sanz

unread,
Dec 15, 2009, 10:42:22 AM12/15/09
to
Si precisas tener 2 tablas en el RecordSource del formulario, tendrás que
usar una consulta.

Pero no necesitas tener las 2 tablas en el RecordSource sólo porque las
listas se alimenten de esas tablas. Si en las listas quieres tener algo en
su propiedad ControlSource u Origen del control, sí que deberán estar esos
campos en el origen del formulario. Pero si no es así, no hace falta; para
eso tienen las listas sus propias propiedades Origen de la fila o RowSource.

0 new messages