Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Caracteres no numericos en campo bigint (https://www.clubdelphi.com/foros/showthread.php?t=58282)

Mfi 15-07-2008 11:21:38

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.

RolphyReyes 15-07-2008 14:00:05

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.

duilioisola 15-07-2008 14:36:36

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;

Mfi 15-07-2008 14:50:33

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...:mad:

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...

Mfi 15-07-2008 15:33:21

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

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!!! :D:D:D:D

Un saludo...

Gallosuarez 15-07-2008 22:09:56

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...:eek:).

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... :D:D

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

Saludos,
Gerardo Suárez

Mfi 16-07-2008 08:24:55

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.


La franja horaria es GMT +2. Ahora son las 15:32:49.

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