SQL - Comparar dos rangos numéricos [Ayudín]

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • Mariotte
    0, 1, 1, 2, 3, 5, 8, 13..
    • 19-10-2003
    • 20868

    #1

    SQL - Comparar dos rangos numéricos [Ayudín]

    Estoy trabajando en access con una consulta basada en TextBoxes de un formulario. Básicamente busca locales por nombre, dirección, altura.

    Por ejemplo un ejemplo de la estructura que estoy usando el WHERE de la instrucción SQL:

    …
    AND
    (([NombreDeFantasia] Like "*" & [Forms]![frmBusquedas]![txtNombreDeFantasia] & "*" Or [Forms]![frmBusquedas]![txtNombreDeFantasia] Is Null)=True)
    AND
    …

    [NombreDeFantasia] es un string común y funciona bien la consulta

    Ahora bien, lo que no se me ocurre ahora mismo cómo hacer es para filtrar por altura de la calle (numerción de la calle).

    Por ejemplo:

    Un lugar tiene como dirección Rivadavia 1551
    Otro Corrientes 356/358 (la altura va desde el N° 356 añ N° 358)

    Yo para captar eso tengo dos campos de altura, “AlturaDesde” y “AlturaHasta”
    Por lo general se carga la primera altura nada más (como el lugar de Rivadavia)

    Ahora quiero filtrar las alturas con dos controles, txtAlturaDesde y txtAlturaHasta y meterlos en la Query esa.

    Lo que estaría haciendo es filtrar un rango de numeración con otro rango de numeración

    Ej: si el usuario quiere filtrar entre 1110 y 1180 le puede saltar un lugar con rango de altura entre 1170 a 1190.

    Pero a su vez también tiene que poder incluirse que si el usuario busca por “la altura 5689”, le tire bien los locales que tienen esa altura exacta como también los que entran en ese rango (por ejemplo entraría uno que tenga altura 5687 a 5691)

    Entonces tendría que diferenciar 4 casos

    1) 1ALTURA DE BUSQUEDA -> RANGO DE ALTURA
    BUSCA: 1589 -> ENCUENTRA 1587-1589 o 1587-1591
    2) 1ALTURA DE BUSQUEDA -> 1ALTURA (EXACTA)
    BUSCA: 1589 ->ENCUENTRA 1589
    3) RANGO DE BUSQEUDA -> ALTURA EXACTA
    BUSCA: 1587-1591 ->ENCUENTRA 1589
    4) RANGO DE BUSQUEDA ->RANGO DE ALTURA
    BUSCA: 1587-1591 -> ENCUENTRA 1585-1587


    O sea, cuando haya alguna numeración coincidente, lo tiene que tirar

    Por ahora no se me ocurre como hacer

    Capaz se haría más fácil si hago alguna como forzar al usuario a completar el rango de alturas como 1589-1589 cuando el lugar tiene una sola altura, y también forzar a que busque siempre rango de alturas, por más que busque una única. Con eso capaz saco una carga al asunto… pero tampoco sé bien si hay mucha diferencia.

    Incluso podría traer problemas porque entre 1589-1589 capaz con cierta función el programa interpreta que no hay numeraciones entre esas alturas…

    Bueno sh eso me parece… por ahora no tengo ni la más puta idea eh? Y en mi mente es bastante típico tener que hacer aproaches así nocierto, así que supongo que podrán ayudarme
    No me busques porque me vas a encontrar... OMG ^^ .. TE ENCONTRE QUIERO DECIR... o sea lo pillas tio. El que compro dolare recibira dolare. Si te preocupas mucho te arrugas. Te lo juro por vos.

    MÚSICA: Mamúes
  • Mariotte
    0, 1, 1, 2, 3, 5, 8, 13..
    • 19-10-2003
    • 20868

    #2
    Me suena que está medio enroscado, voy a tratar de simplificarlo.

    Las personas cargan una calle y definen una numeración o un rango de altura.

    Luego quieren, ingresando una altura o rango de alturas, ver si hay alguna casa o local ya cargada. La condición mínima es que cualquier rango de las alturas cargadas “toque” las alturas buscadas.
    No me busques porque me vas a encontrar... OMG ^^ .. TE ENCONTRE QUIERO DECIR... o sea lo pillas tio. El que compro dolare recibira dolare. Si te preocupas mucho te arrugas. Te lo juro por vos.

    MÚSICA: Mamúes

    Comentario

    • judío ginger daywalker petiso
      Pelotudo
      • 14-03-2005
      • 16758

      #3
      Vos tenes dos campos en la DB: alturaDesde y alturaHasta. si la entrada no tiene un rango, asumo que la altura esta en alturaDesde y alturaHasta es -1 o 0...
      tambien asumo que alturaDesde < alturaHasta y buscarDesde < buscarHasta

      tu condicion es:
      WHERE (alturaDesde BETWEEN buscarDesde AND buscarHasta) OR (alturaDesde < buscarDesde AND alturaHasta > buscarDesde)

      K
      Editado por última vez por judío ginger daywalker petiso; 06-07-2007, 06:11 PM.

      Comentario

      • Mariotte
        0, 1, 1, 2, 3, 5, 8, 13..
        • 19-10-2003
        • 20868

        #4
        Gracias, ya mismo lo pruebo =D

        Coso, mientras otra cuesti&#243;n. Estoy intentando que filtre tambi&#233;n por un rango de fechas; esto es m&#225;s f&#225;cil porque el destino es una fecha fija. El problema es que al depender de dos criterios, no s&#233; c&#243;mo seguir repitiendo an&#225;logamente la f&#243;rmula de m&#225;s arriba en cuanto a si el valor del txtBox es null.

        Esta ser&#237;a la instrucci&#243;n

        Código:
        And
        ([Fecha] Between [Forms]![frmBusquedasSIN]![txtFecha1] and [Forms]![frmBusquedasSIN]![txtFecha2])
        And
        Código:
        …
        AND
        (([NombreDeFantasia] Like "*" & [Forms]![frmBusquedas]![txtNombreDeFantasia] & "*" Or [Forms]![frmBusquedas]![txtNombreDeFantasia] Is Null)=True)
        AND
        …
        y yo quiero que tenga el cosito ese Or "txtBox" is null, pero no s&#233; d&#243;nde ponerlo o c&#243;mo armarlo. Sino cuando no hay datos en la fecha se cagan todos los dem&#225;s filtros.

        y tambi&#233;n tengo que ver qu&#233; pasa si en vez de un rango de fecha s&#243;lo ponen una fecha; pero eso lo puedo solucionar con VBA, hago que s&#237; o s&#237; siempre haya dos fechas, aunque una sea el duplicado de la primera.

        Ah y claro, lo mismo me va a pasar con esto de las alturas
        Editado por última vez por Mariotte; 06-07-2007, 06:31 PM.
        No me busques porque me vas a encontrar... OMG ^^ .. TE ENCONTRE QUIERO DECIR... o sea lo pillas tio. El que compro dolare recibira dolare. Si te preocupas mucho te arrugas. Te lo juro por vos.

        MÚSICA: Mamúes

        Comentario

        • Mariotte
          0, 1, 1, 2, 3, 5, 8, 13..
          • 19-10-2003
          • 20868

          #5
          funcion&#243; de maravillas con un mayor igual por ah&#237;

          ahora estoy complicado pero despu&#233;s sigo con esto
          No me busques porque me vas a encontrar... OMG ^^ .. TE ENCONTRE QUIERO DECIR... o sea lo pillas tio. El que compro dolare recibira dolare. Si te preocupas mucho te arrugas. Te lo juro por vos.

          MÚSICA: Mamúes

          Comentario

          • Mariotte
            0, 1, 1, 2, 3, 5, 8, 13..
            • 19-10-2003
            • 20868

            #6
            Por ahora saf&#233; la estructura de sql de esas poniendo en los textbox de esos rangos por default "1 a 9999" y "01/01/1999 a 09/09/2009" (o sea en el formulario... digamos, se produce el filtro s&#236; o s&#236;, pero lo que hago es filtrar todos los posibles y listo), jauj el peor parche; pero hasta que pueda figurear afuera (ahj spanglishhh) c&#243;mo manejar los nulls en esto, probar&#233; haciendo esa mierda.

            ah per&#225;, igual le falta algo a lo de las alturas, porque hay un rango que no toma todav&#237;a... ahora no lo tengo adelante pero era como que si la Altura era 1585/1589 y yo buscaba por 1589/1591 no aparec&#237;a (pese a que le puse mayor o igual a los cositos); o al rev&#233;s, con respecto al otro borde (1585/1589 busco por 1581/1585; pero me pa que es el otro)

            ahora ni puedo pensar, pero shfjgh
            No me busques porque me vas a encontrar... OMG ^^ .. TE ENCONTRE QUIERO DECIR... o sea lo pillas tio. El que compro dolare recibira dolare. Si te preocupas mucho te arrugas. Te lo juro por vos.

            MÚSICA: Mamúes

            Comentario

            • judío ginger daywalker petiso
              Pelotudo
              • 14-03-2005
              • 16758

              #7
              tendrias que fijarte que criterio usa el BETWEEN. necesitas que use criterios inclusivos, por lo que si no es asi, reemplazala por una comparacion "a mano" con <=, >= y un AND en el medio.

              K

              Comentario

              • Mariotte
                0, 1, 1, 2, 3, 5, 8, 13..
                • 19-10-2003
                • 20868

                #8
                Ahora mismo estoy viendo c&#243;mo redactar para que no me filtre cuando hay nulls
                No me busques porque me vas a encontrar... OMG ^^ .. TE ENCONTRE QUIERO DECIR... o sea lo pillas tio. El que compro dolare recibira dolare. Si te preocupas mucho te arrugas. Te lo juro por vos.

                MÚSICA: Mamúes

                Comentario

                • MoaLaiSkirulais
                  ^^(V)^^
                  • 08-07-2003
                  • 23268

                  #9
                  la interfaz deberia ser lo mas simple posible:

                  buscar:
                  altura desde _ _ _ _
                  altura hasta _ _ _ _

                  y nada mas...

                  Comentario

                  • Mariotte
                    0, 1, 1, 2, 3, 5, 8, 13..
                    • 19-10-2003
                    • 20868

                    #10
                    Estem... s&#237;... es lo que uso... dos text box para llenar... "qu&#233; tiene que ver"
                    (lo de los default values era para emparchar, con la misma interfaz).
                    No me busques porque me vas a encontrar... OMG ^^ .. TE ENCONTRE QUIERO DECIR... o sea lo pillas tio. El que compro dolare recibira dolare. Si te preocupas mucho te arrugas. Te lo juro por vos.

                    MÚSICA: Mamúes

                    Comentario

                    • Mariotte
                      0, 1, 1, 2, 3, 5, 8, 13..
                      • 19-10-2003
                      • 20868

                      #11
                      Jauj creo que es lo más "largo" y a su vez lo más prolijito que "programé" (no sé si puedo considerarme entre las tropas de este noble ejército cuya espada un buen código). Además funciona perfecto. Esto cambia el RecordSource de un subformulario con un botón.


                      Código:
                      Private Function Filtro()
                      
                          
                          Dim SQLstr As String
                          Dim WhereClause As String
                          Dim strNombreDeFantasia As String
                          Dim strCalle As String
                          Dim strEsquina As String
                          Dim strAltura As String
                          Dim strComisaria As String
                          Dim strOtrosDatos As String
                          Dim strFechaInsp As String
                          
                          'NOMBRE DE FANTASIA
                          If IsNull(Me.txtNombreDeFantasia) Then
                              strNombreDeFantasia = "Is Null Or [NombreDeFantasia] Is Not Null) "
                          Else
                              strNombreDeFantasia = "like '*" & Format(Me.txtNombreDeFantasia, "mm/dd/yyyy") & "*') "
                          End If
                          
                          'CALLE
                          If IsNull(Me.cboCalle) Then
                              strCalle = ""
                          Else
                              strCalle = " AND [idCallePpal] = " & Me.cboCalle
                          End If
                          
                          'ESQUINA
                          If IsNull(Me.cboEsquina) Then
                              strEsquina = ""
                          Else
                              strEsquina = " AND [idEsquinaPpal] = " & Me.cboEsquina
                          End If
                          
                          'ALTURA
                          If IsNull(Me.txtAlturaDesde) And IsNull(Me.txtAlturaHasta) Then
                              strAltura = ""
                          ElseIf Not IsNull(Me.txtAlturaDesde) And IsNull(Me.txtAlturaHasta) Then
                              strAltura = " AND (([AlturaDesdePpal]<='" & Me.txtAlturaDesde & "') and ([AlturaHastaPpal]>='" & Me.txtAlturaDesde & "'))"
                          ElseIf Not IsNull(Me.txtAlturaHasta) And IsNull(Me.txtAlturaDesde) Then
                              strAltura = " AND (([AlturaDesdePpal]<='" & Me.txtAlturaHasta & "') and ([AlturaHastaPpal]>='" & Me.txtAlturaHasta & "'))"
                          Else
                              strAltura = " AND (([AlturaDesdePpal]<= '" & Me.txtAlturaDesde & "' and [AlturaHastaPpal]>='" & Me.txtAlturaHasta & "') or " & _
                                          " ([AlturaDesdePpal]>= '" & Me.txtAlturaDesde & "' and [AlturaHastaPpal]<='" & Me.txtAlturaHasta & "') or " & _
                                          " ([AlturaDesdePpal]>= '" & Me.txtAlturaDesde & "' and [AlturaDesdePpal]<='" & Me.txtAlturaHasta & "') or " & _
                                          " ([AlturaHastaPpal]>= '" & Me.txtAlturaDesde & "' and [AlturaHastaPpal]<='" & Me.txtAlturaHasta & "'))"
                          End If
                          
                          'COMISARIA
                          If IsNull(Me.cboComisaria) Then
                              strComisaria = ""
                          Else
                              strComisaria = " AND [ComisariaNumero] = " & Me.cboComisaria
                          End If
                          
                          'OTROS DATOS
                          If IsNull(Me.txtOtrosDatos) Then
                              strOtrosDatos = ""
                          Else
                              strOtrosDatos = " AND [OtrosDatosLocal] like '*" & Me.txtOtrosDatos & "*'"
                          End If
                         
                          'FECHA INSPECCION
                          If IsNull(Me.txtFechaInsp1) And IsNull(Me.txtFechaInsp2) Then
                              strFechaInsp = ""
                          ElseIf Not IsNull(Me.txtFechaInsp1) And IsNull(Me.txtFechaInsp2) Then
                              strFechaInsp = " AND [FechaInsp]=#" & Format(Me.txtFechaInsp1, "Medium Date") & "#"
                          ElseIf Not IsNull(Me.txtFechaInsp2) And IsNull(Me.txtFechaInsp1) Then
                              strFechaInsp = " AND [FechaInsp]=#" & Format(Me.txtFechaInsp2, "Medium Date") & "#"
                          Else
                              strFechaInsp = " AND [FechaInsp]Between #" & Format(Me.txtFechaInsp1, "Medium Date") & "# and #" & Format(Me.txtFechaInsp2, "Medium Date") & "#"
                          End If
                         
                         
                          SQLstr = "SELECT tblLocal.idLocal, tblLocal.NombreDeFantasia, tblLocal.idCallePpal, tblLocal.AlturaDesdePpal, tblLocal.AlturaHastaPpal, tblLocal.idEsquinaPpal, tblLocal.idCalleSec, tblLocal.AlturaDesdeSec, tblLocal.AlturaHastaSec, tblLocal.idEsquinaSec, tblLocal.OtrosDatosLocal, tlkpComisaria.ComisariaNumero, tblInspeccion.idInspeccion, tblInspeccion.FechaInsp " & _
                                   "FROM tlkpComisaria RIGHT JOIN (tblLocal LEFT JOIN tblInspeccion ON tblLocal.idLocal = tblInspeccion.idLocal) ON tlkpComisaria.idComisaria = tblLocal.idComisaria " & _
                                   "WHERE ([NombreDeFantasia] " & strNombreDeFantasia _
                                   & strCalle & strEsquina & strComisaria _
                                   & strOtrosDatos & strFechaInsp & strAltura & _
                                   ";"
                                   
                               
                          Me!fsubBusquedasSIN.Form.RecordSource = SQLstr
                          MsgBox SQLstr
                      
                      
                      End Function
                      Después de probar bastante me di cuenta que con SQL sólo no lo iba a poder trabajar, así que hice que el SQL lo cree el VBA... pero estuve dándo vueltas hasta encontrar la mejor manera de que se vaya armando la el strSQL.

                      Una vez que lo entendí pude trabajar más tranqui y hacer todo lo que quería. Manejar los nulls, etc; además que esta forma de encararlo deja abiertas más opciones... como meterle múltiples opciones o checkboxes locos. Por ejemplo lo de las alturas:

                      Código:
                         If IsNull(Me.txtAlturaDesde) And IsNull(Me.txtAlturaHasta) Then
                              strAltura = ""
                          ElseIf Not IsNull(Me.txtAlturaDesde) And IsNull(Me.txtAlturaHasta) Then
                              strAltura = " AND (([AlturaDesdePpal]<='" & Me.txtAlturaDesde & "') and ([AlturaHastaPpal]>='" & Me.txtAlturaDesde & "'))"
                          ElseIf Not IsNull(Me.txtAlturaHasta) And IsNull(Me.txtAlturaDesde) Then
                              strAltura = " AND (([AlturaDesdePpal]<='" & Me.txtAlturaHasta & "') and ([AlturaHastaPpal]>='" & Me.txtAlturaHasta & "'))"
                          Else
                              strAltura = " AND (([AlturaDesdePpal]<= '" & Me.txtAlturaDesde & "' and [AlturaHastaPpal]>='" & Me.txtAlturaHasta & "') or " & _
                                          " ([AlturaDesdePpal]>= '" & Me.txtAlturaDesde & "' and [AlturaHastaPpal]<='" & Me.txtAlturaHasta & "') or " & _
                                          " ([AlturaDesdePpal]>= '" & Me.txtAlturaDesde & "' and [AlturaDesdePpal]<='" & Me.txtAlturaHasta & "') or " & _
                                          " ([AlturaHastaPpal]>= '" & Me.txtAlturaDesde & "' and [AlturaHastaPpal]<='" & Me.txtAlturaHasta & "'))"
                          End If
                      Gracias de nuevo kkkkkk =D jsuj coso lo gracioso es que para resolverlo tuve que hacer unos diagramas que no hacía desde la secundaria, pero enseguida lo saqué... aunque tenía tan oxidada esa parte de la mente que al principio como que ni pensaba en mayores o igual jafu no sé.

                      Tincho si querés después te paso el cosito completo a ver qué te parece.
                      No me busques porque me vas a encontrar... OMG ^^ .. TE ENCONTRE QUIERO DECIR... o sea lo pillas tio. El que compro dolare recibira dolare. Si te preocupas mucho te arrugas. Te lo juro por vos.

                      MÚSICA: Mamúes

                      Comentario

                      Trabajando...