FoxPro/Visual FoxPro - Programador de computadoras

   
Vista:

Programador de computadoras

Publicado por Francisco Salinas (6 intervenciones) el 16/11/2009 21:01:45
Estoy intentando migrar datos de tablas libres .dbf a una base de datos sql. Mi dificultad radica en que quiero mover el contenido de la tabla dbf a variables y posteriormente insertarlos a la tabla de la base sql.
Todos los ejemplos que he consultado hasta ahora en las diferentes páginas me muestran ejemplos de cómo hacer esto, pero los valores que mueven a los campos de la tabla sql son registrados explicitamente en la sentencia. Es decir:

=SqlExec(nHanConn,"INSERT INTO Area (AreCodigo, AreDescripcion) VALUES (2,'PERIFERIA')")

cuando lo que necesito hacer es lo siguiente:

do while .not. eof()

mover contenido de la tabla a variables

w_Codigo = Area -> Codigo
w_Nombre = Area -> Nombre

if luego insertar a la tabla de la base

=SqlExec(nHanConn,"INSERT INTO Area (AreCodigo, AreDescripcion) VALUES (w_Codigo,'w_Nombre')")

select Area
if .not. eof()
skip
else
exit
endif
enddo

Alguien puede ayudarme en corregir o completar mi rutina? Gracias desde ya
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

RE:Programador de computadoras

Publicado por xx (378 intervenciones) el 17/11/2009 00:31:17
do while .not. eof()
w_Codigo = Area -> Codigo
w_Nombre = Area -> Nombre
_Xsql ="INSERT INTO Area (ARECODIGO,AREDESCRIPCION) VALUES("+;
w_CODIGO+","+W_NOMBRE+")"
SQLPREPARE(nHanConn,_Xsql)
SQLEXEC( nHanConn)
select Area
if .not. eof()
skip
else
exit
endif
enddo
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

RE:Migración de datos

Publicado por Francisco Salinas (6 intervenciones) el 17/11/2009 14:38:39
Gracias por tu atencion XX. He probado tu sugerencia y creo que va a funcionar, solo que me arroja un mensaje de error con la variable w_Codigo. La razón es que la misma es numérica. He probado de muchas formas la sentencia y no consigo que me asuma el valor de la variable numérica.

Me gustaría, que me sigas ayudando. Gracias desde ya
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

RE:Migración de datos

Publicado por xx (378 intervenciones) el 17/11/2009 18:22:25
do while !eof()
w_Codigo = Area -> Codigo
w_Nombre = Area -> Nombre
_Xsql ="INSERT INTO Area (ARECODIGO,AREDESCRIPCION) VALUES("+;
ALLTRIM(STR(w_CODIGO))+","+W_NOMBRE+")"
SQLPREPARE(nHanConn,_Xsql)
SQLEXEC( nHanConn)
SELECT Area
skip +1
enddo

*pruebalo, solo ARECODIGO de tu SQL debe ser capaz de albergar a w_Codigo de tu DBF
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

RE:Migración de datos

Publicado por Francisco Salinas (6 intervenciones) el 17/11/2009 19:36:41
Hola Sr. xx, disculpame si soy ya una molestia. Te envío a continuación todo el procedimiento que ya funciona, pero no inserta a la tabla de la base sql.

Hice los siguientes cambios:

- Converti a campo tipo Texto, el campo de AreCodigo en la tabla AREA de la base SQL, ya que definitivamente no me acepta la lectura del insert() la variable w_codigo como numérico. De hecho. La estructura que me enviaste se orienta a campos tipo String.-

- La cadena del insert() que me facilitaste me arroja un error de sintaxis. Te transcribo como quedo ahora. Así me funciona sin errores, yo puedo ver los código y los nombres a medida que va leyendo los registros. El tema es que no inserta a la tabla de la base sql.

cCadConnDSN = "DRIVER=SQL Server;" ;
+ "SERVER=Pcexi15;" ;
+ "UID=sa;" ;
+ "PWD=lolo;" ;
+ "DATABASE=Eximpar;" ;
+ "WSID=Pcexi15;" && Cadena de conexión a la base de datos sql

nHanConn = SQLSTRINGCONNECT(m.cCadConnDSN) && conexión a la base sql
IF nHanConn > 0 && prueba de conexión exitosa
=MESSAGEBOX("Conectado a la base de datos de SQl Server") && mensaje de conexión exitosa
select 0 && selección de área de apertura de tabla dbf
use c:\Datos\Eximpar\Area shared && apertura de tabla dbf
go top && inicialización de puntero en el primer registro dbf
browse && despliegue de contenido de la tabla dbf

do while .not. eof() && rutina de lectura secuencial

w_Codigo = "" && inicialización de variable
w_Nombre = "" && inicialización de variable
_Xsql = "" && inicialización de variable

w_Codigo = ALLTRIM(STR(Area -> Codigo))
w_Nombre = ALLTRIM(Area -> Nombre)
AccesoBase.Codigo.value = w_Codigo
AccesoBase.Nombre.value = w_Nombre

* _Xsql = "INSERT INTO Area (AreCodigo,AreDescripcion) VALUES (8,'Hola')" && prueba de inserción explicita que funciona

_Xsql = "INSERT INTO Area (ARECODIGO,AREDESCRIPCION) VALUES(" + w_Codigo + ", " + w_Nombre + " )" && senetencia de inserción

AccesoBase.txt_Xsql.value = _Xsql && Despliega el contenido de _Xsql en un Textbox
AccesoBase.refresh && Refresca el formulario
wait && parada para ver que el contenido de _Xsql es el correcto

=SQLPREPARE(nHanConn,_Xsql) && prepara la inserción del registro en la tabla
=SQLEXEC( nHanConn) && ejecuta la inserción
select Area && selecciona tabla fuente
skip + 1 && desplaza el puntero al siguiente registro
enddo
=SqlExec(nHanConn, 'select * from Area') && Habre la tabla en la base sql
browse && despliega contenido de la tabla

SQLDISCONNECT(nHanConn) && desconecta la base

CLOSE DATABASES ALL && cierra todas las tablas
RELEASE w_Codigo, w_Nombre, _Xsql && reinicia variables
ELSE
=MESSAGEBOX("Error al conectarse a la base de datos de SQl Server") && mensaje de conexión fallida
ENDIF
return && salida del procedimiento

Gracias por la paciencia.
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

RE:Migración de datos

Publicado por xx (378 intervenciones) el 17/11/2009 20:31:36
Disculpa no me percate de que la sentencia no tenia las comillas dobles:
Da lo mismo usar "xxx" o 'xxxx' o [xxx ] para definir una cadena xxx en VFP entonces
prueba esto :

_Xsql = [INSERT INTO Area (ARECODIGO,AREDESCRIPCION) VALUES(]+;
alltrim(str(w_Codigo))+; &&convierte el numero a cadena
[,] + ["]+w_Nombre +["]+ [ )]
podrias insertar un WAIT _Xsql WINDOWS luego de la sentecia anterior para depurar
deberia mostrarte algo asi

INSERT INTO Area (ARECODIGO,AREDESCRIPCION VALUES(1,"DESCRIPCION")

y deberia funcionar con ARECODIGO como numerico, pero si ya has convertido el campo a caracter deberias cambiarla a

_Xsql = [INSERT INTO Area (ARECODIGO,AREDESCRIPCION) VALUES("] + w_Codigo + [",] + ["]+w_Nombre +["]+ [ )]

Para que se entienda se forma un string con el comando insert denotando los campos string con "" y los valores numericos sin comillas mediante expresiones.

Hasta donde se el problema esta en la composición del string _Xsql, es lo poco que se de sentencias SQL lo estuve experimentando con el MySQL pero todabia no pude ahondar mucho en el tema.

primero deberias depurar bien la formacion de la cadena a ejecutar y luego lo pruebas directamente sobre el motor SQL

Espero haber ayudado.
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

RE:Migración de datos

Publicado por Francisco Salinas (6 intervenciones) el 17/11/2009 22:36:08
Hola Sr. xx, respondo esta vez con buenas noticias. El objetivo ha sido logrado y te expreso por este medio mis agradecimientos, esperando pueda volver a contar contigo para consultas futuras.

Transcribo toda la rutina, con algunas modificaciones que introduje, para lo mires y para que esté disponible, ya que quizas a otros, les pueda servir como ejemplo para procedimientos similares.

Gracias. Hasta siempre

cCadConnDSN = "DRIVER=SQL Server;" ;
+ "SERVER=Pcexi15;" ;
+ "UID=sa;" ;
+ "PWD=lolo;" ;
+ "DATABASE=Eximpar;" ;
+ "WSID=Pcexi15;" && Cadena de conexión a la base de datos sql

nHanConn = SQLSTRINGCONNECT(m.cCadConnDSN) && conexión a la base sql
IF nHanConn > 0 && prueba de conexión exitosa
=MESSAGEBOX("Conectado a la base de datos de SQl Server") && mensaje de conexión exitosa
select 0 && selección de área de apertura de tabla dbf
use c:\Datos\Eximpar\Area shared && apertura de tabla dbf
go top && inicialización de puntero en el primer registro dbf
browse && despliegue de contenido de la tabla dbf
BEGIN TRANSACTION && Inicia transaccion en sql
do while .not. eof() && rutina de lectura secuencial

w_Codigo = 0 && inicialización de variable
w_Nombre = "" && inicialización de variable
_Xsql = "" && inicialización de variable

w_Codigo = ALLTRIM(STR(Area -> Codigo))
w_Nombre = ALLTRIM(Area -> Nombre)
AccesoBase.Codigo.value = w_Codigo
AccesoBase.Nombre.value = w_Nombre

_Xsql = [INSERT INTO Area (ARECODIGO,AREDESCRIPCION) VALUES (]+ w_Codigo + [,] + [']+ w_Nombre + [']+ [)] &&convierte el numero a cadena

AccesoBase.txt_Xsql.value = _Xsql && Despliega el contenido de _Xsql en un Textbox
AccesoBase.refresh && Refresca el formulario
WAIT _Xsql WINDOWS && parada para ver que el contenido de _Xsql es el correcto
=SQLPREPARE(nHanConn,_Xsql) && prepara la inserción del registro en la tabla
if SQLEXEC( nHanConn) <= 0 && ejecuta la inserción
a=Aerror(Mat) && mueve a una variable el error detectado
Messagebox(Mat(2),55,'Error al Grabar') && despliega el mensaje de error
ENDIF

select Area && selecciona tabla fuente
skip + 1 && desplaza el puntero al siguiente registro
enddo
END TRANSACTION && finaliza transaccion en sql
=SqlExec(nHanConn, 'select * from Area') && Habre la tabla en la base sql
browse && despliega contenido de la tabla

SQLDISCONNECT(nHanConn) && desconecta la base

CLOSE DATABASES ALL && cierra todas las tablas
RELEASE w_Codigo, w_Nombre, _Xsql && reinicia variables
ELSE
=MESSAGEBOX("Error al conectarse a la base de datos de SQl Server") && mensaje de conexión fallida
ENDIF
return && salida del procedimiento
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

RE:Migración de datos

Publicado por Francisco Salinas (6 intervenciones) el 19/11/2009 16:19:59
Sr. xx, me gustaría hacerle la siguiente consulta,

Antecedente:

- Tengo un campo llamado "Fecha" en una tabla libre .dbf
- Necesito crear la candena en la variable "_Xsql", para enviar la fecha de cada registro al campo VtaFecha de la tabla, en la base sql server.

Mi consulta es, si cómo debería crear la cadena "_Xsql", de tal forma que, de un campo origen tipo date, pueda convertirlo a tipo DateTime en una variable y enviarlo al campo destino.

w_Fecha = tabla -> Fecha
w_Comprobante = ALLTRIM(tabla -> Comprobante)

_Xsql = [INSERT INTO Tabla (VtaFecha,VtaComprobante) VALUES (]+ .......+ [)]

gracias por su atención
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

RE:Migración de datos

Publicado por xx (378 intervenciones) el 19/11/2009 21:00:14
Bueno sabia que tarde o temprano ivas a preguntar sobre las fechas, te cuento que llegue a habilitar mysql en una maquina con linux para pruebas pero no llegue a probarlo con fechas por cuestiones de tiempo, y lei por otros foros que esta insersion depende del formato del motor SQL definido para las fechas es decir AAAA/MM/DD o DD/MM/AAAA o sea consulta las documentaciones de tu motor SQL sobre como insertar una fecha o picale al google pidiendole ejemplos con el nombre de tu motor SQL y te lloveran respuestas pruebalos y seguro daras con la solucion.

Suerte!!.
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

RE:Migración de datos

Publicado por Francisco Salinas (6 intervenciones) el 20/11/2009 13:06:58
Sr. xx,

Buenas noticias. Aquí te envío los pasos que dí para obtener el objetivo.

- w_Fecha = tabla -> Fecha

- w_FechaString = str(day(w_Fecha)) + "/" + str(month(w_fecha))+ "/" + str(year(w_fecha)). Esta construcción tuve que hacerla, porque si le envío solo w_fecha como lee del registro, arroja un error de char a DateTime.

- + [']+ w_FechaString + ['] +. En la cadena se trata como una variable tipo texto

- La versión del sql que tengo guarda "dd/mm/aaahh:mm:ss a.m." y al leer w_FechaString, le agrega por defecto 12:00:00 a.m.

Gracias por su paciencia y orientación
Hasta siempre
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