ALTER TABLE en FoxyDB...

70 views
Skip to first unread message

Francisco

unread,
Jul 2, 2015, 5:21:34 AM7/2/15
to publice...@googlegroups.com
Buenas, estoy implementando un sistema para realizar modificaciones en las base de datos del proyecto para actualizar las mismas en los clientes. El caso es que no se muy bien como acometer dicho proceso en FoxyDB y me gustaría una pequeña ayudita. Tengo una tabla la cual recoge todos los nombres de las base de datos que usa la aplicacion tal que xxxx001 xxxx002 etc... bien tengo un form que recorre dicha tabla y pasa a un procedimiento tanto la base de datos a verificar como el entorno de datos o clase FoxyDB. En ese procedimiento tengo que abrir una tabla ver si existen unos campos y si no existen hacer el ALTER TABLE correspondiente. 

Sería algo así: (la conexión con el servidor de base de datos ya está establecida)

* --------------------------------------------------------------
* PROCEDIMIENTO PARA CAMBIAR REGISTRAR LOS CAMBIOS EN LAS TABLAS
* DE LAS BASES DE DATOS 
* --------------------------------------------------------------
PROCEDURE MIRARCAMBIOS
LPARAMETER cBASEDATOS,cClaseDatos
LOCAL nPOSICION,nFILA,cAUX
SET EXACT ON
IF oClaseDatos.BaseDatos(cBASEDATOS) && CAMBIO A LA BASE DE DATOS A ANALIZAR
oClaseDatos.Sql("Select * from datosemp limit 1","cur_datosemp")
SELECT cur_datosemp
AFIELDS(mCAMPOS)
IF ASCAN(mCAMPOS,'EJEMPLO')=0 && SI NO EXISTE CAMPO EJEMPLO
cSQL="ALTER TABLE DATOSEMP ADD COLUMN EJEMPLO VARCHAR(10) NOT NULL DEFAULT ''"
IF !HAGO_UPDATE(cSQL,"ARTICULOS",oClaseDatos)
=MESSAGEBOX("Error al crear campo EJEMPLO en tabla DATOSEMP",48,"Atención")
ENDIF
ENDIF
RELEASE mCAMPOS
oClaseDatos.CerrarCursor("cur_Datosemp")
ENDIF
SET EXACT OFF
RETURN

La verdad no se si FoxyDB tiene otra manera o directamente puedo mandar los ALTER TABLES con la verificación de que no exista el campo mediante procedimiento almacenado... nose... 

Francisco

unread,
Jul 2, 2015, 5:34:37 AM7/2/15
to publice...@googlegroups.com, dire...@informatica-apliges.com
Otra cosa más en la funcion DB hay un this.Return(................) pero ese procedure no está incluido en la definiciones de la clase y salta un error...

* Cambiar Base de datos
IF this.Sql(__commandSql,true)
RETURN this.Return(Program(),__dataBaseChanged,true)
ELSE
RETURN this.Errors(PROGRAM(),__dataBaseNotChanged,false)
ENDIF

Imagino que falta este PROCEDURE...

*** --------------------------------------------------------------------------------------------
*** --------------------------------------------------------------------------------------------
PROCEDURE Return
LPARAMETERS __procedureName as Character, __errorNumber as Integer, __returnValue as Variant
* Post
* Control de Mensajes internos de la Librería, según el procedimiento enviado
* Parámetros
* __procedureName, Nombre del procedimiento que envía el error
* __errorNumber,  Numero de error
* __returnValue, Valor que será Retornado por el procedimiento
* Asignar valores a las propiedades Error
this.TextMessage(__procedureName,__errorNumber,__returnValue)
* Mostrar Mensajes de la Librería
IF this.debug
this.Message()
ENDIF
RETURN __returnValue
ENDPROC




Antonio Meza

unread,
Jul 2, 2015, 12:59:14 PM7/2/15
to publice...@googlegroups.com, dire...@informatica-apliges.com
Hola Francisco!!!

la función .DB() como bien comentas tiene un error, la verdad no la uso y no la cambie, no hay que crear un procedimiento nuevo solo tienes que cambiar la linea que marca el error

RETURN this.Return(Program(),__dataBaseChanged,true)

por

RETURN this.Post(Program(),__dataBaseChanged,true)

Ya que la función .Return() la cambie por POST()

saludos
Antonio Meza

Antonio Meza

unread,
Jul 2, 2015, 1:20:44 PM7/2/15
to publice...@googlegroups.com, dire...@informatica-apliges.com
Hola de nuevo!!

Si puedes realizar lo que comentas, el problema es que estas usando .Update() y este solo es para el manejo de Cursores, estas confundiendo un cursor con una estructura de tabla y por ello no va a funcionar de esta forma.

Recuerda que para enviar cualquier comando al servidor debes usar .SQL() y para el manejo de cursores usar .Update(), hay una función de FoxyDb que te devuelve la estructura de la tabla y se llama .TableFields()

Prueba el siguiente código, ya tienes que ajustar a tus necesidades es solo una idea.

* --------------------------------------------------------------
* PROCEDIMIENTO PARA CAMBIAR REGISTRAR LOS CAMBIOS EN LAS TABLAS
* DE LAS BASES DE DATOS 
* --------------------------------------------------------------
PROCEDURE MIRARCAMBIOS
LPARAMETER cBASEDATOS,cClaseDatos
LOCAL nPOSICION,nFILA,cAUX
SET EXACT ON
IF oClaseDatos.BaseDatos(cBASEDATOS) && CAMBIO A LA BASE DE DATOS A ANALIZAR
oClaseDatos.TableFields("datosemp","cur_datosemp")
                select cur_datosemp
                locate for cur_datosemp.field_name = 'EJEMPLO'
                IF NOT FOUND()
cSQL="ALTER TABLE DATOSEMP ADD COLUMN EJEMPLO VARCHAR(10) NOT NULL DEFAULT ''"
                     oClaseDatos.Begin(2) && Puedes usar 3 tambien
IF not oClaseDatos.Sql(cSQL)
=MESSAGEBOX("Error al crear campo EJEMPLO en tabla DATOSEMP",48,"Atención")
ENDIF
ENDIF
RELEASE mCAMPOS
oClaseDatos.CerrarCursor("cur_Datosemp")
ENDIF
SET EXACT OFF
RETURN


Francisco

unread,
Jul 2, 2015, 1:43:27 PM7/2/15
to publice...@googlegroups.com, solv...@gmail.com, dire...@informatica-apliges.com
Funciona perfecto, gracias.

pd: No es que haga un update es que llamo a una funcion mía que se llama así y esa a su vez llama a sql de FoxyDB... 

Francisco

unread,
Jul 2, 2015, 1:44:43 PM7/2/15
to publice...@googlegroups.com, solv...@gmail.com, dire...@informatica-apliges.com
Verifica esto por que this.return está en varios sitios... 

Saludos.

Rick C. Hodgin

unread,
Jul 2, 2015, 1:44:55 PM7/2/15
to publice...@googlegroups.com, dire...@informatica-apliges.com
Humor Jueves:

DROP TABLE tabla
OOOPS()
RECUPERAR TABLE tabla RÁPIDAMENTE
¡UF()  && PHEW()

PEDIR_DISCULPAS(mi error)

CONTINUE

:-)

Saludos cordiales,
Rick C. Hodgin

Antonio Meza

unread,
Jul 2, 2015, 2:06:26 PM7/2/15
to publice...@googlegroups.com, dire...@informatica-apliges.com, solv...@gmail.com
Tienes razón, ya los cambie, gracias por reportarme los errores, te agradezco mucho.!!

saludos
Antonio Meza

Antonio Meza

unread,
Jul 2, 2015, 2:07:48 PM7/2/15
to publice...@googlegroups.com, dire...@informatica-apliges.com, solv...@gmail.com
Que bueno que te funciono!!!

NOTA: Deberías cambiarle el nombre para que no se llame igual, ya que se puede confundir cuando pongas código.

saludos
Antonio Meza

Antonio Meza

unread,
Jul 2, 2015, 2:09:33 PM7/2/15
to publice...@googlegroups.com, rick.c...@gmail.com, dire...@informatica-apliges.com
:) jajaj

Hola Rick!!

Has visto FoxyDb? alguna sugerencia o mejora!!

saludos
Antonio Meza

Rick C. Hodgin

unread,
Jul 2, 2015, 3:23:07 PM7/2/15
to publice...@googlegroups.com, solv...@gmail.com, rick.c...@gmail.com, dire...@informatica-apliges.com
Por Google Translate:  No he utilizado FoxyDb. Siempre me escribió mis propias extensiones de software cuando tuve necesidades. Ha sido a la vez bueno y malo que ha hecho de esa manera. :-)


Saludos cordiales,
Rick C. Hodgin

English:  I haven't used FoxyDb.  I always wrote my own software extensions when I had needs.  It has been both good and bad to have done it that way. :-)
Reply all
Reply to author
Forward
0 new messages