Como representar un combobox sin ningún elemento repetido en Access

Tengo una tabla la cual quiero filtrar desde dos combobox. Estos deben tener la particularidad de que después de filtrar con el primero, el otro combobox solo me debe mostrar las opciones que quedan (como en cascada) y si comienzo con el otro debe pasar lo mismo.

Hasta el momento he hecho esto, pero tengo varios problemas.

Combobox Year

Private Sub Cboxyear_Enter()
Dim zustandyear As Byte
Dim zustandcountry As Byte

If IsNull(Me.Cboxcountry) Or Me.Cboxcountry = "" Then
zustandcountry = 0
Else
zustandcountry = 1
End If

If zustandcountry = 0 Then
Me.Cboxyear.RowSource = "SELECT DISTINCT Jahr, Country from Big_table order by Jahr;"
End If

If zustandcountry = 1 Then
Qryyear = "SELECT DISTINCT Jahr,Country FROM Big_table WHERE Jahr = '" & Me.Cboxcountry.Column(0) & "'"
Me.Cboxyear.RowSource = Qryyear
Me.Cboxyear.Requery
End If

End Sub

Combobox Country

Private Sub Cboxcountry_Enter()

If IsNull(Me.Cboxyear) Or Me.Cboxyear = "" Then
zustandyear = 0
Else
zustandyear = 1
End If

If zustandyear = 0 Then
Me.Cboxcountry.RowSource = "Select Distinct Country, Jahr from Big_table order by Country;"
End If

If zustandyear = 1 Then
Qrycountry = "SELECT DISTINCT Country,Jahr FROM Big_table WHERE Country= '" & Me.Cboxyear.Column(0) & "'"
Me.Cboxcountry.RowSource = Qrycountry
Me.Cboxcountry.Requery
End If

End Sub

Los problemas son que

1. Me filtralos países pero no elimina los dobles en el combobox

2. Al elegir un Combobox y trato de elegir el segundo combobox no me muestra ningún elemento a elegir.

2 respuestas

Respuesta
2

Veo una cosa "rara" en tu código, y es que en el primer If (cuando no filtras el origen del mismo por el otro combo), no actualizas el origen de los combos con el Requery. Además, puedes simplificarlos así:

'Combobox Year
Private Sub Cboxyear_Enter()
If IsNull(Me.Cboxcountry) Or Me.Cboxcountry = "" Then
Me.Cboxyear.RowSource = "SELECT DISTINCT Jahr, Country from Big_table order by Jahr;"
Else
Me.Cboxyear.RowSource = "SELECT DISTINCT Jahr,Country FROM Big_table WHERE Jahr = '" & Me.Cboxcountry.Column(0) & "'"
End If
Me.Cboxyear.Requery
End Sub
'Combobox Country
Private Sub Cboxcountry_Enter()
If IsNull(Me.Cboxyear) Or Me.Cboxyear = "" Then
Me.Cboxcountry.RowSource = "Select Distinct Country, Jahr from Big_table order by Country;"
Else
Me.Cboxcountry.RowSource = "SELECT DISTINCT Country,Jahr FROM Big_table WHERE Country= '" & Me.Cboxyear.Column(0) & "'"
End If
Me.Cboxcountry.Requery
End Sub

Respecto al problema 2, no te puedo decir nada, pues el código te debiera funcionar.

El problema 1, sin ver tu tabla, imagino que estará en que una misma "Country" puede tener varios "Jahr", y por eso te aparece duplicado en el combo, pues el predicado DISTINCT se aplica al conjunto de campos, no al que lo sigue (en tu caso Country)

Muchas gracias por tu respuesta, ya entendí lo que me propusiste, ¿pero tienen alguna idea de como podría solucionar este problema de duplicidad en mis combobox? quizas usando group by country having count (*)=1?

Aunque agrupes por country, si mantienes el campo Jahr en el origen del combo, y tiene valores distintos para un mismo country, vas a seguir con el problema.

Yo me plantearía si es necesario incluir el campo Jahr en la SQL del combo

Gracias otra vez Sveinbjorn, ¿me podrías dar un ejemplo de a que te refieres con incluir el campo jahr en el SQL del combo?

En las SQL de tus combos tienes:

SELECT DISTINCT Jahr, Country from Big_table

Lo que es lo mismo que decir: selecciona los campos Jahr y Country que sean distintos (los dos juntos) de la tabla Big_Table.

Para que no te repita los paises, tendría que ser así:

SELECT DISTINCT Country from Big_table

Pero como desconozco si el campo Jahr es importante o no, o si lo usas para vincular otras tablas..., no te puedo recomendar este método directamente.

Muchas gracias Sveinbjorn, tengo una tabla en el cual se encuentra los campos Jahr y Country y si a través de este método tengo repeticiones en el combobox porque a veces el otro criterio es diferente.

Pero anadi solo el otro campo al combobox para cuando una vez elgido el primer criterio( por ejemplo Jahr), solo pueda asignar al segundo combobox solo valores combinados con el primero ( Jahr y Country) . El Campo Jahr es de los años y deseo filtrar primero por años y luego por países. Y también en viceversa. Si fuera en solo una dirección no tendría problemas porque seria una cascada. Mi problema es que quiero que se pueda filtrar en las dos direcciones y que mi combobox no tenga repeticiones.

Muchas gracias por tu tiempo y paciencia.

Yo lo haría así:

La SQL del combo sin filtrar que muestre todos los países, independientemente del año: SELECT Country From Big_Table

La SQL del combo que muestre todos los años: SELECT Jarh From Big_Table

SQL del combo países filtrada por el combo año:

SELECT Country From Big_Table WHERE Jahr=" Me.CboxYear

SQL del combo año año, filtrada por el pais:

SELECT Jarh From Big_Table WHER Country='" & Me.Cboxcountry & "'"

Respuesta

Daniel: Ya que me preguntaste de forma directa te comento:

Voy de acuerdo con la respuesta de Svenbjorn y te añado que aún ignorando lo que hay detrás de tu código Original, a mi juicio las .Column(0) son .Column(1)

Esto creo que quedará corregido con el código de Sveinbjorn, y lo de la duplicidad no voy a repetir lo que el ya te dice. Saludos >> Jacinto

Gracias por tu respuesta Jacinto, te pregunte directamente porque tu ya me habías ayudado con algo parecido. Si tienes razón debería ser column (1). Gracias por tu consejo. ¿Tienes alguna idea como podría solucionar la duplicidad?

Daniel: Por supuesto que puedes preguntarme directamente cuando quieras y si sé ayudarte encantado de poder hacerlo.

Lo de la Duplicidad no lo podrás evitar en éste caso, salvo que con filtros logres mostrar un solo Item, pero eso no es lo deseable aquí.

A veces es una cuestión de efecto visual.

Si fuera éste el caso, en el ancho de la primera columna, que sería el Indice(0), le pones anco = 0cm y la segunda los que necesites.

Ya me contarás. Saludos >> Jacinto

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas