Como guardar una fecha vacía en SQL SERVER 2008 desde Foxpro 9

4,642 views
Skip to first unread message

Rafael Morales

unread,
Jul 17, 2013, 9:33:44 PM7/17/13
to publice...@googlegroups.com
Hola a todos, alguien sabe como guardar valores NULL en un campo del tipo date contenida en una tabla de SQL SERVER 2008 ?, el problema es que tengo un formulario hecho en Fox desde donde me conecto a mi base de datos e intento almacenar una fecha, todo funciona correcto mientras el textbox contiene un valor pero cuando lo dejo vacío no me permite guardar. El texbox almacena el contenido en una variable de memoria llamada m.fecha intenté haciendo lo siguiente pero no tuve resultados positivos:

IF empty(m.fecha)
    m.fecha = .NULL.
ENDIF

verifico si la variable m.fecha esta vacío, en caso de estar vacío le pongo un valor NULL antes de guardar. Pero esto no funciona, ¿qué puedo hacer?, buscando en google encontré alguien que sugiere que almacene la fecha como texto en la base de datos de SQLServer, pero yo quiero que se guarde con formato de fecha no de texto ni numerico. Es posible hacerlo?. Gracias.

--
Rafael Morales

Miguel Ab

unread,
Jul 18, 2013, 2:40:16 AM7/18/13
to publice...@googlegroups.com
Hola.

O no he entendido algo o me parece que el fallo está en otro sitio.

En SQL Server no se puede almacenar un campo vacio como en VFP, se almacena null (y el campo debe admitirlo en la definición de la tabla) o una fecha. Para almacenar null hay dos opciones:
- Si lo haces a través de un SP o un parámetro: m.fecha=.NULL.
- Si lo haces a través de un String: "INSERT tabla (fecha) VALUES (null)"

Te aseguro que estoy en tu caso y a mi me funciona perfectamente.

Saludos y suerte con el problema.

mpulla

unread,
Jul 18, 2013, 8:07:00 AM7/18/13
to publice...@googlegroups.com

Hola Rafamra.

Como dice Miguel Ab, Sql Server no admite vacíos en campos tipo fecha,

Trabaja de esta manera, así no tienes que preocuparte por formatos de fecha, valores null, etc.

Private lfecha as date
lfecha = iif(empty(m.fecha), NULL, m.fecha)

lcSql = 'Insert Into Mi_tabla (fecha) Values (?lfecha)'

Saludos.
Mauricio

Miguel Canchas

unread,
Jul 18, 2013, 9:30:16 AM7/18/13
to publice...@googlegroups.com

Solo ponle por default null en tu tabla de sql server.

 

MK

Rafael Morales

unread,
Jul 18, 2013, 12:04:55 PM7/18/13
to publice...@googlegroups.com
Gracias a todos por la ayuda, me sirvió bastante. He solucionado el problema, use lo que me recomendaron. Pero sucedió algo curioso las lineas de codigo que uso para guardar en la base de datos de SQL SERVER es la siguiente:

Private xapertura as date
private xcierre as date 

xapertura = iif(empty(m.apertura), NULL, m.apertura)
xcierre = iif(empty(m.cierre), NULL, m.cierre)


TEXT TO sql_insert TEXTMERGE NOSHOW ADDITIVE

  insert into TABLAS.ASVS (<<thisform.campos>>) VALUES ('<<m.cuit>>','<<m.ficha1>>','<<m.ficha2>>','<<m.contribuye>>','<<m.barrio>>','<<m.domicilio>>','<<m.razon>>','<<m.telefono>>','<<m.acatego>>','<<m.id_catego>>','<<m.rubro>>',?<<m.apertura>>,?<<m.cierre>>)   

ENDTEXT
  
 RAFA=sqlexec(nu_conexion,sql_insert)


thisform.campos  es una propiedad donde tengo la lista de los nombres de campos de la tabla con la que estoy trabajando.
No sé si esto será la mejor forma de guardar los datos en SQL SERVER pero funciona perfectamente, lo curioso es que en la cadena sql_insert escribo el contenido de los campos encerrados entre comillas simples y guarda perfectamente siempre y cuando no sea una fecha lo que se intenta guardar, porque sino no me deja. Para los campos que tienen formato de fecha le pongo un signo de pregunta como se puede ver arriba con Azúl y Rojo los campos m.apertura y m.cierre, y de esta manera ya guarda perfectamente. ¿debería usar siempre el signo de pregunta en lugar de las comillas simples?.

Gracias de nuevo a todos.
--
Rafael Morales

Víctor Hugo Espínola Domínguez

unread,
Jul 18, 2013, 12:14:44 PM7/18/13
to publicesvfoxpro
Hola Rafael

,?<<m.apertura>>,?<<m.cierre>>

Debe ser:l
,?m.apertura,?m.cierre

'<<m.domicilio>>'
Esto puede fallar si el domicilio es una cadena que contiene apóstrofo ('), ejemplo: "Av. Juan E. O'Leary Nº 1234"
Es preferible que lo uses así: ?m.Domicilio

Saludos,
Víctor.
 

Rafael Morales

unread,
Jul 18, 2013, 12:31:23 PM7/18/13
to publice...@googlegroups.com
Gracias Victor, justo a tiempo. Estaba haciendo pruebas y no podía guardar, ahora hice los cambios que mencionaste  ,?<<m.apertura>>,?<<m.cierre>> por ,?m.apertura,?m.cierre  y se solucionó el problema, voy a tener que chequear los otros formularios porque en todos hice lo mismo en cualquier momento va a saltar un error. Gracias por la ayuda. Saludos.
--
Rafael Morales
Reply all
Reply to author
Forward
0 new messages