Forum: Rails-ES Problema con conversion de fechas

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
0fdce938a28a604fd5613a68b0d78fcb?d=identicon&s=25 Jose vicente Ribera pellicer (joripel)
on 2008-12-04 20:33
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%>   <!--
cuando pulse el boton ira a buscadata de lgn -->
<%= stylesheet_link_tag "show" %>


<h1>Busqueda por fechas de LGN</h1>

<p>
 <b><%='Introduzca Fecha inicial (DD/MM/AA)'%></b><br />      <!--para
introducir dia mes y año del inicio de la busqueda-->
 <%= text_field_tag :dia, params[:dia_ini]%>
 <%= text_field_tag :mes, params[:mes_ini]%>
 <%= text_field_tag :anyo, params[:any_ini]%>
 </p>
 <p>
  <b><%='Introduzca Fecha Final (DD/MM/AA)'%></b><br />      <!--para
introducir dia mes y año del inicio de la busqueda-->
   <%= text_field_tag :dia, params[:dia_fin]%>
 <%= text_field_tag :mes, params[:mes_fin]%>
 <%= text_field_tag :anyo, params[:any_fin]%>
 </p>

  <%= 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
0e34c56054c414263e933a1b8b3d0d55?d=identicon&s=25 Ruben Davila (rdavila)
on 2008-12-04 21:30
(Received via mailing list)
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 Rodriguez Troitiño ;)

Saludos.
0fdce938a28a604fd5613a68b0d78fcb?d=identicon&s=25 Jose vicente Ribera pellicer (joripel)
on 2008-12-05 16:47
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:     <th>Email</th>
29:   </tr>
30:
31: <% for lgn in @lgns %>
32:  <tr class="<%=cycle('odd','par')%>">
33:     <td><%=h lgn.user_id %></td>
34:     <td><%=h lgn.client_id %></td>

##################################################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"}
  User Load (0.000000)   SELECT * FROM users WHERE
(users."id" = 1) LIMIT 1
Rendering template within layouts/lgns
Rendering lgns/buscadata


Es como si solo almacenara los datos del inicio de la busqueda no?
5c15703984caa012845b3cea129da936?d=identicon&s=25 Manuel González Noriega (Guest)
on 2008-12-05 17:04
(Received via mailing list)
2008/12/5 Jose vicente Ribera pellicer
<ruby-forum-incoming@andreas-s.net>

>
> 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.
0fdce938a28a604fd5613a68b0d78fcb?d=identicon&s=25 Jose vicente Ribera pellicer (joripel)
on 2008-12-05 17:24
Manuel González Noriega wrote:
> 2008/12/5 Jose vicente Ribera pellicer
> <ruby-forum-incoming@andreas-s.net>
>
>>
>> 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
5c15703984caa012845b3cea129da936?d=identicon&s=25 Manuel González Noriega (Guest)
on 2008-12-05 17:34
(Received via mailing list)
2008/12/5 Jose vicente Ribera pellicer
<ruby-forum-incoming@andreas-s.net>

> -----------------
> 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/HowtoDebug...
6f952bee7570a3db2ecba5b06c0062b3?d=identicon&s=25 Fernando Guillen (Guest)
on 2008-12-05 17:34
(Received via mailing list)
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.

:/


(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
<ruby-forum-incoming@andreas-s.net
 > escribió:
0fdce938a28a604fd5613a68b0d78fcb?d=identicon&s=25 Jose vicente Ribera pellicer (joripel)
on 2008-12-05 17:49
Fernando Guillen 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.
>
> :/
>
>
> (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
> <ruby-forum-incoming@andreas-s.net
>  > 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 :(
0fdce938a28a604fd5613a68b0d78fcb?d=identicon&s=25 Jose vicente Ribera pellicer (joripel)
on 2008-12-05 17:51
Por cierto Manuel...gracias por el enlace, me pongo ya a ello.


Cualquier ayuda sea agradecida
0fdce938a28a604fd5613a68b0d78fcb?d=identicon&s=25 Jose vicente Ribera pellicer (joripel)
on 2008-12-05 17:55
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 :(
0fdce938a28a604fd5613a68b0d78fcb?d=identicon&s=25 Jose vicente Ribera pellicer (joripel)
on 2008-12-05 18:13
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.
This topic is locked and can not be replied to.