Power Builder - Presentación Inversa de Suma Acumulada

 
Vista:
Imágen de perfil de Violeta

Presentación Inversa de Suma Acumulada

Publicado por Violeta (2 intervenciones) el 30/08/2016 17:11:00
image002

Se me pide que en una DW tipo external agregue varias columnas (cantidad, costo, existencia, descripcion, fecha, contabilizado, precio_factura)

Debe estar ordenado por fecha de manera descendente, y el campo existencia debe mostrar la suma acumulada de la columna cantidad (positivo o negativo dependiendo la descripción del concepto, para que se reste o se sume). El problema aquí lo tengo en mostrar el acumulado de abajo hacia arriba, es decir, como se ve en la imagen, el campo 'existencia', es el que lleva el acumulado de lo que entra y sale de almacen por ventas y compras, es en ASPEI SAE, y lo filtraron por fecha, donde la existencia inicia su acumulado, desde abajo hasta arriba dónde se muestra lo que hay hasta la fecha más reciente.

Utilize un compute cumulativeSum (cantidad for all) y con un cursor lleno los campos y este en automático se llena, pero me surgen dos problemas, inicia de arriba hacia abajo, y el último dato no lo acumula, solo repite el último resultado.

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
DECIMAL		ldc_cantidad, ldc_costo, ldc_existencia, ldc_precio_factura, ldc_cantidad_ult
 
INTEGER		li_row, li_contador = 0, li_row_ult, li_row_menos
 
STRING		ls_descripcion, ls_contabilizado, ls_salida = 'N'
 
DATE			ld_fecha
 
DECLARE cur_insumo CURSOR FOR
SELECT	"cmp_ord_compra_proveedores_detalle"."cantidad_recibida",
			"cmp_ord_compra_proveedores_detalle"."precio",
			"cmp_ord_compra_proveedores_detalle"."precio_factura",
			"cmp_ord_compra_proveedores_detalle"."fecha_recep_ep"
FROM	"cmp_ord_compra_proveedores_detalle"
WHERE	("cmp_ord_compra_proveedores_detalle"."id_elemento" = :ii_id_elemento) AND
			("cmp_ord_compra_proveedores_detalle"."status" IN ('T','R'))
//ESTATUS T= RECIBIDA TOTAL Y R=RECIBIDA PARCIAL CERRADA
GROUP BY	("cmp_ord_compra_proveedores_detalle"."cantidad_recibida",
				"cmp_ord_compra_proveedores_detalle"."precio",
				"cmp_ord_compra_proveedores_detalle"."precio_factura",
				"cmp_ord_compra_proveedores_detalle"."fecha_recep_ep")
ORDER BY "cmp_ord_compra_proveedores_detalle"."fecha_recep_ep" DESC
USING SQLCA;
 
dw_reporte.GetChild('dw_det',idwc_detalle_mp)
idwc_detalle_mp.SetTransObject(SQLCA)
 
OPEN cur_insumo;
 
//Validar primero si existen registros
IF SQLCA.SQLCode = 100 THEN
	MessageBox("Aviso","La Materia Prima seleccionada no presenta movimientos",Exclamation!,OK! )
	rb_1.Checked = False
	CLOSE cur_insumo;
END IF
 
IF SQLCA.SQLCode = 0 THEN
	DO WHILE ls_salida = 'N'
		FETCH	cur_insumo INTO :ldc_cantidad, :ldc_costo, :ldc_precio_factura, :ld_fecha;
 
		//Verificar si no está vacío de registros
		IF SQLCA.SQLCode = 100 AND li_contador = 0 THEN
			MessageBox("¡AVISO!","La Materia Prima seleccionada no presenta movimientos",Exclamation!,OK!)
			rb_1.Checked = False
			ls_salida = 'S'
		END IF
 
		IF SQLCA.SQLCode = 0 THEN
			//Validar Nulos
			IF IsNull(ldc_cantidad) THEN ldc_cantidad = 0.00
			IF IsNull(ldc_costo) THEN ldc_costo = 0.00
			IF IsNull(ldc_precio_factura) THEN ldc_precio_factura = 0.00
			//IF IsNull(ld_fecha) THEN ld_fecha = DATE (1900,01,01)	//DATE ( year yyyy, month mm, day dd )
 
			//Obtención de extras
			 ldc_existencia = 0.00
			 ls_descripcion = 'C'
			 ls_contabilizado = ''
 
			/*
			CHOOSE CASE ls_descripcion
				CASE 'C'
					ldc_cantidad = ldc_cantidad * (1)
				CASE 'V'
					ldc_cantidad = ldc_cantidad * (-1)
				CASE 'DV'
					ldc_cantidad = ldc_cantidad * (1)
				CASE 'DC'
					ldc_cantidad = ldc_cantidad * (-1)
			END CHOOSE
			 */
 
			//Llenado de DWC
			li_row = idwc_detalle_mp.InsertRow(0)
			idwc_detalle_mp.SetItem(li_row,"cantidad",ldc_cantidad)
			idwc_detalle_mp.SetItem(li_row,"costo",ldc_costo)
			// idwc_detalle_mp.SetItem(li_row,"existencia_1",ldc_existencia)//No lo ocupo
			idwc_detalle_mp.SetItem(li_row,"descripcion",ls_descripcion)
			idwc_detalle_mp.SetItem(li_row,"fecha",ld_fecha)
			idwc_detalle_mp.SetItem(li_row,"contabilizado",ls_contabilizado)
			idwc_detalle_mp.SetItem(li_row,"precio_factura", ldc_precio_factura)
			idwc_detalle_mp.SetItem(li_row,"numeracion",li_row)
		ELSE
			ls_salida = 'S'
		END IF
		li_contador = li_contador + 1
	LOOP
END IF
 
CLOSE cur_insumo;


image003

Es así como la arme, se llena si hay datos, hace el acumulativo, pero no en el orden que deseo y el último dato no lo suma, ya intente cambiando el ORDER BY a ASC y el InsertRow(1), redibujar al final con un .ReDraw() y luego ordenar con SORT(), pero no me ha funcionado. Alguien podría ayudarme. De antemano, gracias

image004

Esto es lo que me despliega
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

Presentación Inversa de Suma Acumulada

Publicado por Jorge (29 intervenciones) el 01/09/2016 16:52:40
Hola

En vista que es un DW External, mi recomendación es que lo trabajes en dos tiempos.

En el primero, que ya está, llenas los datos ordenados por fecha de manera descendiente.

Después de cerrar el cursor, con una sentencia FOR podrías recorrer la lista pero comenzando desde la última fila hasta la primera e ir calculando la existencia según la cantidad.

FOR li_row = ll_totalFilas TO 1 STEP -1
// Leer cantidad
// Hacer cálculo con el acumulado
// mostrar resultado
idwc_detalle_mp.SetItem(li_row,"existencia_1",ldc_existencia)
NEXT

Saludos
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
Imágen de perfil de Violeta

Presentación Inversa de Suma Acumulada

Publicado por Violeta (2 intervenciones) el 01/09/2016 18:07:22
Muchas gracias por tu ayuda, ya no utilize un compute, directamente lo metí en una columna, he hice lo que me sujeriste, ya quedó

De nuevo, infinitas gracias

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//Después del CLOSE cur_insumo;
 
li_row = idwc_detalle_mp.RowCount()
ldc_cantidad = idwc_detalle_mp.GetItemDecimal(li_row,"cantidad")
 
FOR i = li_row TO 1 STEP -1
	li_row_ult = i
	// Leer cantidad
	IF li_row_ult = li_row OR li_row_ult < 1 THEN
		ldc_cantidad_ult = 0
	ELSE
		ldc_cantidad_ult = idwc_detalle_mp.GetItemDecimal(i,"cantidad")
	END IF
	// Hacer cálculo con el acumulado
	ldc_cantidad = ldc_cantidad + ldc_cantidad_ult
	ldc_existencia = ldc_cantidad
	// mostrar resultado
	idwc_detalle_mp.SetItem(i,"existencia",ldc_existencia)
NEXT



Saludos
image005
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