FoxPro/Visual FoxPro - Crear Tabla de Totales

   
Vista:

Crear Tabla de Totales

Publicado por Walter (2 intervenciones) el 12/06/2014 18:45:39
Estimados:
Soy un newbie en VFP y me gustaria contar con vuestra experiencia en mis primeros pasos.
El problema que tengo es crear una tabla que contenga totales.

Partimos de una tabla de datos como la mostrada abajo:
[SUJETO] [MONTO1] [MONTO2]
[Juan ] [2] [12]
[Pedro] [8] [ 5]
[Juan ] [5] [ 3]
[Luis ] [3] [17]
… … …
[Jose ] [6] [11]
[Pedro] [1] [ 8]

Donde no conozco el numero exacto de sujetos
Y requiero generar a partir de esta otra tabla que solo tenga totales, como por ejemplo
[SUJETO] [SUMA1] [CALC2]
[Juan ] [ 7] [xx]
[Pedro] [xx] [xx]
[Luis ] [xx] [xx]
[Jose ] [xx] [xx]

donde SUMA1, contiene la suma simple de los MONTO1 para cada sujeto,
pero CALC2, es resultado de un calculo, digamos por dar un ejemplo, (si el Tipo de Sujeto es 'A', entonces considerar el 1.5*MONTO2 como sumando)

Donde el Tipo lo obtenemos de otra tabla
[SUJETO] [TIPO]
[Juan ] [A]
[Pedro] [B]
...... .....
Alguien me puede ayudar con las instrucciones para ejecutar esta tarea en VFP
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

Crear Tabla de Totales

Publicado por Fidel José (558 intervenciones) el 12/06/2014 20:27:41
Tal vez te sirva la rutina que sigue. Crea sus propios cursores a partir de arrays pero lo que interesa es la metodología de cálculo. Hay, por supuesto, formas un poco más sofisticadas.
Deberás encontrarle la justificación a cada cosa y ensayar métodos alternativos.

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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
*<LocalDefine>
LOCAL i,LcSujeto,lcCalif,lnOpera
*</LocalDefine>
 
*<Limpieza>
LOCAL ARRAY gaCursor(3)
gaCursor[1]="Sujetos"
gaCursor[2]="Detalle"
gaCursor[3]="Tsuma"
FOR i=1 TO ALEN(gaCursor)
	IF USED(gaCursor[i])
		SELECT (gaCursor[i])
		USE
	ENDIF
NEXT
*</Limpieza>
 
*<CreandoCursores>
LOCAL ARRAY gaSuje(5,2)
gaSuje[1,1]="Juan"
gaSuje[1,2]="A"
gasuje[2,1]="Pedro"
gaSuje[2,2]="B"
gaSuje[3,1]="Luis"
gasuje[3,2]="A"
gasuje[4,1]=[Jose]
gasuje[4,2]="B"
gaSuje[5,1]=[Miguel]
gaSuje[5,2]="C"
 
CREATE CURSOR sujetos ("SUJETO" C(12),"CALIF" C(1))
FOR i=1 TO ALEN(gaSuje,1)
	INSERT INTO sujetos (sujeto, calif ) ;
		VALUES (gaSuje[i,1],gasuje[i,2])
NEXT
SELECT sujetos
INDEX on sujeto TAG isujeto
 
 
 
LOCAL ARRAY gaprop(9,3)
gaProp[1,1]=[Juan ]
gaProp[2,1]=[Pedro]
gaProp[3,1]=[Luis]
gaProp[4,1]=[Juan ]
gaProp[5,1]=[Jose]
gaProp[6,1]=[Pedro]
gaProp[7,1]=[Luis]
gaProp[8,1]=[Pedro]
gaProp[9,1]=[Juan ]
 
gaProp[1,2]=2
gaProp[2,2]=8
gaProp[3,2]=5
gaProp[4,2]=3
gaProp[5,2]=6
gaProp[6,2]=1
gaProp[7,2]=4
gaProp[8,2]=10
gaProp[9,2]=3
 
gaProp[1,3]=12
gaProp[2,3]=5
gaProp[3,3]=3
gaProp[4,3]=17
gaProp[5,3]=11
gaProp[6,3]=8
gaProp[7,3]=25
gaProp[8,3]=4
gaProp[9,3]=15
 
CREATE CURSOR detalle ("SUJETO" C(12),"MONTO1" N(12,2),"MONTO2" N(12,2))
FOR I=1 TO ALEN(gaprop,1)
	INSERT INTO detalle (sujeto,monto1,monto2) ;
		VALUES (gaprop[i,1],gaprop[i,2],gaprop[i,3])
NEXT
 
CREATE CURSOR tsuma ("SUJETO" C(12),"CALIF" C(1),"SUMA1" N(12,2) ,"SUMA2" N(12,2))
SELECT TSUMA
INDEX ON SUJETO TAG TSSUJETO
*</CreandoCursores>
 
*<Proceso>
LOCAL ARRAY gaCalc(3,2)
gaCalc[1,1]=[A]
gaCalc[2,1]=[B]
gaCalc[3,1]=[C]
 
gaCalc[1,2]=1.5
gaCalc[2,2]=2
gaCalc[3,2]=0.5
 
SELECT DETALLE
SCAN
	lcSujeto=TRIM(sujeto)
	lcCalif=""
	lnOpera=1
	STORE 0 TO lnMonto1 , lnMonto2
	IF INDEXSEEK(lcSujeto,.f.,"SUJETOS","ISUJETO")
		INDEXSEEK(lcSujeto,.t.,"SUJETOS","ISUJETO")
		lcCalif=sujetos.calif
	ENDIF
	IF !EMPTY(lcCalif)
		nas=ASCAN(gaCalc,lcCalif)
		IF nas#0
			lnOpera=gaCalc[nas + 1]
		ENDIF
	ENDIF
 
	IF !INDEXSEEK(lcSujeto,.f.,"TSUMA","TSSUJETO")
		INSERT INTO TSUMA (SUJETO,CALIF) VALUES (lcSujeto,lcCalif)
	ENDIF
	SELECT TSUMA
	INDEXSEEK(lcSujeto,.t.,"TSUMA","TSSUJETO")
	replace suma1 WITH suma1 + detalle.monto1 ,;
		suma2 WITH suma2 + ROUND(detalle.monto2 * lnOpera ,2)
ENDSCAN
SELECT TSUMA
GO TOP
* Método de muestra (generalmente un formulario con Control Grid)
BROWSE
 
*<Limpieza>
FOR i=1 TO ALEN(gaCursor)
	IF USED(gaCursor[i])
		SELECT (gaCursor[i])
		USE
	ENDIF
NEXT
*</Limpieza>
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Crear Tabla de Totales

Publicado por Walter (2 intervenciones) el 13/06/2014 07:24:32
Estimado Fidel:

Aunque al principio le pareció complejo a mis ojos novatos.
Cuando comprendí plenamente la rutina, ha resultado no solo de gran utilidad al resolver mi problema, sino también una gran guía en mi aprendizaje.

Agradezco mucho tu tiempo y dedicacion para ayudarme.
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