Cita:
Iniciado por huesos52
Los meses que quieras.
Saludos
Huesos el plsql funcionó perfectamente...
Pero ahora que decidí mejorar el modelo de datos y siguiendo el consejo de gnzsoloyo "
Muestra un diseño de base de datos muy ineficiente...
Si tienes N saldos, que se relacionan con N productos, los saldos pasan a ser una tabla relacional, y cada entrada de esa tabla corresponde a un mes determinado, para un producto determinado. Pero no se crea una tabla con doce campos.... Eso no está bien.", quedando como resultado 3 tablas en vez de una, me esta generando errores para generar los saldos de los meses con el pl...
Me puedes ayudar a hacerlo para tres tablas?
Esta es la consulta que uso, sin los saldos calculados:
Código SQL:
Ver originalSELECT
SUM("F0902"."GBAPYC"/100) AS "Inicial",
SUM("F0902"."GBAN01"/100) AS "Enero",
SUM("F0902"."GBAN02"/100) AS "Febrero",
SUM("F0902"."GBAN03"/100) AS "Marzo",
/*SaldoEnero*/
/*SaldoFebrero*/
"F0006"."MCMCU" AS "MCMCU",
"F0006"."MCDL01" AS "MCDL01",
"F0901"."GMOBJ" AS "GMOBJ",
"F0901"."GMSUB" AS "GMSUB",
"F0901"."GMDL01" AS "GMDL01"
FROM "F0006" "F0006",
"F0901" "F0901",
"F0902" "F0902"
WHERE "F0902"."GBAID"="F0901"."GMAID"
AND "F0902"."GBMCU"="F0006"."MCMCU"
AND TRIM ("F0902"."GBOBJ") LIKE '14%'
AND "F0902"."GBFY" =13
AND "F0902"."GBCO" ='00001'
AND "F0902"."GBLT" ='AA'
AND TRIM("F0902"."GBOBJ")!='149999'
AND TRIM("F0006"."MCRP22")=:Establecimiento
GROUP BY "F0901"."GMDL01",
"F0006"."MCMCU",
"F0006"."MCDL01",
"F0901"."GMOBJ",
"F0901"."GMSUB"
He aqui la funcion que tu me pusiste, no me genera error, el concepto lo llamo desde otra tabla, la "F0901"."GMDL01"
Código SQL:
Ver originalCREATE OR REPLACE FUNCTION suma_agregada(concepto_id VARCHAR2,mes_columna NUMBER) RETURN NUMBER IS
TYPE rec IS record(
GBAPYC NUMBER,
GBAN01 NUMBER,
GBAN02 NUMBER,
GBAN03 NUMBER,
GBAN04 NUMBER
);
TYPE tabla IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
rec_var rec;
suma_agrupada NUMBER :=0;
v_saldo_inicial NUMBER;
valores tabla;
BEGIN
SELECT GBAPYC,GBAN01,GBAN02,GBAN03,GBAN04
INTO rec_var
FROM F0901, F0902 WHERE GMDL01 = concepto_id;
v_saldo_inicial := rec_var.GBAPYC;
valores(1) := rec_var.GBAN01;
valores(2) := rec_var.GBAN02;
valores(3) := rec_var.GBAN03;
valores(4) := rec_var.GBAN04;
suma_agrupada := v_saldo_inicial;
FOR i IN REVERSE 1..mes_columna loop
suma_agrupada := suma_agrupada + valores(i);
END LOOP;
RETURN suma_agrupada;
END;
/
Pero al llamar la funcion
Código SQL:
Ver originalSELECT
F0901.GMDL01, --Concepto
suma_agregada(GMDL01,1) GBAN01, --Enero
suma_agregada(GMDL01,2) GBAN02, --Febrero
suma_agregada(GMDL01,3) GBAN03, --Marzo
suma_agregada(GMDL01,4) GBAN04
FROM F0901,F0902
me genera este error:
Código SQL:
Ver originalError SQL: ORA-01422: la recuperación exacta devuelve un número mayor de filas que el solicitado
ORA-06512: en "SYSTEM.SUMA_AGREGADA", línea 16
01422.00000 - "exact fetch returns more than requested number of rows"
*Cause: The NUMBER specified IN exact fetch IS less than the ROWS returned.
*Action: Rewrite the query OR CHANGE NUMBER OF ROWS requested
Agradeceria si me pudieras ayudar....