Access - Otra forma de hacerlo?

 
Vista:
sin imagen de perfil
Val: 266
Bronce
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Otra forma de hacerlo?

Publicado por Pablo (328 intervenciones) el 17/04/2021 21:58:50
Hola a tod@s
Quiero construir una sql que en su cláusula where tiene 4 variables
una variable que toma los valores a / b, a su vez cada uno de estos valores está ligado con 3 variables que pueden ser true o false, la primera puede valer a y las otras tres ser true, false y true por ejemplo
Para solucionar el problema utilice un select case para la variables primera y muchos if then dentro de cada case, son tantos que me pierdo
Alguien sabe alguna forma de hacerlo más rápida y sencilla.

Gracias
Pablo
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

Otra forma de hacerlo?

Publicado por Anonimo (3357 intervenciones) el 18/04/2021 00:16:31
Una idea básica (la metodología es la misma):

Localiza ejemplos recientes sobre 'concatenar' porque eso es en definitiva lo que se necesita, concatenar condiciones (esta vez con AND/OR en lugar de comas o separadores) y solo entraran en la condición los campos que contengan datos (son campos conocidos, están en el formulario y siempre serán los mismos).

Creo que eso elimina un gran porcentaje de posibles combinaciones, el campo tiene datos ... se utiliza / no los tiene ... se le ignora y para incluir/excluir un booleano (activo = incluye / inactivo = excluye .... ).

Obtenidas las condiciones se utiliza para construir la SQL.
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: 266
Bronce
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Otra forma de hacerlo?

Publicado por Pablo (328 intervenciones) el 18/04/2021 17:12:39
Hola Anonimo:
Quiero buscar libros por título o autor(Marco13), primera variable, después tengo 3 cuadros de texto que corresponden a inicio, contiene y fin(Txt38,40 y 42), del campo autor o titulo ya seleccionado en la primera variable. Se entiende?
Lo que hice fue esto:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
Option Compare Database
Option Explicit
Dim sqlbusqueda As String
 
Private Sub Comando47_Click() 'Buscar
Select Case Me.Marco13
Case 1 'autor
'fff
If IsNull(Me.Texto38) = False And IsNull(Me.Texto40) = False And IsNull(Me.Texto42) = False Then sqlbusqueda = sqlbusqueda & "'" & LTrim(Me.Texto38) & "*' and " _
& "autorlibro like '*" & LTrim(Me.Texto40) & "*' and autorlibro like '*" & LTrim(Me.Texto42) & "'"
'ftt
If IsNull(Me.Texto38) = False And IsNull(Me.Texto40) = True And IsNull(Me.Texto42) = True Then sqlbusqueda = sqlbusqueda & "'" & LTrim(Me.Texto38) & "*'"
'ftf
If IsNull(Me.Texto38) = False And IsNull(Me.Texto40) = True And IsNull(Me.Texto42) = False Then sqlbusqueda = sqlbusqueda & "'" & LTrim(Me.Texto38) & "' and " _
& "autorlibro like '*" & LTrim(Me.Texto42) & "'"
'fft
If IsNull(Me.Texto38) = False And IsNull(Me.Texto40) = False And IsNull(Me.Texto42) = True Then sqlbusqueda = sqlbusqueda & "'" & LTrim(Me.Texto38) & "' and " _
& "autorlibro like *'" & LTrim(Me.Texto40) & "'"
'ttt
If IsNull(Me.Texto38) And IsNull(Me.Texto40) And IsNull(Me.Texto42) Then
MsgBox "No has puesto ninguna condición"
End If
'tff
If IsNull(Me.Texto38) = True And IsNull(Me.Texto40) = False And IsNull(Me.Texto42) = False Then sqlbusqueda = sqlbusqueda & "like '*" & LTrim(Me.Texto40) & "* and " _
& "autorlibro like '*" & LTrim(Me.Texto42) & "'"
'ttf
If IsNull(Me.Texto38) = True And IsNull(Me.Texto40) = True And IsNull(Me.Texto42) = False Then sqlbusqueda = sqlbusqueda & "like '*" & LTrim(Me.Texto42) & "'"
'tft
If IsNull(Me.Texto38) = True And IsNull(Me.Texto40) = False And IsNull(Me.Texto42) = True Then sqlbusqueda = sqlbusqueda & "'*" & LTrim(Me.Texto40) & "*'"
Case 2 'titulo
'fff
If IsNull(Me.Texto38) = False And IsNull(Me.Texto40) = False And IsNull(Me.Texto42) = False Then sqlbusqueda = sqlbusqueda & "'" & LTrim(Me.Texto38) & "*' and " _
& "titulolibro like '*" & LTrim(Me.Texto40) & "*' and titulolibro like '*" & LTrim(Me.Texto42) & "'"
'ftt
If IsNull(Me.Texto38) = False And IsNull(Me.Texto40) = True And IsNull(Me.Texto42) = True Then sqlbusqueda = sqlbusqueda & "'" & LTrim(Me.Texto38) & "' and " _
 & "titulolibro like '*" & LTrim(Me.Texto42) & "'"
 'ftf
If IsNull(Me.Texto38) = False And IsNull(Me.Texto40) = True And IsNull(Me.Texto42) = False Then sqlbusqueda = sqlbusqueda & "'" & LTrim(Me.Texto38) & "' and " _
& "titulolibro like '" & LTrim(Me.Texto42) & "'"
'fft
If IsNull(Me.Texto38) = False And IsNull(Me.Texto40) = False And IsNull(Me.Texto42) = True Then sqlbusqueda = sqlbusqueda & "like '" & Me.Texto42 & "'"
'ttt
If IsNull(Me.Texto38) And IsNull(Me.Texto40) And IsNull(Me.Texto42) Then
MsgBox "No has puesto ninguna condición"
End If
'tff
If IsNull(Me.Texto38) = True And IsNull(Me.Texto40) = False And IsNull(Me.Texto42) = False Then sqlbusqueda = sqlbusqueda & "like '*" & LTrim(Me.Texto40) & "* and " _
& "titulolibro like '*" & LTrim(Me.Texto42) & "'"
'ttf
If IsNull(Me.Texto38) = True And IsNull(Me.Texto40) = True And IsNull(Me.Texto42) = False Then sqlbusqueda = sqlbusqueda & "like '*" & LTrim(Me.Texto42) & "'"
'tft
If IsNull(Me.Texto38) = True And IsNull(Me.Texto40) = False And IsNull(Me.Texto42) = True Then sqlbusqueda = sqlbusqueda & "'*" & LTrim(Me.Texto40) & "*'"
End Select
DoCmd.OpenReport "busqueda_realizada", acViewPreview, , , , sqlbusqueda
End Sub

Me parece un poco tocho,no?, de ahí mi pregunta: no hay otra forma de hacerlo?
Utilicé siempre el And, no se si con Or se ganaría algo, qué opinas?
Gracias
Pablo
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: 266
Bronce
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Otra forma de hacerlo?

Publicado por Pablo (328 intervenciones) el 18/04/2021 19:37:08
Acabo de darme cuenta de una cosa: los tres cuadros de texto que utilizo para las 3 variables nunca serán nulos, sí pueden tener longitud 0, tendré que cambiar lo condición isnull por len(ltrim(Txtnn))<>0
Vuelta a empezar
No hay algo más rápido?
Pablo
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