Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-11-2011
mizzard mizzard is offline
Miembro
NULL
 
Registrado: feb 2011
Posts: 100
Poder: 14
mizzard Va por buen camino
Me estoy haciendo un lio con fechas

Hola a todos!, como digo en el titulo, me estoy haciendo un lio impresionante, os pongo en situacion.

dispongo de un programita que gestiona los tiempos de cada proceso, por lo que cuando se inicia un proceso memorizo en una tabla de access los siguientes campos:

nombreProceso, FechaIn, HoraIn, FechaOut, HoraOut, TiempoTotal.

Pues bien todo funciona a la perfección almacenandose, por ejemplo lo siguiente:

nombreProceso | FechaIn | HoraIn | FechaOut | HoraOut | TiempoTotal
proceso1 | 28/11/2011 | 20:00:00 | 28/11/2011 | 20:35:12 | (lo que tengo que rellenar)


Bueno, digamos que la seccion de codigo en donde se tiene que ejecutar la rutina que calcule los tiempos dispongo de la siguiente informacion:

(ambos se encuentran en un DBText)
FechaIn = DBtxtFechaIn->Caption;
HoraIn = DBtxtHoraIn->Caption;

(ambos se encuentran en un AnsiString)
FechaOut = fecha.SubString(2,11);
HoraOut = hora.SubString(2,11);

El motivo de que sea así es porque cuando pongo la fecha de fin y la hora de fin, las de inicio ya se encuentran en la base de datos, por lo que son accesibles directamente de los DBText, sin embargo aunque actualizo la información de las de fin y la meto en la base de datos, tengo que usar mis variables temporales intermedias (las AnsiString), porque ya he comprobado que la informacion no es manipulable en el momento que actualizo la base de datos y quiero calcular el tiempo.

El caso es que lo he desglosado todo en fecha con formato dd/mm/yyyy y horas con formato hh/mm/ss en dos campos y ahora me armo un lio para calcular la diferencia (que me gustaria que tuviese el formato "hhh/mm/ss") ->tendria como máximo 999 horas.

Tengo un monton de problemas al convertir formatos AnsiString a fechas para que cuando haga la diferencia me salga solo y no me aclaro.

Una vez expuesta mi duda (espero que quede clara) y mi objetivo -> Lo que quiero hacer es viable o es muy farragoso? Como podría hacerlo suponiendo que el acceso a la informacion es como he indicado (DBText para Ins y AnsiString para Outs).


Uf, espero vuestra ayuda amigos!!!, muchas gracias!!!
Responder Con Cita
  #2  
Antiguo 28-11-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboración.

Vaya, si ya llevas un montón de mensajes, pues recuerda poner títulos descriptivos a tus preguntas, gracias.
Responder Con Cita
  #3  
Antiguo 28-11-2011
mizzard mizzard is offline
Miembro
NULL
 
Registrado: feb 2011
Posts: 100
Poder: 14
mizzard Va por buen camino
Lo siento, ha sido la desesperacion del momento, si quieres borrame el mensaje y creo otro hilo con un titulo descriptivo
Responder Con Cita
  #4  
Antiguo 28-11-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Tan sólo recuérdalo para la próxima vez
Responder Con Cita
  #5  
Antiguo 28-11-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
No entiendo por qué motivo usas fechas en formato texto, lo ideal y más cómodo es usarlas como lo que son, fechas, TDateTime.
De esa forma podrás hacer cálculos simples, ten en cuenta que las fechas se guardan como un número con decimales, la parte entera representa los días transcurridos desde 31/12/1899 (creo recordar) y la parte decimal es la hora. Por lo que para calcular diferencias, por ejemplo, es tan simple como hacer: diferencia=fechaactual-fechaanterior
Responder Con Cita
  #6  
Antiguo 28-11-2011
mizzard mizzard is offline
Miembro
NULL
 
Registrado: feb 2011
Posts: 100
Poder: 14
mizzard Va por buen camino
Entiendo que lo logico es usarlos en formato TDateTime, simplemente comento donde tengo ubicada la informacion (al meter la infor en la tabla con comandos SQL, la fecha la pongo en un AnsiString y como los datos de fecha y hora de entrada están ya, me aparecen en un DBText).

Simplemente comento que he tenido muchos problemas para pasar de AnsiString (la informacion que he metido en la tabla de la base de datos) e intentar pasarlo a fecha (no lo he logrado).

Y viendo que no me salia, he expuesto todo mi planteamiento y mi intencionalidad para saber si se podia hacer o si estaba equivocandome en algo.

En caso de que fuera correcta la idea de mostrar el resultado en horas minutos y segundos (formato hhh:mm:ss -> 999:59:59 como max) como podría pasar mi AnsiString a formato TDateTime?

Una vez solventado este problema, entiendo que lo que deberia hacer en primer lugar es restar las fechas para saber los dias (multiplicando por 24 para obtener las horas) y finalmente calcular la diferencia horaria, correcto? o podria meter ambos campos de fecha y hora y restarlos obteniendo un resultado mucho mas cómodo

Un saludo!
Responder Con Cita
  #7  
Antiguo 28-11-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Veamos, si comprendo, tienes una fecha en formato texto, ejemplo: '28/11/2011' y quieres convertirla a formato fecha, por ejemplo:

Código Delphi [-]
var
  myDate : TDateTime;
 begin
  myDate := StrToDate('28/11/2011');
  ShowMessage(DateTimeToStr(myDate));
 end;

¿Es eso?, si no es, entonces, ¿puedes poner un ejemplo?, gracias.
Responder Con Cita
  #8  
Antiguo 30-11-2011
mizzard mizzard is offline
Miembro
NULL
 
Registrado: feb 2011
Posts: 100
Poder: 14
mizzard Va por buen camino
Hola, perdona por la tardanza que he estado liado en otros asuntos.

Tienes razon, usando esa función parece que la cosa funciona bastante bien. Para ello he utilizado variables tipo String y luego esa funcion. Pero se me plantea una duda, como he comentado tengo en una variable TDateTime con formato dd/mm/yyyy y otra variable TDateTime con formato hh/mm/ss tal y como describo a continuacion:

FechaIn | HoraIn | FechaOut | HoraOut
27/11/2011 | 20:00:00 | 28/11/2011 | 19:00:00

Yo habia probado a restar en primer lugar las fechas, obteniendo los dias, y luego proceder a restar las horas, pero claro, la primera es mayor que la segunda para este caso... es decir, no ha llegado a pasar un dia.

Viendo que la cosa se complicaba bastante para determinados casos (recordando que me gustaria mostrar el tiempo total en horas y minutos), se me ha ocurrido si se podria meter en un TDateTime los dos campos FechaIn y HoraIn y en otro TDateTime los campos de FechaOut y HoraOut, de tal forma que fuera todo mas sencillo

Mi pregunta es, esto se puede haceR??, como se haria?

Muchas gracias y un saludo!

Última edición por mizzard fecha: 30-11-2011 a las 01:26:24.
Responder Con Cita
  #9  
Antiguo 30-11-2011
Avatar de olbeup
olbeup olbeup is offline
Miembro
 
Registrado: jul 2005
Ubicación: Santiago de la Ribera (España)
Posts: 685
Poder: 19
olbeup Va camino a la fama
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Veamos, si comprendo, tienes una fecha en formato texto, ejemplo: '28/11/2011' y quieres convertirla a formato fecha, por ejemplo:

Código Delphi [-]
var
  myDate : TDateTime;
 begin
  myDate := StrToDate('28/11/2011');
  ShowMessage(DateTimeToStr(myDate));
 end;

¿Es eso?, si no es, entonces, ¿puedes poner un ejemplo?, gracias.
Siguiendo el ejemplo de Casimiro Notevi, puedes añadir esto:
Código SQL [-]
var
  myDate : TDateTime;
 begin
  myDate := StrToDateTime('28/11/2011 08:18');
  ShowMessage(DateTimeToStr(myDate));
 end;
Un saludo.
Responder Con Cita
  #10  
Antiguo 30-11-2011
mizzard mizzard is offline
Miembro
NULL
 
Registrado: feb 2011
Posts: 100
Poder: 14
mizzard Va por buen camino
Hola, gracias por la respuesta, parece que con horas de descanso y pensando bien las cosas y con vuestra ayuda he conseguido restar las fechas como queria, obteniendo 3 variables tipo int para dias, horas y minutos para cada proceso.

Ahora para finalizar me falta meter esas variables en un campo de la base de datos, para posteriormente sumar todos los campos de todos los procesos y ver los dias, horas y minutos totales. Y aqui es cuando me surge una nueva duda.

siguiendo con la filosofia descrita en este hilo de usar TDateTime, como tendria que almacenar estos datos en mi campo de la base de datos para que posteriormente los pueda sumar facilmente? Me explico, supongamos lo siguiente:

Tiempo proceso 1 | Tiempo proceso 2 | Tiempo proceso 3 | Tiempo TOTAL
1 dia, 2 horas, 20min | 0 dia, 15 horas, 10min | 0 dia, 0 horas, 15min | campo a calcular

Como tengo que almacenar esos int en la base de datos para que pueda hacer la suma total de forma sencilla?

Espero que quede clara mi pregunta, muchas gracias y un saludo!
Responder Con Cita
  #11  
Antiguo 30-11-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Tal y como comenté antes, las fechas son números con decimales, así que para sumarlos sólo has de sumarlos
Código Delphi [-]
tiempototal:=proceso1+proceso2+proceso3
Responder Con Cita
  #12  
Antiguo 30-11-2011
mizzard mizzard is offline
Miembro
NULL
 
Registrado: feb 2011
Posts: 100
Poder: 14
mizzard Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Tal y como comenté antes, las fechas son números con decimales, así que para sumarlos sólo has de sumarlos
Código Delphi [-]
tiempototal:=proceso1+proceso2+proceso3
Cierto, no habia caido que el problema era mucho mas sencillo de lo que me imaginaba... pues a falta de implementarlo (cosa que no creo q tenga problemas) ya estaría todo listo.

Muchisimas gracias a ambos, un saludo y si alguien tiene algun problema parecido, estaré encantado de aportar todo lo que pueda.

Un abrazo!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
TTreeNode, que estoy haciendo mal setq OOP 6 21-11-2011 16:39:09
Que estoy haciendo mal ? piolillo Internet 8 28-07-2011 17:23:24
Que estoy haciendo mal José Luis Garcí Varios 6 24-05-2011 18:45:58
Que estoy haciendo Mal esimon SQL 4 04-07-2006 21:55:25
Que estoy Haciendo mal jostrix PHP 1 01-11-2004 01:29:16


La franja horaria es GMT +2. Ahora son las 16:57:06.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi