FoxPro/Visual FoxPro - Error al insertar en sql desde Foxpro

   
Vista:
Imágen de perfil de daniel

Error al insertar en sql desde Foxpro

Publicado por daniel danny1578@gmail.com (6 intervenciones) el 03/08/2017 19:41:37
Buenas compañeros, haber quien me puede ayudar, estoy haciendo un sistema para registrar una informacion desde foxpro pero que se almacene en sql, ya hice la ventana de registrar los datos pero me envia un error de tipo de datos no conciden, no se que estoy haciendo mal agrego el codigo haver quien me ayuda con esto.

CODIGO DEL BOTON GUARDAR

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
v_nsop = thisform.txtnum_sop.value
 
v_dep = thisform.Cmd_unidad.value
 
v_fecha1 = thisform.txtfecha1.value
 
v_hora1 = alltrim(thisform.txthora1.value)+' '+substr(thisform.Cmd_hora_tipo1.value,3,4) 
 
v_usu_sol = thisform.Cmd_usuario_sol.value
 
v_estatus = thisform.Cmd_estatus.value
 
v_ton_rep = thisform.Cmd_usu_sol.value
 
v_detalle1 = thisform.txtdetalle1.value
 
v_logu = v_usuario
 
v_logf = DTOC(date())
 
SELECT 2
 
=cursorsetprop('Buffering', 5, "tbl_reportes")
 
insert into Tbl_Reportes (Rep_numero, Rep_año, Rep_ced_sol, Rep_ced, Rep_estado, Rep_Cod_dep, Rep_fecha_reporte, Rep_hora_reporte, Rep_detalle_reporte,Rep_log_fecha, Rep_log_usuario) values (v_nsop, v_año, v_usu_sol, v_ton_rep, v_estatus, v_dep, v_fecha1, v_hora1, v_detalle1, v_logf, v_logu)
 
=tableupdate(1,.t.)
 
=messagebox("REPORTE REGISTRADO CORRECTAMENTE",0+64+256,"Error de Validación")
 
release thisform
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Error al insertar en sql desde Foxpro

Publicado por Fidel José (539 intervenciones) el 03/08/2017 20:55:39
" para registrar una informacion desde foxpro pero que se almacene en sql..." , no sé que quieres especificar con eso.
De lo que se ve, actualizas una tabla nativa (tbl_Reportes) con una sentencia INSERT - SQL.
El error que te indica es que alguno de los valores parámetros, no es del mismo tipo del valor esperado por la tabla.
Por ejemplo, revisa si el valor v_fecha1 es realmente una fecha.
? Vartype(v_fecha1).
Posiblemente el textbox llamado txtFecha1 no tenga el formato adecuado.
Lo mejor para asegurarte de que sea una fecha es configurar ese control como:
.Format = "D"
.Value = {}

Nota1
No uses SELECT 2, SELECT 1, etc.
Si quieres seleccionar una tabla, escribe simplemente
SELECT TBL_REPORTES.
Y si se trata de un cursor (o Alias) cuyo nombre es determinado al vuelo
lcCursor = "cur"+sys(2015)
SELECT * FROM TBL_REPORTES WHERE FECHA BETWEEN DIA1 AND DIA2 INTO CURSOR (lcCursor) READWITE
SELECT (lcCursor)


Para abrir una tabla
USE TBL_REPORTES IN 0 SHARED

Nota2
Tienes que estudiar la nomeclatura estandar de variables y objetos. Te va ayudar muchísimo.

1
2
3
4
5
6
7
8
9
10
11
Ejemplos de controles
custom => cus_nombre
label => lbl_nombre
form => frm_nombre
checkbox => chk_nombre
editbox => edt_nombre
listbox => lst_nombre
spinner => spn_nombre
pageFrame => pgf_Nombre
page => pag_Nombre
commandButton => cmd_nombre

Para las variables, se utiliza un prefijo de dos letras.
La primer letra indica si la variable es pública (g), privada (p) o local (L). Para el caso de parámetros, se utiliza la letra T.
La segunda letra indica el tipo de valor que contiene la variable.
n: numérico
c: character
d: fecha
t: datetime
L: lógico (boolean)

Así, en lugar de "v_fecha1", deberías usar "ldFecha"
Se suele utilizar la letra x para casos en que el valor es indeterminado y resulta de un proceso, o se trata de un parámetro ambiguo.
Por ejemplo:

1
2
3
4
5
6
7
8
9
10
PROCEDURE Get_Oper
LPARAMETERS txNum , txMult
txNum = ICASE(VARTYPE(txNum)="N",txNUm,;
			VARTYPE(txNUm)="C",VAL(txNum),;
			0)
 
txMult = ICASE(VARTYPE(txMult)="N",txMult,;
			VARTYPE(txMult)="C",VAL(txMult),;
			1)
RETURN txNum * txMult
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de DANIEL

Error al insertar en sql desde Foxpro

Publicado por DANIEL (6 intervenciones) el 03/08/2017 21:22:35
Me podiras dar un ejemplo de como usar la verificación de que tipo de verdad es el campo fecha
? Vartype(v_fecha1)

Donde debo usar esto en verdad nunca habia programado en foxpro, es mi primera vez.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Error al insertar en sql desde Foxpro

Publicado por Fidel José (539 intervenciones) el 04/08/2017 01:25:56
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
v_nsop = thisform.txtnum_sop.value
v_dep = thisform.Cmd_unidad.value
v_fecha1 = thisform.txtfecha1.value
v_hora1 = alltrim(thisform.txthora1.value)+' '+substr(thisform.Cmd_hora_tipo1.value,3,4) 
v_usu_sol = thisform.Cmd_usuario_sol.value
v_estatus = thisform.Cmd_estatus.value
v_ton_rep = thisform.Cmd_usu_sol.value
v_detalle1 = thisform.txtdetalle1.value
v_logu = v_usuario
v_logf = DTOC(date())
 
IF VARTYPE(v_fecha1)="D"
	=cursorsetprop('Buffering', 5, "tbl_reportes")
 
	INSERT INTO Tbl_Reportes ;
		(Rep_numero,;
		Rep_año,;
		Rep_ced_sol,;
		Rep_ced,;
		Rep_estado,;
		Rep_cod_dep,;
		Rep_fecha_reporte,;
		Rep_hora_reporte,;
		Rep_detalle_reporte,;
		Rep_log_fecha,;
		Rep_log_usuario);
	VALUES ;
		(v_nsop,;
		v_año,;
		v_usu_sol,;
		v_ton_rep,;
		v_estatus,;
		v_dep,;
		v_fecha1,;
		v_hora1,;
		v_detalle1,;
		v_logf,;
		v_logu)
 
	=tableupdate(1,.t.)
 
 
 
	=messagebox("REPORTE REGISTRADO CORRECTAMENTE",0+64+256,"Error de Validación")
	THISFORM.Release()
ELSE
	MESSAGEBOX("v_fecha1 no es un valor fecha, sino "+VARTYPE(v_fecha1))
ENDIF

De paso, fijate que si pones RELEASE Thisform, Visual Fox Pro tratará de liberar una supuesta variable llamada "thisform".
Release es un método nativo del formulario, por lo que corresponde colocar:
Thisform.Release()
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Leonardo Daniel A.

Error al insertar en sql desde Foxpro

Publicado por Leonardo Daniel A. (189 intervenciones) el 04/08/2017 07:04:05
que error te arroja ???


SQL Server almacena las fechas asi yyyy-mm-dd año-mes-dia por lo que insertarlas en formato de foxpro que generalmente es dd/mm/yyyy

antes mandar la insersion has lo sig.

wait window TuVariableFecha

para ver que formato trae tu fecha

2do.- yo no haria el sistema asi.... mejor haria una conexion remota y luego vistas remotas y las marco como actualizables... y las agregas al entorno de datos, pones el tipo de buffer a usar... debe ser Buffer de registro cuando modificas un solo registro, y buffer de tabla, cuando tienes varios registros a actualizar como el caso de los GRIDS

y en el boton guardar solo mando
select miVista
=tableUpdate(.t.)

y el boton cancelar
select miVista
=TableRevert(.t.)

y te evitas andar creando sentencias SQL y errores de dedo y demas que pueden causar errores
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de DANIEL

Error al insertar en sql desde Foxpro

Publicado por DANIEL (6 intervenciones) el 04/08/2017 15:25:28
Buenas compañeros la variable v_fecha1 trae C en el mensaje.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Error al insertar en sql desde Foxpro

Publicado por Fidel José (539 intervenciones) el 05/08/2017 00:30:32
Tal vez te cueste leer, pero insito

Posiblemente el textbox llamado txtFecha1 no tenga el formato adecuado.
Lo mejor para asegurarte de que sea una fecha es configurar ese control como:
.Format = "D"
.Value = {}

O sea, en el INIT del form pones
This.TxtFecha1.Format = "D"
This.TxtFecha1.Value = {}

Lo que ingreses en txtFecha1 será un valor fecha.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de DANIEL

Error al insertar en sql desde Foxpro

Publicado por DANIEL (6 intervenciones) el 07/08/2017 14:35:06
Buenos dias compañeros yo declare en el principal del programa un formato para esa fecha:

1
2
3
store ctod('  /  /    ') to v_fecha1
store ctod('  /  /    ') to v_fecha2
store ctod('  /  /    ') to v_fecha3

Luego en la ventana del formulario hice lo que me recomendaste en las propiedades
.Format = "D"
.Value = {}

adicional en el init
This.TxtFecha1.Format = "D"
This.TxtFecha1.Value = {}

Pero me sigo enviendo error dice que no conciden los tipos, anexo la imagen de los campos de la tabla SQL haber que estoy haciendo mal compañeros.

ADICIONAL EL CAMPO EN LA TABLA SQL

BD_SIS_IT
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Error al insertar en sql desde Foxpro

Publicado por Fidel José (539 intervenciones) el 07/08/2017 16:13:48
Y está claro que la tabla no espera un valor fecha, sino un datetime()
La declaración que hagas de una variable es inútil en visual Fox si luego le asignas el valor de un control.
O sea, puedo escribir
v_Fecha1 = .F.
v_Fecha1 = thisform.TxtFecha1.Value

Y el tipo de dato que termina teniendo v_Fecha1 es el que corresponde al Value del control Thisform.txtFEcha1. Y como lo has ajustado es un tipo "D" (Date()) cuando debería ser un tipo "T" (datetime())

De paso, no uses Ctod() para asignar un valor Date(). Lo correcto es:
v_fecha1 = {} && PARA DATE()
v_fecha1 = {//::} & para Datetime()
La diferencia entre un Date() y un Datetime() es muy fácil de ver: En tu ventana de comandos escribre:
? DATE()
? DATETIME()

Ahora viene el tiempo de saber qué necesitas.
Puedes utilizar esta función para convertir una fecha (date()) en Datetime().

v_fecha1 = Convert_Date_time_to_DateTime(thisform.txtFecha1.Value)
Pero debes tener en cuenta que ahí la hora saldrá como "00:00:00", lo que nos lleva a preguntarnos si tiene sentido o no el uso del datetime() en la tabla.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
PROCEDURE Convert_Date_Time_to_DateTime
*****************************************
LPARAMETERS tdFecha,tcHora,tnHours
TRY
 
	LOCAL lnSep,;
		lnAdd,;
		ltReturn,;
		lcString,;
		loex as Exception
 
	LOCAL ARRAY laHora(1)
 
 
	ltReturn = {//::}
 
	* Fecha
	IF VARTYPE(m.tdFecha)#"D"
		tdFEcha = {}
	ENDIF
 
	* Hora
	IF VARTYPE(m.tcHora)#"C"
		tcHora = "00:00:00"
	ENDIF
	tcHora = UPPER(m.tcHora)
	lnAdd=IIF(AT("PM",tcHora)>0,12,0)
 
	* hours
	IF VARTYPE(tnHours)#"N" OR !BETWEEN(m.tnHours,12,24)
		tnHours = 24
	ENDIF
 
	SET HOURS TO tnhours
 
	IF !EMPTY(m.tdFecha)
		lnSep = ALINES(laHora,CHRTRAN(m.tcHora,CHRTRAN(m.tcHora,"1234567890:",""),""),1,":")
		IF m.lnSep > 0
			IF m.lnAdd = 12
				laHora[1] = TRANSFORM(VAL(laHora[1])+12)
			ENDIF
			IF VAL(laHora[1])=24
				tdFecha = m.tdFEcha + 1
				laHora[1] = "00"
			ENDIF
		ENDIF
		ltReturn = DATETIME(YEAR(m.tdFecha),;
			MONTH(m.tdFecha),;
			DAY(m.tdFecha),;
			IIF(m.lnSep>0,VAL(laHora[1])+lnAdd,0),;
			IIF(m.lnSep>1,VAL(laHora[2]),0),;
			IIF(m.lnSep>2,VAL(laHora[3]),0))
 
	ENDIF
CATCH TO loex
	lcSTring = "tdFecha="+IIF(VARTYPE(m.tdFecha)="C",tdFecha,TRANSFORM(tdFecha)) + CHR(13);
		+ "tcHora="+IIF(VARTYPE(m.tcHora)="C",tcHora,TRANSFORM(m.tcHora)) + CHR(13) ;
		+ "lnSep="+TRANSFORM(m.lnSep) + CHR(13)
 
	loex.UserValue = PROGRAM()+CHR(13);
		+ m.lcString
 
	*ShowError(loex)  && muestra los errores capturados por CATCH
 
FINALLY
 
ENDTRY
RETURN m.ltReturn
ENDPROC

De otro modo, puedes utilizar una entrada tipo DateTime() en el control TxtFecha1, asignándole en el init del form el valor
Thisform.TxtFecha1.Value = {//::}
El ancho del campo debe permitir ver la parte de la hora. Es un poco engorroso para el usuario.
Alternativamente puedes crear otro Textbox para que ingrese la hora y juntar los dos con la función Convert_Date_Time_to_DateTime(), pero debes validar que la hora ingresada por el usuario sea aceptable para Time(). O sea, cada segmento de hora, minuto, segundo pueden tener un valor entre 0 y 59.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de DANIEL

Error al insertar en sql desde Foxpro

Publicado por DANIEL (6 intervenciones) el 10/08/2017 20:44:03
Buenas compañeros, ya he intentado todo lo que me dicen y sigue enviando error, no conciden los tipos.

Sigo las recomendaciones:

1- en el codigo principal del programa donde declaro las variables, quiete ctod, como me lo recomendaron.

1
2
3
store ('  /  /    ') to v_fecha1
store ('  /  /    ') to v_fecha2
store ('  /  /    ') to v_fecha3

2- en el init del formulario le di value a txtfecha1, acalro no me acepta los :: para las horas tratae de ponerlo en el value pero me los quita como dijo el compañero arriba Thisform.TxtFecha1.Value = {//::} no me permite hacer asi.

1
Thisform.TxtFecha1.Value = {//}

3- en el formato del txtfecha hice lo que me dijo el compañero que lo canbiara por (cuando debería ser un tipo "T" (datetime())), y aun asi me sigue mandando error de tipo de dato.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Ever

Error al insertar en sql desde Foxpro

Publicado por Ever antonycol2012@hotmail.com (23 intervenciones) el 10/08/2017 22:36:58
Que error te da, si es en mysql no hay tipo de campo datetime hay q guardar aparte la fecha y lahora ademas no acepta fecha vacia.
Si la fecha esta vacia hay q asignarle cero asi:
Txtfecha='0000/00/00'
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de DANIEL

Error al insertar en sql desde Foxpro

Publicado por DANIEL (6 intervenciones) el 11/08/2017 14:32:33
Buenas compañero, la base de datos es sql.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Revisar política de publicidad