FoxPro/Visual FoxPro - error tipo de datos xls a dbf

 
Vista:

error tipo de datos xls a dbf

Publicado por Fernando Pintasilgo (60 intervenciones) el 20/11/2015 14:00:03
Hola amigos del foro, al ejecutar el código para importar una planilla excel a dbf (uso vfp9), en la linea

insert into (tabla donde se insertan los datos) (campo1,campo2) values (m.dato1,m.dato2)

da error "no coinciden los tipos de datos"

He definido como campo tipo texto en excel como en mi dbf, pero importa los datos como tipo indefinido

¿como puedo solucionar este error?

Gracias


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
*** buscvo el archivo a importar ***
_archivo = Getfile("xls,xlsx","","Importar",0,"Importar Archivo")
 
If Empty(_archivo)
Return
ENDIF
*** creo un objeto ... para el caso un excel
ExcObj=Createobject("EXCEL.APPLICATION")
*** cargo el archvo seleccionado
ExcObj.WORKBOOKS.Open(_archivo)
*** comienso a hacer un barrido por todas la hojas que tenag el libro de excel
For x=1 To ExcObj.Sheets.Count
ExcObj.Sheets(x).Select
_fc=4 &&& indica la fila de lectura
Do While .T.
m.dato1=ExcObj.cells(_fc,1).Value
m.dato2=ExcObj.cells(_fc,2).Value
If Isnull(m.Nuf)
Exit
Endif
**********
insert into (tabla donde se insertan los datos) (campo1,campo2) values (m.dato1,m.dato2)
********* escribo en el excel a fin de saber que el registro fue insertado
ExcObj.cells(_fc,4).Value=cone.getmensaje()
 
_fc=_fc+1
enddo
ENDFOR
ExcObj.ActiveWorkbook.Save
ExcObj.WORKBOOKS.Close
Release ExcObj
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
sin imagen de perfil
Val: 1.011
Oro
Ha mantenido su posición en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

error tipo de datos xls a dbf

Publicado por Fidel José (657 intervenciones) el 21/11/2015 00:17:37
En tu código expuesto aquí, no dice de qué se trata este m.nuf (no aparece definida).
De todos modos el problema es otro: el valor null puede aparecer en una celda de cualquier columna cuando no hayan puesto allí un dato, por lo que debes crear el valor por default para cada campo, conforme al valor esperado.
En el segmento que sigue, "cTypReq" es el tipo de valor esperado para cada columna. Esto se puede basar en afields() del cursor o en un string parámetro que pases a la función.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
do case
					case cTypReq="C"
						defVal=""
					case Inlist(cTypReq,"N","I")
						DEFVAL=0
					CASE cTypReq="L"
						defVal=.f.
					case cTypReq="D"
						defVal=Ctod("")
				ENDCASE
 
				xValor=oSheet.Cells(i_,m.ncol).value
				IF ISNULL(xValor)
					xValor=defval
				ENDIF

Por otra parte, es necesario atacar otro problema, que es el del dato que debería tener una forma pero tiene otra. O sea, no es un valor null, pero tampoco responde al tipo esperado, por lo que hay que intentar las transformaciones antes de insertar en el cursor o tabla de destino.

cTypVal toma el tipo de valor obtenido (que puede ser el valor por defecto según el código anterior) y trata de determinar si es compatible con el tipo correspondiente al campo de destino.
Acá son irrelevantes el array gaval[] , tanto como el "<VALCOD>" (clave que se pasa en un string parameter para derivar el proc.)
En el procedimiento que tengo, el valor termina como elemento del array gaVal[] donde cada elemento es el valor de cada columna en la linea actual.
Lo que termina haciendo el segmento que sigue, es adecuar el valor obtenido si no coincide con el tipo de valor esperado.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
cTypVal=Vartype(xValor)
				IF cTypVal="N" AND nqRedon # 0
					xValor = ROUND(xValor,nqRedon)
				ENDIF
				if !empty(ctForma)
					do case
						case at("<VALCOD>",CTFORMA)#0
							nSet=vAL(QmlTag(ctForma,"VALCOD") )
							gaval[j_]=iif(!Empty(xValor),Valcod(xValor,nSet),"")
					ENDCASE
				ELSE
					do case
						case cTypReq="C" AND cTypVal="N"
							gaval[j_]=ltrim(str(xValor))
						case cTypReq="N" AND cTypVal="C"
							gaval[j_]=Val(FonlyNumer(xValor))
						CASE cTypReq="D" AND cTypVal="T"
							gaval[j_] = TTOD(xValor)
 
						otherwise
							gaval[j_]=iif(cTypVal=cTypReq,xValor,defVal)
					endcase
				ENDIF
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