-- Function: f_generar_escala_notas_continua(integer) -- DROP FUNCTION f_generar_escala_notas_continua(integer); CREATE OR REPLACE FUNCTION f_generar_escala_notas_continua(_escala_notas integer) RETURNS integer AS $BODY$ DECLARE _nota_inicio integer; _nota_final integer; _decimales integer; _separador character; _i int; _ii int; _nota_txt character varying; _nota_num numeric; _nota_desc character varying(100); _resultado_id character; _resultado_fin numeric; _concepto_id integer; _concepto_fin numeric; BEGIN SELECT nota_inicial::integer, nota_final::integer, cantidad_decimales, separador_decimal INTO _nota_inicio, _nota_final, _decimales, _separador FROM sga_escalas_notas WHERE escala_nota = _escala_notas; FOR _i IN _nota_inicio .. _nota_final LOOP _nota_num := _i; FOR _ii IN 0 .. (10^_decimales - 1) LOOP _nota_txt := _i::character varying; -- Se determinan los decimales IF (_decimales > 0) THEN _nota_num := _i + ((_ii + 0.0) / 10^_decimales); _nota_txt := _nota_txt || _separador || substring(substring(((_ii + 0.0) / 10^_decimales)::character varying from 3)|| '000' from 1 for _decimales); END IF; -- Se determina la descripción _nota_desc := f_numero_a_texto(_nota_num); -- Se determina el resultado IF (_resultado_fin IS NULL OR _nota_num > _resultado_fin) THEN SELECT COALESCE(resultado, NULL), COALESCE(nota_final, NULL) INTO _resultado_id, _resultado_fin FROM sga_escalas_notas_rangos_resultados WHERE escala_nota = _escala_notas AND _nota_num BETWEEN nota_inicial AND nota_final; END IF; -- Se determina el concepto IF (_concepto_fin IS NULL OR _nota_num > _concepto_fin) THEN SELECT COALESCE(concepto, NULL), COALESCE(nota_final, NULL) INTO _concepto_id, _concepto_fin FROM sga_escalas_notas_rangos_conceptos WHERE escala_nota = _escala_notas AND _nota_num BETWEEN nota_inicial AND nota_final; END IF; --RAISE NOTICE 'Nota num: % \\n\\n',_nota_num; --RAISE NOTICE 'Nota txt: % \\n',_nota_txt; INSERT INTO sga_escalas_notas_det (escala_nota, nota, descripcion, resultado, concepto, valor_numerico) VALUES (_escala_notas, _nota_txt, _nota_desc, _resultado_id, _concepto_id, _nota_num); IF (_i = _nota_final) THEN EXIT; END IF; END LOOP; END LOOP; RETURN 1; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE COST 100; ALTER FUNCTION f_generar_escala_notas_continua(integer) OWNER TO postgres;; GRANT EXECUTE ON FUNCTION f_generar_escala_notas_continua(integer) TO public; GRANT EXECUTE ON FUNCTION f_generar_escala_notas_continua(integer) TO postgres;