Actualizar estructura de tablas comparando dos base de datos

866 views
Skip to first unread message

Edward Cifuentes

unread,
Apr 26, 2012, 9:14:18 AM4/26/12
to publice...@googlegroups.com
La idea es actualizar las estrucutras de las tablas despues de compararlas con dos base de datos,
este siempre es el dilema a medida que vas creando una aplicación sin un diseño previo bien establecido
y cada nada tienes que actualizar las tablas con los datos ya existentes

Alguna idea o ayuda de codigo para comparar tablas y base de datos


Gustavo

unread,
Apr 26, 2012, 11:46:43 AM4/26/12
to Comunidad de Visual Foxpro en Español
Hola:

Puedes abrir tu dbc, con el use midbc.dbc, lo recorres con el scan for
objecytype=table para recorrer las tablas del dbc. Luego con el copy
extend te generas una tabla con la tabla, campo, tipo y el tamaño. Y
otra tabla con los indices.
Luego viene en el proceso de actualizar, yo para ello comparo la tabla
anteriormente creada, Ej. 1º si existe la tabla, si existe el campo,
si el tamaño es diferente, etc.. y luego los indices.
Y por ultimo recorro los dbc´s y si no existe la tabla la agrego.

Bueno esa es la idea, espero que te sirva para algo.

Un saludo

On 26 abr, 15:14, Edward Cifuentes <edwardcifuentes...@gmail.com>
wrote:

spartaco

unread,
Apr 26, 2012, 4:25:51 PM4/26/12
to publice...@googlegroups.com
Yo tengo una herramienta que hace eso, el autor quien me la paso es nuestro querido amigo argentino
Daniel Del Giudice, que esta desaparecido del foro, si el me autoriza la envió. con mínimas mejoras que he hecho.

El tiene otra herramienta que compartió por aquí que puede ser de ayuda que es combo_google_search, que permite hacer búsqueda por varias palabras en un sola linea. ejemplo jose, manuel, el ba a buscar todos los jose y manuel

Saludos
Edwin


Saludos
Edwin

foxteban

unread,
Apr 27, 2012, 1:01:06 AM4/27/12
to Comunidad de Visual Foxpro en Español
Hola Edward

De acuerdo a lo que te interprete, es una rutina que modifique las
estructura de las tabla existentes
Mira, yo he creado una tabla con los nombres de los campos partiendo
del comando COPY STRUCTURE EXTENDED
le llamo TABLAS.DBF con esta esctructura
create dbf TABLAS (table_nro i(4) , field_name c(40), field_type c(1),
field_len i(4), field_dec i(4), table_name c(40))
En donde por ejemplo
table_nro | field_name | field_type | field_len | field_dec |
table_name |
1 | NROCTA | C | 10
| 0 | cuentas |
1 | NOMCTA | C | 40 |
0 | cuentas |
2 | NROCTA | C | 10
| 0 | asientos |
2 | DEBE | N | 12
| 2 | asientos |
etc.....

y de esta manera cuando debas agregar algun campo a una de las tablas,
solamente la incorporas a esta tabla y con una rutina
recorre esta tabla y crea los campos faltantes y/o modifica algun
campo existente en las tablas existentes.

Tengo la rutina si queres te la paso.
Te dejo un saludo
Esteban

Edward Cifuentes

unread,
Apr 27, 2012, 10:48:10 AM4/27/12
to publice...@googlegroups.com
Esteban te agradeceria si me envias la rutina para ver como fuciona

foxteban

unread,
Apr 27, 2012, 2:19:20 PM4/27/12
to Comunidad de Visual Foxpro en Español
Hola Edward.
Pasame un correo valido por que el que esta en la pagina me devuelve
como inexistente, asi te envio el archivo. Es un Form y una tabla. No
se como enviarlo por este medio.

Esteban

Edward Cifuentes

unread,
Apr 27, 2012, 2:21:58 PM4/27/12
to publice...@googlegroups.com
edward_c...@hotmail.com o edwardcif...@gmail.com
guardalos en una carpeta los comprimes y lo adjuntas

Edward Cifuentes

unread,
Apr 27, 2012, 3:35:29 PM4/27/12
to publice...@googlegroups.com
esteban muchas gracias esta excelente faltan algunas modificaciones
como asignar la ruta de la base de datos
y al parecer vas creando una tabla con toda la estructura
excelente ayuda gracias !!!!

Daniel Del Giudice

unread,
Apr 27, 2012, 4:50:44 PM4/27/12
to publice...@googlegroups.com
Hola Edwin,
 
gracias por las palabras. Estás autorizadísimo para compartir todo el código que quieras. No estoy perdido del foro, pero para cuando leo las entradas ya alguien contestó, sin contar todo el trabajo que tengo y no me permite ayudar como quisiera. Un abrazo grande desde el hemisferio sur :-)

Edward Cifuentes

unread,
Apr 27, 2012, 5:01:44 PM4/27/12
to publice...@googlegroups.com
Muchisimas Gracias Daniel es un buen aporte

spartaco

unread,
Apr 27, 2012, 8:39:11 PM4/27/12
to publice...@googlegroups.com
Estimado Edward Cifuentes

Te envío un archivo en rar, en el encontraras un proyecto, ejecuta a inicio en la opción code del proyecto.
esto funciona en tres paso

1) En el botón Agregar tablas: esto lo que hace es que en ellas almacenamos las tablas que utilizamos en nuestro sistema
2) En el botón Guardar estructura:  lo que hace es que guarda toda la estructura de las tablas, teniendo en cuenta el paso1
3) Ya que tenemos toda la estructura almacenada paso2, seleccionamos la ruta donde están las tablas que queremos  actualizar.

Nota: con estos tres pasos solo podemos crear tablas, campos con sus tipos de datos, indices,
pero si modificamos por ejemplo el tamaño del un campo c10 a c20, no realiza el cambio, no recuerdo si eso lo modifique para que
pueda cambiar la longitud.

Saludos
Edwin Duran
updatetablas.rar

Daniel Del Giudice

unread,
Apr 28, 2012, 5:43:50 PM4/28/12
to publice...@googlegroups.com
No hay por qué. El agradecido soy yo, que he recibido en este foro infinitamente más de lo que he dado. ;-)
 

El viernes, 27 de abril de 2012 18:01:44 UTC-3, Edward Cifuentes escribió:
Muchisimas Gracias Daniel es un buen aporte

miltonvas

unread,
May 3, 2012, 7:23:09 PM5/3/12
to Comunidad de Visual Foxpro en Español
yo tengo un archvio llamdo cambistru.prg que lo uso en el programa
pricipal o lo puedo llamar al hacer clcik derecho en logo de la
empresa
y me ha funcionado a la perfeccion cuando actualizo el programa
sistema.exe\


**********cambistru.prg
DO use WITH "VARI orde k1"
SEEK "USYS"
IF EOF()
APPEND blank
REPLACE codi WITH "USYS", dscr WITH "Ultima Act del Sistema"
ENDIF
PRIVATE kusys,datos,k,kusysg
k=ADIR(datos,'sist.exe')
IF k>0
kusys=CTOT(DTOC(datos(3))+' '+datos(4)) &&fecha del archvio exe
kusysg=CTOT(valo) &&fecha graba de ultima acualizacion del exe
IF NOT kejecuta &&esta variablke viene del doble click en el logo
porque ahi se que quiero ejecutar sino verifica si he actualziado el
exe para proceder
IF kusysg>=kusys
USE
RETURN 0
ENDIF
ENDIF
REPLACE valo WITH TTOC(kusys)
ENDIF
USE

kcomando="set path to .,"+kpathdata
&kcomando
**************************** cada vez que cambio la estructura o algo
de mis tablas o creo una nueva ytabla aqui pongo los comandos
respectivos por ejemplo
=tablanew("item","dscr c(30),cant n(15,2), valo n(15,2)")
=camponew("item","codi","codi c(5)")
=campomod("item","codi",10,"codi c(10)")
=verindex("item","k1","codi")
***********************************

proc tablanew
lpara ktabla, kstruc
if not file(ktabla+".dbf")
kcomando="create table "+ktabla+" "+kstruc)
&kcomando
use
endif
endproc

proc camponew
lpara kcatbla,kcampo,kstru
use &ktabla
if type("kcampo")="U"
use &ktabla excl
kcomando="alter table "+ktabla+" add column "+kstru "
&kcomando
endif
use
endproc

proc campomod &&esta solo la uso para campos char no se todavia como
hacer con otros campos
ktabla,kcampo,klargo,kstru
use &ktabla
if len(kcampo)<>klargo
use &ktabla excl
kcomando="alter table "+ktabla+" alter column "+kstru
endif
use
endproc

proc verindex
LPARAMETERS ktabla,ktag,kindexstru
DO use WITH ktabla+" shared"
kerridx=1
FOR i=1 TO TAGCOUNT()
IF UPPER(TAG(I))=UPPER(ktag)
kerridx=0
ENDIF
ENDFOR
IF kerridx<>0
DO use WITH ktabla+" excl"
kcomando="INDEX ON "+kindexstru+" TAG "+ktag
&kcomando
ENDIF



On Apr 28, 4:43 pm, Daniel Del Giudice <danieldg0...@gmail.com> wrote:
> No hay por qué. El agradecido soy yo, que he recibido en este foro
> infinitamente más de lo que he dado. ;-)
>
> El viernes, 27 de abril de 2012 18:01:44 UTC-3, Edward Cifuentes escribió:
>
>
>
>
>
>
>
> > Muchisimas Gracias Daniel es un buen aporte
>
> > El 27 de abril de 2012 15:50, Daniel Del Giudice escribió:
>
> >> Hola Edwin,
>
> >> gracias por las palabras. Estás autorizadísimo para compartir todo el
> >> código que quieras. No estoy perdido del foro, pero para cuando leo las
> >> entradas ya alguien contestó, sin contar todo el trabajo que tengo y no me
> >> permite ayudar como quisiera. Un abrazo grande desde el hemisferio sur :-)
>
> >> El jueves, 26 de abril de 2012 17:25:51 UTC-3, spartaco escribió:
>
> >>> Yo tengo una herramienta que hace eso, el autor quien me la paso es
> >>> nuestro querido amigo argentino
> >>> Daniel Del Giudice, que esta desaparecido del foro, si el me autoriza
> >>> la envió. con mínimas mejoras que he hecho.
>
> >>> El tiene otra herramienta que compartió por aquí que puede ser de ayuda
> >>> que es combo_google_search, que permite hacer búsqueda por varias palabras
> >>> en un sola linea. ejemplo jose, manuel, el ba a buscar todos los jose y
> >>> manuel
>
> >>> Saludos
> >>> Edwin
>
> >>> Saludos
> >>> Edwin
>

Douglas Sánchez

unread,
May 4, 2012, 11:57:42 PM5/4/12
to publice...@googlegroups.com
Actualizar estructura es muy facil pone en una carpeta ejemplo yo lo hacia asi TABLAS, es la carpeta donde estan las tablas en limpio
DATOS, es la carpeta donde estan las tablas con informacion esta rutina funciona asi creo q es lo mas facil ahi va.

Espero te sirva, Saludes...

Private All Like l*
    ldirectory = Sys(5) +  ;
        SYS(2003) +  ;
        "\DATOS\"
    ldirectory2 = Sys(5) +  ;
        SYS(2003) +  ;
        "\TABLAS\"
    archivos = ldirectory2 +  ;
        "*.dbf"
    lhits = Adir(ltables,  ;
        archivos)
    If lhits == 0
        Wait Window Timeout 2  ;
            "No se encuentran las nuevas estructuras... actualice el sistema para continuar... "
    Endif
    Close Table All
    Close Databases All
    Local xarchi1, xarchi2 As  ;
        CHARACTER
    If  .Not. Empty(ldirectory)
        Wait Window Nowait  ;
            "Extrayendo datos a las nuevas estructuras..."
        For lcount = 1 To lhits
            lfilespec = ldirectory +  ;
                ltables(lcount,  ;
                1)
            lfilespec2 = ldirectory2 +  ;
                ltables(lcount,  ;
                1)
            If File(lfilespec)
                xarchi1 = Justfname(lfilespec)
                Wait Window  ;
                    NOWAIT  ;
                    "Actualizando la Tabla: " +  ;
                    xarchi1
                If Substr(ltables(lcount,  ;
                        1), 1, 5) <>  ;
                        "FOXUS"  ;
                        .And.  ;
                        SUBSTR(ltables(lcount,  ;
                        1), 1, 5) <>  ;
                        "TABLA"  ;
                        .And.  ;
                        SUBSTR(ltables(lcount,  ;
                        1), 1, 6) <>  ;
                        "MONEDA"
                    Select 0
                    Use &lfilespec2;
                        Excl
                    Zap
                    Appen From &lfilespec For !Deleted()
                    Use
                Endif
            Endif
        Endfor
        Wait Window Nowait  ;
            ALLTRIM(Str(lhits)) +  ;
            " tablas procesadas!"
    Endif
    Close Databases All
    Close Table All
    Local xarchi5 As Character
    lhits = Adir(ltables,  ;
        ldirectory + "*.*")
    Wait Window Nowait  ;
        "Eliminando tablas del directorio destino...espere un memento.."
    For lcount = 1 To lhits
        lfilespec = ldirectory +  ;
            ltables(lcount,  ;
            1)
        xarchi5 = ltables(lcount,  ;
            1)
        Wait Window Nowait  ;
            "Eliminando: " +  ;
            xarchi5
        Erase &lfilespec
    Endfor
    Close Table All
    Close Databases All
    lhits = Adir(ltables,  ;
        ldirectory2 +  ;
        "*.*")
    For lcount = 1 To lhits
        lfilespec1 = ldirectory2 +  ;
            ltables(lcount,  ;
            1)
        lfilespec2 = ldirectory +  ;
            ltables(lcount,  ;
            1)
        If Substr(ltables(lcount,  ;
                1), 1, 5) <> "FOXUS"  ;
                .And.  ;
                SUBSTR(ltables(lcount,  ;
                1), 1, 5) <> "TABLA"  ;
                .And.  ;
                SUBSTR(ltables(lcount,  ;
                1), 1, 6) <>  ;
                "MONEDA"
            xarchi2 = Justfname(lfilespec1)
            Wait Window Nowait  ;
                "Copiando : " +  ;
                xarchi2
            Copy File &lfilespec1 To;
                &lfilespec2
        Endif
    Endfor
    Close Table All
    Close Databases All
    lhits = Adir(ltables,  ;
        archivos)
    Wait Window Nowait  ;
        "Limpiendo estruturas nuevas..."
    For lcount = 1 To lhits
        lfilespec2 = ldirectory2 +  ;
            ltables(lcount,  ;
            1)
        Select 0
        Use &lfilespec2 Excl
        Zap
    Endfor
    Close Table All
    Close Databases All





Cristhian Martínez

unread,
Aug 14, 2020, 3:17:07 PM8/14/20
to Comunidad de Visual Foxpro en Español
Buenas tardes
Estoy teniendo este mismo problema y no estoy sabiendo como solucionarlo, traté de utilizar el codigo proporcionado por DSanchez pero no supe como hacerlo.
podrían ayudarme por favor
Muchas gracias

Edwin Duran

unread,
Aug 14, 2020, 4:10:38 PM8/14/20
to Comunidad de Visual Foxpro en Español
Prueba lo que envie en el 2012
mas arriba publicado

Cristhian Martínez

unread,
Aug 14, 2020, 4:21:50 PM8/14/20
to Comunidad de Visual Foxpro en Español
Justamente estaba probando lo que enviaste Edwin, pero no estoy entendiendo bien como aplicarlo (soy algo nuevo en esto), podrías decirme los pasos a seguir?
TABLAS, es la carpeta donde están las tablas con las nuevas estructuras en limpio
DATOS, es la carpeta donde están las tablas con información.

Te lo agradecería mucho

Edwin Duran

unread,
Aug 15, 2020, 12:13:02 PM8/15/20
to Comunidad de Visual Foxpro en Español
Saludos,escribeme por whatsapp 829-452-7948 para conectarnos por anydesk y explicarte

Dsan

unread,
Aug 15, 2020, 12:46:46 PM8/15/20
to publice...@googlegroups.com
Hola,    Si leistes te ubicas bien

dentro de la carpeta del Sistema manejaba DATOS  ahi ponia mi base de datos y mis tablas dbf,    luego cuando instalaba una nueva version copiaba esta carpeta TABLAS
Ahi iban todas las tablas actualizadas nuevas estructuras o sea campos nuevos que no tenian la carpeta datos....

Y con mi exe anterior entraba y ejecutaba ese codigo y asi de siemple, ojo tenes que tener acceso exclusivo antes comprobar que solo tu estas en el Sistema...

Saludes

Dsanchez.



--
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/f6318d79-6763-48ee-b5e0-4e646ec54ecen%40googlegroups.com.
Reply all
Reply to author
Forward
0 new messages