Consulta como crear una bd en mysql desde vfp

947 views
Skip to first unread message

Marcelo Barberis

unread,
Jun 3, 2017, 11:39:32 AM6/3/17
to publicesvfoxpro
Hola amigos, les consulto un tema, estoy pensando hacer un sistema tipo multiempresa, ya tengo las estructuras de las tablas por lo que puedo crearla automaticamente cuando arranca por primera vez mi sistema pero yo debo crear la base de datos manualmente usando un administrador de bd de mysql yo uso heidysql, ahora mi consulta es como puedo crear una base de datos lo mismo automaticamente y despues ya que se proceda a crear las tablas en mysql, nose si alguien ha creado algo asi para que me oriente.
Desde ya agradesco cualquier comentario al respecto

--
Marcelo Barberis Gutierrez
Sistemas Informaticos
Villa Montes - Bolivia
Telef.: +591-76830544

Martín E. Lezama

unread,
Jun 3, 2017, 5:28:19 PM6/3/17
to Comunidad de Visual Foxpro en Español
Marcelo.

Yo diseñé un form que hace lo siguiente:

Elegís tu BD de Visual FoxPro.

Te lee todas las estructuras, y te las copia en un archivo Script SQL.

Después, ese script, desde el SQL, lo corrés y te crea las estructuras automáticamente.

No te puedo copiar el form porque no te correría, tiene varias cosas de seteos y clases propias que para copiártelo sería un bolonqui. Pero ya te busco y te pego el código y te digo cómo reconstruir un form así.

Dame 10 minutos.

Slds.

Antonio Meza

unread,
Jun 3, 2017, 7:36:21 PM6/3/17
to Comunidad de Visual Foxpro en Español
Es muy sencillo solo tienes que enviar las instrucciones SQL para crear la base de datos y las tablas, ejemplo

* Crear base de datos
_sql = "CREATE DATABASE " + "BaseDeDatosNueva"

IF sqlexec(nConn, _sql) > 0
     * Se creo la base de datos
else
     * Hubo un error, etc etc
ENDIF

* Para crear las tablas hay infinidad de formas, no tengo el código a la mano, pero los mas rápido es obtener un script de como esta creada la tabla de la siguiente forma:

_sql = "SHOW CREATE TABLE `BaseDeDatosReal`.`alumnos`;
IF sqlexec(nConn, _sql, "cursorEstructuraTabla") > 0
     Select cursorEstructuraTabla
     brow
     * No recuerdo el nombre del campo que contiene la estructura te fijas
     * Supongamos que es CreateTable
    _sql = cursorEstructuraTabla.CreateTable
    IF sqlexec(nConn, _sql) > 0
       * se creo la tabla
    ENDIF
ELSE
     * hay un error
ENDIF

La otra forma es que en HeidiSql copies el código de como se creo la tabla pues ahí te lo muestra lo pones algo así:

TEXT TO _sql TEXTMERGE PRETEXT 7 NOSHOW
     CREATE TABLE `alumnos` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`idtutor` INT(11) NOT NULL DEFAULT '0',
`nombre` VARCHAR(60) NOT NULL DEFAULT '',
`apellido_paterno` VARCHAR(60) NOT NULL DEFAULT '',
`apellido_materno` VARCHAR(60) NOT NULL DEFAULT '',
`curp` VARCHAR(30) NOT NULL DEFAULT '',
`activo` CHAR(2) NOT NULL DEFAULT '',
`registro` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
     )
     COLLATE='utf8_general_ci'
     ENGINE=InnoDB
     AUTO_INCREMENT=0
     ;
ENDTEXT

IF sqlexec(nConn, _sql) > 0
     * Se creo la tabla
else
     * Hubo un error, etc etc
ENDIF


En cualquiera de los casos tienes que repetir por cada tabla.

saludos
Antonio Meza

Marcelo Barberis

unread,
Jun 3, 2017, 8:40:02 PM6/3/17
to publicesvfoxpro
hola bueno gracias por los comentarios aportados, les comento, yo tengo en una tabla ya las esctructuras de las tablas y en algunas tablas tambien estan los registros que agrego predeterminadamente, mi tema era como hago para crear la bd sin tenerlo que hacer manualmente en algun adm de mysql, lo que deseo es que el programa lo haga por el usuario, porque como dije antes el proceso de las tablas ya lo tengo.
Una consulta amigo Mesa, tu pones por ej IF sqlexec(nConn, _sql) > 0, y nConn de donde obtienes ese dato amigo

Marcelo Barberis

unread,
Jun 3, 2017, 8:42:55 PM6/3/17
to publicesvfoxpro
yo intente hacerlo les comento buscando la forma de crea la bd y me mandaba error "el controlador de conexion no es valido" y bueno despues de intentarlo varias veces de diferentes formas y con instrucciones diferente buscandola no me daba por lo que recurri al grupo aver si alguien me da una mano

Antonio Meza

unread,
Jun 5, 2017, 10:02:58 AM6/5/17
to Comunidad de Visual Foxpro en Español
nConn  es una variable que puede ser cualquier nombre y la obtienes al conectarte al servidor de Mysql, como estas enviando las instrucciones SQL al servidor? es decir pon un ejemplo de como lo haces.

saludos
Antonio Meza

Martín E. Lezama

unread,
Jun 5, 2017, 11:06:11 AM6/5/17
to Comunidad de Visual Foxpro en Español



Marcelo ESTO es lo que tenés que hacer. Vas a tener que adaptar un poquito pero acá tenés la solución.

Disculpá la demora pero este fin de semana anduve a las corridas. Te pongo las pantallas del form que yo utilizo.

Como te dije, para mandarte el form era un lío porque tiene mucha clase propia, entonces tengo que incluirte todas las clases que uso. Pero te comento cómo funciona.

En mi sistema, yo tengo una tabla en la que figuran todas las bases de datos DBC que tengo. Abro esa tabla, leo todas las bases de datos y las pongo en lista el combo de arriba.

El código del botón Elegir también alude a clases propias, pero te cuento básicamente lo que hace:

1) Obtiene el nombre y la ruta completa del DBC.
2) Abre el DBC como DBF poniéndole de alias "dbcactivo"
3) Desde acá corro lo siguiente:

CREATE CURSOR curtablas ;
(tabla c(30), ubicacion c(200), procesar l, noproc l)
= CURSORSETPROP("Buffering",5,"curtablas")

*---- El campo PROCESAR lo utilizo en la grilla para tildar/destildar las tablas que quiero que me genere el SCRIPT de estructura.
*---- El campo NOPROC en cambio, lo tengo por si por algún inconveniente (error de apertura o lo que fuese) no pude procesar alguna tabla requerida.

LOCAL ARRAY laTablas[1]
laTablas[1] = ""

SELECT dbcactivo.objectname ;
FROM dbcactivo ;
WHERE ALLTRIM(LOWER(dbcactivo.objecttype)) = "table" ;
 AND !DELETED() ;
ORDER BY dbcactivo.objectname ;
INTO ARRAY laTablas

IF _TALLY = 0
= MESSAGEBOX("La base de datos no contiene tablas.",48,"VERIFIQUE LO SIGUIENTE")
RETURN
ENDIF

i = 1

FOR i = 1 TO ALEN(laTablas)
SELECT curtablas
SCATTER MEMVAR BLANK

m.tabla = laTablas[i]
m.ubicacion = lcDirDBF
m.procesar  = .T.
m.noproc    = .T.

INSERT INTO curtablas FROM MEMVAR
ENDFOR

SELECT curtablas
GO TOP

ThisForm.GrdTablas.RecordSource = "curtablas"
ThisForm.GrdTablas.Column1.ControlSource = "curtablas.tabla"
ThisForm.GrdTablas.Column2.ControlSource = "curtablas.procesar"
ThisForm.GrdTablas.Refresh()

---------------------------------------------------------------

O sea, básicamente obtengo del DBC todas las tablas que posee, y las cargo en la grilla para decidir si procesarlas o no. Una vez presionado ese botón, la grilla me queda como la que se ve en la imagen.

Bien, ahora ESTO HAGO EN EL BOTÓN ACEPTAR.

*----------------------------
lnInicio    = SECONDS()
lnTablaProc = 0
lcBaseDatos = ALLTRIM(This.Parent.CboBaseDatos.Value)
lcDirSQL    = gcDirPrinc + "SQL\"
lnManejador = FCREATE(lcDirSQL + lcBaseDatos + ".sql")

SELECT curtablas
GO TOP

SCAN
lnRegistro = ABS(RECNO("curtablas"))

SCATTER MEMVAR
m.ubicacion = ALLTRIM(LOWER(m.ubicacion))
m.tabla     = ALLTRIM(LOWER(m.tabla))

USE (m.ubicacion + m.tabla) ALIAS tabla SHARED IN 0

IF USED("tabla")
lnCampos   = AFIELDS(laTabla,"tabla")

USE IN tabla

lcOrden    = "CREATE TABLE `" + lcBaseDatos + "`.`" + m.tabla + "` (" + CHR(13)

i   = 1
lcPrimaria = ALLTRIM(LOWER(laTabla[1,1]))

FOR i = 1 TO ALEN(laTabla,1)
lcOrden = lcOrden + "`" + ALLTRIM(LOWER(laTabla[i,1])) + "` "

DO CASE
CASE laTabla[i,2] = "C" &&Character
lcOrden = lcOrden + "VARCHAR(" + ALLTRIM(STR(laTabla[i,3])) + ")"

CASE laTabla[i,2] = "Y" &&Currency
lcOrden = lcOrden + "DOUBLE"

CASE laTabla[i,2] = "D" &&Date
lcOrden = lcOrden + "DATE"

CASE laTabla[i,2] = "T" &&Datetime
lcOrden = lcOrden + "DATETIME"

CASE laTabla[i,2] = "B" &&Double
lcOrden = lcOrden + "DOUBLE"

CASE laTabla[i,2] = "F" &&Float
lcOrden = lcOrden + "FLOAT"

CASE laTabla[i,2] = "I" &&Integer
lcOrden = lcOrden + "INTEGER"

CASE laTabla[i,2] = "L" &&Logical
lcOrden = lcOrden + "BIT(1)"

CASE laTabla[i,2] = "M" &&Memo
lcOrden = lcOrden + "TEXT(65535)"

CASE laTabla[i,2] = "N" &&Numeric
lcOrden = lcOrden + "FLOAT"

ENDCASE

lcOrden = lcOrden + IIF(laTabla[i,2] $ "DTM", ", "," NOT NULL, ") + CHR(13)
ENDFOR

lcOrden = lcOrden + " PRIMARY KEY (`" + lcPrimaria + "`));" + CHR(13) + CHR(13)

IF lnManejador >= 0
lnTablaProc = lnTablaProc + 1

ThisForm.LblTablasProc.Caption = "Tablas procesadas: " + ALLTRIM(STR(lnTablaProc))
ThisForm.LblTablasProc.Visible = .T.

= FWRITE(lnManejador,lcOrden)

SELECT curtablas
REPLACE curtablas.noproc WITH .F.
GO TOP
GO (lnRegistro)
This.Parent.GrdTablas.Refresh()
ENDIF
ENDIF

SELECT curtablas
ENDSCAN

= FCLOSE(lnManejador)
lnFin       = SECONDS()
lcTiempo    = Seg2DHMS(lnFin - lnInicio,.F.,.F.,.T.)

ThisForm.LblTiempoProc.Caption = "Tiempo de proceso: " + lcTiempo
ThisForm.LblTiempoProc.Visible = .T.
*-----------------------------

Esto genera un archivo de texto de bajo nivel, con extensión .SQL, que es un SCRIPT DE SQL con TODAS LAS ESTRUCTURAS leídas de tus tablas DBF.

Después, en el administrador SQL, hacés lo siguiente:

- Abris y entrás
- Ponés la base de datos que deseás como contenedor como activa.
- Corrés este script y voilá, te generó todas las estructuras dentro de la BD SQL.


Martín E. Lezama

unread,
Jun 5, 2017, 11:10:33 AM6/5/17
to Comunidad de Visual Foxpro en Español
Otra aclaración para mi respuesta, Marcelo. En MI CASO ese script marca siempre como PRIMARY KEY el campo 1, porque en TODAS mis tablas el campo ID es el primero, y es siempre el que uso como clave candidata en VFP.

Si vos tenés una estructura diferente, omití la PRIMARY KEY y después marcalas manualmente. Pero si podés tener tu clave principal en el campo 1 de tu tabla, va como trompada.

Antonio Meza

unread,
Jun 5, 2017, 12:58:34 PM6/5/17
to Comunidad de Visual Foxpro en Español
Martín, pero tu le estas comentando como migrar de DBF a Mysql, y el solo quiere saber como crear una base de datos desde código.

saludos
Antonio Meza

Martín E. Lezama

unread,
Jun 5, 2017, 1:12:32 PM6/5/17
to Comunidad de Visual Foxpro en Español
No, Antonio, lo que yo puse hace exactamente lo que él quiere, que es ponerle todas las ESTRUCTURAS (no los registros) de las tablas DBF en un script SQL, entonces, después con ese script crea las tablas. ;-)

Esto no migra los REGISTROS, copia la ESTRUCTURA. Te termina generando un archivo así:

CREATE TABLE `clientes`.`cli_cbte` (
`id` VARCHAR(10) NOT NULL, 
`descrip` VARCHAR(40) NOT NULL, 
`nom_corto` VARCHAR(10) NOT NULL, 
`letra` VARCHAR(1) NOT NULL, 
`tipocomp` VARCHAR(1) NOT NULL, 
`idcfisc` VARCHAR(10) NOT NULL, 
`idfacelec` VARCHAR(10) NOT NULL, 
`idciti` VARCHAR(10) NOT NULL, 
`baja` BIT(1) NOT NULL, 
`operador` VARCHAR(20) NOT NULL, 
`fechacrea` DATETIME, 
`operamodif` VARCHAR(20) NOT NULL, 
`fechamodif` DATETIME, 
 PRIMARY KEY (`id`));

CREATE TABLE `clientes`.`cli_cbteemp` (
`id` VARCHAR(10) NOT NULL, 
`idempresa` VARCHAR(10) NOT NULL, 
`idcbte` VARCHAR(10) NOT NULL, 
`puntoventa` INTEGER NOT NULL, 
`ultimonro` INTEGER NOT NULL, 
`baja` BIT(1) NOT NULL, 
`operador` VARCHAR(20) NOT NULL, 
`fechacrea` DATETIME, 
`operamodif` VARCHAR(20) NOT NULL, 
`fechamodif` DATETIME, 
 PRIMARY KEY (`id`));
....

entonces, vos después, a ese archivo lo corrés desde el motor SQL y te crea automáticamente todas las estructuras.

Slds.

Martín E. Lezama

unread,
Jun 5, 2017, 1:28:17 PM6/5/17
to Comunidad de Visual Foxpro en Español
Antonio, aclaro un poco más. Marcelo pidió poder crear las tablas automáticamente.

Se me ocurre que la mejor manera de hacerlo es: leer tu DBC a como está en Visual FoxPro, leer las tablas que contiene y copiar la estructura en un script.

Entonces después vas a MySQL, o a SQL Server o al motor que tengas, creás la base de datos, y luego corriendo ese script, te genera todas las tablas automáticamente adentro.

Seguramente se debe poder correr esto mismo desde VFP adaptándolo. Yo por una cuestión de prolijidad prefiero correr los scripts SQL desde el mismo motor SQL, ya que siendo la creación inicial de las tablas, es preferible verlo en su sitio. Total, no es algo que uno vaya a hacer comúnmente, las tablas se crean una sola vez y de ahí quedan siempre las estructuras.

Saludos.

Martín.


El lunes, 5 de junio de 2017, 13:58:34 (UTC-3), Antonio Meza escribió:

Francisco

unread,
Jun 6, 2017, 4:17:26 AM6/6/17
to Comunidad de Visual Foxpro en Español
Está claro que Marcelo solo busca como crear el contenedor de BBDD en MySql para luego aplicar lo que ya tiene realizado que es cargar todas las estructuras de tablas y luego insertar los datos por defecto en las mismas. Yo estoy también pensando como realizar este proceso completo y estoy estudiando cuales son las mejores alternativas para ello. 

El proceso se compone de los puntos siguientes:
  1. Crear el contenedor BBDD en Mysql con un nombre dado.
  2. Crear las tablas vacías en la BBDD anterior
  3. Cargar los datos predeterminados en las tablas.
Creo que Marcelo ya tiene realizados los puntos 2 y 3 pero ahora requiere del punto 1 que realizaba a través del propio gestor HeidySql y supongo quiere realizar directamente desde el propio programa. En este caso me lleva ventaja dado que yo aún estoy pensando cual es la mejor manera de realizar este tema pensando también que las estructuras y datos a cargar pueden sufrir cambios. En fin se agradece cualquier tipo de ayuda. 

pd: Para exportar estructuras y/o datos de Fox a MySql existe una utilidad llamada MigDBFtoMySQL (Irwin Rodriguez) que lo hace estupendamente (Enlace)


Message has been deleted

omar

unread,
Feb 18, 2020, 7:40:25 PM2/18/20
to Comunidad de Visual Foxpro en Español
hola como estas, buenas noches, así como esta ejecutándolo desde vfp me crea la tabla, pero no resuelve ni necesidad ya que necesito crear una tabla en la cual los caracteres ""VARCHAR (10)"" pueda reemplazarse por una variable ej:
lcar=alltrim(thisform.text_car.value)
y aqui necesitaria reemplazar el caracter por el resultado de la variable:
VARCHAR (lcar)
pero no me toma el valor de la variable y no crea la table. si alqyuien me puede dar una sugerencia les estaría muya agradecido

Víctor Hugo Espínola Domínguez

unread,
Feb 19, 2020, 8:14:46 AM2/19/20
to publice...@googlegroups.com
Puedes usar el bloque o la función TEXT

Saludos,
Víctor.
Lambaré - Paraguay.



--
Visita el Blog de la Comunidad Visual FoxPro en Español: http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/3f515de9-3f09-4b17-907e-f8db0546adb9%40googlegroups.com.
Reply all
Reply to author
Forward
0 new messages