Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-07-2008
Mfi Mfi is offline
Miembro
 
Registrado: may 2007
Posts: 16
Poder: 0
Mfi Va por buen camino
Question Caracteres no numericos en campo bigint

Tengo una tabla con un campo bigint en el que se guardan los Minutos que tarda un determinado proceso, el caso es que un proceso puede tardar un minuto o 300 horas con lo que un campo tipo time no me vale (solo acepta hasta 24 horas).

Mediante los eventos onGetText y onSetText he hecho que me trasforme los datos introducidos y los pase a minutos de forma:

Dato introducido -> dato en el campo
55 -> 55
1:55 -> 115
2:00 -> 120

es decir, que me hace la transformación del formato horario a minutos, el código de transformación funciona correctamente, pero claro, al ser un campo tipo bigint no me deja introducir ':' con lo que no puedo introducir datos en formato horario.

¿hay alguna forma de poder introducir el caracter ':' al escribir el campo? una forma de desactivar que delphi corte los caracteres que se pueden escribir en el campo también me vale, ya que los eventos se encargan de verificar que el valor introducido sea correcto.

Un saludo y gracias por anticipado.
Responder Con Cita
  #2  
Antiguo 15-07-2008
Avatar de RolphyReyes
RolphyReyes RolphyReyes is offline
Miembro
 
Registrado: ago 2004
Ubicación: Santo Domingo
Posts: 285
Poder: 20
RolphyReyes Va por buen camino
Smile

Saludos.

Podrías utilizar un campo Varchar y guardarlo tal cual como tarda, a lo que me refiero 1:55 Min o 2:00H y así no tienes que hacer ninguna conversión ni nada por el estilo.

Otra opción podría ser utilizar un campo Float o Doble Precision y a razón de una formula guardes los valores con sus decimales pudiendo después presentarlos sin incoveniente alguno.

Digo lo anterior porque no te sera posible ponerle algun caracter que no sea numerico a un campo BigInt.
__________________
Gracias,
Rolphy Reyes
Responder Con Cita
  #3  
Antiguo 15-07-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Otra opción es un campo calculado.

- Botón derecho sobre la tabla.
- Fields Editor
- Botón derecho sobre el Editor.
- New Field

Le dices que es tipo string.
En OnGetText:
- Pones el procedimiento que te transforma el campo bigint a horas y minutos.
Código Delphi [-]
procedure TDataModule.TablaCAMPOCALCGetText(Sender: TField;
  var Text: String; DisplayText: Boolean);
begin
   Text := Convierte_Min_En_Horas(TablaCAMPO_BIG_INT.AsInteger);
end;

En OnSetText:
- Convientes las horas y minutos y las pones en el campo bigint.
Código Delphi [-]
procedure TDataModule.TablaCAMPOCALCSetText(Sender: TField;
  const Text: String);
begin
   TablaCAMPO_BIG_INT.AsInteger := Convierte_Horas_En_Minutos(Text);
end;
Responder Con Cita
  #4  
Antiguo 15-07-2008
Mfi Mfi is offline
Miembro
 
Registrado: may 2007
Posts: 16
Poder: 0
Mfi Va por buen camino
Muchas gracias a los dos por las respuestas, os cuento..

Lo de utilizar un campo tipo texto queda descartado porque tengo que hacer muchas consultas estadísticas sobre ese campo.

Lo del campo calculado llevo un par de horas intentandolo.. creo un campo calculado 'campotexto', meto en el evento onCalcFields el código para cargar el valor
Código Delphi [-]
campotexto:=inttostr(campobigint);
y relleno los eventos onGetText y onSetText con un código prácticamente igual que el que me mencionas (más complejo porque hago la conversión directamente, pero que esta probado en el campo bigint cambiando el ':' por un '-' y funciona perfectamente) Pero me encuentro con el problema de que el campocalculado no es editable, con lo cual no se puede modificar su valor y no salta el evento onSetText...

He hecho un rápido intento cambiando el tipo de campo a fkinternalcalc que creo que si es editable.. peeero.. no lo puedo cargar desde onCalcFields...

Sigo partiendome los cuernos con ello.. si saco algo en claro ya posteo la solución...
Responder Con Cita
  #5  
Antiguo 15-07-2008
Mfi Mfi is offline
Miembro
 
Registrado: may 2007
Posts: 16
Poder: 0
Mfi Va por buen camino
Talking

Ya está, la solución que encontré es un poco retorcida pero funciona de perlas...

Lo explico, creé un campo nuevo en la Tabla (en la base de datos) llamado AUX de tipo varchar.
en el IbTable1 le doy a newfield y creo un campo AUX, en las propiedades de dicho campo lo pongo FieldKind=fsInternalCalc, así el campo ya es editable y no me da error al intentar acceder a el.. ahora queda enlazar con el campo bigint:

Creo un campo en la IbTable1 de tipo Calculated, da igual el nombre y tipo, porque solo está para que se lance el evento oncalcFields, y dentro de dicho evento ponemos el codigo:
Código Delphi [-]
IBTable1AUX.asstring:=inttostr(IBTable1CampoBigint.asinteger)

y los eventos onSetText y onGetText con la estructura que puso duilioisola, y listo!!!

Un saludo...
Responder Con Cita
  #6  
Antiguo 15-07-2008
Gallosuarez Gallosuarez is offline
Miembro
 
Registrado: feb 2007
Posts: 92
Poder: 18
Gallosuarez Va por buen camino
Post

Caballeros:

Creo que por mi parte aplicaría una mejor solución (cuidado con las soluciones retorcidas: soluciones retorcidas dan resultados retorcidos ....y poco eficientes además...).

Ahí va....
Crea en tu tabla dos campos de tipo timestamp (periodo_ini y periodo fin, por ejemplo), y si lo deseas, un tercer campo donde guardes el resultado de la diferencia entre estos dos campos (este campo debe de ser double) . Al iniciar el proceso, guardas la fecha y hora actual (ojo debe de ser fecha y hora) en el campo periodo_ini y al finalizar el proceso lo guardas en el campo periodo_fin. La diferencia entre estos dos campos es la fracción del día transcurrida entre procesos.

Prueba lo siguiente:
Código SQL [-]
 
select cast('07/15/08 08:10:00' as timestamp) - cast('07/15/08 08:00:00' as timestamp)
from rdb$database

Resultado = 0.006944444

Es decir, la fracción del día transcurrido.... si lo quieres en minutos simplemente lo multiplicas por 24 * 60 (24 horas que tiene un dia y 60 minutos que tiene una hora). Y listo...

Haz la prueba y nos platicas como te fue...

Saludos,
Gerardo Suárez
Responder Con Cita
  #7  
Antiguo 16-07-2008
Mfi Mfi is offline
Miembro
 
Registrado: may 2007
Posts: 16
Poder: 0
Mfi Va por buen camino
Hola Gallosuarez, gracias por la sugerencia, en principio no encaja muy bien con el programa que tengo entre manos, el tiempo de los procesos (procesos de fabricación) se pone a priori, es decir, es una estimación, con lo cual para el usuario no es práctico poner hora de inicio y hora final. En la parte de control de fabricación (el tiempo real que se tarda) si lo tengo puesto como me comentas.

La solución es para un formulario puntual dentro de la aplicación, aunque la solución es "retorcida" la estructura de la BD es de lo más sencilla, un campo bigint con los minutos, y uno temporal tipo varchar que realmente da igual lo que contenga ya que solo se usa para la interfaz de usuario. El problema era puramente de interfaz de usuario, en lo que a BD se refiere esta todo correcto.

Muchas gracias otra vez por tomaros la molestia de contestar a mi post.
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
Como limitar a caracteres en mayúsculas en campo TDBMemo KAYO Conexión con bases de datos 4 01-05-2008 09:47:26
caracteres numéricos en un edit edusus Varios 1 21-04-2006 00:24:16
Tipo BIGINT en FireBird en Delphi ? teletranx Firebird e Interbase 7 15-03-2004 20:44:28
Campo DbMemo ¿Limitacion a 244 caracteres? borbi OOP 0 22-10-2003 14:55:11
Evitar introducir caracteres en un campo numérico de un TRxdbGrid setry2 OOP 2 07-05-2003 12:07:32


La franja horaria es GMT +2. Ahora son las 04:00:03.


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