Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Ayuda Problema tipo cadena/date (https://www.clubdelphi.com/foros/showthread.php?t=95948)

steelha 05-11-2022 23:11:49

Ayuda Problema tipo cadena/date
 
Buenas, perdón por molestar un sábado :) . Mi problema consiste en lo siguiente poseo una tabla en SQL llamada Pacientes en la cual tengo un campo pxnacidoen el cual es de tipo date
pxNacidoen date Nullvalue

Poseo el siguiente código
Código Delphi [-]
procedure TfrmPacientes.guardar_datos;
begin
  if nuevo = 1 then
    begin
      DM.QryPacientes.Insert;
      DM.QryPacientesidpaciente.Value := DM.QryPacientes.RecordCount + 1;
    end
  else
    DM.QryPacientes.Edit ;

  with DM do
  begin
    QryPacientespxNombres.Value   := Trim(edtnombre.Text);
    QryPacientespxApellidos.Value := Trim(edtapellido.Text);
    QryPacientespxDocumento.Value := Trim(edtdocumento.Text);
    QryPacientespxCorreo.Value    := Trim(edtdocumento.Text);
    QryPacientespxDireccion.Value := Trim(mdireccion.Lines.Text);
    QryPacientespxTelefonos.Value := Trim(mtelefono.Lines.Text);
    QryPacientespxEstado.Value    := chkactivo.Checked;
    QryPacientespxNacidoen.Value  := dtpnacimiento.Date; //aca el error de tipo string vs tipo date
    QryPacientes.Post;
  end;

  limpiar;
  deshabilitar;
end;

Por lo que pude ver cuando se crean los campo en el adoquery se crea como tipo Twidestring no entiendo el porque si en sql esta muy bien definido. Alguna idea de como solucionar esto. Ya he borrado la tabla y creado nuevamente igual pasa. Alguna ayuda o consejo

Casimiro Notevi 06-11-2022 11:00:05

¿Qué base de datos estás usando?

Aparte de tu pregunta, esto te puede traer muchos problemas:
Código Delphi [-]
DM.QryPacientesidpaciente.Value := DM.QryPacientes.RecordCount + 1;
Es mejor que uses algo como:
Código SQL [-]
select max(idpaciente)+1 from tbPacientes;

steelha 06-11-2022 13:40:10

Muy buenas casimiro, gracias por el comentario. lo tomare encuenta. Pero la aplicacion que estoy desarrollando no elimina registros solo cambia el estado de true a false; por lo que no habria problema alguno no existe el boton Delete o eliminar :).

Por tu pregunta uso Microsft SQL 2014 mas delphi xe7 en la oficina y 10 en la casa. Como dije defino el campo tipo Date pero a la hora de agregar todos los campos al adoquery lo crea como un widestring de ahi viene el problema. he tratado de usar el datetostr pero igual me da error no se que hacer.

Casimiro Notevi 06-11-2022 13:53:43

Cita:

Empezado por steelha (Mensaje 548992)
... cuando se crean los campo en el adoquery se crea como tipo Twidestring ...

¿No puedes cambiarlo manualmente o luego por código?
dtpnacimiento es un datetimepicker, ¿no?

Neftali [Germán.Estévez] 07-11-2022 08:43:17

¿Si sabes que es un tipo Date, porqué no lo especificas al asignar el valor?

Código Delphi [-]
    QryPacientespxNacidoen.AsDate := dtpnacimiento.Date;

steelha 07-11-2022 18:30:37

Si muchas gracias neftali , asi funciona; pero no entiendo el porque si en la tabla de Sql esta declarado como campo tipo DATE cuando agrego los campos al componente la crea como TWIDESTRING. Quiero saber si es que el compoente no soporte el tipo date o debe ser declarado tipo DATETIME en la tabla para que asi lo reconozca.

steelha 08-11-2022 00:24:08

Código Delphi [-]
  if nuevo = 1 then
    begin
      DM.QryPacientes.Insert;
      DM.QryPacientesidpaciente.Value := DM.QryPacientes.RecordCount + 1;
    end
  else
    DM.QryPacientes.Edit ;

  with DM do
  begin
    QryPacientespxNombres.Value   := Trim(edtnombre.Text);
    QryPacientespxApellidos.Value := Trim(edtapellido.Text);
    QryPacientespxDocumento.Value := Trim(edtdocumento.Text);
    QryPacientespxCorreo.Value    := Trim(edtdocumento.Text);
    QryPacientespxDireccion.Value := Trim(mdireccion.Lines.Text);
    QryPacientespxTelefonos.Value := Trim(mtelefono.Lines.Text);
    QryPacientespxEstado.Value    := chkactivo.Checked;
    QryPacientesidSexo.Value      := QrySexoidSexo.Value;
    QryPacientesidEstadoCivil.Value:=QryECidEstadoCivil.Value;
    QryPacientesidZona.Value      := QryZonaidZona.Value;
    QryPacientesidCiudad.Value    := QryCiudadidCiudad.Value;
    QryPacientesidSector.Value    := QrySectoridSector.Value;
    QryPacientesidSeguro.Value         := QryArsidArs.Value;
    QryPacientespxNacidoen.AsDateTime  := dtpnacimiento.DateTime;
    QryPacientes.Post;
  end;

He probado los cambios y todo perfecto siempre y cuando no cambie la fecha. Desde que selecciona una fecha he intento grabar obtengo el error.

First chance exception at $7640DF72. Exception class EDatabaseError with message 'Conversion failed when converting date and/or time from character string'.

steelha 08-11-2022 03:18:23

Muchas gracias doy por terminado este hilo. Utilice la forma mas rapida pero no la que se debe hacer. Cambie el tipo de campo a texto y con esto resuelto todo

Casimiro Notevi 08-11-2022 08:28:44

No tiene lógica, a ver si es un problema con la versión de los componentes que estás usando.


La franja horaria es GMT +2. Ahora son las 04:09:19.

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