Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Manejo de fechas en SQL Server Usando DatetimePicker (https://www.clubdelphi.com/foros/showthread.php?t=79745)

hondaalberto 06-08-2012 20:48:12

Grabar en la Base de datos solo la Fecha de un DateTimerPicker
 
Buenas Tardes Amigos

Utilizo Delphi 7 y Sql Server Express 2008 y estoy utilizando un Componente DateTimerPicker para Grabar la Fecha en la base de datos pero me Graba la fecha y la Hora y me interesa solo la fecha.

En la base de datos tengo un Campo llamado Fecha del tipo DateTime, silo lo coloco de tipo date me da un error porque el DateTimepicker le envia tambien la Hora.

Utilizo en Siguiente Codigo en delphi:

Código Delphi [-]
DataSource.DataSet.FieldByName('Fecha').AsDateTime:=DTPFecha.Date;

Casimiro Notevi 06-08-2012 20:54:47

¿Y por qué no usas un tipo de dato sólo fecha?, un date.

ecfisa 06-08-2012 20:55:39

Hola hondaalberto.

La propiedad Date del TDateTimePicker devuelve un valor del tipo TDate por lo que no puede estar allí el problema.

No conozco Sql Server Express 2008, pero proba de este modo:
Código Delphi [-]
  DataSource.DataSet.FieldByName('Fecha').Value:= DTPFecha.Date;

Saludos.

hondaalberto 06-08-2012 21:12:20

cambie el campo a tipo date y probe tambien haciendolo como dice Ecfisa y me devuelve el siguiente error.


---------------------------
Debugger Exception Notification
---------------------------
Project RetailPos.exe raised exception class EOleException with message 'Error al convertir una cadena de caracteres en fecha y/u hora'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------

ecfisa 06-08-2012 21:41:38

Hola.

A ver... proba de este modo:
Código Delphi [-]
   DataSource.DataSet.FieldByName('Fecha').AsDateTime:= Trunc(DTPFecha.Date);
Si no habrá que esperar que alguien con conocimientos de MS SQL te oriente.

Por cierto, ¿ Que componentes estas usando y de que tipo es el campo "Fecha" ?

Saludos.

hondaalberto 06-08-2012 22:09:57

Si no habrá que esperar que alguien con conocimientos de MS SQL te oriente.

Por cierto, ¿ Que componentes estas usando y de que tipo es el campo "Fecha" ?

Saludos.

Me sigue dando el Mismo error.

Conecto la Base de datos utilizando ADOConection y el campo Fecha si lo declaro del tipo Date en la Base de datos me develve el error que mostre en uno de los mensajes anteriores y si esta declarado del tipo datetime me graba la fecha mas muchos ceros en la parte dnd va la hora.

Casimiro Notevi 06-08-2012 22:12:51

Si el campo es del tipo date y tú le pasas el valor del datetime, que también es un date, no te puede salir el mensaje: "'Error al convertir una cadena de caracteres en fecha y/u hora'."

Así que estás mirando en el sitio que no corresponde, estás conectado a otra base de datos, estás pasando el valor de un tedit normal y no es un tdatetime, etc.

hondaalberto 06-08-2012 22:21:05

me sigue dando el error... y el campo es del tipo date...

Casimiro Notevi 06-08-2012 22:23:51

Da más información o pon el código fuente que lo veamos (copia->pega), que no somos adivinos ;)

hondaalberto 06-08-2012 22:59:20

El código en donde estoy utilizando el Componente DatetimePicker es el Siguiente:

Código Delphi [-]

procedure TFFacturadeVentas.BGuardarClick(Sender: TObject);
......
TCabVentasTemp.FieldByName('Fecha').Value:= DTPFecha.Date;


procedure TFFacturadeVentas.TCabVentasTempBeforePost(DataSet: TDataSet);
....
 TCabVentasTemp.FieldByName('Fecha').Value:= DTPFecha.Date;



procedure TFFacturadeVentas.FormActivate(Sender: TObject);
...
 DTPFecha.Date:=Date; // Componente Datetimepicker




 procedure TFFacturadeVentas.DBGDatosDblClick(Sender: TObject);
 ....
 FieldByName('Fecha').Value:= DTPFecha.Date;




procedure TFFacturadeVentas.DBGDatosColExit(Sender: TObject);
....

DataSource.DataSet.FieldByName('Fecha').Value:= DTPFecha.Date;

hondaalberto 06-08-2012 23:01:28

Este es el codigo de las Dos tablas en donde intento enviar esos datos de fecha:

Código SQL [-]
CREATE TABLE [dbo].[Lin_Ventas_Temp](
    [Documento_Tipo] [nvarchar](15) NOT NULL,
    [Documento_No] [int] NOT NULL,
    [Fecha] [datetime] NOT NULL,
    [Cliente_No] [int] NOT NULL,
    [Producto_No] [int] NOT NULL,
    [Descripcion] [nvarchar](50) NOT NULL,
    [Cantidad] [decimal](25, 2) NULL,
    [Precio_de_Venta] [money] NULL,
    [Descuento] [money] NULL,
    [Porciento_Itbis] [decimal](25, 2) NOT NULL,
    [Importe_Itbis] [money] NOT NULL,
    [Grupo_Itbis] [nvarchar](7) NOT NULL,
    [Usuario] [nvarchar](50) NOT NULL,
    [Fecha_Hora_Registro] [nvarchar](22) NOT NULL




CREATE TABLE [dbo].[Cab_Ventas_Temp](
    [Documento_Tipo] [nvarchar](15) NOT NULL,
    [Fecha] [datetime] NOT NULL,
    [Documento_No] [int] NOT NULL,
    [No_Documento_Externo] [nvarchar](15) NULL,
    [Cliente_No] [int] NOT NULL,
    [Cliente_Nombre] [nvarchar](50) NOT NULL,
    [RNC] [nvarchar](11) NULL,
    [Numero_Comprobante_Fiscal] [nvarchar](19) NOT NULL,
    [Serie_NCF] [nvarchar](10) NOT NULL,
    [Importe] [money] NOT NULL,
    [Itbis] [money] NOT NULL,
    [Efectivo] [money] NOT NULL,
    [Cheque] [money] NOT NULL,
    [Tarjeta] [money] NOT NULL,
    [Transferencia] [money] NOT NULL,
    [Credito] [money] NOT NULL,
    [Descuento] [money] NOT NULL,
    [Usuario] [nvarchar](50) NOT NULL,
    [Fecha_Hora_Registro] [nvarchar](22) NOT NULL,
    [Direccion] [nvarchar](50) NOT NULL,
    [Contacto] [nvarchar](50) NULL,
    [Telefono] [nvarchar](15) NULL,
    [Fax] [nvarchar](15) NULL,
    [Tel_Movil] [nvarchar](15) NULL,
    [Tel_Oficina] [nvarchar](15) NULL,
    [PaisNombre] [nvarchar](50) NOT NULL,
    [CiudadNombre] [nvarchar](50) NOT NULL,

hondaalberto 07-08-2012 03:15:04

El Registro en la Base de Datos se Graba en el Campo Fecha de la Siguiente Manera:

2012-08-06 00:00:00.000

lo que necesito es que se grabe solo la fecha sin todos esos ceros.

hondaalberto 07-08-2012 03:48:40

Manejo de fechas en SQL Server Usando DatetimePicker
 
Buenas noches amigos y muchas gracias por anticipado


Utilizo Delphi 7 y Sql Server Express 2008 y para el manejo de las fechas utilizo un Componente DateTimePicker pero al momento de Guardar los datos en la base datos se guardan de la siguiente manera:

2012-08-06 00:00:00.000

lo que necesito es que se grabe solo la fecha sin todos esos ceros (El tipo de datos de este campo Fecha es Datetime).

Utilizo este código en Delphi:
Código Delphi [-]
DataSource.DataSet.FieldByName('Fecha').Value:=DTPFecha.Date;


Otro Incoveniente que tengo con esta situación es que al momento de hacer un select con esos datos no me devuelve ningún valor incluso cuando utilizo un Like%% no me muestra nada.

He probado utilizando el tipo de Datos Date en la Base de datos pero cuando el registro se va a grabar en la base de datos me da un error de conversion al tipo de datos fecha u hora.

¿Qué puedo hacer para solucionar esto?

Caral 07-08-2012 04:13:32

Hola
Creo que deberias modificar el campo a tipo date solamente y luego verificar el tipo de formato que darselo al datetimepicker.
saludos

MartinS 07-08-2012 04:34:00

Hola Creo que aquí
Código SQL [-]
[Fecha] [datetime] NOT NULL,
está creando el campo fecha del tipo fecha y hora, ¿o no? por eso requiere que también ingreses la hora cosa que si pones el DTPFecha.Date falta la hora (DTPFecha.DateTime es completo).
El tema es que si queres que solo sea fecha deberias redefinir el campo...

Me parece que es eso :p

Saludos

Aca algo dice - Referencia microsoft

hondaalberto 07-08-2012 04:49:32

Muchas Gracias Caral y Martin por sus respuestas he probado lo que me han indicado cambiando el Campo al tipo de datos Date y me devuelve el siguiente error:

Código Delphi [-]
---------------------------
Debugger Exception Notification
---------------------------
Project RetailPos.exe raised exception class EOleException with message 'Error al convertir una cadena de caracteres en fecha y/u hora'. Process stopped. Use Step or Run to continue.
---------------------------
OK   Help   
---------------------------


En el datetimepicker tengo las Siguientes Propiedades configuradas

Format = 2012/08/06
Kind = dtkDate
Time = 12:00:00 AM
DateFormat =dfShort

hondaalberto 07-08-2012 04:51:30

Muchas Gracias Martin por tu respuesta he probado lo que me has indicado cambiando el Campo al tipo de datos Date y me devuelve el siguiente error:

Código Delphi [-]--------------------------- Debugger Exception Notification --------------------------- Project RetailPos.exe raised exception class EOleException with message 'Error al convertir una cadena de caracteres en fecha y/u hora'. Process stopped. Use Step or Run to continue. --------------------------- OK Help ---------------------------



En el datetimepicker tengo las Siguientes Propiedades configuradas

Format = 2012/08/06
Kind = dtkDate
Time = 12:00:00 AM
DateFormat =dfShort

ecfisa 07-08-2012 05:04:36

Hola hondaalberto.

Combiné tus dos últimos hilos bajo el título mas significativo por tener ambos el mismo contenido.

Por favor no dupliques los temas, lee el punto [6] de la [guía de estilo].

Ya sea que no recibas respuesta o las obtenidas no resuelvan tu problema, lo correcto es continuar con el hilo inicial para no duplicar la información.

Saludos y gracias por tu colaboración. :)

MartinS 07-08-2012 05:11:26

Deberías verificar los campos que quedaron almacenados en el DataSet, es decir, cuando le das con el botón derecho sobre el componente y agregas los campos (si es que lo haces) puede hacer referencia al tipo anterior, en ese caso, borra lo campos y volvé a incorporarlos. Tambien deberias intentar indicando el tipo de dato que vas a escribir.

Código Delphi [-]
TCabVentasTemp.FieldByName('Fecha').Value:= DTPFecha.Date;

Por

Código Delphi [-]
TCabVentasTemp.FieldByName('Fecha').AsDateTime:= DTPFecha.DateTime;

Proba esta animalada... :)

Código Delphi [-]
TCabVentasTemp.FieldByName('Fecha').AsDateTime := StrToDate(FormatDateTime('yyyy-mm-dd',DTPFecha.DateTime));

y vemos...

Ah!! tambien veo en tu mensaje que guarda la fecha separada por guion (-)y segun el formato que pasaste recien es barra (/)

Pd: Haciendo unas pruebitas y poniendo el año primero como indicas da error de conversion... si lo coloco dd/mm/yyyy anda joya

Casimiro Notevi 07-08-2012 09:42:00

Cita:

Empezado por hondaalberto (Mensaje 438961)
El Registro en la Base de Datos se Graba en el Campo Fecha de la Siguiente Manera:
2012-08-06 00:00:00.000
lo que necesito es que se grabe solo la fecha sin todos esos ceros.

Un momento, creo que estás confundido (o nos estás confundiendo a todos :D)

¿Cómo sabes que en la BD se graba con ese formato?, ¿no será que tú lo visualizas con alguna utilidad y se presenta con ese formato? :confused:

javier7ar 07-08-2012 14:57:04

A ver... vamos por pasos:

1 - En MS SQL Server no existia el campo de tipo Fecha (Date) solo; solo existia el campo de tipo FechaHora (DateTime) A partir de la version 2008 aparecen Date y Time por separado aparte del DateTime de siempre.
Pero si ya tenes creada la base de datos y el campo es DateTime te puede servir lo que sigue.

2 - Si queres guardar solamente la fecha y no la hora, en Delphi hace esto:
Código Delphi [-]
TCabVentasTemp.FieldByName('Fecha').AsDateTime:= INT(DTPFecha.DateTime);
Esto es porque el tipo FechaHora (DateTime en SQL Server y TDateTime en Delphi) estan representados por un numero flotante/real, y guardan la fecha en la parte entera y la hora en la parte decimal. La funcion INT() te devuelve la parte entera de un numero flotante/real

3 - Si no queres que te muestre los 00:00:00 de la hora eso ya es una cuestion de formato, pero si estan en cero quiere decir que solo tiene la fecha, y la hora esta en cero
Para que no muestre los ceros tenes dos opciones:

- Desde SQL Server:
Código SQL [-]
select convert(varchar(10), CampoFecha, 103) as FechaBonita
from Tabla
Pero ojo que ahi el tipo del campo devuelto por la consulta pasa a ser String (varchar)
Podes ver en la ayuda de la funcion Convert los diferentes formatos que tiene (103 es el formato dd/mm/aaaa)

- Desde Delphi:
En la Query/Table en la que haces la consulta, agregas el campo y le modificas la propiedad DisplayFormat le pones el valor dd/mm/aaaa (o el formato que mas te guste)
De esta forma el campo sigue siendo de tipo DateTime pero se muestra solo la parte de la fecha

Bueno, espero te sirva de ayuda esto
Saludos


La franja horaria es GMT +2. Ahora son las 19:13:59.

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