Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   Visual Basic clásico (http://www.forosdelweb.com/f69/)
-   -   busqueda por rango de fecha (http://www.forosdelweb.com/f69/busqueda-por-rango-fecha-545174/)

juancho24 03/01/2008 11:50

busqueda por rango de fecha
 
:arriba:HOla amigos del foro

me pueden ayudar con el siguiente problemita:

necesito realizar una busqueda por rango de fechas en una tabla access 2000 con coneccion ADO y k me muestre los resultados en una grilla, el rango de fechas es seleccionado en dos textbox, el primero desde que fecha y el segundo hasta que fecha, y luego al presionar un boton buscar me muestre los resultados en la grilla

eso, espero me puedan ayudar,

gracias

saludos:arriba:

GeoAvila 07/01/2008 14:33

Re: busqueda por rango de fecha
 
Cita:

Iniciado por juancho24 (Mensaje 2235771)
:arriba:HOla amigos del foro

me pueden ayudar con el siguiente problemita:

necesito realizar una busqueda por rango de fechas en una tabla access 2000 con coneccion ADO y k me muestre los resultados en una grilla, el rango de fechas es seleccionado en dos textbox, el primero desde que fecha y el segundo hasta que fecha, y luego al presionar un boton buscar me muestre los resultados en la grilla

eso, espero me puedan ayudar,

gracias

saludos:arriba:

la sentencia es algo así

"select * from tabla where fecha between '#01/01/2007#' and '#31/12/2007#'"

si no te funciona asi quita los numerales
despues las fechas las reemplazas por dtpickers o bien textbox

nos vemos

juancho24 19/02/2008 09:21

Re: busqueda por rango de fecha
 
Cita:

Iniciado por GeoAvila (Mensaje 2239747)
la sentencia es algo así

"select * from tabla where fecha between '#01/01/2007#' and '#31/12/2007#'"

si no te funciona asi quita los numerales
despues las fechas las reemplazas por dtpickers o bien textbox

nos vemos


Hola amigo GeoAvila

una consulta, tienes algun ejemplo acerca de esta consulta que me puedas enviar porfavor, te lo agradeceria mucho:-)

te cuidas:arriba:

bye

franko1809 19/02/2008 15:14

Re: busqueda por rango de fecha
 
Especifica si es vb6 o .net

En visualbasic6.0 lo hice de esta manera

Private Sub cmdBusqueda_Click()
Select Case List1.ListIndex
Case 0
rsLectores.Filter = "" & List1 & " = '" & Text1 & "'"
Case 1 To 2
rsLectores.Filter = "" & List1 & " LIKE '" & Text1 + "%" & "'"
Case 3
rsLectores.Filter = "" & List1 & " >= '" & dtpDesde & "' and " & List1 & " <= '" & dtpHasta & "'"
End Select
If rsLectores.RecordCount <= 0 Then
MsgBox "No se encontro ningun registro"
Text1 = ""
Text1.SetFocus
End If
End Sub

Cambia los controles dtpicker por los text y el list1 por el campo de busqueda

saludos

juancho24 05/03/2008 19:31

Re: busqueda por rango de fecha
 
Amigos ayudenme porfavor, no se en que estoy fallando para k me realice la busqueda por rangos de fechas, se los agradecere muchoo, es urgente

aqui les dejo el codigo para k me ayuden


Private Sub Command1_Click()
Dim sql As String

sql = " SELECT DATOSVISITADOR.RutVisitador, DATOSVISITADOR.DvVisitador, DATOSVISITADOR.NombreVisitador, DATOSCLIENTE.RutCliente, DATOSCLIENTE.DvCliente, DATOSCLIENTE.NombreCliente, OBSERVACIONESGENERALES.MontoCredito, OBSERVACIONESGENERALES.PlazoCredito, OBSERVACIONESGENERALES.NombrePersonaAtendio, OBSERVACIONESGENERALES.HoraVisita, OBSERVACIONESGENERALES.Fecha "
sql = sql & "FROM (DATOSCLIENTE INNER JOIN (DATOSVISITADOR INNER JOIN VISITAS ON (DATOSVISITADOR.DvVisitador = VISITAS.DvVisitador) AND (DATOSVISITADOR.RutVisitador = VISITAS.RutVisitador)) ON (DATOSCLIENTE.ID = VISITAS.ID) AND (DATOSCLIENTE.DvCliente = VISITAS.DvCliente) AND (DATOSCLIENTE.RutCliente = VISITAS.RutCliente)) LEFT JOIN OBSERVACIONESGENERALES ON (VISITAS.DvCliente = OBSERVACIONESGENERALES.DvCliente) AND (VISITAS.RutCliente = OBSERVACIONESGENERALES.RutCliente) AND (VISITAS.ID = OBSERVACIONESGENERALES.ID);"
rs1.Open sql & "WHERE (((OBSERVACIONESGENERALES.FECHA)= #" & Format(Txtfechainicio.Text, "mm/dd/yyyy") & "# and #" & Format(txtfechafin.Text, "mm/dd/yyyy") & "#", cnn1, adOpenDynamic, adLockOptimistic

If rs1.BOF = False And rs1.EOF = False Then
If Txtfechainicio.Text <> "" Or txtfechafin.Text <> "" Then
If rs1("fecha") = Txtfechainicio.Text And txtfechafin.Text Then
Call CargarDataGrid(DataGrid1)
Else
MsgBox ("no hay datos para cargar"), vbInformation
End If
Else
MsgBox ("Debe seleccionar un dato"), vbCritical
com_grupo.Enabled = True
End If
Else
MsgBox ("La tabla no tiene registros"), vbCritical

End If

End Sub


gracias

saludos

Juan

juancho24 06/03/2008 11:27

Re: busqueda por rango de fecha
 
POrfavor ayudenme que es urgente amigos:-(
gracias

saludos


Cita:

Iniciado por franko1809 (Mensaje 2291516)
Especifica si es vb6 o .net

En visualbasic6.0 lo hice de esta manera

Private Sub cmdBusqueda_Click()
Select Case List1.ListIndex
Case 0
rsLectores.Filter = "" & List1 & " = '" & Text1 & "'"
Case 1 To 2
rsLectores.Filter = "" & List1 & " LIKE '" & Text1 + "%" & "'"
Case 3
rsLectores.Filter = "" & List1 & " >= '" & dtpDesde & "' and " & List1 & " <= '" & dtpHasta & "'"
End Select
If rsLectores.RecordCount <= 0 Then
MsgBox "No se encontro ningun registro"
Text1 = ""
Text1.SetFocus
End If
End Sub

Cambia los controles dtpicker por los text y el list1 por el campo de busqueda

saludos


Avellaneda 06/03/2008 12:07

Re: busqueda por rango de fecha
 
Una consulta que me parece demasiado complicada, es decir, demasiados paréntesis sin sentido. ¿ pero, probaste con la primera respuesta que te dieron?


"WHERE (((OBSERVACIONESGENERALES.FECHA) BETWEEN #" & Format(Txtfechainicio.Text, "mm/dd/yyyy") & "# and #" & Format(txtfechafin.Text, "mm/dd/yyyy") & "#",

Aunque creo que, si las fechas vienen de unos TextBox no necesitas hacer el formato de conversión.

Prueba así:
"WHERE (((OBSERVACIONESGENERALES.FECHA) BETWEEN #" & Txtfechainicio & "# AND #" & txtfechafin & "#",

extrem_bcn 06/03/2008 14:21

Re: busqueda por rango de fecha
 
Cita:

Iniciado por Avellaneda (Mensaje 2312293)
Una consulta que me parece demasiado complicada, es decir, demasiados paréntesis sin sentido. ¿ pero, probaste con la primera respuesta que te dieron?


"WHERE (((OBSERVACIONESGENERALES.FECHA) BETWEEN #" & Format(Txtfechainicio.Text, "mm/dd/yyyy") & "# and #" & Format(txtfechafin.Text, "mm/dd/yyyy") & "#",

Aunque creo que, si las fechas vienen de unos TextBox no necesitas hacer el formato de conversión.

Prueba así:
"WHERE (((OBSERVACIONESGENERALES.FECHA) BETWEEN #" & Txtfechainicio & "# AND #" & txtfechafin & "#",

Por experiencia con Acces te recomiendo que SI hagas la conversion a mm/dd/yyyy ya que Access hace el tonto si se lo pasas por dd/mm/yyyy aunque yo para más seguridad lo formateo a yyyy/mm/dd que es el formato "universal" (esto de universal está muy cogido por los pelos eh..)

extrem_bcn 06/03/2008 14:31

Re: busqueda por rango de fecha
 
Por cierto, la sentencia SQL que tienes es.. guapa eh :aplauso: jejejeje en serio, si ves que te va mal mira de filtrarlo por yyyy/mm/dd (aunque con mm/dd/yyyy deberia de irte bien).

Por cierto, respecto el código que va después de la SQL... te corregiria lo siguiente:

If not (rs1.BOF And rs1.EOF) Then 'Es más fácil de leer con el not, no crees?
If isdate(Txtfechainicio) Or isdate(txtfechafin) Then 'Para que haces la comprobación si ya has hecho la SQL? lo lógico seria hacer este filtro al principio de todo ya que si abres el recordset sin fecha te va a pegar un pedo de aquí a HonoLulu (o como se escriba). y utilizaria el isdate en vez de ""

'Creo que aquí pretendres preguntar que si la fecha del rs1 es igual al txtfechainicio y al tctfechafin, no? pues te falta otro =

If rs1("fecha") = Txtfechainicio.Text And rs1("fecha") = txtfechafin.Text Then
Call CargarDataGrid(DataGrid1)
Else
MsgBox ("no hay datos para cargar"), vbInformation
End If
Else
MsgBox ("Debe seleccionar un dato"), vbCritical
com_grupo.Enabled = True
End If
Else
MsgBox ("La tabla no tiene registros"), vbCritical

End If

End Sub

juancho24 08/03/2008 21:16

Re: busqueda por rango de fecha
 
Amigos me sale un error que no se a que se debe, por favor ayudenme, aqui les dejo el codigo marcado en donde me sale el error:

Error'-2147217900 (80040e14)`en tiempo de ejecucion:
se encontraron caracteres despúes del final de la instrucción SQL.



sql = " SELECT DATOSVISITADOR.RutVisitador, DATOSVISITADOR.DvVisitador, DATOSVISITADOR.NombreVisitador, DATOSCLIENTE.RutCliente, DATOSCLIENTE.DvCliente, DATOSCLIENTE.NombreCliente, OBSERVACIONESGENERALES.MontoCredito, OBSERVACIONESGENERALES.PlazoCredito, OBSERVACIONESGENERALES.NombrePersonaAtendio, OBSERVACIONESGENERALES.HoraVisita, OBSERVACIONESGENERALES.Fecha "
sql = sql & "FROM (DATOSCLIENTE INNER JOIN (DATOSVISITADOR INNER JOIN VISITAS ON (DATOSVISITADOR.DvVisitador = VISITAS.DvVisitador) AND (DATOSVISITADOR.RutVisitador = VISITAS.RutVisitador)) ON (DATOSCLIENTE.ID = VISITAS.ID) AND (DATOSCLIENTE.DvCliente = VISITAS.DvCliente) AND (DATOSCLIENTE.RutCliente = VISITAS.RutCliente)) LEFT JOIN OBSERVACIONESGENERALES ON (VISITAS.DvCliente = OBSERVACIONESGENERALES.DvCliente) AND (VISITAS.RutCliente = OBSERVACIONESGENERALES.RutCliente) AND (VISITAS.ID = OBSERVACIONESGENERALES.ID);"
rs1.Open sql & "(WHERE OBSERVACIONESGENERALES.FECHA BETWEEN #" & Txtfechainicio & "# AND #" & txtfechafin & "#)", cnn1, adOpenDynamic, adLockOptimistic

les agradesco su ayuda

saludos:-)


Cita:

Iniciado por extrem_bcn (Mensaje 2312526)
Por cierto, la sentencia SQL que tienes es.. guapa eh :aplauso: jejejeje en serio, si ves que te va mal mira de filtrarlo por yyyy/mm/dd (aunque con mm/dd/yyyy deberia de irte bien).

Por cierto, respecto el código que va después de la SQL... te corregiria lo siguiente:

If not (rs1.BOF And rs1.EOF) Then 'Es más fácil de leer con el not, no crees?
If isdate(Txtfechainicio) Or isdate(txtfechafin) Then 'Para que haces la comprobación si ya has hecho la SQL? lo lógico seria hacer este filtro al principio de todo ya que si abres el recordset sin fecha te va a pegar un pedo de aquí a HonoLulu (o como se escriba). y utilizaria el isdate en vez de ""

'Creo que aquí pretendres preguntar que si la fecha del rs1 es igual al txtfechainicio y al tctfechafin, no? pues te falta otro =

If rs1("fecha") = Txtfechainicio.Text And rs1("fecha") = txtfechafin.Text Then
Call CargarDataGrid(DataGrid1)
Else
MsgBox ("no hay datos para cargar"), vbInformation
End If
Else
MsgBox ("Debe seleccionar un dato"), vbCritical
com_grupo.Enabled = True
End If
Else
MsgBox ("La tabla no tiene registros"), vbCritical

End If

End Sub


Avellaneda 09/03/2008 02:59

Re: busqueda por rango de fecha
 
Es por el punto y coma que pones al final de la sentencia sql. Además debes quitar los paréntesis en la instrucción Open del recordset. En fin, prueba poniendo el código así:

Código:

Dim sql As String
If Txtfechainicio.Text = "" Or Txtfechafin.Text = "" Then
    MsgBox ("Debe seleccionar un dato"), vbCritical
    com_grupo.Enabled = True
    Exit Sub
End If
rs1.CursorLocation = adUseClient
sql = " SELECT DATOSVISITADOR.RutVisitador, DATOSVISITADOR.DvVisitador, DATOSVISITADOR.NombreVisitador, DATOSCLIENTE.RutCliente, DATOSCLIENTE.DvCliente, DATOSCLIENTE.NombreCliente, OBSERVACIONESGENERALES.MontoCredito, OBSERVACIONESGENERALES.PlazoCredito, OBSERVACIONESGENERALES.NombrePersonaAtendio, OBSERVACIONESGENERALES.HoraVisita, OBSERVACIONESGENERALES.Fecha "
sql = sql & "FROM (DATOSCLIENTE INNER JOIN (DATOSVISITADOR INNER JOIN VISITAS ON (DATOSVISITADOR.DvVisitador = VISITAS.DvVisitador) AND (DATOSVISITADOR.RutVisitador = VISITAS.RutVisitador)) ON (DATOSCLIENTE.ID = VISITAS.ID) AND (DATOSCLIENTE.DvCliente = VISITAS.DvCliente) AND (DATOSCLIENTE.RutCliente = VISITAS.RutCliente)) LEFT JOIN OBSERVACIONESGENERALES ON (VISITAS.DvCliente = OBSERVACIONESGENERALES.DvCliente) AND (VISITAS.RutCliente = OBSERVACIONESGENERALES.RutCliente) AND (VISITAS.ID = OBSERVACIONESGENERALES.ID)"
rs1.Open sql & "WHERE OBSERVACIONESGENERALES.FECHA BETWEEN #" & Txtfechainicio & "# AND #" & Txtfechafin & "#", cnn1, adOpenDynamic, adLockOptimistic

If rs1.RecordCount > 0 Then
    Call CargarDataGrid(DataGrid1)
Else
    MsgBox ("no hay datos para cargar"), vbInformation
End If

Aún así, creo que la sentencia es demasiado recargada y con demasiadas comparaciones:

(DATOSCLIENTE.ID = VISITAS.ID) AND (DATOSCLIENTE.DvCliente = VISITAS.DvCliente) AND (DATOSCLIENTE.RutCliente = VISITAS.RutCliente)

¿No sería igual comparar solamente el ID? los demás campos, se supone que siempre son iguales.

juancho24 09/03/2008 17:45

Re: busqueda por rango de fecha
 
Gracias a todos por la ayuda que me han dado, espero porfavor me sigan ayudando con lo siguiente, miren ya no me salen errores en codigo, me muestra datos buscados en la grilla pero no todos, solo me muestra el primer dato de la tabla, me muestra la linea del primer registro, a k se puede deber esto?

ayudenme porfavor

les dejo el ultimo codigo que tengo

gracias

Private Sub Command1_Click()


Dim sql As String

sql = " SELECT DATOSVISITADOR.RutVisitador, DATOSVISITADOR.DvVisitador, DATOSVISITADOR.NombreVisitador, DATOSCLIENTE.RutCliente, DATOSCLIENTE.DvCliente, DATOSCLIENTE.NombreCliente, OBSERVACIONESGENERALES.MontoCredito, OBSERVACIONESGENERALES.PlazoCredito, OBSERVACIONESGENERALES.NombrePersonaAtendio, OBSERVACIONESGENERALES.HoraVisita, OBSERVACIONESGENERALES.Fecha "
sql = sql & "FROM (DATOSCLIENTE INNER JOIN (DATOSVISITADOR INNER JOIN VISITAS ON (DATOSVISITADOR.DvVisitador = VISITAS.DvVisitador) AND (DATOSVISITADOR.RutVisitador = VISITAS.RutVisitador)) ON (DATOSCLIENTE.ID = VISITAS.ID) AND (DATOSCLIENTE.DvCliente = VISITAS.DvCliente) AND (DATOSCLIENTE.RutCliente = VISITAS.RutCliente)) LEFT JOIN OBSERVACIONESGENERALES ON (VISITAS.DvCliente = OBSERVACIONESGENERALES.DvCliente) AND (VISITAS.RutCliente = OBSERVACIONESGENERALES.RutCliente) AND (VISITAS.ID = OBSERVACIONESGENERALES.ID)"
rs1.Open sql & "WHERE OBSERVACIONESGENERALES.FECHA BETWEEN #" & txtFechaInicio & "# AND #" & txtfechafin & "#", cnn1, adOpenDynamic, adLockOptimistic

If rs1.BOF = False And rs1.EOF = False Then
If txtFechaInicio.Text <> "" Or txtfechafin.Text <> "" Then
If rs1("fecha") >= txtFechaInicio.Text And rs1("fecha") <= txtfechafin.Text Then
rs1.MoveNext
Call CargarDataGrid(DataGrid1)
Else
MsgBox ("no hay datos para cargar"), vbInformation
End If
Else
MsgBox ("Debe seleccionar un dato"), vbCritical
com_grupo.Enabled = True
End If
Else
MsgBox ("La tabla no tiene registros"), vbCritical

End If

End Sub





Cita:

Iniciado por Avellaneda (Mensaje 2315309)
Es por el punto y coma que pones al final de la sentencia sql. Además debes quitar los paréntesis en la instrucción Open del recordset. En fin, prueba poniendo el código así:

Código:

Dim sql As String
If Txtfechainicio.Text = "" Or Txtfechafin.Text = "" Then
    MsgBox ("Debe seleccionar un dato"), vbCritical
    com_grupo.Enabled = True
    Exit Sub
End If
rs1.CursorLocation = adUseClient
sql = " SELECT DATOSVISITADOR.RutVisitador, DATOSVISITADOR.DvVisitador, DATOSVISITADOR.NombreVisitador, DATOSCLIENTE.RutCliente, DATOSCLIENTE.DvCliente, DATOSCLIENTE.NombreCliente, OBSERVACIONESGENERALES.MontoCredito, OBSERVACIONESGENERALES.PlazoCredito, OBSERVACIONESGENERALES.NombrePersonaAtendio, OBSERVACIONESGENERALES.HoraVisita, OBSERVACIONESGENERALES.Fecha "
sql = sql & "FROM (DATOSCLIENTE INNER JOIN (DATOSVISITADOR INNER JOIN VISITAS ON (DATOSVISITADOR.DvVisitador = VISITAS.DvVisitador) AND (DATOSVISITADOR.RutVisitador = VISITAS.RutVisitador)) ON (DATOSCLIENTE.ID = VISITAS.ID) AND (DATOSCLIENTE.DvCliente = VISITAS.DvCliente) AND (DATOSCLIENTE.RutCliente = VISITAS.RutCliente)) LEFT JOIN OBSERVACIONESGENERALES ON (VISITAS.DvCliente = OBSERVACIONESGENERALES.DvCliente) AND (VISITAS.RutCliente = OBSERVACIONESGENERALES.RutCliente) AND (VISITAS.ID = OBSERVACIONESGENERALES.ID)"
rs1.Open sql & "WHERE OBSERVACIONESGENERALES.FECHA BETWEEN #" & Txtfechainicio & "# AND #" & Txtfechafin & "#", cnn1, adOpenDynamic, adLockOptimistic

If rs1.RecordCount > 0 Then
    Call CargarDataGrid(DataGrid1)
Else
    MsgBox ("no hay datos para cargar"), vbInformation
End If

Aún así, creo que la sentencia es demasiado recargada y con demasiadas comparaciones:

(DATOSCLIENTE.ID = VISITAS.ID) AND (DATOSCLIENTE.DvCliente = VISITAS.DvCliente) AND (DATOSCLIENTE.RutCliente = VISITAS.RutCliente)

¿No sería igual comparar solamente el ID? los demás campos, se supone que siempre son iguales.


extrem_bcn 10/03/2008 00:23

Re: busqueda por rango de fecha
 
el último código? pero si es el mismo de siempre ...
Además ... mucho caso de los consejos no haces... anteriormente te dije que seria mejor cambiar esta línea:

If txtFechaInicio.Text <> "" Or txtfechafin.Text <> "" Then

por esta


If isdate(txtFechaInicio) Or isdate(txtfechafin.Text) Then

Y que de poco servia ponerla cuando ya has abierto el recordset ..... ya que si en el txt introduzco letras que pasará? pues que te colará todo ... o ... y si introduzco 30/02/07? pues que tambien colará ... (el 30 del 02 no existe..)

un consejo (esta vez no sobre código): intenta desglosar el problema... pegar todo el código del proyecto aquí no es la mejor solución... donde está el error (en teoria) es en la SQL así que centrate en eso ... y explica un poco la estructura de la tabla.

Saludos y suerte...

usuario_16 13/02/2010 02:42

Respuesta: Re: busqueda por rango de fecha
 
Cita:

Iniciado por Avellaneda (Mensaje 2312293)
Una consulta que me parece demasiado complicada, es decir, demasiados paréntesis sin sentido. ¿ pero, probaste con la primera respuesta que te dieron?


"WHERE (((OBSERVACIONESGENERALES.FECHA) BETWEEN #" & Format(Txtfechainicio.Text, "mm/dd/yyyy") & "# and #" & Format(txtfechafin.Text, "mm/dd/yyyy") & "#",

Aunque creo que, si las fechas vienen de unos TextBox no necesitas hacer el formato de conversión.

Prueba así:
"WHERE (((OBSERVACIONESGENERALES.FECHA) BETWEEN #" & Txtfechainicio & "# AND #" & txtfechafin & "#",

Hola oye yo tengo un problema similar al que se esta mencionado, solo que aparte de necesitar hacer una búsqueda en un rango de fechas necesito también obtener los registros que tienen una marca en un campo boolean, solo que al hacer la consulta tanto en visual como en access solo me da como resultado los registros de las fechas especificadas pero que en el campo de la marca tienen falso y yo necesito los de verdadero, lo estoy realizando de esta manera:

rs.Open "SELECT * From tabla where campo_marca=true and fecha between #& Format(Text1.Text, "dd/mm/yyyy") & "# and #" & Format(Text2.Text, "dd/mm/yyyy") & "# "

Como le puedo hacer?. Espero me puedas ayudar por favor, muchas gracias =)

JavierB 13/02/2010 04:07

Respuesta: busqueda por rango de fecha
 
Hola usuario_16

Te recuerdo el aviso que había al final de este tema y que parece que no has leído.

http://img39.imageshack.us/img39/9218/antiguow.jpg

Tema cerrado.


La zona horaria es GMT -6. Ahora son las 07:49.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.