Problema con conversion de fechas


#1

Hola estoy implementando el tipico buscador con fecha de inicio y final
para una determinada clase de objetos, pero llevo toda la tarde y la
cosa esta cruda.

En la vista de buscadata lo que hago es almacenar el valor del año, mes
y dia inicial/final, esto debe funcionar, no son mas que unos campos de
texto.

Aqui esta el codigo:

<% form_tag ({:action =>‘buscadata’},{:class => ‘lgn’}) do%>
<%= stylesheet_link_tag “show” %>

Busqueda por fechas de LGN

<%='Introduzca Fecha inicial (DD/MM/AA)'%>
<%= text_field_tag :dia, params[:dia_ini]%> <%= text_field_tag :mes, params[:mes_ini]%> <%= text_field_tag :anyo, params[:any_ini]%>

<%='Introduzca Fecha Final (DD/MM/AA)'%>
<%= text_field_tag :dia, params[:dia_fin]%> <%= text_field_tag :mes, params[:mes_fin]%> <%= text_field_tag :anyo, params[:any_fin]%>

<%= submit_tag “Buscar entre las fechas seleccionadas”, :name=>nil%>

<%end%>

Sequidamente en buscadata lo que intento es que me busque en mi base de
datos estos objetos desde la fecha inicial y la final que previamente
hemos introducido. Lo que pasa es que no encuentro la forma de generar
una variable que sql entienda como fecha. Mi codigo es algo asi:

def buscadata
date1 = ??? Como crear con las variables:añoini :mesini :diaini algo
que sql lo entienda como un formato de fecha para poder realizar la
busqueda
date2 = ??? Idem

#La busqueda en SQL seria asi:
@lgn=Lgn.find(:all, :conditions => ['created_at >=? and created_at <=
? ', date1, date2 ])

He usado el buscador, pero no he encontrado mucho respecto a mi duda,
asi que agradeceria muchisimo cualquier comentario.

Gracias y saludos

end


#2

Hola Jose, tal vez algo asi pueda ayudar:

class TuControlador < AC

def buscadata
date1 =
parse_date("#{params[:dia_ini]}/#{params[:mes_ini]/#{params[:any_ini]}")
date2 =
parse_date("#{params[:dia_fin]}/#{params[:mes_fin]/#{params[:any_fin]}")
if date1 and date2
@lgn=Lgn.find(:all, :conditions => ['created_at >=? and created_at
<=?
', date1, date2 ])
end
end

private

def parse_date(str, format=’%d/%m/%Y’)
begin
date = Date.strptime(str, format)
return date
rescue ArgumentError
return false
end
end
end

El parser de fechas llega gracias a Daniel R. Troitiño :wink:

Saludos.


#3

Hola, gracias por las respuestas. Actualmente tengo:

def buscadata
date1
=parse_date("#{params[:dia_ini]}/#{params[:mes_ini]}/#{params[:any_ini]}")
date2
=parse_date("#{params[:dia_fin]}/#{params[:mes_fin]}/#{params[:any_fin]}")
if date1 and date2
@lgns=Lgn.find(:all, :conditions => [‘created_at >=? and
created_at <=?’, date1, date2 ])
end
end
######################################################################################################
private

def parse_date(str, format=’%d/%m/%Y’)
begin
date = Date.strptime(str, format)
return date
rescue ArgumentError
return false
end
end

Pero cuando lo llevo a la vista de buscadata (un copy paste de la del
index) me dice que @lgns esta vacio:
You have a nil object when you didn’t expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each

Extracted source (around line #31):

28:

Email
29:
30:
31: <% for lgn in @lgns %>
32:
33: <%=h lgn.user_id %>
34: <%=h lgn.client_id %>

##################################################3
Estos son los parametros que se pueden observar durante la ejecucion en
consola:
Processing LgnsController#buscadata (for 127.0.0.1 at 2008-12-05
16:44:14) [POST]
Session ID: 228043c88804095ae481b956ad325890
Parameters:
{“authenticity_token”=>“1e73ef6797efcbfd4079674e0545a003326118bd”,
“action”=>“buscadata”, “mes”=>“12”, “dia”=>“1”, “controller”=>“lgns”,
“anyo”=>“2007”}
e[4;35;1mUser Load (0.000000)e[0m e[0mSELECT * FROM users WHERE
(users.“id” = 1) LIMIT 1e[0m
Rendering template within layouts/lgns
Rendering lgns/buscadata

Es como si solo almacenara los datos del inicio de la busqueda no?


#4

Manuel González Noriega wrote:

2008/12/5 Jose vicente Ribera pellicer
removed_email_address@domain.invalid

Pero cuando lo llevo a la vista de buscadata (un copy paste de la del
index) me dice que @lgns esta vacio:

Pon un breakapoint en el controlador y comprueba tanto los contenidos de
params como que el parseo de la fecha devuelva lo que esperas y que el
find
te esté devolviendo datos. Ejecutar la SQL de búsqueda en la consola de
base
de datos tampoco sobraría.


Programo con e-texteditor…con esto puedo poner breakpoints?..Los he
utilizado para ver errores, pero era programando en Matlab


#5

2008/12/5 Jose vicente Ribera pellicer
removed_email_address@domain.invalid


Programo con e-texteditor…con esto puedo poner breakpoints?..Los he
utilizado para ver errores, pero era programando en Matlab

Por ejemplo,

http://wiki.rubyonrails.org/rails/pages/HowtoDebugWithRubyDebug


#6

Así a simple vista no parece que los nombres de los parámetros que
envías coincidan con los que luego consultas en el controlador.

:confused:

(Perdón por la sintaxis, escrito desde el móvil)

Fernando Guillén
Desarrollador Web Freelance
http://fernandoguillen.info

El 05/12/2008, a las 16:47, Jose vicente Ribera pellicer
<removed_email_address@domain.invalid

escribió:


#7

2008/12/5 Jose vicente Ribera pellicer
removed_email_address@domain.invalid

Pero cuando lo llevo a la vista de buscadata (un copy paste de la del
index) me dice que @lgns esta vacio:

Pon un breakapoint en el controlador y comprueba tanto los contenidos de
params como que el parseo de la fecha devuelva lo que esperas y que el
find
te esté devolviendo datos. Ejecutar la SQL de búsqueda en la consola de
base
de datos tampoco sobraría.


#8

Fernando G. wrote:

Así a simple vista no parece que los nombres de los parámetros que
envías coincidan con los que luego consultas en el controlador.

:confused:

(Perdón por la sintaxis, escrito desde el móvil)

Fernando Guillén
Desarrollador Web Freelance
http://fernandoguillen.info

El 05/12/2008, a las 16:47, Jose vicente Ribera pellicer
<removed_email_address@domain.invalid

escribió:

Tienes razon, justo termino de solventarlo, muchas gracias, pero el
error persiste. Eso si ahora almenos ya carga los datos correctos,tal y
como dice el error:

Parameters:

{“mes_fin”=>“12”,
“dia_fin”=>“30”,
“any_fin”=>“2008”,
“authenticity_token”=>“1e73ef6797efcbfd4079674e0545a003326118bd”,
“mes_ini”=>“1”,
“dia_ini”=>“1”,
“any_ini”=>“2008”}

Lo he solventado cambiando el nobre del text_field en vez de
dia->dia_inicio…, ahora el nombre del text fiend coincide con el del
parametro.

Por cierto buscando he encontrado informacion para pasar el vecto a
fecha con:

date =str.to_date

pero nada la cosa sigue igual :frowning:


#9

Por cierto Manuel…gracias por el enlace, me pongo ya a ello.

Cualquier ayuda sea agradecida


#10

increible pero cierto…

Lo bueno: ya nome genera error…me dirige a la vista si!!!
Lo malo: ya le puedo meter la fecha que quiera que me muestra todos los
objetos que tengo creados

Ironico no? de tener un nil a un full…joe con el temita :frowning:


#11

SOLUCIONADO!!!

Gracias a todos por la ayuda, lo repetire hasta la saciedad, pero asi da
gusto.

Comento cual era el problema por si ayuda a alguien en el futuro.

En la consolo ejecute:
‘11/12/2008’.to_date y ante mi aombro genero un error…solucion
‘12/11/2008’.to_date…es decir (mes/dia/año).to_date y no
(dia/mes/año).to_date.

Simplemente cambie el orden de los argumentos en buscadata por:

def buscadata
date1
=parse_date("#{params[:mes_ini]}/#{params[:dia_ini]}/#{params[:any_ini]}")
date2
=parse_date("#{params[:mes_fin]}/#{params[:dia_fin]}/#{params[:any_fin]}")
if date1 and date2
@lgns=Lgn.find(:all, :conditions => [‘created_at >=? and
created_at <=?’, date1, date2 ])
end
end

y ahora todo funciona a las mil maravillas.

Un saludo y mil gracias.