Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Edicion fecha que se guarda en una tabla (https://www.clubdelphi.com/foros/showthread.php?t=84492)

jocaro 25-10-2013 12:29:18

Edicion fecha que se guarda en una tabla
 
Hola.

Necesito orientación sobre la que considerais mejor forma de editar un campo fecha.

Mi intención es que en la edición.
  • Se pueda controlar que se introduce sólo información de tipo fecha.
  • Se presente una máscara para las barras de separación.
  • La fecha se pueda presentar en formato dd/mm/aaaa y guardar en la tabla en sentido contrario (aaaa/mm/dd).
  • Posibilidad de seleccionar la fecha desde un componente de calendario.
Como siempre, gracias de antemano por vuestra atención.


Un saludo.

ElDioni 25-10-2013 13:30:49

Puede echarle un vistazo al componente TDateTimePicker, te pone una máscara con las barras, solo te deja introducir fechas válidas y puedes seleccionar la fecha en un calendario, a la hora de guardar la fecha con el formato que dices, creo que había una función que lo hacía pero ahora no lo recuerdo, de todas formas siempres puedes hacer lo siguiente:

Código Delphi [-]
TxtFecha.Text:=TxtFecha.Text[7]+TxtFecha.Text[8]+TxtFecha.Text[9]+TxtFecha.Text[10]+TxtFecha.Text[4]+TxtFecha.Text[5]+TxtFecha.Text[6]+TxtFecha.Text[1]+TxtFecha.Text[2]+TxtFecha.Text[3];

Saludos.

Casimiro Noteví 25-10-2013 13:39:32

Cita:

Empezado por jocaro (Mensaje 468933)
La fecha se pueda presentar en formato dd/mm/aaaa y guardar en la tabla en sentido contrario (aaaa/mm/dd).

¿Para qué quieres guardarla así?

jocaro 25-10-2013 14:18:12

Cita:

Puede echarle un vistazo al componente TDateTimePicker, te pone una máscara con las barras, solo te deja introducir fechas válidas y puedes seleccionar la fecha en un calendario...
Muchas gracias ElDioni por tu ayuda. Creo que es justo lo que buscaba.

Cita:

¿Para qué quieres guardarla así?
Me he planteado la posibilidad de guardar la fecha en la tabla, como un string o un número para después utilizarlo en comparaciones, ordenaciones, etc sin usar funciones de fecha.

ecfisa 25-10-2013 16:01:48

Hola jocaro.

No sé que RDBMS estas usando, pero creo que existen soluciones mas sólidas (y simples) desde la misma base de datos.

Ahora respondiendo a tu pregunta, igual que ElDioni, considero que el TDateTimePicker da solución a los puntos primero, segundo y cuarto de tu consulta.

En cuanto al tercer punto, una opción es usar los eventos OnGetText y OnSetText del campo en cuestión y que también podes asignar en tiempo de diseño creando el campo persistente, ahorrándote así la asignación por código:
Código Delphi [-]
...
procedure TForm1.FormCreate(Sender: TObject);
begin
  Campo.ReadOnly := True;
  DataSet.FieldByName('CAMPO').OnGetText := CampoGetText;
  DataSet.FieldByName('CAMPO').OnSetText := CampoSetText;
end;

procedure TForm1.DateTimePicker1Change(Sender: TObject);
var
  f : string;
begin
  f := DateToStr(DateTimePicker1.Date);
  f := Copy(f, 7, 4) + '/' + Copy(f, 4, 2) + '/' + Copy(f, 1, 2);
  with DataSet do
  begin
    FieldByName('CAMPO').ReadOnly := False;
    Edit;
    FieldByName('CAMPO').AsString := f;
    FieldByName('CAMPO').ReadOnly := True;
  end;
end;

procedure TForm1.CampoGetText(Sender: TField; var Text: string; DisplayText: Boolean);
var
  f: string;
begin
  f := Sender.AsString;
  if f > '' then
    Text := Copy(f, 9, 2) + '/' + Copy(f, 6, 2) + '/' + Copy(f, 1, 4);
end;

procedure TForm1.CampoSetText(Sender: TField; const Text: string);
var
  f: string;
begin
  f := Text;
  if f > '' then
   Sender.AsString := Copy(f, 7, 4) + '/' + Copy(f, 4, 2)+ '/'+ Copy(f, 1, 2);
end;
...

procedure TForm1.FormDestroy(Sender: TObject);
begin
  DataSet.FieldByName('CAMPO').OnGetText := nil;
  DataSet.FieldByName('CAMPO').OnSetText := nil;
end;
De ese modo, mantendrá invertida la fecha en la tabla, pero la mostrará normal en todos los controles de datos sin más.

Notarás que por protección, el campo llamado "CAMPO" (así soy de ocurrente :o), se mantiene en la condición ReadOnly y solo sale de ella por un momento en el evento OnChange del TDateTimePicker, ya que no existe implementado ningún mecanismo de validación sobre la fecha ingresada en otros controles.

Saludos :)

Casimiro Noteví 25-10-2013 16:16:39

Cita:

Empezado por jocaro (Mensaje 468940)
Me he planteado la posibilidad de guardar la fecha en la tabla, como un string o un número para después utilizarlo en comparaciones, ordenaciones, etc sin usar funciones de fecha.

No necesitas guardarla en string para eso, ya que la fecha en la mayoría de BDs son números, así que puedes comparar, ordenar, sumar, restar, etc. sin tener que hace nada especial.

jocaro 28-10-2013 14:51:35

Hola ecfisa

Gracias por tu ayuda.

He conseguido el resultado que quería, además de una forma mas simple; atendiendo tu indicación he mirado el tema de la gestión de fecha en la propia base de datos (la guarda directamente en formato año-mes-dia hora-minuto)

Un saludo:)


La franja horaria es GMT +2. Ahora son las 03:29:53.

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