[Lazarus-es] trabajando con horas

Jesus Reyes jesusrmx en yahoo.com.mx
Mar Oct 19 02:45:09 CEST 2010



--- El lun 18-oct-10, Paola Bruccoleri <pbruccoleri en adinet.com.uy> escribió:

> De: Paola Bruccoleri <pbruccoleri en adinet.com.uy>
> Asunto: Re: [Lazarus-es] trabajando con horas
> A: "Spanish version of Lazarus List" <lazarus-es en lists.lazarus.freepascal.org>
> Fecha: lunes, 18 de octubre de 2010, 16:17
>  El 18/10/2010 02:26 p.m., José
> Mejuto escribió:
> > Hello Paola,
> > 
> > Monday, October 18, 2010, 6:21:22 PM, you wrote:
> > 
> > PB>  la cosa que no lo pude hacer
> funcionar!!..
> > PB>  coloqué la dll en la carpeta UDF de
> firebird, reinicié el server, pero
> > PB>  cuando voy a probarla desde el ibexpert
> me dice que la función no
> > PB>  existe. Quizás me esté faltando hacer
> algo..
> > PB>  chauuuuuuuu
> > 
> > Las UDF tienes que registrarlas en la base de datos,
> para cada base de
> > datos: http://www.firebirdfaq.org/faq169/
> ok.. ya está registrada!!.. qué complicado (más bien
> laaargoo de hacer) si se me ocurre tener registradas todas
> las que trae la dll!!
> 
> Bueno, esto:
> SELECT SECONDS2PERIOD(SUM(hs_trabajo - cast('0:0' as
> time))) FROM form_03
> 
> me devuelve correctamente, pero en formato string la suma
> de las horas: dd:hh:mm:ss..
> 
> pero .. se complica la suma final desde el lazreport.
> 

Exacto, no creo que sea el mejor método en este caso, ver adelante...

> Me gustaría que si Jesús puede, vea cómo optimizar
> esto:
> [STR(INT([qry."HS_TRABAJO"] /
> 3600))]:[STR(INT([qry."HS_TRABAJO"] mod 3600) /
> 60))]:[STR((([qry."HS_TRABAJO"] mod 3600) mod 60))]
> 

no creo eso sea buena idea, a ver, si [qry."HS_TRABAJO"] regresa la cantidad de segundos acumulada por operario, en mi opinión seria mejor dejarle el trabajo de formatear el resultado a una función de usuario, digamos [MiFormato([qry."HS_TRABAJO"])]. 

La función MIFORMATO (LazReport lo pone automáticamente en mayúsculas) se procesa en el evento OnUserFunction del componente TfrReport. En el ejemplo "Editor" se ilustra como procesar posteriormente el parámetro [qry."HS_TRABAJO"] mediante Secs := frParser.Calc(P1), como resultado obtendrás el valor de segundos, el cual puedes procesar de la siguiente manera:

 Val :=  format('%d Dias ',[Secs div SecsPerDay]);
 Secs := Secs mod SecsPerDay;
 Val := Val + format('%d:', [Secs div 3600]);
 Secs := Secs mod 3600;
 Val := Val + format('%d:',[Secs div 60]);
 Secs := Secs mod 60;
 Val := Val + format('%d',[Secs]);

o usando las formulas que ya han comentado. De esta manera puedes reusar la función MIFORMATO en cuantos campos necesites.

También, esto te permitirá usar la función de LazReport SUM combinandola asi [MiFormato(SUM(Campo))] para calcular el total y mostrarlo formateado.


> en cada campo del lazreport.. o sea, si se puede poner
> alguna función en algún lado.. no sé.. se me ocurre..
> 
> otra cosa.. ¿cómo es la sintaxis del FORMATTEXT para que
> un número de 1 dígito quede de 2?... 8 -> 08
> 

La función FORMATTEXT esta ligada a la función FormatMaskText la cual no se si este funcionando correctamente, se supone que en Delphi lo haga, mas tarde tratare de ver como funciona. 

Si planeas usar el método que te comento, no es necesario hacer nada extra ya que la función de usuario regresa el valor ya formateado. Si necesitas formatear otros valores te sugiero usar la funcionalidad del botón "Formato" (hacer doble clic sobre el campo en el diseñador de reportes), tiene editor de formato muy fácil de usar.


Jesus Reyes A.


      




More information about the Lazarus-es mailing list