Alguien le ha pasado esto, quiero guardar un campo fecha en sql - me sale este error

1,247 views
Skip to first unread message

generaldata...@gmail.com

unread,
Feb 23, 2016, 2:29:46 PM2/23/16
to Comunidad de Visual Foxpro en Español
Buenos tardes :

De antemano muy agradecido si alguien me pude ayudar en el sentido como dar solución me sale que es incompatible
el campo fecha de FoxPro con el SQL

el Mensaje es :

Operand type Clash : Bit is incompatible with date

Soy nuevo en esto, recién estoy tratado de hacer algo con Visual FoxPro 9 y SQL

no se que incompatibilidad puede ver:

en FoxPro mi Campo se llama : txtFecha_afiliación

lo declaro x_fecha_afiliacion=CTOD(Space(8))

en el SQL el Campo es : Fecha_afiliacion  - Datetime








Auto Generated Inline Image 1

Carlos Miguel FARIAS

unread,
Feb 23, 2016, 3:22:27 PM2/23/16
to Grupo Fox
Si el campo destino es datetime, la función debería ser CTOT, creo, pero además, no es la forma de crear una fecha vacía en fox (ver ayuda) de dichas funciones. Y SQL Server, no deberías guardar fechas vacías, lo correcto sería usar un campo fecha con valor null, porque es lo que significa que la fecha no se conoce.
Pero igual, creo que falta que nos pases algunos elementos más, por ejemplo como te conectas a SQL Server (CA, SPT o vistas remotas).
Saludos: Miguel, La Pampa (RA)

Larga Vida y Prosperidad
Que la Fuerza te acompañe.

generaldata...@gmail.com

unread,
Feb 23, 2016, 4:41:39 PM2/23/16
to Comunidad de Visual Foxpro en Español
Hola miguel : Yo me conecto al sql con SPT

ALTER procedure usp_inserta_pacientes

@ps_ape_paterno varchar(100),

@ps_ape_materno varchar(100),

@ps_nombres varchar(100),

@ps_sexo char(2),

@ps_fecha_afiliacion datetime,

@ps_fecha_nacimiento datetime,

@ps_lugar_nacimiento varchar(80),

@ps_numero_identidad varchar(20),

@ps_codigo_barra varchar(20),

@ps_autogenerado varchar(20),

@ps_domicilio varchar(80),

@ps_ubicacion varchar(60),

@ps_telefono varchar(20),

@ps_email varchar(60),

@ps_trabajo varchar(60),

@ps_ubicacion_trabajo varchar(60),

@ps_telefono_trabajo varchar(20),

@ps_email_trabajo varchar(60),

@ps_activo char(2),

@ps_codafiliado CHAR(4),

@ps_codprocedencia CHAR(4),

@ps_codraza CHAR(4),

@ps_codintruccion CHAR(4),

@ps_codestcivil CHAR(4),

@ps_codocupacion CHAR(4),

@ps_coddocident CHAR(4),

@ps_codreligion CHAR(4),

@ps_codgruposan CHAR(4),

@ps_idcodusu char(8)

As

begin

DECLARE @ps_nrohistoria VARCHAR(20)

Select @ps_nrohistoria = Max(nrohistoria)

From Pacientes

If @ps_nrohistoria is null

Begin

SET @ps_nrohistoria ='P001'

End

Else

begin

SET @ps_nrohistoria = 'P'+RIGHT ('00' + CAST(CAST(SUBSTRING(@ps_nrohistoria,2,3) AS INT)+1 as varchar),3)

end

--begin

-- SET @ps_idcodchof = 'T001'

--end

SET DATEFORMAT DMY

begin tran

INSERT INTO Pacientes

VALUES (@ps_nrohistoria,@ps_codafiliado,@ps_idcodusu,@ps_codgruposan,@ps_codreligion,@ps_coddocident,@ps_codocupacion,@ps_codestcivil,@ps_codintruccion,@ps_codraza,@ps_codprocedencia,@ps_activo,@ps_email_trabajo,@ps_telefono_trabajo,@ps_ubicacion_trabajo,@ps_trabajo,@ps_email,@ps_telefono,@ps_ubicacion,@ps_domicilio,@ps_autogenerado,@ps_codigo_barra,@ps_numero_identidad,@ps_lugar_nacimiento,@ps_fecha_nacimiento,@ps_fecha_afiliacion,@ps_sexo,@ps_nombres,@ps_ape_materno,@ps_ape_paterno)

commit transaction

--Begin catch

-- rollback tran

-- return

-- end catch

end


Carlos Miguel FARIAS

unread,
Feb 24, 2016, 5:56:26 AM2/24/16
to Grupo Fox
Bien, conexión por SPT, invocas un SP del SQL Server, los parámetros definidos indican que son datetime, pero vos intentas enviarle una fecha errónea (vfp la maneja pero sql server no). Deberías enviar un valor NULL (y prever que dicho campo, admita nulos).
Este tema ya fue tratado en este foro por lo que te remito al hilo:
Saludos: Miguel, La Pampa (RA)

Larga Vida y Prosperidad
Que la Fuerza los acompañe, 0 (cero) es que sabes que no tienes nada, null es que no sabes que tienes

Antonio Meza

unread,
Feb 24, 2016, 10:22:43 AM2/24/16
to Comunidad de Visual Foxpro en Español
Hola!!!!

No uso SqlServer, pero en Mysql, MariaDb y Firebird que son los que mas uso, cuando creas la tabla y agregas los campos tienes la opción de poner un valor por default en los campos, de esta forma cuando uso campos Date o DateTime, le pongo en MariaDb y Mysql que el valor por default del campo sera "0000-00-00" o "0000-00-00 00:00:00" y en el caso de Firebird el valor por default sera NULL.

De esta forma si inserto un registro nuevo evito el error de que VFP envié una fecha vacía, pero si modificas un registro ya guardado el valor por default ya no funciona ya que este solo lo hace cuando insertas y entonces tienes que enviar el valor manual, es decir verificar los campos fechas que no estén vacíos antes de enviar al servidor.

saludos
Antonio Meza
...

Carlos Miguel FARIAS

unread,
Feb 24, 2016, 3:21:20 PM2/24/16
to Grupo Fox
La fecha vacía (u otros datos vacíos) era la forma que tenían las dbfs de manejar datos null. Un buen diseño cuando el dato se desconoce, prevé que el campo tenga un valor null.
Con campos de cadena, vació o null en general no afecta a los datos pero...
- Si tienes un indice sobre un campo con null, el valor null no se incorpora al indice, por lo que el indice es más chico (depende de los SGBD).
- Si el dato corresponde a un dato numérico (y la fecha cae en ese tipo), una fecha "vacía" o cero, cero..., puede cambiar los resultados de las consultas. Si haces un SUM, AVG u otras operaciones, el valor cero, se suma (sería lo de menos), pero se cuenta, por lo que cambia el promedio, si quieres calcular un máximo o un mínimo, te cambian el resultado (si tus valores son negativos, un cero sería el máximo, y si fueran positivos, un cero sería el mínimo).
- Si haces una multiplicación con un valor null, te da null, y en sql se chequea simplemente con IS NULL, (también NVL() y IFNULL(), depende para que), pero si multiplicas por cero, te da cero (ups!?) y si divides por cero da error!!!!
- Se puede trabajar con fechas vacías?, si pero tienes que prever instrucciones adicionales luego para saltear los datos.
- El uso de valor default (con cualquier valor que se use), tal como indican, solo funciona al insertar, pero el hecho que haga eso automáticamente, te simplifica las inserciones, lo que me gusta, es KISS

Saludos: Miguel, La Pampa (RA)
Larga Vida y Prosperidad

Que la Fuerza los acompañe, 

generaldata...@gmail.com

unread,
Feb 25, 2016, 1:06:31 AM2/25/16
to Comunidad de Visual Foxpro en Español
Gracias a todos por su ayuda, he tratado de hacer las sugerencias que me dicen
Pero ahora me sale este error : Por Favor alguien pe pude ayudar o decirme que puedo hacer
Gracias



El martes, 23 de febrero de 2016, 14:29:46 (UTC-5), generaldata...@gmail.com escribió:
Auto Generated Inline Image 1

Carlos Miguel FARIAS

unread,
Feb 25, 2016, 6:47:30 AM2/25/16
to Grupo Fox
Revisa la longitud de los campos strings (cadenas) que mandas (len()) y el tamaño de los respectivos campos receptores, y busca en la ayuda de SQL Server y del driver ODBC para SQL Server, con que está asociado ese error.

Y por favor, pasa un poco más de información para poder ayudarte, porque estamos deduciendo cosas y no hemos visto la sentencia Fox con la que invocas SQL Server y que te da ese error.

Saludos: Miguel, La Pampa (RA)

Larga Vida y Prosperidad
Que la Fuerza los acompañe.

Patricio Muñoz

unread,
Feb 25, 2016, 7:00:49 AM2/25/16
to publice...@googlegroups.com
El SQLServer da problemas con campos de tipo fecha que son vacios.... eso no existe en sql. En vez de enviar '  /  /   ', deberias enviar '01/01/1900'.

Bendiciones
--
Patricio Muñoz
Pro&Tech
Analista en Sistemas

generaldata...@gmail.com

unread,
Feb 25, 2016, 7:56:51 AM2/25/16
to Comunidad de Visual Foxpro en Español
Gracias por la ayuda : Te Envió información
en mi formulario : Init ( Tengo )

PUBLIC xfecha1 as date

PUBLIC xfecha2 as date

xfecha1 = iif(empty(x_fecha_afiliacion), NULL, x_fecha_afiliacion)

xfecha2 = iif(empty(x_fecha_nacimiento), NULL, x_fecha_nacimiento)


*--------------------------
En un Procedimiento Grabar : en FoxPro
*--------------------------

*--Nuevo

IF xNuevo=1

SET DATE TO DMY

x_nrohistoria=Thisform.pagfram1.page1.txtNroHistorias

x_ape_paterno=alltrim(Thisform.pagfram1.page1.txtape_materno.Value)

x_ape_materno=ALLTRIM(Thisform.pagfram1.page1.txtape_paterno.Value)

x_nombres=ALLTRIM(Thisform.pagfram1.page1.txtNombres.Value)

x_sexo=ALLTRIM(Thisform.pagfram1.page1.txtsexo.Value)

*x_fecha_afiliacion=Thisform.pagfram1.page1.txtfecha_afiliacion.Value

*x_fecha_nacimiento=Thisform.pagfram1.page1.txtfecha_nacimiento.Value

xfecha1=Thisform.pagfram1.page1.txtfecha_afiliacion.Value

xfecha2=Thisform.pagfram1.page1.txtfecha_nacimiento.Value

* STORE DATETIME( ) TO xFecha1

* STORE DATETIME( ) TO xFecha2

xFecha3= DATETIME(YEAR(xFecha1)+1,1,1)

xFecha4= DATETIME(YEAR(xFecha2)+1,1,1)

* DATETIME(YEAR(DATE( ) ) + 1, 1, 1) && Next New Year

x_lugar_nacimiento=ALLTRIM(Thisform.pagfram1.page1.txtlugar_nacimiento.Value)

x_numero_identidad=Thisform.pagfram1.page3.txtnumero_identidad.Value

x_codigo_barra=ALLTRIM(thisform.pagfram1.page1.txtCodigo_barra.Value)

x_autogenerado=ALLTRIM(Thisform.pagfram1.page1.txtautogenerado.Value)

x_domicilio=ALLTRIM(Thisform.pagfram1.page1.txtdomicilio.Value)

x_ubicacion=ALLTRIM(Thisform.pagfram1.page1.txtubicacion.Value)

x_telefono=ALLTRIM(Thisform.pagfram1.page1.txttelefono.value)

x_enail=ALLTRIM(Thisform.pagfram1.page1.txtemail.Value)

x_trabajo=ALLTRIM(Thisform.pagfram1.page2.txttrabajo.Value)

x_ubicacion_trabajo=ALLTRIM(Thisform.pagfram1.page2.txtubicacion_trabajo.Value)

x_telefono_trabajo=ALLTRIM(Thisform.pagfram1.page2.txttelefono_trabajo.Value)

*-------*

x_email_trabajo=ALLTRIM(Thisform.pagfram1.page2.txtemail_trabajo.Value)

x_activo=ALLTRIM(Thisform.pagfram1.page3.txtActivo.Value)

x_codafiliado=Thisform.pagfram1.page3.txtcodafiliado.Value

x_codprocedencia=Thisform.pagfram1.page3.txtcodprocedencia.Value

x_codraza=Thisform.pagfram1.page3.txtRaza.Value

x_codintruccion=Thisform.pagfram1.page3.txtcodinstruccion.Value

x_codestcivil=Thisform.pagfram1.page3.txtEstadocivil.Value

x_codocupacion=Thisform.pagfram1.page3.txtCodocupacion.Value

x_coddocident=Thisform.pagfram1.page3.txtcoddocident.Value

x_codreligion=Thisform.pagfram1.page3.txtcodreligion.Value

x_codgruposan=Thisform.pagfram1.page3.txtcodgrupoSan.Value

x_codusu = xIDCOU

WAIT WINDOW XfECHA1

WAIT WINDOW XfECHA2

*--------------------------------------------------------------------*

TEXT TO _SQL4 NOSHOW

x_ape_paterno,x_ape_materno,x_nombres,x_sexo,?xfecha3,?xfecha4,x_lugar_nacimiento,x_numero_identidad,x_codigo_barra,x_autogenerado,x_domicilio,x_ubicacion,x_telefono,x_email,x_trabajo,x_ubicacion_trabajo,x_telefono_trabajo,x_email_trabajo,x_activo,x_codprocedencia,x_codraza,x_codintruccion,x_codestcivil,x_codocupacion,x_coddocident,x_codreligion,x_codgruposan,x_codusu,x_codafiliado

ENDTEXT

ThisformSET.FOrmulario12.historias1.insertar(_sql4)

* WAIT WINDOW cone.getmensaje()

*MESSAGEBOX("Registro insertado :"+ALLTRIM(x_nombres))

Thisformset.formulario12.select_pacientes1.select('Tmppacientes')

Thisform.grid21.RecordSource='Tmppacientes'

*---

haber si me pueden ayudar.




El martes, 23 de febrero de 2016, 14:29:46 (UTC-5), generaldata...@gmail.com escribió:

Carlos Miguel FARIAS

unread,
Feb 25, 2016, 12:42:58 PM2/25/16
to Grupo Fox
justo la lógica de acceso al SGBD la tienes en metodos del formulario que no estamos viendo. Es como recibir quedas de ruido molesto de una casa, pero no te dejan entrar a donde se producen.
Saludos: Miguel

generaldata...@gmail.com

unread,
Mar 8, 2016, 4:01:52 PM3/8/16
to Comunidad de Visual Foxpro en Español
Gracias a Todos por la ayuda, ya pude solucionar mi problema con el campo fecha


El martes, 23 de febrero de 2016, 14:29:46 (UTC-5), generaldata...@gmail.com escribió:
Reply all
Reply to author
Forward
0 new messages