FoxPro/Visual FoxPro - COMO PUEDO JUNTAR ARCHIVOS DBF DE UNA CARPETA

 
Vista:

COMO PUEDO JUNTAR ARCHIVOS DBF DE UNA CARPETA

Publicado por Carlos Aybar (1 intervención) el 16/03/2018 15:02:11
BUENAS... CONSULTA, TENGO VARIOS ARCHIVOS DBF Y LOS QUIERO JUNTAR TODOS DE UNA CARPETA. EL COMANDO APPEND FROM ES PARA JUNTAR DE UNO EN UNO, Y SI QUIERO JUNTAR VARIOS DE UNA CARPETA, QUE COMANDO USO. GRACIAS. SOLO CONOZCO LO BASICO DE VISUAL FOX.
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
sin imagen de perfil
Val: 1.011
Oro
Ha mantenido su posición en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

COMO PUEDO JUNTAR ARCHIVOS DBF DE UNA CARPETA

Publicado por Fidel José (657 intervenciones) el 16/03/2018 23:37:43
Puedes usar append from siempre que hables de varias tablas dbf con igual estructura de datos.
El problema que se da en tu planteo es cuáles son las tablas que hay que juntar, porque en una carpeta pueden existir distintas tablas que no tengan nada que ver unas con otras.
Si todas las tablas de una carpeta tienen la misma estructura se puede usar la función ADIR()
1
2
3
4
5
6
7
8
9
10
11
12
LOCAL i,lnfiles
LOCAL ARRAY laFiles(1)
USE tabla_Madre
lcFolder = GETDIR(FULLPATH(""),"Carpeta","Carpeta con dbf iguales",64+48)
IF !EMPTY(m.lcFolder)
	lnFiles = ADIR(laFiles,ADDBS(m.lcFolder)+"*.dbf","",1)
	FOR i = 1 TO m.lnFiles
		lcTabla = ADDBS(m.lcFolder)+laFiles[i,1]
		SELECT Tabla_Madre
		APPEND FROM &lcTabla
	NEXT
ENDIF

Si no sabes cuales son las tablas que comparten la estructura, tendrás que hacer un procedimiento para determinar eso.
Podría ser algo como lo que sigue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
PROCEDURE juntar
*---------------
LOCAL i,lnfiles
LOCAL ARRAY laFiles(1)
USE tabla_Madre
lcFolder = GETDIR(FULLPATH(""),"Carpeta","Carpeta con dbf iguales",64+48)
IF !EMPTY(m.lcFolder)
	lnFiles = ADIR(laFiles,ADDBS(m.lcFolder)+"*.dbf","",1)
	FOR i = 1 TO m.lnFiles
		lcTabla = ADDBS(m.lcFolder)+laFiles[i,1]
		USE (m.lcTabla) IN 0 SHARED AGAIN ALIAS Tabla_append
		IF Comparar_Tablas(tabla_madre,Tabla_Append)
			SELECT * FROM Tabla_Append WHERE .t. INTO CURSOR curAppend
			SELECT Tabla_Madre
			APPEND FROM DBF("curAppend")
		ENDIF
		USE IN curAppend
		USE IN Tabla_append
	NEXT
ENDIF
 
PROCEDURE Comparar_tablas
LPARAMETERS tcTable_left,tcTable_Right
***********************************
* Comparar si los campos son iguales
* Retorna (.t.) si son iguales  (.f.) con cualquier diferencia
* incluso de posicionamiento de campos.
TRY
	LOCAL i,;
		j,;
		l_Identical,;
		lnCols_left,;
		lnCols_Right,;
		lnFields_Left,;
		lnFields_Right,;
		lcMessage,;
		loEx AS Exception
 
	LOCAL ARRAY laFields_Left(1),laFields_Right(1)
 
	DO WHILE .t.
		IF !USED(m.lcTable_Left) ;
			OR !USED(m.lcTable_Right)
			lcMessage = "Necesita tener las tablas abiertas para compararlas"
			EXIT
		ENDIF
 
		l_Identical = .t.
		lnFields_Left = AFIELDS(laFields_left,m.tcTable_left)
		lnCols_Left = ALEN(laFields_Left,2)
		lnFields_Right = AFIELDS(laFields_Right,m.tcTable_Right)
		lnCols_Right = ALEN(laFields_Right,2)
 
		IF m.lnFields_Left <> m.lnFields_Right ;
			OR m.lnCols_Left <> m.lnCols_Right
			l_Identical=.f.
		ELSE
			FOR i = 1 TO m.lnFields_Right
				FOR j = 1 TO m.lnCols_Right
					IF VARTYPE(laFields_Left[m.i,m.j]) <> VARTYPE(laFields_Right[m.i,m.j])
						l_Identical = .f.
						EXIT
					ENDIF
					IF laFields_left[m.i,m.j] <> laFields_Right[m.i,m.j]
						l_Identical = .f.
						EXIT
					ENDIF
				NEXT
			NEXT
		ENDIF
		EXIT
	ENDDO
 
 
CATCH TO loex
	loex.UserValue = PROGRAM()
	ShowError(loex,,,.t.)
	l_Identical = .f.
FINALLY
	IF !EMPTY(m.lcMessage)
		MESSAGEBOX(m.lcMessage,0,PROPER(PROGRAM()))
	ENDIF
ENDTRY
RETURN m.l_Identical
ENDPROC
 
 
PROCEDURE ShowError
*-----------------------------------------------------
LPARAMETERS toExcep,tlNotShow,tcCaption
 
tcCaption=EVL(tcCaption,"Mensaje del Sistema")
SET HOURS TO 24
LOCAL lcMens
 
 
lcMens="Fecha "+TRANSFORM(DATETIME());
	+ Chr(13)+"Mensaje: "+toExcep.message;
	+ Chr(13)+"ErrorNo: "+TRANSFORM(toExcep.Errorno);
	+ Chr(13)+"Llamada: "+toExcep.Uservalue
IF _vfp.StartMode=0
	lcMens=lcMens+ Chr(13)+"Linea "+TRANSFORM(toExcep.lineno)
ENDIF
 
STRTOFILE(lcMens+ Chr(13)+REPLICATE("=",60)+ Chr(13),"Errors.log",1)
 
lcMens="Se ha producido un error:"+ Chr(13)+lcMens
IF !tlNotShow
	MESSAGEBOX(m.lcMens,0,m.tcCaption)
ENDIF
 
ENDPROC
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

COMO PUEDO JUNTAR ARCHIVOS DBF DE UNA CARPETA

Publicado por Miguel Cuellar (1 intervención) el 16/06/2021 21:34:15
Buen dia, soy completamente neofito en la materia de visual fox, pero se me presenta el mismo requerimiento de juntar muchas tablas identicas, y queria ver si me pueden explicar que es lo que se cambia para poder usarlo y si antes de este codigo hay que hacer algo mas

LOCAL i,lnfiles
LOCAL ARRAY laFiles(1)
USE tabla_Madre
lcFolder = GETDIR(FULLPATH(""),"Carpeta","Carpeta con dbf iguales",64+48)
IF !EMPTY(m.lcFolder)
lnFiles = ADIR(laFiles,ADDBS(m.lcFolder)+"*.dbf","",1)
FOR i = 1 TO m.lnFiles
lcTabla = ADDBS(m.lcFolder)+laFiles[i,1]
SELECT Tabla_Madre
APPEND FROM &lcTabla
NEXT
ENDIF
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