Clipper/FiveWin - Modificar / Ampliar estructura de dbf

   
Vista:

Modificar / Ampliar estructura de dbf

Publicado por Gabriel Martin (41 intervenciones) el 27/11/2007 09:59:01
Buenas a todos.

Llegan momentos en la vida de un programa, que por mucho que te resistas, esta obligado a crecer, y como no sus bases de datos, tanto en tamaño como en forma. E ahí mi problema. Mi nuevo programa en five requiere de mas datos que mi anterior en clipper puro. No obstante quiero seguir poder accediendo a las bases de datos con el programa antiguo. De tal forma que me veo obligado a modificar la estructura de las dbf. En la mayoria de las ocasiones es agregar nuevos campos, pero en alguna otra se ha de modificar, eso si, solo en el tamaño.

He leido que este proceso se puede hacer pero es lento. Intentarlo con un progrma exterior no es solucion posible, ha de ser con aplicacion interna. El programa detectará que las bases tienen un formato antiguo y las actualizará.

¿Alguna maravillosa idea?

Mil gracias
Gabriel Mataro BCN Spain
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
información
Otras secciones de LWP con contenido de Clipper/FiveWin
- Código fuente de Clipper/FiveWin
- Cursos de Clipper/FiveWin
- Temas de Clipper/FiveWin
información
Códigos de Clipper/FiveWin
- Melodias
- Convertir numeros a letras
- Visor de archivos DBF

RE:Modificar / Ampliar estructura de dbf

Publicado por Ricardo Ramírez Espinoza (208 intervenciones) el 27/11/2007 11:37:42
Hola Gabriel :

Puedes carregar la estrutura de la DBF existente en una arreglo... y comparar con lo que pretendes modificar.
Podrias implemnetar 02 listbox con ambas estruturas y pintar de diferente color los campos que van a ser modificados.
Creas la nueva DBF e pasas los registros de la antigua DBF, por seguridad el modulo podria hacer una copia de la DBF misma antes de hacer los cambios...
Realmente no es muy lento el proceso....

Espero te ayudem los comentarios.

Saludos,
Ricardo Ramírez!
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:Modificar / Ampliar estructura de dbf

Publicado por Gabriel Martin (41 intervenciones) el 27/11/2007 11:55:18
Gracias Ricardo por tu pronta contestacion.

La verdad es que, en mi caso, ha de ser un proceso automatico y que el usuario no pueda intervenir.

He cogido parte de codigo que he encontrado aqui en el foro, pero el problema lo tengo cuando quiero modificar un campo de la base de datos que ya existe.

lo hecho hasta ahora:

FUNCTION SelEmpre()

LOCAL cDirec:=Clipro->CODIGO

oPhatFileMult+=""+cDirec

SET DEFAULT TO &oPhatFileMult

IF .NOT. FILE("Version.txt")
ActualFile(cDirec)
ENDIF

RETURN(.T.)

FUNCTION ActualFile(cDirec)

LOCAL aEstruct
LOCAL cFileOld,cFileNew

// --------------------------------- EMPRESA

DBSelectArea(25)
DBUseArea(,,"Empresa",,.F.)

aEstruct:=Empresa->(DBStruct())

Aadd(aEstruct,{"EJERCICI","N",4,0})
Aadd(aEstruct,{"REQ3","N",1,0})
Aadd(aEstruct,{"CODPOS","C",4,0})
Aadd(aEstruct,{"FAX","C",9,0})
Aadd(aEstruct,{"EMAIL","C",40,0})

DBCreate("Temp",aEstruct)

DBCloseArea(25)

DBSelectArea(50)
DBUseArea(,,"Temp",,.F.)
Append FROM Empresa.dbf

DBCloseAll()

SET DEFAULT TO &oPhatFileMult

cFileOld:=oPhatFileMult+"Empresa.dbf"
cFileNew:=oPhatFileMult+"xmpresa.dbf"

RENAME (cFileOld) TO (cFileNew)

ERASE Temp.dbt

cFileOld:=oPhatFileMult+"Temp.dbf"
cFileNew:=oPhatFileMult+"EMPRESA.DBF"

RENAME (cFileOld) TO (cFileNew)

DBCloseAll()

RETURN (.T.)
//-----------------------------------------------------------------

Todo funciona a la perfeccion para añadir tantos campos como quieras, el problema esta en el momento que necesitas, por ejemplo, la longitud de un campo que ya existe.

Espero haberme explicado mejor.

Muchas gracias Gabriel Mataró BCN Spain
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:Modificar / Ampliar estructura de dbf

Publicado por Ricardo Ramírez Espinoza (208 intervenciones) el 27/11/2007 12:28:38
"Todo funciona a la perfeccion para añadir tantos campos como quieras, el problema esta en el momento que necesitas, por ejemplo, la longitud de un campo que ya existe."

Disculpa no entendi :(

Podrias explicarmelo mejor :)

Saldudos
Ricardo Ramírez!
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:Modificar / Ampliar estructura de dbf

Publicado por Gabriel Martin (41 intervenciones) el 27/11/2007 17:37:00
A ver si soy capaz de que se publique la respuesta a tu pregunta.

Necesito no solo añadir campos a una base exixtente, sino que ademas he de modificar el tamaño de alguno de los campos que ya existen:

Ejemplo:
El campo TELEFONO es caracter de 15 y ha de ser Caracter de 9
El campo TOTAL es numerico de 5.2 y ha de ser numerico de 9.2

Saludos Gabriel Mataró BCN Spain
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:Modificar / Ampliar estructura de dbf

Publicado por pepe (39 intervenciones) el 27/11/2007 18:40:37
Pues puedes utilizar el DBU del Clipper. Podrás añadir campos o modificar o eliminar los existentes. Y también editar cualquier *.dbf y manipular sus contenidos.

Y haz una copia de los *.dbf que vayas a modificar y trabaja sobre la copia, si añades campos no hay problema, pero si modificas la longitud de los existentes igual pierdes los datos.

Un saludo
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:Modificar / Ampliar estructura de dbf

Publicado por Gabriel Martin (41 intervenciones) el 27/11/2007 18:47:03
Gracias Pepe, pero esa solucion no me vale, han de cambiarse 35 bases de 450 carpetas, claro realizar manualmente esa operacion con el dbu 15750 veces, pues como que no es muy aceptable.

Gracias de todas formas
Gabriel Mataró BCN Spain
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:Modificar / Ampliar estructura de dbf

Publicado por Mauricio Arevalo (152 intervenciones) el 27/11/2007 19:00:28
Gabriel ahi va:

USE(HCFS) EXCLUSIVE NEW ALIA HCFS
IF !NETERR()
StruVieja:=DBSTRUCT()
StruNueva:={{"HCONF01","C", 1,0},{"HCONF02","C",10,0},{"HCONF03","C", 3,0},;
{"HCONF05","N", 2,0},{"HCONF06","C",18,0},{"HCONF07","N", 6,2},;
{"HCONF09","C", 1,0},{"HCONF10","C",10,0},{"HUCOD ","C", 2,0},;
{"HCONF11","N", 5,2},{"HCONF12","N", 3,0},{"HCONF13","N", 5,2},;
{"HCONF15","N", 5,2},{"HCONF16","N", 3,0},{"HCONF17","N",10,2},;
{"HTITU03","C",20,0},{"HTITU04","C",20,0},{"HTITU05","C",20,0},;
{"HTITU07","C",20,0},{"HCONF20","L", 1,0},{"HCONF21","L", 1,0},;
{"HRECIBO","N", 3,0},{"HCIERRE","L", 1,0},{"HCAPROX","N", 3,0}}
StrVieja:=LEN(StruVieja)
StrNueva:=LEN(StruNueva)
IF StrVieja#StrNueva //Verifica si hay diferencia crea una nueva temporal y la cambia..
COPY TO COPIACFS
DBCREATE("TEMPOS",StruNueva)
USE TEMPOS
CMS=DIRARCEMP+"HS"+CODEMP+ANO
APPE FROM &CMS
COPY TO (HCFS)
ENDIF
ELSE
BLOQUEO()
CLOS DATA
RETU
ENDIF

Sirve tanto para agregar o modificar las ya existentes an anchura..

Espero te sriva.

Saludos

Mauricio Arevalo
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:Modificar / Ampliar estructura de dbf

Publicado por Gabriel Martin (41 intervenciones) el 27/11/2007 19:16:37
A la Perfeccion Mauricio. Mejor incluso que lo que habia imaginado.

Mil gracias de veras
Gabriel Mataró BCN Spain
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:Modificar / Ampliar estructura de dbf

Publicado por Mauricio Arevalo (152 intervenciones) el 27/11/2007 22:01:10
Gabriel:

Que pena contigo hazle una modificación pequeña al código que te envie:

IF StrVieja#StrNueva // si hay diferencia crea una nueva temporal y la cambia..
COPY TO COPIATER
DBCREATE("TEMPOT",StruNueva)
USE TEMPOT
CMS=DIRARCEMP+"HT"+CODEMP+ANO
APPE FROM &CMS
COPY TO (HTER)
//Agregas esto
ELSE
IF StrVieja==StrNueva //diferencia POSICIONES crea una nueva temporal..
COPY TO COPIATER
DBCREATE("TEMPOT",StruNueva)
USE TEMPOT
CMS=DIRARCEMP+"HT"+CODEMP+ANO
APPE FROM &CMS
COPY TO (HTER)
ENDIF

ENDIF

La razon es la siguiente:

En la primera te funciona (#) siempre y cuando haya diferencia de elementos de una matriz, peroooo, si los elementos son iguales no te funciona; se puede necesitar no agregar elementos a la MATRIZ como es tu caso, sino cambiar los datos de los elementos existentes, entonces si te sirve la segunda (==) .

Ojos los cambios solamente son en tamaño ya que no podrias cambiar un campo númerico a uno caracter por ejempo, porque te da error..para ese caso habria que hacer otra rutina...


Saludos

Mauricio Arevalo
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:Modificar / Ampliar estructura de dbf

Publicado por Gabriel Martin (41 intervenciones) el 28/11/2007 09:19:34
Muchas gracias Mauricio.

en cuanto la tenga a punto te aviso de su funcionamiento

Saludos Gabriel Mataró BCN SPAIN
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:Modificar / Ampliar estructura de dbf

Publicado por Ricardo Ramírez Espinoza (208 intervenciones) el 28/11/2007 11:43:43
Gabriel :
Con el código que publicaste anteiormente....(que dices tenerlo tomado de este foro) pensé que conseguias escribir algun código para modificar estruturas de DBFS :) es por
eso que no entendia tu pregunta :)

Saludos.
Ricardo Ramírez!
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