Oracle存储过程(包:PACK_KPI_KERNEL For YS三度评价体系)
CREATE OR REPLACE PACKAGE PACK_KPI_KERNEL IS
--定义多级数组 字符串
TYPE TSTRARRY IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER; TYPE TSTRARRYARRY IS TABLE OF TSTRARRY INDEX BY BINARY_INTEGER; TYPE TSTRARRYARRYARRY IS TABLE OF TSTRARRYARRY INDEX BY BINARY_INTEGER; -- Author : D
-- Created : 2011
-- Purpose : KPI模块 绩效考核核心算法包 --核心 调用接口 as_KEY是关键值 as_flag 是调用标记
PROCEDURE KERNEL_MASTER_CONTROL; --自动获取绩效考核月份参数 默认为 本月上月的月份
FUNCTION GET_KPI_DATE RETURN VARCHAR2; --核心 调用接口 as_KEY是关键值 as_flag 是调用标记
PROCEDURE KT_MAIN_MASTER_CONTROL(as_KEY IN VARCHAR2, as_flag IN VARCHAR2); --计算 量化指标 单项得分 体系ID BODATA
FUNCTION GET_ONETARGET_SCORE(as_TARSYS_id IN VARCHAR2, as_bodata NUMBER)
RETURN NUMBER; --计算 量化指标 单项有自变量 得分 体系ID BODATA
FUNCTION GET_ONETARGET_SCORE_VAR(as_TARSYS_id IN VARCHAR2,
as_bodata NUMBER) RETURN NUMBER; --计算量化月奖 每日
PROCEDURE GET_BORESULT_LH_AWORD_TODAY; --建立System_P_ID二维数组
FUNCTION Get_KPI_System_P_ID(as_target_id IN VARCHAR2) RETURN TSTRARRY; --建立SystemID二维数组
FUNCTION Get_KPI_SystemID(as_target_id IN VARCHAR2) RETURN TSTRARRYARRY; --计算量化月奖
FUNCTION GetComAword(as_KPI_SCORE IN number, as_CATALOG_ID IN VARCHAR2)
RETURN NUMBER; --计算总月奖
FUNCTION Get_all_Aword(as_LH_SCORE IN number, as_GL_SCORE IN NUMBER)
RETURN NUMBER; --获取指标的bodata2
FUNCTION Get_bodata2_kpi_flu_record(as_target_id IN VARCHAR2,
as_month IN VARCHAR2) RETURN NUMBER; --部门得分修正
FUNCTION Get_K_DEP_DATA(as_dep_id IN VARCHAR2, as_month IN VARCHAR2)
RETURN NUMBER; --指标单项得分修正
FUNCTION get_lh_score_fix(LH_score IN NUMBER,
dep_id IN NUMBER,
as_month IN VARCHAR2) RETURN NUMBER; --取得资金计划准确率
FUNCTION get_zjjhzql(as_dep_id IN VARCHAR2, as_month IN VARCHAR2)
RETURN NUMBER; --定时取指标元素 主程序 小元素合成算法
--=-=-==-=-=-=-=-------------------------------
PROCEDURE BOELEMENT_MASTER_CONTROL(as_date IN VARCHAR2); --取值
--=-=-==-=-=-=-=-------------------------------
FUNCTION GET_BOELEMENT(as_ele_id IN VARCHAR2, as_date IN VARCHAR2)
RETURN NUMBER; --取值
--=-=-==-=-=-=-=-------------------------------
FUNCTION kpi_splitelementex(P_STRING IN VARCHAR2, as_date IN VARCHAR2)
return NUMBER;
--取值
--=-=-==-=-=-=-=-------------------------------
FUNCTION kpi_splitelementgetrs(as_V_POS IN VARCHAR2, as_date IN VARCHAR2)
return VARCHAR2; --根据指标公式,得出指标的实际值和计划值
--=-=-==-=-=-=-=-------------------------------
PROCEDURE KERNEL_TARGET_DATA_MAIN(AS_MONTH IN VARCHAR2); procedure KPI_VIEW_TARGET; --集团指标取数 /*procedure Insert_JHZ_ToJHFluTable(as_date IN VARCHAR2);
procedure InsertOne_JHZ_ToJHFluTable(as_TARGET_ID in varchar2,
as_VALUE_PLAN in varchar2,
as_VALUE_DATA in varchar2,
as_REC_REASON in varchar2,
as_REC_MONTH in varchar2); procedure kpi_BackToELeResultTable(as_date in varchar2);
*/ --计算量化月奖
FUNCTION Get_OneTarget_Score_NEW(as_TARSYS_id IN VARCHAR2,
as_bodata NUMBER) RETURN NUMBER;
PROCEDURE KERNEL_TARGET_ALL_XS(AS_YEAR IN VARCHAR2);
procedure KPI_LR_SJ_PM(as_month varchar2);
procedure KPI_LR_YSZQL_PM(as_month varchar2);
END PACK_KPI_KERNEL;
/
CREATE OR REPLACE PACKAGE BODY PACK_KPI_KERNEL IS
type My_Cursor is ref cursor; ARRY1 TSTRARRY;
ARRY2 TSTRARRYARRY;
ARRY3 TSTRARRYARRYARRY; --====================================================================
--主控制,控制元素合成和指标计算,缺BO部分
PROCEDURE KERNEL_MASTER_CONTROL AS
ls_YF VARCHAR2(10);
ln_RESULT NUMBER; BEGIN DBMS_OUTPUT.ENABLE(10000000);
--DBMS_OUTPUT.ENABLE( buffer_size =>Null ); BEGIN
/* insert into kpi_test2 values(to_char(sysdate,'yyyy-mm-dd hh:mi:ss'));
commit;*/ ls_YF := GET_KPI_DATE(); --取计划值
PACK_KPI_JHZ.KPI_GET_JHZ_BYDAY(''); DBMS_OUTPUT.put_line('检查点1-1');
--小元素取值,小元素合成大元素,kpi_manager_boelement ---> kpi_manager_boelement_result
BOELEMENT_MASTER_CONTROL(ls_YF);
DBMS_OUTPUT.put_line('检查点1-2');
--根据指标公式,计算指标计划值和实际值 KERNEL_TARGET_DATA_MAIN(ls_YF);
DBMS_OUTPUT.put_line('检查点1-3');
--指标计划值,实际值取值,计算指标得分,kpi_manager_boresult ---> kpi_manager_boresult_report
KT_MAIN_MASTER_CONTROL(ls_YF, '');
DBMS_OUTPUT.put_line('检查点1-4');
--第二次计算
BOELEMENT_MASTER_CONTROL(ls_YF);
DBMS_OUTPUT.put_line('检查点2-1');
KERNEL_TARGET_DATA_MAIN(ls_YF); DBMS_OUTPUT.put_line('检查点2-2');
KT_MAIN_MASTER_CONTROL(ls_YF, ''); DBMS_OUTPUT.put_line('检查点2-3');
--运行日志
pack_kpi_base.SET_SYSTEM_LOG('核心任务成功!', '被计算月份' || ls_YF); /* if to_number(to_char(SYSDATE, 'dd'))=15 then
Insert_JHZ_ToJHFluTable(ls_YF);
end if;*/ DBMS_OUTPUT.disable();
EXCEPTION
WHEN OTHERS THEN
--运行日志
pack_kpi_base.SET_SYSTEM_LOG('核心任务失败!',
'被计算月份' || ls_YF || Sqlerrm(Sqlcode));
END; END KERNEL_MASTER_CONTROL; --==================================================================== --====================================================================
--自动获取绩效考核月份参数 默认为 本月上月的月份
FUNCTION GET_KPI_DATE RETURN VARCHAR2 AS ls_kpi_date VARCHAR2(10);
day number; BEGIN
day := to_number(to_char(SYSDATE, 'dd')); if day < 20 then
ls_kpi_date := to_char(pack_kpi_base.F_GET_SYM(to_char(SYSDATE,
'yyyymm')),
'yyyy-mm'); -- ls_kpi_date := '2012-12';
else
ls_kpi_date := to_char(SYSDATE, 'yyyy-mm');
--ls_kpi_date := '2012-01';
end if; RETURN ls_kpi_date; END GET_KPI_DATE; --==================================================================== --=================================================================================
--==================================================================== --核心 调用接口 as_KEY是关键值 as_flag 是调用标记 0 是自动指标计算 1 是用户自定义计算
PROCEDURE KT_MAIN_MASTER_CONTROL(as_KEY IN VARCHAR2, as_flag IN VARCHAR2) IS ls_key VARCHAR2(4000);
ls_flag VARCHAR2(10); --游标取值
Cursor Cur_BO Is
SELECT t1.id, --主键
t1.t_id,
t1.target_id,
t1.target_code,
t1.target_name,
t1.tarsys_id,
t1.standardvalue, --标准值
t1.RATIO, --预测值
--2011-10-08 修改四舍五入
round(t1.BODATA, 4) BODATA, --指标分值 当月累计数
t1.bodata2,
t1.bodate
From kpi_manager_boresult_temp t1
-- where t1.target_id=38568
; --
ln_ID NUMBER;
ls_T_ID VARCHAR2(4000);
ls_TARGET_ID VARCHAR2(4000);
ls_TARGET_CODE VARCHAR2(4000);
ls_TARGET_NAME VARCHAR2(4000);
ls_tarsys_id VARCHAR2(4000);
ls_STANDARDVALUE VARCHAR2(4000);
ls_RATIO VARCHAR2(4000);
ls_BODATA NUMBER; --实际值
ls_BODATA2 NUMBER;
ls_BODATE VARCHAR2(4000); ls_realvalue number; --实际值=ls_BODATA
--
ln_i NUMBER;
ln_industry90001 NUMBER;
ln_industry90002 NUMBER;
ln_ALL_BEST NUMBER;
ln_HISTORY_BEST NUMBER; --分数计算部分变量
ln_industry NUMBER;
resScore NUMBER;
resScoreYSZQL NUMBER;
--ln_score NUMBER;
Ln_TARSYS_TYPE NUMBER;
ln_TARSYS_SCORE_TYPE NUMBER; --体系得分算法体系,重要用于判断分支 ln_K_DEP_DATA NUMBER; --部门指标修正系数
ln_CXD_SCORE NUMBER; --创新度得分
ln_WDD_SCORE NUMBER; --稳定度的分
ln_NLD_SCORE NUMBER; --努力度得分
ln_YSZQL_SCROE NUMBER; --预算准确率得分 BEGIN
DBMS_OUTPUT.ENABLE(10000000); --参数处理
IF as_KEY IS NULL THEN
ls_key := GET_KPI_DATE();
ELSE
ls_key := as_KEY;
END IF; IF as_flag IS NULL THEN
ls_flag := '';
ELSE
ls_flag := as_flag;
END IF; --test
DBMS_OUTPUT.PUT_LINE('0、 装填原始数据 、参数 主键 = ' || ls_key ||
'计算类型 0 自动计算 1 用户计算= ls_flag =' || ls_flag); --==================================================
--第一部分 完成待计算数据处理 根据flag
--================================================== --测试时候注释掉保留中间结果
DELETE FROM kpi_manager_boresult_temp;
COMMIT; --ls_flag = 0 每日计算
IF ls_flag = '' THEN INSERT INTO kpi_manager_boresult_temp (ID,
T_ID,
TARGET_ID,
TARGET_CODE,
TARGET_NAME,
tarsys_id,
STANDARDVALUE,
RATIO,
BODATA,
BODATA2,
BODATE,
JS_DATE)
SELECT rownum,
t.BORESULTID,
t.TARGET_ID,
NULL,
t.TARGET_NAME,
tt.tarsys_id,
t.STANDARDVALUE,
t.RATIO,
t.BODATA,
t.bodata2,
to_char(t.BOGETDATE, 'yyyy-mm'),
SYSDATE
FROM kpi_kernel_boresult_v t, kpi_kpimodel_tst tt
WHERE t.TARGET_ID = tt.target_id
--and t.target_id='38568'
;
COMMIT; END IF; --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
--ls_flag = 1 用户自定义计算
IF ls_flag = '' THEN INSERT INTO kpi_manager_boresult_temp (ID,
T_ID,
TARGET_ID,
TARGET_CODE,
TARGET_NAME,
tarsys_id,
STANDARDVALUE,
RATIO,
BODATA,
BODATA2,
BODATE,
JS_DATE)
SELECT rownum,
t.rec_id,
t.target_id, --指标ID
'',
tt.target_name, --指标名字
tt.tarsys_id,
-- pack_kpi_base.F_GET_standardvalue(t.target_id) standardvalue, --标准值 pack_kpi_kernel.Get_bodata2_kpi_flu_record(t.target_id,
t.rec_date) standardvalue,
pack_kpi_base.F_GET_RATIO(t.target_id) PRE_RATIO, --预测值
t.BODATA, --指标分值 用户自行修改值
-- pack_kpi_kernel.Get_bodata2_kpi_flu_record(t.target_id,to_char(to_date(t.rec_date,'yyyy-mm-dd'),'yyyy-mm')) BODATA2,
pack_kpi_kernel.Get_bodata2_kpi_flu_record(t.target_id,
t.rec_date) BODATA2, t.rec_date, --时间
SYSDATE
FROM kpi_flu_record t, kpi_kpimodel_tst tt
WHERE t.target_id = tt.target_id
AND t.rec_id = ls_key; COMMIT; END IF; --==================================================
--第二部分 完成指标体系分值计算
--================================================== --游标从统一接口取数
Open Cur_BO;
Fetch Cur_BO
INTO ln_ID,
ls_T_ID,
ls_TARGET_ID,
ls_TARGET_CODE,
ls_TARGET_NAME,
ls_tarsys_id,
ls_STANDARDVALUE,
ls_RATIO,
ls_BODATA,
ls_BODATA2,
ls_BODATE;
ln_i := 1;
--主循环 每次一个指标。
While Cur_BO%Found LOOP
--test ln_i := ln_i + 1; --循环每行
--根据指标类型编码 判断 是那个类型的指标 ,分别调用不同方法计算。并保存
--各项变量重新初始化
ln_industry := 99999; --创新度中间结果
ln_CXD_SCORE := 99999; --创新度
ln_WDD_SCORE := 99999; --稳定度的分
ln_NLD_SCORE := 99999; --努力度得分
ln_YSZQL_SCROE := 99999; --预算准确率得分
ln_K_DEP_DATA := 1; --部门得分修正系数
ln_TARSYS_SCORE_TYPE := -1; --默认为无效
ls_realvalue := ls_BODATA; --保存实际值 --通过判断实际值和计划值与指标是否是比值行还是普通型,确定是否进行计算
IF ((ls_BODATA IS NOT NULL) AND
pack_kpi_base.F_GET_TARSYS_TYPE(ls_tarsys_id) = '') OR
(pack_kpi_base.F_GET_TARSYS_TYPE(ls_tarsys_id) = '' AND
(ls_STANDARDVALUE IS NOT NULL) or
pack_kpi_base.F_GET_TARSYS_TYPE(ls_tarsys_id) = '') THEN
--第一类:普通型
IF pack_kpi_base.F_GET_TARSYS_TYPE(ls_tarsys_id) = '' THEN ls_BODATA := ls_BODATA - ls_STANDARDVALUE; --跟计划值没关系 END IF;
--第二类:比值型
--bodata 综合处理 当 指标体系是比值型的时候,对bodata除以计划值得到率
IF pack_kpi_base.F_GET_TARSYS_TYPE(ls_tarsys_id) = '' THEN IF ls_STANDARDVALUE = 0 THEN
--预测值等于0 或为空 预测值得分为100 否则执行 用分数除以预测值的比值
IF ls_BODATA = 0 THEN
ls_BODATA := '';
END IF;
ELSE
ls_BODATA := round(ls_BODATA / ls_STANDARDVALUE, 4) * 100;
END IF; -- DBMS_OUTPUT.PUT_LINE( '1.1、bodata 综合处理 、ln_ID = '|| ln_ID || 'ls_TARGET_ID='||ls_TARGET_ID||' ls_TARGET_NAME='||ls_TARGET_NAME||' ls_BODATA='|| ls_BODATA ); END IF; --取得 考核体系 类型代码 重要用于判断分支
--0,稳定度(普通);1,稳定度(正向);2,稳定度(反向);3,努力度;4,创新度;5,预算准确率;6,修正系数;7,不计算 8创新度不计算 ln_TARSYS_SCORE_TYPE := pack_kpi_base.F_GET_SCORETYPE_from_tarsys_id(ls_tarsys_id); DBMS_OUTPUT.PUT_LINE('1、 初始化完成待计算前 、ln_ID = ' || ln_ID ||
'ls_TARGET_ID=' || ls_TARGET_ID ||
' ls_TARGET_NAME=' || ls_TARGET_NAME ||
' ls_BODATA=' || ls_BODATA ||
' ln_TARSYS_SCORE_TYPE=' ||
ln_TARSYS_SCORE_TYPE); --========算法开始,=================================
--=====创新度========================================================= --!!!!!
IF ln_TARSYS_SCORE_TYPE = 4 THEN --文件中规定的算法,暂时屏蔽
/* BEGIN --获取指标的历史最好水平和行业最好水平
SELECT t.ALL_BEST,t.HISTORY_BEST
INTO ln_ALL_BEST,ln_HISTORY_BEST
from kpi_kpimodel_industry t
where t.target_id = ls_TARGET_ID;
exception
when NO_DATA_FOUND then
ln_ALL_BEST := 0;
ln_HISTORY_BEST := 0;
END;
----
IF ln_ALL_BEST+ln_HISTORY_BEST >0 THEN --正向
IF ls_tarsys_id = '90001' THEN IF (ls_BODATA - ln_ALL_BEST)*1 -3>0 THEN
ln_industry90001 := 3;
ELSE
ln_industry90001 := (ls_BODATA - ln_ALL_BEST)*1;
END IF; IF (ls_BODATA - ln_HISTORY_BEST)*2 - 5 > 0 THEN
ln_industry90002 := 3;
ELSE
ln_industry90002 := (ls_BODATA - ln_HISTORY_BEST)*5;
END IF; IF ln_industry90001 > ln_industry90002 THEN
ln_industry := ln_industry90001;
ELSE
ln_industry := ln_industry90002;
END IF; END IF; --反向
IF ls_tarsys_id = '90002' THEN
IF (ln_ALL_BEST - ls_BODATA)*1 -3>0 THEN
ln_industry90001 := 3;
ELSE
ln_industry90001 := (ln_ALL_BEST - ls_BODATA)*1;
END IF; IF (ln_HISTORY_BEST - ls_BODATA)*2 - 5 > 0 THEN
ln_industry90002 := 3;
ELSE
ln_industry90002 := (ln_HISTORY_BEST - ls_BODATA)*5;
END IF; IF ln_industry90001 > ln_industry90002 THEN
ln_industry := ln_industry90001;
ELSE
ln_industry := ln_industry90002;
END IF;
END IF;
----
END IF; ln_CXD_SCORE :=ln_industry;*/ --执行
--=========(创新度得分=当权重不为0时:实际值-行业最好>=0?20:0;权重为0:按照普通方法计算)=====================
if pack_kpi_base.F_GET_WEIGHT_SCALE(ls_TARGET_ID) <> 0 then ln_ALL_BEST := pack_kpi_base.F_GET_ALL_BEST(ls_TARGET_ID); --获取行业最好
ls_BODATA := ls_realvalue - ln_ALL_BEST; --实际值-行业最好
end if; ln_CXD_SCORE := PACK_KPI_KERNEL.Get_OneTarget_Score(ls_tarsys_id,
ls_BODATA); -- 更新创新度结果 位置需变更!!!!!!!!!
UPDATE kpi_manager_boresult_temp t
SET t.cxd_score = ln_CXD_SCORE
WHERE t.id = ln_ID;
COMMIT; --test
DBMS_OUTPUT.PUT_LINE(' 2.1 创新度计算 、 ls_TARGET_NAME=' ||
ls_TARGET_NAME || ' ls_tarsys_id=' ||
ls_tarsys_id || 'ln_CXD_SCORE=' ||
ln_CXD_SCORE); END IF; --=======预算准确率===========================================================================
--!!!!!
IF ln_TARSYS_SCORE_TYPE = 5 THEN --执行
ln_YSZQL_SCROE := PACK_KPI_KERNEL.Get_OneTarget_Score(ls_tarsys_id,
ls_BODATA); -- 更新预算准确率
UPDATE kpi_manager_boresult_temp t
SET t.yszql_scroe = ln_YSZQL_SCROE
WHERE t.id = ln_ID;
COMMIT;
--test
DBMS_OUTPUT.PUT_LINE(' 2.1 预算准确率 、 ls_TARGET_NAME=' ||
ls_TARGET_NAME || ' ls_tarsys_id=' ||
ls_tarsys_id || 'ln_YSZQL_SCROE=' ||
ln_YSZQL_SCROE); END IF; --================================================================== --努力度得分===========================================================
--!!!!!
IF ln_TARSYS_SCORE_TYPE = 3 OR ln_TARSYS_SCORE_TYPE = 31 OR
ln_TARSYS_SCORE_TYPE = 32 THEN IF ln_TARSYS_SCORE_TYPE = 3 THEN
--普通:(实际值-历史最好>=0?10:0)
--执行
ln_HISTORY_BEST := pack_kpi_base.F_GET_HISTORY_BEST(as_target_id => ls_TARGET_ID);
ls_BODATA := ls_realvalue - ln_HISTORY_BEST;
ln_NLD_SCORE := PACK_KPI_KERNEL.Get_OneTarget_Score_NEW(ls_tarsys_id,
ls_BODATA); -- 更新努力度得分 普通
UPDATE kpi_manager_boresult_temp t
SET t.nld_score = ln_NLD_SCORE
WHERE t.id = ln_ID;
COMMIT; --test
DBMS_OUTPUT.PUT_LINE(' 2.3 努力度 普通 得分 、 ls_TARGET_NAME=' ||
ls_TARGET_NAME || ' ls_tarsys_id=' ||
ls_tarsys_id || 'ln_NLD_SCORE=' ||
ln_NLD_SCORE);
END IF; IF ln_TARSYS_SCORE_TYPE = 31 AND ls_BODATA2 > 0 THEN
--正向(实际值-历史最好>=0?10:0)
--执行
ln_HISTORY_BEST := pack_kpi_base.F_GET_HISTORY_BEST(as_target_id => ls_TARGET_ID);
ls_BODATA := ls_realvalue - ln_HISTORY_BEST; ln_NLD_SCORE := PACK_KPI_KERNEL.Get_OneTarget_Score_NEW(ls_tarsys_id,
ls_BODATA); -- 更新努力度得分 正向
UPDATE kpi_manager_boresult_temp t
SET t.nld_score = ln_NLD_SCORE
WHERE t.id = ln_ID;
COMMIT; --test
DBMS_OUTPUT.PUT_LINE(' 2.3 努力度 正向 得分 、 ls_TARGET_NAME=' ||
ls_TARGET_NAME || ' ls_tarsys_id=' ||
ls_tarsys_id || 'ln_NLD_SCORE=' ||
ln_NLD_SCORE);
END IF; IF ln_TARSYS_SCORE_TYPE = 32 AND ls_BODATA2 < 0 THEN
--反向(努力度得分=历史最好-实际值>=0?10:0)
--执行
ln_HISTORY_BEST := pack_kpi_base.F_GET_HISTORY_BEST(as_target_id => ls_TARGET_ID);
ls_BODATA := ln_HISTORY_BEST - ls_realvalue; ln_NLD_SCORE := PACK_KPI_KERNEL.Get_OneTarget_Score_NEW(ls_tarsys_id,
ls_BODATA); -- 更新努力度得分 反向
UPDATE kpi_manager_boresult_temp t
SET t.nld_score = ln_NLD_SCORE
WHERE t.id = ln_ID;
COMMIT; --test
DBMS_OUTPUT.PUT_LINE(' 2.3 努力度 反向 得分 、 ls_TARGET_NAME=' ||
ls_TARGET_NAME || ' ls_tarsys_id=' ||
ls_tarsys_id || 'ln_NLD_SCORE=' ||
ln_NLD_SCORE);
END IF; END IF; --稳定度得分=========================================================== --先确定tarsys_id 是稳定度部分指标
--!!!!!
IF ln_TARSYS_SCORE_TYPE = 0 OR ln_TARSYS_SCORE_TYPE = 1 OR
ln_TARSYS_SCORE_TYPE = 2 THEN
--待修改 --普通稳定度
--!!!!!
IF ln_TARSYS_SCORE_TYPE = 0 THEN
--执行
ln_WDD_SCORE := 100 + nvl(PACK_KPI_KERNEL.Get_OneTarget_Score_NEW(ls_tarsys_id,
ls_BODATA),
0); -- 更新稳定度得分
UPDATE kpi_manager_boresult_temp t
SET t.wdd_score = ln_WDD_SCORE
WHERE t.id = ln_ID;
COMMIT;
--test
DBMS_OUTPUT.PUT_LINE(' 2.4 稳定度得分,普通 、 ls_TARGET_NAME=' ||
ls_TARGET_NAME || ' ls_tarsys_id=' ||
ls_tarsys_id || 'ln_WDD_SCORE=' ||
ln_WDD_SCORE); END IF; --财务稳定度 正向
--!!!!!
IF ln_TARSYS_SCORE_TYPE = 1 AND ls_BODATA2 > 0 THEN --执行
ln_WDD_SCORE := 100 + nvl(PACK_KPI_KERNEL.Get_OneTarget_Score_NEW(ls_tarsys_id,
ls_BODATA),
0); -- 更新稳定度得分
UPDATE kpi_manager_boresult_temp t
SET t.wdd_score = ln_WDD_SCORE
WHERE t.id = ln_ID;
COMMIT;
--test
DBMS_OUTPUT.PUT_LINE(' 2.4 稳定度得分 财务稳定度 正向 、 ls_TARGET_NAME=' ||
ls_TARGET_NAME || ' ls_tarsys_id=' ||
ls_tarsys_id || 'ln_WDD_SCORE=' ||
ln_WDD_SCORE); END IF; --财务稳定度 反向
--!!!!!
IF ln_TARSYS_SCORE_TYPE = 2 AND ls_BODATA2 < 0 THEN
--执行
ln_WDD_SCORE := 100 + nvl(PACK_KPI_KERNEL.Get_OneTarget_Score_NEW(ls_tarsys_id,
ls_BODATA),
0); -- 更新稳定度得分
UPDATE kpi_manager_boresult_temp t
SET t.wdd_score = ln_WDD_SCORE
WHERE t.id = ln_ID;
COMMIT; --test
DBMS_OUTPUT.PUT_LINE(' 2.4 稳定度得分--财务稳定度 反向 、 ls_TARGET_NAME=' ||
ls_TARGET_NAME || ' ls_tarsys_id=' ||
ls_tarsys_id || 'ln_WDD_SCORE=' ||
ln_WDD_SCORE); END IF; END IF; -- --不计算的 稳定度得分===========================================================
--!!!!!
IF ln_TARSYS_SCORE_TYPE = 7 THEN -- 更新稳定度得分
UPDATE kpi_manager_boresult_temp t
SET t.wdd_score = ls_BODATA
WHERE t.id = ln_ID;
COMMIT;
DBMS_OUTPUT.PUT_LINE(' 2.7 不计算的稳定度得分 、 ls_TARGET_NAME=' ||
ls_TARGET_NAME || ' ls_tarsys_id=' ||
ls_tarsys_id || 'ln_WDD_SCORE=' ||
ln_WDD_SCORE); END IF; -- --不计算的 创新度得分===========================================================
--!!!!!
IF ln_TARSYS_SCORE_TYPE = 8 THEN -- 更新创新度得分
UPDATE kpi_manager_boresult_temp t
SET t.CXD_SCORE = ls_BODATA
WHERE t.id = ln_ID;
COMMIT;
DBMS_OUTPUT.PUT_LINE(' 2.8 不计算的创新度得分 、 ls_TARGET_NAME=' ||
ls_TARGET_NAME || ' ls_tarsys_id=' ||
ls_tarsys_id || 'CXD_SCORE=' || ls_BODATA); END IF; -- --修正系数得分计算===========================================================
--!!!!!
IF ln_TARSYS_SCORE_TYPE = 6 THEN
ln_K_DEP_DATA := PACK_KPI_KERNEL.Get_OneTarget_Score(ls_tarsys_id,
ls_BODATA/100); -- 修正系数得分
UPDATE kpi_manager_boresult_temp t
SET t.K_DEP_DATA = ln_K_DEP_DATA
WHERE t.id = ln_ID;
COMMIT;
DBMS_OUTPUT.PUT_LINE(' 2.6 修正系数得分、 ls_TARGET_NAME=' ||
ls_TARGET_NAME || ' ls_tarsys_id=' ||
ls_tarsys_id || 'ln_K_DEP_DATA=' ||
ln_K_DEP_DATA); END IF; --
------------修正系数不计算 范广龙 20130905
IF ln_TARSYS_SCORE_TYPE = 61 THEN
ln_K_DEP_DATA := ls_BODATA; -- 修正系数得分
UPDATE kpi_manager_boresult_temp t
SET t.K_DEP_DATA = ln_K_DEP_DATA
WHERE t.id = ln_ID;
COMMIT;
DBMS_OUTPUT.PUT_LINE(' 2.7 修正系数不计算体系得分、 ls_TARGET_NAME=' ||
ls_TARGET_NAME || ' ls_tarsys_id=' ||
ls_tarsys_id || 'ln_K_DEP_DATA=' ||
ln_K_DEP_DATA); END IF;
----------------------------------------------- --
---- END IF;
--==============================
--循环结束FETCH一次=============
--==============================
Fetch Cur_BO
INTO ln_ID,
ls_T_ID,
ls_TARGET_ID,
ls_TARGET_CODE,
ls_TARGET_NAME,
ls_tarsys_id,
ls_STANDARDVALUE,
ls_RATIO,
ls_BODATA,
ls_BODATA2,
ls_BODATE; End Loop; --test
DBMS_OUTPUT.PUT_LINE(' 2.9、 计算结束——共计算指标个数 、 ln_i=' || ln_i); Close Cur_bo; --==================================================
--第三部分 完成指标数据提交至指定位置
--================================================== --更新根据flag分类。 --ls_flag = 0 批量计算
IF ls_flag = '' THEN --kpi_manager_boresult_temp ----》kpi_manager_boresult_report begin
merge into kpi_manager_boresult_report t1
using (select t.t_id,
t.target_id,
t.target_code,
t.target_name,
t.bodata,
t.bodata2,
t.bodate,
SUM(t.wdd_score) wdd_score,
SUM(t.nld_score) nld_score,
SUM(t.cxd_score) cxd_score,
SUM(t.yszql_scroe) yszql_scroe,
SUM(t.K_DEP_DATA) K_DEP_DATA from KPI_MANAGER_BORESULT_TEMP t
GROUP BY t.t_id,
t.target_id,
t.target_code,
t.target_name,
t.bodata,
t.bodata2,
t.bodate) t2
on (t1.target_id || t1.report_month = t2.target_id || t2.bodate) when matched then
update
set t1.update_date = SYSDATE,
t1.useflag = '',
t1.bodata = t2.bodata,
t1.bodata2 = t2.bodata2,
t1.wdd_score = t2.wdd_score,
t1.nld_score = t2.nld_score,
t1.cxd_score = t2.cxd_score,
t1.yszql_scroe = t2.yszql_scroe,
t1.K_DEP_DATA = t2.K_DEP_DATA /*,
t1.commit_flag = '0'*/ WHERE t1.target_id = t2.target_id
AND t1.report_month = t2.bodate
and t1.commit_flag = 0 when not matched then
insert
(TARGET_ID,
TARGET_NAME,
TARGET_CODE,
UPDATE_DATE,
REPORT_MONTH,
USEFLAG,
WDD_SCORE,
NLD_SCORE,
CXD_SCORE,
YSZQL_SCROE,
K_DEP_DATA,
COMMIT_FLAG,
BODATA,
BODATA2 )
Values
(t2.target_id,
t2.target_name,
t2.target_code,
SYSDATE,
t2.bodate,
'',
t2.WDD_SCORE,
t2.NLD_SCORE,
t2.CXD_SCORE,
t2.YSZQL_SCROE,
t2.K_DEP_DATA,
'',
t2.bodata,
t2.bodata2);
commit;
exception
when OTHERS then
rollback;
end;
END IF; --========================================== --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
--ls_flag = 1 用户自定义计算
IF ls_flag = '' THEN begin
merge into kpi_flu_record t1
using (select t.t_id,
t.target_id,
t.target_code,
t.target_name,
t.bodata,
t.bodate,
SUM(t.wdd_score) wdd_score,
SUM(t.nld_score) nld_score,
SUM(t.cxd_score) cxd_score,
SUM(t.yszql_scroe) yszql_scroe from KPI_MANAGER_BORESULT_TEMP t
GROUP BY t.t_id,
t.target_id,
t.target_code,
t.target_name,
t.bodata,
t.bodate) t2
on (t1.rec_id = t2.t_id) when matched then
update
SET t1.wdd_score = t2.wdd_score,
t1.nld_score = t2.nld_score,
t1.cxd_score = t2.cxd_score,
t1.yszql_scroe = t2.yszql_scroe
WHERE t1.rec_id = t2.t_id;
commit;
exception
when OTHERS then
rollback;
end;
--更新K值
begin
merge into kpi_manager_boresult_report t1
using (select t.t_id,
t.target_id,
t.target_code,
t.target_name,
t.bodata,
t.bodata2,
t.bodate,
SUM(t.wdd_score) wdd_score,
SUM(t.nld_score) nld_score,
SUM(t.cxd_score) cxd_score,
SUM(t.yszql_scroe) yszql_scroe,
SUM(t.K_DEP_DATA) K_DEP_DATA from KPI_MANAGER_BORESULT_TEMP t
GROUP BY t.t_id,
t.target_id,
t.target_code,
t.target_name,
t.bodata,
t.bodata2,
t.bodate) t2
on (t1.target_id || t1.report_month = t2.target_id || t2.bodate) when matched then
update
set t1.update_date = SYSDATE,
t1.useflag = '',
-- t1.bodata = t2.bodata,
t1.bodata2 = t2.bodata2, t1.K_DEP_DATA = t2.K_DEP_DATA
/*,
t1.commit_flag = '0'*/ WHERE t1.target_id = t2.target_id
AND t1.report_month = t2.bodate; commit;
exception
when OTHERS then
rollback;
end; END IF; END KT_MAIN_MASTER_CONTROL; ---================================================== --==================================================================== FUNCTION GET_ONETARGET_SCORE(as_TARSYS_id IN VARCHAR2, as_bodata NUMBER)
RETURN NUMBER AS
--ComClass CATALOG_ID
--分数上限、下限和步长 --返回值
ln_RESULT NUMBER; BEGIN DECLARE BEGIN
--初始化 IF as_bodata IS NULL THEN
-- RETURN 0; ELSE
BEGIN SELECT DECODE(SIGN(t.tarsys_step),
1,
( /*trunc(*/
(as_bodata - t.tarsys_bottom) / t.tarsys_step) *
t.tarsys_score /*)*/,
-1,
( /*trunc(*/
(t.tarsys_upper - as_bodata) / (-t.tarsys_step)) *
t.tarsys_score /*)*/,
0,
t.tarsys_score, --步长为0,直接返回默认分值
0)
INTO ln_RESULT
from kpi_kpimodel_targetsystem t WHERE t.p_tarsys_id = as_TARSYS_id
AND t.tarsys_upper > as_bodata
AND t.tarsys_bottom <= as_bodata;
EXCEPTION
WHEN OTHERS THEN
ln_RESULT := 0; END;
END IF;
END; RETURN round(ln_RESULT, 2);
END GET_ONETARGET_SCORE; --==================================================================== --==================================================================== --==================================================================== FUNCTION GET_ONETARGET_SCORE_VAR(as_TARSYS_id IN VARCHAR2,
as_bodata NUMBER) RETURN NUMBER AS
--ComClass CATALOG_ID
--分数上限、下限和步长 --返回值
ln_RESULT NUMBER; BEGIN DECLARE BEGIN
--初始化 IF as_bodata IS NULL THEN
-- RETURN 0; ELSE
BEGIN SELECT as_bodata * t.tarsys_score --传入值乘参数,用体系得分保存。
INTO ln_RESULT from kpi_kpimodel_targetsystem t WHERE t.p_tarsys_id = as_TARSYS_id
AND t.tarsys_upper > as_bodata
AND t.tarsys_bottom <= as_bodata;
EXCEPTION
WHEN OTHERS THEN
ln_RESULT := 0; END;
END IF;
END; RETURN round(ln_RESULT, 2);
END GET_ONETARGET_SCORE_VAR; --==================================================================== --==================================================================== --计算量化月奖 ,每日 ,暂时停用中
PROCEDURE GET_BORESULT_LH_AWORD_today IS BEGIN begin
--从kpi_kernel_lh_aword_v ----》KPI_RESULT_DEP_AWORD
--仅仅取当日的BODATA结果,根据部门汇总月奖保存
merge into KPI_RESULT_DEP_AWORD t1
using (SELECT * FROM kpi_kernel_lh_aword_v t
WHERE t.resultdate = to_char(SYSDATE, 'yyyymmdd')) t2
on (t1.depid = t2.department_id) when matched then
update
set t1.resdata = t2.Aword, t1.resdate = t2.resultdate
WHERE t1.resdate = to_char(SYSDATE, 'yyyymmdd')
when not matched then
insert
(ResultID, DepID, ResDATA, ResDate)
Values
(seq_KPI_Result_AWORD.NEXTVAL,
t2.department_id,
t2.Aword,
SYSDATE);
commit; exception
when OTHERS then
rollback;
end; END GET_BORESULT_LH_AWORD_today; FUNCTION Get_KPI_System_P_ID(as_target_id IN VARCHAR2) RETURN TSTRARRY AS tst_arry TSTRARRY; --tst游标
Cursor Cur_TST Is
select t.TARSYS_ID
from kpi_kpimodel_tst t
where t.target_id = as_target_id; ls_tst VARCHAR2(100);
ls_tst2 VARCHAR2(100);
ln_i INTEGER;
ln_count INTEGER; BEGIN
Open Cur_TST;
Fetch Cur_TST
INTO ls_tst;
ln_i := 1;
--主循环 每次一个指标。
While Cur_TST%Found LOOP tst_arry(ln_i) := ls_tst;
ln_i := ln_i + 1;
--循环结束FETCH一次 Fetch Cur_TST
INTO ls_tst;
End Loop;
Close Cur_TST; --处理数组0位置,用来记录数据数量
tst_arry(0) := ln_i; RETURN tst_arry; END Get_KPI_System_P_ID;
--==================================================================== FUNCTION Get_KPI_SystemID(as_target_id IN VARCHAR2) RETURN TSTRARRYARRY AS tst_arry TSTRARRY;
tst_arryarry TSTRARRYARRY; --tst游标
Cursor Cur_TST Is
select t.TARSYS_ID
from kpi_kpimodel_tst t
where t.target_id = as_target_id; ls_tst VARCHAR2(100);
ls_tst2 VARCHAR2(100);
ln_i INTEGER;
ln_count INTEGER; --system1 有子节点
Cursor Cur_system1 Is
select t.tarsys_id
from KPI_KPIMODEL_TARGETSYSTEM t
where t.tarsys_id <> ls_tst2
start with t.tarsys_id = ls_tst2
connect by prior t.tarsys_id = t.p_tarsys_id; --system2 没子节点
Cursor Cur_system2 Is
select t.tarsys_id
from KPI_KPIMODEL_TARGETSYSTEM t
where t.tarsys_id = ls_tst2
start with t.tarsys_id = ls_tst2
connect by prior t.tarsys_id = t.p_tarsys_id; BEGIN
Open Cur_TST;
Fetch Cur_TST
INTO ls_tst;
ln_i := 1;
--主循环 每次一个指标。
While Cur_TST%Found LOOP tst_arry(ln_i) := ls_tst;
ln_i := ln_i + 1;
--循环结束FETCH一次 Fetch Cur_TST
INTO ls_tst;
End Loop;
Close Cur_TST; --处理数组0位置,用来记录数据数量
tst_arry(0) := ln_i;
tst_arryarry(0)(0) := ln_i;
IF ln_i = 1 THEN
tst_arryarry(0)(0) := '';
END IF; --根据tst取所有的子节点
FOR i IN 1 .. tst_arry(0) - 1 LOOP
DBMS_OUTPUT.PUT_LINE('二、 tst第一步,循环次数:' || i || ',target_id:' ||
as_target_id || ' 考核大体系' || tst_arry(i));
END LOOP; IF tst_arryarry(0) (0) <> 0 THEN
FOR i IN 1 .. tst_arry(0) - 1 LOOP
ls_tst2 := tst_arry(i); --判断是否有子节点
BEGIN
select COUNT(1)
INTO ln_count
from KPI_KPIMODEL_TARGETSYSTEM t
where t.tarsys_id <> ls_tst2
start with t.tarsys_id = ls_tst2
connect by prior t.tarsys_id = t.p_tarsys_id;
exception
when NO_DATA_FOUND then
ln_count := 0;
END; IF ln_count > 0 THEN
Open Cur_system1;
Fetch Cur_system1
INTO ls_tst;
ln_i := 1;
--主循环 每次一个指标。
While Cur_system1%Found LOOP tst_arryarry(i)(ln_i) := ls_tst;
ln_i := ln_i + 1;
Fetch Cur_system1
INTO ls_tst;
End Loop;
Close Cur_system1;
tst_arryarry(i)(0) := ln_i; ELSE
Open Cur_system2;
Fetch Cur_system2
INTO ls_tst;
ln_i := 1;
--主循环 每次一个指标。
While Cur_system2%Found LOOP tst_arryarry(i)(ln_i) := ls_tst;
ln_i := ln_i + 1;
Fetch Cur_system2
INTO ls_tst;
End Loop;
Close Cur_system2;
tst_arryarry(i)(0) := ln_i; END IF; END LOOP;
END IF; RETURN tst_arryarry; END Get_KPI_SystemID; --==================================================================== FUNCTION GetComAword(as_KPI_SCORE IN number, as_CATALOG_ID IN VARCHAR2)
RETURN NUMBER AS
--ComClass CATALOG_ID
--分数上限、下限和步长
dblScoreUP number;
dblScoreBottom number;
dblScoreStep number;
dblScoreTT number; LS_BOTTOM number; --记录起征点
--返回值
ln_RESULT NUMBER; BEGIN DECLARE
--TYPE s_TYPE IS RECORD
--( str VARCHAR2(4000) ); BEGIN
LS_BOTTOM := 0;
ln_RESULT := 0; --获取“起征点”
BEGIN SELECT t.catalog_t_bottom
INTO LS_BOTTOM
from KPI_KPIMODEL_CATALOGTARGET t WHERE t.catalog_id = as_CATALOG_ID
AND t.catalog_t_award = 0;
EXCEPTION
WHEN OTHERS THEN
LS_BOTTOM := -99999; END;
--无法获取起征点,则结果返回-99999
IF LS_BOTTOM = -99999 THEN
ln_RESULT := -99999; --返回值为-1特殊值,说明表中参数设置有错误。 ELSE
--算法 IF as_KPI_SCORE >= LS_BOTTOM THEN --新算法,适合累进计算部分
BEGIN
SELECT SUM(DECODE(DECODE(SIGN(as_KPI_SCORE - T.CATALOG_T_UPPER),
0,
1,
1,
1,
-1,
-1), --判断区间 0,1均返回1代表本段算全分 -1返回-1代表本段算比例分
1,
((T.CATALOG_T_UPPER - T.CATALOG_T_BOTTOM) /
T.CATALOG_T_STEP) * T.CATALOG_T_AWARD, --不在这个区间
-1,
DECODE(SIGN(CATALOG_T_STEP),
1,
((as_KPI_SCORE - T.CATALOG_T_BOTTOM) /
T.CATALOG_T_STEP * T.CATALOG_T_AWARD)),
-1,
((T.CATALOG_T_UPPER - as_KPI_SCORE) /
(-T.CATALOG_T_STEP) * T.CATALOG_T_AWARD),
0)) C_AWARD
INTO ln_RESULT
FROM KPI_KPIMODEL_CATALOGTARGET T WHERE T.CATALOG_ID = as_CATALOG_ID
AND T.CATALOG_T_BOTTOM >= LS_BOTTOM
AND T.CATALOG_T_BOTTOM <= as_KPI_SCORE
ORDER BY T.CATALOG_T_UPPER;
EXCEPTION
WHEN OTHERS THEN
ln_RESULT := -99998;
END; END IF; IF as_KPI_SCORE < LS_BOTTOM THEN --老算法,适合多段计算部分
BEGIN
SELECT DECODE(SIGN(CATALOG_T_STEP),
1,
(DECODE(CATALOG_T_STEP, --若step为9999,则直接-1,奖金为零
9999,
-1,
--step 小于零
(as_KPI_SCORE - T.CATALOG_T_BOTTOM) /
T.CATALOG_T_STEP * T.CATALOG_T_AWARD)),
-1,
((T.CATALOG_T_UPPER - as_KPI_SCORE) /
(-T.CATALOG_T_STEP) * T.CATALOG_T_AWARD),
0) LN_RESULT
INTO ln_RESULT
FROM KPI_KPIMODEL_CATALOGTARGET T WHERE T.CATALOG_ID = as_CATALOG_ID
AND T.CATALOG_T_UPPER <= LS_BOTTOM
AND T.CATALOG_T_UPPER > as_KPI_SCORE
AND T.CATALOG_T_BOTTOM <= as_KPI_SCORE; EXCEPTION
WHEN OTHERS THEN
ln_RESULT := -99997;
END; END IF; END IF; --test
--DBMS_OUTPUT.PUT_LINE('GetScoreAllYSZQL :as_bo.TARGET_ID=' ||as_bo.TARGET_ID ||'Ln_temp_resDBL预算='||Ln_temp_resDBL );
--加基本月奖1,返回实际月奖
ln_RESULT := nvl(ln_RESULT, 0) + 1;
END;
RETURN ln_RESULT;
END GetComAword; --==================================================================== --====================================================================
--计算总月奖
FUNCTION Get_all_Aword(as_LH_SCORE IN number, as_GL_SCORE IN NUMBER)
RETURN NUMBER AS ln_RESULT NUMBER; BEGIN ln_RESULT := 0;
ln_RESULT := round(as_LH_SCORE * (1 - as_GL_SCORE), 3); RETURN ln_RESULT;
END Get_all_Aword; --==================================================================== --====================================================================
--获取指标的bodata2
FUNCTION Get_bodata2_kpi_flu_record(as_target_id IN VARCHAR2,
as_month IN VARCHAR2) RETURN NUMBER AS
--权重修正
--K值修正
--得分上下限修正。 --返回值
ln_RESULT NUMBER; BEGIN
begin
select t.bodata2
into ln_RESULT --取P_id
from kpi_manager_boresult_report t
where t.target_id = as_target_id
AND t.report_month = as_month;
exception
when NO_DATA_FOUND then
ln_RESULT := 0;
end; RETURN ln_RESULT;
END Get_bodata2_kpi_flu_record; --==================================================================== --====================================================================
--指标得分最终得分修正
FUNCTION Get_K_DEP_DATA(as_dep_id IN VARCHAR2, as_month IN VARCHAR2)
RETURN NUMBER AS
--权重修正
--K值修正
--得分上下限修正。 --返回值
ln_RESULT NUMBER;
ls_target_id VARCHAR2(50); BEGIN
BEGIN
select tv.target_id
into ls_target_id --取P_id
-----范广龙修改 2013 09 07 from (select t.target_id from kpi_kpimodel_kpitarget t
where t.department_id = as_dep_id
AND t.target_name LIKE '月奖基准系数%' order by t.target_id desc) tv
where
rownum=1;
/*范例
select * from (select t.*
--取P_id
from kpi_kpimodel_kpitarget t
where t.department_id = 122
AND t.target_name LIKE '月奖基准系数%' order by t.target_id desc) ty where rownum=1; */ exception
when OTHERS then
ln_RESULT := 1;
end; BEGIN
select t.k_dep_data
into ln_RESULT --取P_id
from kpi_manager_boresult_report t
where t.target_id = ls_target_id
AND t.report_month = as_month;
exception
when OTHERS then
ln_RESULT := 1;
end; RETURN nvl(ln_RESULT, 1);
END Get_K_DEP_DATA; --==================================================================== --====================================================================
--指标得分最终得分修正
FUNCTION get_lh_score_fix(LH_score IN NUMBER,
dep_id IN NUMBER,
as_month IN VARCHAR2) RETURN NUMBER AS --返回值
ln_RESULT NUMBER;
ln_upper_score NUMBER;
ln_LH_score NUMBER;
BEGIN
ln_LH_score := LH_score;
--计算
--(量化指标基础的分 - 本单位资金计划准确率得分)*修正系数 在上下限规整 --1 - 本单位资金计划准确率得分
ln_LH_score := ln_LH_score + get_zjjhzql(dep_id, as_month); --2 K值修正
ln_LH_score := ln_LH_score *1;-- Get_K_DEP_DATA(dep_id, as_month); --3 得分上下限修正。 BEGIN
SELECT t.upper_score
INTO ln_upper_score
FROM kpi_kpimodel_department t
WHERE t.department_id = dep_id;
EXCEPTION
WHEN OTHERS THEN
ln_RESULT := ln_LH_score;
END; --超过上限的 修改成得分上限
IF ln_upper_score < ln_LH_score THEN
ln_RESULT := ln_upper_score;
ELSE
ln_RESULT := ln_LH_score;
END IF; RETURN ln_RESULT;
END get_lh_score_fix; --====================================================================
--取得资金计划准确率
FUNCTION get_zjjhzql(as_dep_id IN VARCHAR2, as_month IN VARCHAR2)
RETURN NUMBER AS
--权重修正
--K值修正
--得分上下限修正。 --返回值
ln_RESULT NUMBER;
ls_target_id VARCHAR2(50); BEGIN
BEGIN
SELECT t.YSZQL_SCROE
INTO ln_RESULT
from kpi_kernel_dep_month_mx_base_v t
WHERE t.TARGET_NAME LIKE '%资金计划准确率%'
AND t.REC_MONTHDATE = as_month
AND t.DEPARTMENT_ID = as_dep_id;
exception
when OTHERS then
ln_RESULT := 0;
end; RETURN nvl(ln_RESULT, 0);
END get_zjjhzql; --==================================================================== --====================================================================
--定时取指标元素 主程序 小元素合成算法
--=-=-==-=-=-=-=-------------------------------
PROCEDURE BOELEMENT_MASTER_CONTROL(as_date IN VARCHAR2) AS
--定义一 ls_date VARCHAR2(20); --定义二 small_ele_idx NUMBER;
ln_S NUMBER;
ln_S1 NUMBER;
ln_A1 NUMBER;
ln_A2 NUMBER;
ln_A3 NUMBER;
ln_A4 NUMBER;
ln_A5 NUMBER;
ln_A6 NUMBER; --保存游标取出的值
ele_row kpi_kernel_boelement_bigele_v%rowtype; type small_ele is record --包含转账方向、金额等信息
(
rownum number,
ele_id VARCHAR2(100),
er_value NUMBER ); type small_ele_t IS TABLE of small_ele index by binary_integer;
l_small_ele small_ele; --记录
l_small_ele_t small_ele_t; --定义表 --大元素游标
Cursor Cur_ele_big Is
--禁用生产的数据,当不需要禁用时,解锁
SELECT *
From kpi_kernel_boelement_bigele_v
where 1 = 2
ORDER BY BIG_ELE_ID; --小元素游标
Cursor Cur_ele_small Is
SELECT rownum, tt.ele_id, tt.er_value
FROM kpi_manager_boelement t, kpi_manager_boelement_result tt
WHERE t.ele_id = tt.ele_id
AND t.ele_id LIKE ele_row.big_ele_id || '-%'
AND tt.er_month = ls_date
ORDER BY tt.ele_id; --定义三 BEGIN -- DBMS_OUTPUT.ENABLE(10000000); --参数处理
IF as_date IS NULL THEN ls_date := GET_KPI_DATE();
ELSE
ls_date := as_date;
END IF; --==================================================
--第一部分 获取所有普通元素和小元素的值
--================================================== --主体 取元素值,每月一条,有则更新
BEGIN
DBMS_OUTPUT.put_line('检查点1-1');
delete KPI_MANAGER_ELE_RESULT_TEMP;
commit;
DBMS_OUTPUT.put_line('检查点1-2');
insert /*+append */ into KPI_MANAGER_ELE_RESULT_TEMP
SELECT t.ELE_ID,
t.ELE_TYPE,
t.ELEMENT_NAME,
t.DEP_NAME,
t.FACTRY_NAME,
t.ELEMNT_SORUCE,
t.DEFAULTVALUE,
PACK_KPI_KERNEL.GET_BOELEMENT(t.ele_id, ls_date) ER_VALUE,
ls_date er_month
from kpi_manager_boelement t
WHERE t.ele_type_update IN ('', '')
and t.ele_type <> '指标值';
commit; DBMS_OUTPUT.put_line('检查点1-3');
MERGE INTO kpi_manager_boelement_result t1
USING KPI_MANAGER_ELE_RESULT_TEMP t2
ON (t1.ele_id || t1.ER_MONTH = t2.ELE_ID || t2.er_month)
--按月写入条目,每月每元素一条数据
WHEN MATCHED THEN --匹配就更新
UPDATE
SET t1.ER_VALUE = t2.ER_VALUE, t1.ER_DATE = SYSDATE
WHERE t1.ele_id = t2.ELE_ID
AND t1.er_month = t2.er_month WHEN NOT MATCHED THEN --不匹配就写入新数据
INSERT
(ELE_ID, ER_MONTH, ER_VALUE, ER_DATE)
VALUES
(t2.ELE_ID,
t2.er_month,
t2.ER_VALUE,
SYSDATE ); commit;
DBMS_OUTPUT.put_line('检查点1-4');
---新增日志表记录 /* insert into KPI_MANAGER_BOELEMENT_LOG
(er_id,ele_id, er_month, er_value, er_date)
SELECT
SEQ_KPI_KPI_ELE_LOG.Nextval,
t.ELE_ID,
ls_date er_month,
GET_BOELEMENT(t.ele_id, ls_date) ER_VALUE,
sysdate
from kpi_manager_boelement t
WHERE t.ele_type_update IN ('0', '1')
and t.ele_type <> '指标值'; commit;*/
--Exception
--when others then --pack_kpi_base.SET_SYSTEM_LOG( '指标元素提取出错', '指标元素提取出错'); end; --将审批通过的计划值更新到元素结果表【kpi_manager_boelement_result】中
DBMS_OUTPUT.put_line('检查点1-5');
PACK_KPI_JHZ.kpi_BackToELeResultTable(ls_date);
DBMS_OUTPUT.put_line('检查点1-6');
--利润实际排名
KPI_LR_SJ_PM(ls_date);
--利润预算准确率排名
KPI_LR_YSZQL_PM(as_month => ls_date);
DBMS_OUTPUT.put_line('检查点1-7');
--==================================================
--第二部分 根据获取的小元素 合成大元素 写入临时表
--================================================== --1、获取大元素列表逐条计算大元素值
Open Cur_ele_big;
loop
--主循环 --循环内参数初始化####
--small_ele_idx :=0;
ln_s1 := -9997; -- 中间结果
ln_s := -9998; --最终结果
ln_A1 := 0;
ln_A2 := 0;
ln_A3 := 0;
ln_A4 := 0;
ln_A5 := 0;
ln_A6 := 0; --取游标
fetch Cur_ele_big
into ele_row;
exit when Cur_ele_big%NOTFOUND; ---
/*DBMS_OUTPUT.PUT_LINE('2.1、 大元素值取得、 big_ele_id = ' ||
ele_row.big_ele_id || ' element_name=' ||
ele_row.element_name || ' ele_type_update=' ||
ele_row.ele_type_update || ' ele_weight1=' ||
ele_row.ele_weight1 || ' tarsys_id=' ||
ele_row.tarsys_id || ' target_id=' ||
ele_row.target_id || ' formula_bm=' ||
ele_row.formula_bm);*/
small_ele_idx := 0; --(1)得到此大元素的小元素序列,并循环把小元素的值存入变量中。
Open Cur_ele_small;
loop
--主循环
fetch Cur_ele_small
into l_small_ele_t(small_ele_idx);
exit when Cur_ele_small%NOTFOUND; ---
/*DBMS_OUTPUT.PUT_LINE(' 2.2\小元素值循环调用 、num = ' || l_small_ele_t(small_ele_idx)
.rownum || ' ele_id=' || l_small_ele_t(small_ele_idx)
.ele_id || ' er_value=' || l_small_ele_t(small_ele_idx)
.er_value);*/ small_ele_idx := small_ele_idx + 1; end LOOP;
close Cur_ele_small; /* 代码例子备用
for idx in 1 .. 5 loop -- 初始化数据
l_small_ele_t(idx).rownum :=idx;
l_small_ele_t(idx).ele_id := 'xxxxx' ||idx;
l_small_ele_t(idx).er_value := 'F' ;
END loop;*/ --(2)根据大元素的公式标记 进入相对应的算法 计算得分S1 /*
NHYSZQL 指标元素体系-能耗预算准确率 S1=(A2-A1)/A1*100
FJWCL 指标元素体系-分解完成率 S1=(A2-A1)/A1*100
WNCXL 指标元素体系-物耗能耗创新率 S1=A1/A2*100
WNWCL 指标元素体系-能耗物耗完成率 S1=A1/A2*100
CLJH 指标元素体系-产量计划 S1=A2/A1
CLCX1 指标元素体系-产量创新
CLCX3 指标元素体系-产量创新
CLCX4 指标元素体系-产量创新
CLCX5 指标元素体系-产量创新
CLCX6 指标元素体系-产量创新
CLCX7 指标元素体系-产量创新
ZLDF 质量
SSL 损失率*/ --/* SSL
IF ele_row.formula_bm = 'SSL' THEN BEGIN
ln_a1 := l_small_ele_t(0).er_value; --计划值
ln_a2 := l_small_ele_t(1).er_value; -- 实际值 IF ln_a2 IS NULL OR ln_a1 IS NULL OR ln_a1 = 0 THEN
ln_s1 := 0;
ELSE
ln_s1 := ln_a2 / ln_a1 * 100;
END IF;
EXCEPTION
WHEN OTHERS THEN
ln_s1 := 0;
END; -- S = f(s1) 根据S1 计算S的过程,每个算法均可能不同
IF ln_s1 = 0 THEN
ln_S := 0;
ELSE IF ln_s1 <= 90 THEN
ln_S := 110;
END IF;
IF ln_s1 > 90 AND ln_s1 <= 110 THEN
ln_S := ln_s1;
END IF;
IF ln_s1 > 110 THEN
ln_S := 0;
END IF; END IF; END IF; --/* NHYSZQL S1=(A2-A1)/A1*100
IF ele_row.formula_bm = 'NHYSZQL' THEN BEGIN
ln_a1 := l_small_ele_t(0).er_value;
ln_a2 := l_small_ele_t(1).er_value; IF ln_a2 IS NULL OR ln_a1 IS NULL OR ln_a1 = 0 THEN
ln_s1 := 0;
ELSE
ln_s1 := (ln_a2 - ln_a1) / ln_a1 * 100;
END IF;
EXCEPTION
WHEN OTHERS THEN
ln_s1 := 0;
END; -- S = f(s1)根据S1 计算S的过程,每个算法均可能不同 ln_S := PACK_KPI_KERNEL.Get_OneTarget_Score(ele_row.tarsys_id,
ln_s1); END IF; --/* FJWCL S1=(A2-A1)/A1*100
IF ele_row.formula_bm = 'FJWCL' THEN BEGIN
ln_a1 := l_small_ele_t(0).er_value;
ln_a2 := l_small_ele_t(1).er_value; IF ln_a2 IS NULL OR ln_a1 IS NULL OR ln_a1 = 0 THEN
ln_s1 := 0;
ELSE
ln_s1 := (ln_a2 - ln_a1) / ln_a1 * 100;
ln_s1 := ln_s1 * (ln_a1 / abs(ln_a1));
END IF;
EXCEPTION
WHEN OTHERS THEN
ln_s1 := 0;
END; -- S = f(s1)根据S1 计算S的过程,每个算法均可能不同 ln_S := PACK_KPI_KERNEL.Get_OneTarget_Score(ele_row.tarsys_id,
ln_s1); END IF; --WNCXL S1=A1/A2*100
IF ele_row.formula_bm = 'WNCXL' THEN BEGIN
ln_a1 := l_small_ele_t(0).er_value;
ln_a2 := l_small_ele_t(1).er_value; IF ln_a2 IS NULL OR ln_a1 IS NULL OR ln_a1 = 0 THEN
ln_s1 := 0;
ELSE
ln_s1 := (ln_a1 / ln_a2) * 100;
END IF;
EXCEPTION
WHEN OTHERS THEN
ln_s1 := 0;
END; -- S = f(s1) 根据S1 计算S的过程,每个算法均可能不同
IF ln_s1 = 0 THEN
ln_S := 0;
ELSE IF ln_s1 < 100 THEN
ln_S := 0;
END IF;
IF ln_s1 >= 100 AND ln_s1 <= 105 THEN
ln_S := ln_s1;
END IF;
IF ln_s1 > 105 THEN
ln_S := 105;
END IF; END IF; END IF; --WNCXL S1=A1/A2*100
IF ele_row.formula_bm = 'WNCXL2' THEN BEGIN
ln_a1 := l_small_ele_t(0).er_value;
ln_a2 := l_small_ele_t(1).er_value; IF ln_a2 IS NULL OR ln_a1 IS NULL OR ln_a2 = 0 THEN
ln_s1 := 0;
ELSE
ln_s1 := (ln_a2 / ln_a1) * 100;
END IF;
EXCEPTION
WHEN OTHERS THEN
ln_s1 := 0;
END; -- S = f(s1) 根据S1 计算S的过程,每个算法均可能不同
IF ln_s1 = 0 THEN
ln_S := 0;
ELSE IF ln_s1 < 100 THEN
ln_S := 0;
END IF;
IF ln_s1 >= 100 AND ln_s1 <= 105 THEN
ln_S := ln_s1;
END IF;
IF ln_s1 > 105 THEN
ln_S := 105;
END IF; END IF; END IF; -- WNWCL S1=A1/A2*100
IF ele_row.formula_bm = 'WNWCL' THEN BEGIN
ln_a1 := l_small_ele_t(0).er_value;
ln_a2 := l_small_ele_t(1).er_value; IF ln_a2 IS NULL OR ln_a1 IS NULL OR ln_a2 = 0 THEN
ln_s1 := 0;
ELSE
ln_s1 := pack_kpi_base.F_GET_CFYS(ln_a1, ln_a2) * 100;
END IF; EXCEPTION
WHEN OTHERS THEN
ln_s1 := 0;
END; -- S = f(s1) 根据S1 计算S的过程,每个算法均可能不同
IF ln_s1 = 0 THEN
ln_S := 0;
ELSE IF ln_s1 < 90 THEN
ln_S := 0;
END IF;
IF ln_s1 >= 90 AND ln_s1 <= 105 THEN
ln_S := ln_s1;
END IF;
IF ln_s1 > 105 THEN
ln_S := 105;
END IF; END IF; END IF; --CLJH 指标元素体系-产量计划S1=A2/A1
IF ele_row.formula_bm = 'CLJH' THEN BEGIN
ln_a1 := l_small_ele_t(0).er_value;
ln_a2 := l_small_ele_t(1).er_value; IF ln_a2 IS NULL OR ln_a1 IS NULL OR ln_a1 = 0 THEN
ln_s1 := 0;
ELSE
ln_s1 := pack_kpi_base.F_GET_CFYS(ln_a2, ln_a1);
END IF; EXCEPTION
WHEN OTHERS THEN
ln_s1 := 0;
END; -- S = f(s1) 根据S1 计算S的过程,每个算法均可能不同
IF ln_s1 = 0 THEN
ln_S := 0;
ELSE IF ln_s1 > 1.04 THEN
ln_S := 1.04;
ELSE
ln_S := ln_s1;
END IF; END IF; END IF; /* 较复杂待编写
CLCX1 指标元素体系-产量创新
CLCX2 指标元素体系-产量创新
CLCX3 指标元素体系-产量创新
CLCX4 指标元素体系-产量创新
CLCX5 指标元素体系-产量创新
CLCX6 指标元素体系-产量创新
CLCX7 指标元素体系-产量创新
*/ --CLCX1 指标元素体系-产量计划S1=A2/A1
IF ele_row.formula_bm = 'CLCX1' THEN BEGIN
ln_a1 := l_small_ele_t(0).er_value;
ln_a2 := l_small_ele_t(1).er_value;
ln_a3 := l_small_ele_t(2).er_value;
ln_a4 := l_small_ele_t(3).er_value;
ln_a5 := l_small_ele_t(4).er_value; DBMS_OUTPUT.PUT_LINE(' CLCX1计算过程及结果 、ln_a1 = ' ||
ln_a1 || 'ln_a2 = ' || ln_a2 || ' ln_a3 =' ||
ln_a3 || ' ln_a4 =' || ln_a4); --若实际值为0,则结果为0
if nvl(ln_a1, 0) = 0 then
---
ln_s := 0; ELSE
---
ln_a1 := pack_kpi_base.F_GET_CFYS(ln_a1, ln_a5); --a2,a3,a4,均不为空
IF nvl(ln_a2, 0) <> 0 and nvl(ln_a3, 0) <> 0 and
nvl(ln_a4, 0) <> 0 THEN IF ln_a1 > ln_a4 THEN
ln_s := (ln_a1 - ln_a4) / ln_a4 * 300 +
(ln_a4 - ln_a3) / ln_a3 * 200 +
(ln_a3 - ln_a2) / ln_a2 * 100;
ELSIF ln_a1 > ln_a3 THEN
ln_s := (ln_a1 - ln_a3) / ln_a3 * 200 +
(ln_a3 - ln_a2) / ln_a2 * 100;
ELSIF ln_a1 > ln_a2 THEN
ln_s := (ln_a1 - ln_a2) / ln_a2 * 100;
ELSIF ln_a1 < ln_a2 THEN
ln_s := 0; END IF; IF ln_s > 30 THEN
ln_s := 30;
END IF; END IF; --a2,a3,均不为空 a4 = 空
IF nvl(ln_a2, 0) <> 0 and nvl(ln_a3, 0) <> 0 and
nvl(ln_a4, 0) = 0 THEN IF ln_a1 > ln_a3 THEN
ln_s := (ln_a1 - ln_a3) / ln_a3 * 200 +
(ln_a3 - ln_a2) / ln_a2 * 100;
ELSIF ln_a1 > ln_a2 THEN
ln_s := (ln_a1 - ln_a2) / ln_a2 * 100;
ELSIF ln_a1 < ln_a2 THEN
ln_s := 0;
END IF; IF ln_s > 20 THEN
ln_s := 20;
END IF;
END IF; --a2,不为空 a3,a4 = 空
IF nvl(ln_a2, 0) <> 0 and nvl(ln_a3, 0) = 0 and
nvl(ln_a4, 0) = 0 THEN IF ln_a1 > ln_a2 THEN
ln_s := (ln_a1 - ln_a2) / ln_a2 * 100;
ELSE
IF ln_a1 < ln_a2 THEN
ln_s := 0; END IF; IF ln_s > 10 THEN
ln_s := 10;
END IF;
END IF; END IF; END IF;
EXCEPTION
WHEN OTHERS THEN
ln_s := 0;
END; END IF; --CLCX2 指标元素体系-产量计划S1=A2/A1
IF ele_row.formula_bm = 'CLCX2' THEN BEGIN
ln_a1 := l_small_ele_t(0).er_value;
ln_a2 := l_small_ele_t(1).er_value;
ln_a3 := l_small_ele_t(2).er_value;
ln_a4 := l_small_ele_t(3).er_value; --若实际值为0,则结果为0
if nvl(ln_a1, 0) = 0 then
---
ln_s := 0; ELSE
--- ln_a1 := pack_kpi_base.F_GET_CFYS(ln_a1, ln_a4); -- 求日产量 --a2,a3,均不为空
IF nvl(ln_a2, 0) <> 0 and nvl(ln_a3, 0) <> 0 THEN IF ln_a1 > ln_a3 THEN
ln_s := (ln_a1 - ln_a3) / ln_a3 * 200 +
(ln_a3 - ln_a2) / ln_a2 * 100;
ELSIF ln_a1 > ln_a2 THEN
ln_s := (ln_a1 - ln_a2) / ln_a2 * 100;
ELSIF ln_a1 < ln_a2 THEN
ln_s := 0;
END IF; IF ln_s > 20 THEN
ln_s := 20;
END IF;
END IF; --a2,不为空 a3, = 空
IF nvl(ln_a2, 0) <> 0 and nvl(ln_a3, 0) = 0 THEN IF ln_a1 > ln_a2 THEN
ln_s := (ln_a1 - ln_a2) / ln_a2 * 100;
ELSE
IF ln_a1 < ln_a2 THEN
ln_s := 0; END IF; IF ln_s > 10 THEN
ln_s := 10;
END IF;
END IF; END IF; END IF;
EXCEPTION
WHEN OTHERS THEN
ln_s := 0;
END; END IF; --CLCX3 S1=(A1+A2+A3+A4+A5+A6)*0.15
IF ele_row.formula_bm = 'CLCX3' THEN BEGIN
ln_a1 := l_small_ele_t(0).er_value;
ln_a2 := l_small_ele_t(1).er_value;
ln_a3 := l_small_ele_t(2).er_value;
ln_a4 := l_small_ele_t(3).er_value;
ln_a5 := l_small_ele_t(4).er_value;
ln_a6 := l_small_ele_t(5).er_value; ln_s := (ln_a1 + ln_a2 + ln_a3 + ln_a4 + ln_a5 + ln_a6) * 0.15; EXCEPTION
WHEN OTHERS THEN
ln_s := 0;
END; END IF; --CLCX4 S1=(A1+A2+A3+A4+A5)*0.2
IF ele_row.formula_bm = 'CLCX4' THEN BEGIN
ln_a1 := l_small_ele_t(0).er_value;
ln_a2 := l_small_ele_t(1).er_value;
ln_a3 := l_small_ele_t(2).er_value;
ln_a4 := l_small_ele_t(3).er_value;
ln_a5 := l_small_ele_t(4).er_value; ln_s := (ln_a1 + ln_a2 + ln_a3 + ln_a4 + ln_a5) * 0.2; EXCEPTION
WHEN OTHERS THEN
ln_s := 0;
END; END IF; --CLCX5 S1=(A1+A2)/A3
IF ele_row.formula_bm = 'CLCX5' THEN BEGIN
ln_a1 := l_small_ele_t(0).er_value;
ln_a2 := l_small_ele_t(1).er_value;
ln_a3 := l_small_ele_t(2).er_value; ln_s := pack_kpi_base.F_GET_CFYS(ln_a1 + ln_a2, ln_a3); EXCEPTION
WHEN OTHERS THEN
ln_s := 0;
END; END IF; --CLCX6 S1=(A1+A2)/A3/24
IF ele_row.formula_bm = 'CLCX6' THEN BEGIN
ln_a1 := l_small_ele_t(0).er_value;
ln_a2 := l_small_ele_t(1).er_value;
ln_a3 := l_small_ele_t(2).er_value; ln_s := pack_kpi_base.F_GET_CFYS(ln_a1 + ln_a2, ln_a3) / 24; EXCEPTION
WHEN OTHERS THEN
ln_s := 0;
END; END IF; --CLCX7 S1=A1/A2
IF ele_row.formula_bm = 'CLCX7' THEN BEGIN
ln_a1 := l_small_ele_t(0).er_value;
ln_a2 := l_small_ele_t(1).er_value; ln_s1 := pack_kpi_base.F_GET_CFYS(ln_a1, ln_a2);
IF ln_s1 > 1 THEN
ln_s := 3;
ELSE
ln_s := 0;
END IF; EXCEPTION
WHEN OTHERS THEN
ln_s := 0;
END; END IF; --zfdl S = a1 - a2
IF ele_row.formula_bm = 'ZLDF' THEN BEGIN
ln_a1 := l_small_ele_t(0).er_value;
ln_a2 := l_small_ele_t(1).er_value; IF ln_a1 = 0 THEN
--除数为零结果为零
ln_s := 0;
ELSE
ln_s := (pack_kpi_base.F_GET_CFYS(ln_a1, ln_a2) - 1) * 1000 * 5;
END IF; --上下限修正
IF ln_s > 50 THEN
ln_s := 50;
END IF; IF ln_s < -50 THEN
ln_s := -50;
END IF; EXCEPTION
WHEN OTHERS THEN
ln_s := 0;
END;
END IF; --test
/* DBMS_OUTPUT.PUT_LINE(' 2.3\权重修正前的s ' || 'ln_s1 = ' ||
ln_s1 || ' ln_s =' || ln_s);*/ --(4)根据大元素的权重类型 进行权重修正。 --测试时NVl为1,正式时为0
ln_S := ln_S * nvl(ele_row.ele_weight1, 100) / 100 *
nvl(ele_row.ele_weight2, 100) / 100;
ln_S := round(ln_S, 2);
--test
/*DBMS_OUTPUT.PUT_LINE(' 2.4\计算过程及结果 、ele_id = ' ||
ele_row.big_ele_id || 'ln_s1 = ' || ln_s1 ||
' ln_s =' || ln_s);*/ --(5) 结果更新 merge into kpi_manager_boelement_result t1
using (select ele_row.big_ele_id ele_id,
ln_S er_value,
ls_date update_date from dual ) t2
on (t1.ele_id || t1.er_month = t2.ele_id || t2.update_date)
WHEN MATCHED THEN
UPDATE
SET t1.er_value = t2.er_value, t1.er_date = SYSDATE
WHERE t1.ele_id = t2.ele_id
and t1.er_month = t2.update_date WHEN NOT MATCHED THEN
INSERT
( ELE_ID,
ER_MONTH,
ER_VALUE,
--ER_VALUE2,
ER_DATE)
VALUES
(t2.ele_id, t2.update_date, t2.er_value, SYSDATE); COMMIT; end loop; --主循环结束 close Cur_ele_big; --游标关闭 --==================================================
--第三部分 将临时表中计算得到的大元素的值 整体更新入元素结果表
--================================================== END BOELEMENT_MASTER_CONTROL; --====================================================================
--====================================================================
--取值
FUNCTION GET_BOELEMENT(as_ele_id IN VARCHAR2, as_date IN VARCHAR2)
RETURN NUMBER AS ln_RESULT NUMBER;
ln_defaultvalue NUMBER;
ls_SQL LONG; ls_SJ_SQL LONG;
ls_JH_SQL LONG; ls_pa varchar2(4000);
ls_temp varchar2(4000);
ls_NF varchar2(10);
ls_source varchar2(10); ls_ele_name varchar2(4000); --手动取数:计划值取上月的数据,其它数据取默认值
ls_ele_type varchar2(50);
BEGIN
ls_NF := pack_kpi_base.F_GET_NF(as_date);
--1、根据元素ID取的SQL,若没有,则取默认值。转4
BEGIN
SELECT t.elemnt_soruce, t.source
INTO ls_SJ_SQL, ls_source
FROM kpi_manager_boelement t
WHERE t.ele_id = as_ele_id
AND rownum = 1;
EXCEPTION
WHEN no_data_found THEN
ls_SJ_SQL := ''; --elemnt_soruce 字段没有值或者值为0,就说明无法自动取数
END; BEGIN
SELECT t.defaultvalue, t.element_name, t.ele_type
INTO ln_defaultvalue, ls_ele_name, ls_ele_type
FROM kpi_manager_boelement t
WHERE t.ele_id = as_ele_id
AND rownum = 1;
EXCEPTION
WHEN no_data_found THEN
ln_defaultvalue := 0;
END; --第一种情况:手动取数:计划值取上月数据,其它数据取默认值
if ls_source = 1 then
--计划值取上月数据
if ls_ele_type = '指标值' then -- ln_RESULT:=0; select round(nvl(t.VALUE_DATA, 0), 2) er_value
into ln_RESULT
from KPI_FLU_FLOW_RESULT_NEW_V t
where t.TARGET_ID = as_ele_id
and t.REC_MONTH =
to_char(add_months(to_date(as_date || '-01', 'yyyy-MM-dd'),
-1),
'yyyy-MM')
and t.s_code = 8 --已发布
; --其它的取默认值
else
ln_RESULT := ln_defaultvalue;
end if;
--#######临时注释########################################################################
--dbms_output.put_line('ELE_ID: ' || as_ele_id || ls_ele_name ||
-- ' 手动取数 默认值'); else
--第二种情况:自动取数,但无SQL
--重要判断 --临时屏蔽,取数口径,自动还是手动,0自动,1手动
IF ls_SJ_SQL = '' OR ls_SJ_SQL IS NULL THEN
--OR ls_source = 1 THEN ln_RESULT := ln_defaultvalue;
--#######临时注释########################################################################
--dbms_output.put_line('ELE_ID: ' || as_ele_id || ls_ele_name ||
--' 无SQl 默认值');
--第三种情况:自动取数,有sql
ELSE
--SQL顺利取到,开始取数部分
--2、处理SQL 替换各类信息
BEGIN
--'[#date#]' 'yyyy-mm'格式日期
ls_SJ_SQL := replace(ls_SJ_SQL, '[#date#]', as_date); --'[#gcdm#]' 工厂代码
ls_SJ_SQL := replace(ls_SJ_SQL,
'[#gcdm#]',
pack_kpi_base.F_GET_GCDM_FROM_ELEID(as_ele_id)); --'[#erp_lr_yf#]' ERP月份 HSLMM
ls_SJ_SQL := replace(ls_SJ_SQL,
'[#erp_lr_yf#]',
'HSL' || pack_kpi_base.F_GET_MM(as_date)); --'[#NF#]' 'yyyy'格式年份
ls_SJ_SQL := replace(ls_SJ_SQL, '[#NF#]', ls_NF); --修正系数(累计利润)
--'[#curMonth#]' --当前月份
ls_SJ_SQL := replace(ls_SJ_SQL,
'[#curMonth#]',
pack_kpi_base.F_GET_MM(as_date));
--'[#ele_id#]' --元素ID
ls_SJ_SQL := replace(ls_SJ_SQL, '[#ele_id#]', as_ele_id); --3、执行SQL 取值 execute immediate ls_SJ_SQL
into ln_RESULT;
/* dbms_output.put_line('ELE_ID: ' || as_ele_id || ls_ele_name ||
' SQl ##OK## 取的的值 ' || ln_RESULT ||
' 成功的SQL:' || ls_SJ_SQL);
*/
IF ln_RESULT IS NULL THEN
ln_RESULT := NULL;
END IF; --4、最终结果处理并返回。 EXCEPTION
WHEN OTHERS THEN
--pack_kpi_base.SET_SYSTEM_LOG('元素取值错误','配置的SQl执行报错,结果返回默认值'||ls_SJ_SQL);
--#######临时注释########################################################################
--dbms_output.put_line('ELE_ID: ' || as_ele_id || ls_ele_name ||
--' SQl执行报错或没有取得 默认值 SQL:' || ls_SJ_SQL);
ln_RESULT := ln_defaultvalue;
END; END IF;
end if;
RETURN round(nvl(ln_RESULT, 0), 3);
END GET_BOELEMENT; --代码保留
--begin
/*loop
exit when instr(v_GS,'[#')=0;
v_pa:=substr(v_GS,instr(v_GS,'[#')+2,instr(v_GS,'#]')-instr(v_GS,'[#')-2);
select CSTQFF into v_temp from tech_device_base_para_day_t where upper(CSDM)=upper(v_pa) and rownum=1; v_GS:=replace(v_GS,'[#'||v_pa||'#]',v_temp);
end loop;*/ --取实际值过程 /* --SQL例子
(
select sum(mesfctrafmval)
from mb_zbsj_v
where mes_fctr_id ='26'
and mtrl_id='1540015'
and tzzdm='Z5YS0307'
and begtime=last_day(add_months('{#KSSJ#}', -1))
and endtime=last_day('{#KSSJ#}')-1
and id='431'
)*/ /* v_GS:=replace(v_GS,'{#KSSJ#}',p_rq);*/ --ls_SQL:='select '||ls_SJ_SQL||' from dual'; --execute immediate ls_SQL into ln_RESULT; --dbms_output.put_line(v_SQL,4000);
-- EXCEPTION
-- WHEN TOO_MANY_ROWS or ZERO_DIVIDE then
-- Result:=999.99;
--WHEN OTHERS THEN
-- Result:=0;
--end; --==================================================================== function KPI_SplitElementEx(P_STRING IN VARCHAR2, as_date IN VARCHAR2)
return NUMBER is
--分解结构[#x#]*常量+[#y#].......公式,并置换为所需要的数值,完成绩效指标公式的运算。函数使用字符串分解办法进行
--Fantasy_Van 2011.6.30
--V_POS为需要的变量[#x#],而后下一个函数对该变量进行处理,取得所需要的数值并返回,置换出原有的内容,V_POS_MID为取得的数值
--E: [#111#]+[#222#]经过置换后成为: 23.12+[#222#]
Result NUMBER;
ls_date VARCHAR2(20);
V_POS VARCHAR2(2000);
V_POS_MID VARCHAR2(2000);
iPosHead INT := 1;
iPosEnd INT := 0;
V_ResultEnd LONG;
ln_num NUMBER;
i INT := 0;
L_STRING VARCHAR2(2000);
BEGIN
--参数处理
IF as_date IS NULL THEN
ls_date := GET_KPI_DATE();
ELSE
ls_date := as_date;
END IF; L_STRING := P_STRING;
IF Length(L_STRING) > 0 THEN
LOOP
SELECT INSTR(L_STRING, '[#') Into iPosHead FROM dual;
SELECT INSTR(L_STRING, '#]') - INSTR(L_STRING, '[#') + 2
Into iPosEnd
FROM dual;
if iPosHead < 1 THEN
EXIT;
END IF;
SELECT substr(L_STRING, iPosHead, iPosEnd) Into V_POS FROM dual;
V_POS_MID := KPI_SplitElementGetRS(V_POS, ls_date);
L_STRING := REPLACE(L_STRING, V_POS, V_POS_MID);
END LOOP;
END IF;
V_ResultEnd := L_STRING;
IF Length(L_STRING) = 0 THEN
V_ResultEnd := '';
END IF; BEGIN V_ResultEnd := 'SELECT ' || V_ResultEnd || ' FROM dual';
Dbms_Output.Put_Line(V_ResultEnd);
BEGIN
execute immediate V_ResultEnd
into ln_num;
EXCEPTION
WHEN OTHERS THEN
ln_num := -9999;
END;
RETURN ln_num; END;
end KPI_SplitElementEx; function KPI_SplitElementGetRS(as_V_POS IN VARCHAR2, as_date IN VARCHAR2)
return VARCHAR2 is
--取得所需要的元素的数值 Fantasy_Van 2011-6.30
Result VARCHAR2(2000);
ELEM_ID_RESSULT VARCHAR2(2000);
L_V_POS VARCHAR2(2000);
V_POS_MID VARCHAR2(2000);
iHead INT := 0;
iEnd INT := 0;
v_exist int := 0;
BEGIN
BEGIN
L_V_POS := as_V_POS;
SELECT INSTR(L_V_POS, '[#') Into iHead FROM dual;
SELECT INSTR(L_V_POS, '#]') Into iEnd FROM dual;
V_POS_MID := SUBSTR(L_V_POS, iHead + 2, iEnd - iHead - 2); --元素取值
select count(1)
into v_exist
FROM kpi_manager_boelement_result t
WHERE t.er_month = as_date
AND t.ele_id = V_POS_MID; --当kpi_manager_boelement_result表中没有此元素时,取元素表中的默认值
--出现场景:新增指标和元素
if v_exist <> 0 then
SELECT t.er_value
INTO ELEM_ID_RESSULT
FROM kpi_manager_boelement_result t
WHERE t.er_month = as_date
AND t.ele_id = V_POS_MID;
else
select nvl(e.defaultvalue, 0)
into ELEM_ID_RESSULT
from kpi_manager_boelement e
where e.ele_id = V_POS_MID;
end if; EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(Sqlerrm(SQLCODE));
END; Result := nvl(ELEM_ID_RESSULT, 0);
return Result;
EXCEPTION
WHEN OTHERS THEN
return 0; end KPI_SplitElementGetRS; --====================================================================
--定时取指标实际值计划值
--=-=-==-=-=-=-=-------------------------------
PROCEDURE KERNEL_TARGET_DATA_MAIN(AS_MONTH IN VARCHAR2) AS
--定义一 LS_MONTH VARCHAR2(20);
BEGIN
DBMS_OUTPUT.ENABLE(10000000);
--参数处理
IF LS_MONTH IS NULL THEN
LS_MONTH := GET_KPI_DATE();
ELSE
LS_MONTH := AS_MONTH;
END IF; /* 1 原BO新增加 量化指标 的处理。
仿照訾海原程序中写入各种表数据
2 公式计算模块
调用GET_SPLITE_ELEMENT_EX 分解公式字符串,并返回元素的值
实现每月kpi_kernel_target_data 表中量化指标的数据的生成
*/ BEGIN
--更新标记
UPDATE kpi_manager_boresult t SET t.useflag = ''; --写入新数据
INSERT INTO kpi_manager_boresult
(BORESULTID,
TARGET_CODE,
TARGET_NAME,
BODATA,
BODATA2,
BOGETDATE,
USEFLAG,
update_date)
SELECT seq_kpi_manager_boresult.nextval,
t.target_id,
TARGET_NAME,
decode(FORMULA,
NULL,
0,
KPI_SplitElementEx(FORMULA, LS_MONTH)) VALUE_DATA, --实际值
decode(FORMULA2,
NULL,
0,
KPI_SplitElementEx(FORMULA2, LS_MONTH)) VALUE_PLAN, --计划值
pack_kpi_base.F_GET_BYM(LS_MONTH) REC_MONTH,
'',
SYSDATE
FROM kpi_kpimodel_kpitarget T
WHERE T.TARGET_TYPE = 0
AND T.TARGET_USEFLAG = 0
AND t.target_name <> '专项指标'; --更新标准值
UPDATE kpi_kpimodel_kpitarget t
SET t.standardvalue = decode(t.FORMULA2,
NULL,
0,
KPI_SplitElementEx(t.FORMULA2, LS_MONTH))
WHERE T.TARGET_TYPE = 0
AND T.TARGET_USEFLAG = 0
AND t.target_name <> '专项指标'; COMMIT; EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
dbms_output.put_line('定时取指标实际值计划值' || SQLERRM(SQLCODE));
END; END KERNEL_TARGET_DATA_MAIN;
--=================================================================================
--====================================================================
procedure KPI_VIEW_TARGET --集团指标取数(月完成)
as
var_TID NUMBER;
val_T_SQL varchar2(500);
val_source number;
val_result varchar2(50);
var_date varchar2(10); --表级循环,需要用游标
target_row KPI_VIEW_TARGET_SQL_T%rowtype; cursor rows is
select * from KPI_VIEW_TARGET_SQL_T; begin
var_date := GET_KPI_DATE(); --获取日期
--循环执行sql
for target_row in rows loop
val_T_SQL := target_row.t_sql;
val_source := target_row.source;
var_TID := target_row.tid;
if (val_source = 0 and val_T_SQL <> null) then
val_result := PACK_KPI_BASE.EXECSQL_ALL(val_T_SQL, var_date);
--第一步:将获取到的数据插入到KPI_VIEW_TARGET_DATA_T表中
---删除当月原有数据
delete KPI_VIEW_TARGET_DATA_T t
where t.tid = var_TID
and t.tdate = var_date;
commit;
---新增获取到的当月月完成的数据
insert into KPI_VIEW_TARGET_DATA_T
(TTID, TID, TYWC, TDATE)
values
((select nvl(max(a.TTID), 0) + 1 from KPI_VIEW_TARGET_DATA_T a),
var_TID,
val_result,
var_date);
commit;
--第二步:更新KPI_VIEW_TARGET_SQL_T表中的取数时间,为当前时间 update KPI_VIEW_TARGET_SQL_T b
set b.tgetdate = to_char(sysdate, 'yyyy-mm-dd hh:mm:ss am');
commit; end if; end loop;
end KPI_VIEW_TARGET; /* \*
=============================================================
过程名:(Insert_JHZ_ToJHFluTable)
作用 :将元素计划值,从元素结果表
(kpi_manager_boelement_result)
中,提取出来放到计划值审批流程表
(KPI_FLU_FLOW_RESULT_NEW)中 参数:as_date--从元素结果表中取数的日期,格式为‘yyyy-MM’;
=============================================================
*\ procedure Insert_JHZ_ToJHFluTable(as_date IN VARCHAR2) as ls_date varchar2(20);
ele_row kpi_JHZ_V%rowtype; --计划值行 cursor rows_JHZ is --计划值游标
select * from kpi_JHZ_V t where t.er_month = ls_date; begin
DBMS_OUTPUT.ENABLE(10000000); IF as_date IS NULL THEN
ls_date := GET_KPI_DATE();
ELSE
ls_date := as_date;
END IF; --循环元素结果表【kpi_manager_boelement_result】
for ele_row in rows_JHZ loop
--插入到计划值审批流程表中
InsertOne_JHZ_ToJHFluTable(ele_row.ele_id,
0,
ele_row.er_value,
ele_row.element_name,
ele_row.er_month); end loop;
dbms_output.put_line('执行成功!');
exception
when others then
rollback;
dbms_output.put_line(sqlerrm); end Insert_JHZ_ToJHFluTable; --单个计划值插入
procedure InsertOne_JHZ_ToJHFluTable(as_TARGET_ID in varchar2,
as_VALUE_PLAN in varchar2,
as_VALUE_DATA in varchar2,
as_REC_REASON in varchar2,
as_REC_MONTH in varchar2) as v_P_INSTID number; --保存流程实例号的最大值
v_Has number; --当本月本元素已有数据,不再执行插入操作,0-没有数据;1-有数据
v_result_Id number; --保持KPI_FLU_FLOW_RESULT_NEW和KPI_FLU_FLOW_RESULT_NEW_OLD的ID保持一致。便于查询
begin
--当本月本元素已有数据,不再执行插入操作
v_Has := 0; -- 0-没有数据
select count(*)
into v_Has
from KPI_FLU_FLOW_RESULT_NEW t
where t.target_id = as_TARGET_ID
and t.rec_month = as_REC_MONTH; if v_Has = 0 then
--第一:从流程控制表【KPI_FLU_PROCESS_NEW】中获取最大的流程实例号
select (nvl(max(P_INSTID), 0) + 1)
into v_P_INSTID
from KPI_FLU_PROCESS_NEW; --第二:向流程控制表【KPI_FLU_PROCESS_NEW】中添加数据
insert into KPI_FLU_PROCESS_NEW
(P_ID, P_INSTID, P_WCODE, P_CURRENT)
values
(
--(select nvl(max(P_ID),0)+1 from KPI_FLU_PROCESS_NEW)
SEQ_KPI_FLU_PROCESS.NEXTVAL,
v_P_INSTID,
1 --工作项编码,1:表示专业提交
,
1 --当前状态为1,表示可用
); --第三:向流程数据表【KPI_FLU_FLOW_RESULT_NEW】中添加数据 select SEQ_KPI_FLU_FLOW_RESULT.NEXTVAL into v_result_Id from dual; insert into KPI_FLU_FLOW_RESULT_NEW
(ID,
FLOW_ID,
TARGET_ID,
VALUE_PLAN,
VALUE_DATA,
REC_REASON,
UPDATE_DATE,
FLOW_DESC,
REC_MONTH)
values
(
--(select nvl(max(ID),0)+1 from KPI_FLU_FLOW_RESULT_NEW)
v_result_Id,
v_P_INSTID,
as_TARGET_ID,
as_VALUE_PLAN,
as_VALUE_DATA,
as_REC_REASON,
sysdate,
1 --FLOW_DESC:状态描述
,
as_REC_MONTH); --第四:向流程数据原始表【KPI_FLU_FLOW_RESULT_NEW_OLD】中添加数据 insert into KPI_FLU_FLOW_RESULT_NEW_OLD
(ID,
FLOW_ID,
TARGET_ID,
VALUE_PLAN,
VALUE_DATA,
REC_REASON,
UPDATE_DATE,
FLOW_DESC,
REC_MONTH)
values
(v_result_Id,
v_P_INSTID,
as_TARGET_ID,
as_VALUE_PLAN,
as_VALUE_DATA,
as_REC_REASON,
sysdate,
1 --FLOW_DESC:状态描述
,
as_REC_MONTH); commit;
end if; dbms_output.put_line('执行成功!');
exception
when others then
rollback;
dbms_output.put_line(sqlerrm); end InsertOne_JHZ_ToJHFluTable; \*
================================================
过程:kpi_BackToELeResultTable 作用:将审批通过的元素计划值,覆盖到元素结果表
【kpi_manager_boelement_result】中 参数:as_date--覆盖元素结果表中数据的考核日期,
格式为‘yyyy-MM’;
================================================
*\
procedure kpi_BackToELeResultTable(as_date in varchar2) as
ls_date varchar2(20);
begin DBMS_OUTPUT.ENABLE(10000000); IF as_date IS NULL THEN
ls_date := GET_KPI_DATE();
ELSE
ls_date := as_date;
END IF; merge into kpi_manager_boelement_result t1
using
(
select
t2.TARGET_ID,
t2.VALUE_DATA,
t2.REC_MONTH
from KPI_FLU_FLOW_RESULT_NEW_V t2
where t2.s_code=8
) t3
on(t1.ele_id||t1.er_month=t3.TARGET_ID||ls_date) when matched then
update
set t1.er_value=t3.value_data
where t1.ele_id=t3.target_id
and t1.er_month=t3.rec_month; commit;
dbms_output.put_line('执行成功!');
exception
when others then
rollback;
dbms_output.put_line(sqlerrm); end kpi_BackToELeResultTable;*/ /*
--2012-2-6
--计算指标得分创新度和努力度由原来的一个段匹配,更改为多段累加
--政工需求
--起征点:有区间这种情况,例如:0-5之间不加分也不减分
*/
FUNCTION Get_OneTarget_Score_NEW(as_TARSYS_id IN VARCHAR2,
as_bodata NUMBER) RETURN NUMBER AS LS_BOTTOM NUMBER; --记录起征点下限
LS_UPPER NUMBER; --记录起征点上限 bottom number; --当下限为-9999时,返回的是定值,不用累加
upper number; --当上限为999999时,返回的是定值,不用累加
--返回值
LN_RESULT NUMBER; BEGIN
BEGIN
LS_BOTTOM := 0;
LS_UPPER := 0;
LN_RESULT := 0; -- 第一步:判断是否在极限区间(-9999-xx;xx-999999)
begin
select t.tarsys_bottom, t.tarsys_upper
into bottom, upper
from kpi_kpimodel_targetsystem t
WHERE t.p_tarsys_id = as_TARSYS_id
and t.tarsys_bottom <= as_bodata
and t.tarsys_upper > as_bodata; EXCEPTION
WHEN OTHERS THEN
bottom := -9999;
upper := -9999;
END; IF bottom = -9999 OR upper = 999999 THEN
begin
select t.tarsys_score
into LN_RESULT
from kpi_kpimodel_targetsystem t
WHERE t.p_tarsys_id = as_TARSYS_id
and t.tarsys_bottom <= as_bodata
and t.tarsys_upper > as_bodata; EXCEPTION
WHEN OTHERS THEN
LN_RESULT := -9999;
end;
ELSE
--获取“起征点”
BEGIN
select t.tarsys_bottom, t.tarsys_upper
into LS_BOTTOM, LS_UPPER
from kpi_kpimodel_targetsystem t
WHERE t.p_tarsys_id = as_TARSYS_id
and t.tarsys_score = 0;
EXCEPTION
WHEN OTHERS THEN
LS_BOTTOM := -9999;
LS_UPPER := -9999;
END; --无法获取起征点,则结果返回-9999
IF LS_BOTTOM = -9999 and LS_UPPER = -9999 THEN
LN_RESULT := -9999; --返回值为-1特殊值,说明表中参数设置有错误。 ELSE
--算法
IF as_bodata >= LS_UPPER THEN
--新算法,适合累进计算部分
BEGIN
select sum(DECODE(DECODE(SIGN(as_bodata - T.TARSYS_UPPER),
0,
1,
1,
1,
-1,
-1),
1, --大于上限
(DECODE(DECODE(sign(t.tarsys_step),
0,
0,
1,
1,
-1,
1),
0, --步长为0,就直接返回得分
t.tarsys_score,
1,
(T.TARSYS_UPPER - T.TARSYS_BOTTOM) /
T.TARSYS_STEP * T.TARSYS_SCORE)),
-1, --小于上限
(decode(DECODE(sign(t.tarsys_step),
0,
0,
1,
1,
-1,
1),
0, --步长为0,就直接返回得分
t.tarsys_score,
1,
(as_bodata - T.TARSYS_BOTTOM) /
T.TARSYS_STEP * T.TARSYS_SCORE)) )) as C_SCORD
into LN_RESULT
FROM kpi_kpimodel_targetsystem T WHERE T.p_tarsys_id = as_TARSYS_id
and t.tarsys_bottom >= LS_UPPER
and t.tarsys_bottom <= as_bodata
ORDER BY T.TARSYS_UPPER; EXCEPTION
WHEN OTHERS THEN
LN_RESULT := -9998;
END; END IF; IF as_bodata < LS_BOTTOM THEN
--累减
BEGIN
select sum(DECODE(DECODE(SIGN(as_bodata - T.TARSYS_BOTTOM),
0,
1,
1,
1,
-1,
-1),
1, --大于下限
(DECODE(DECODE(sign(t.tarsys_step),
0,
0,
1,
1,
-1,
1),
0, --步长为0,就直接返回得分
t.tarsys_score,
1,
(T.TARSYS_UPPER - as_bodata) /
(-T.TARSYS_STEP) * T.TARSYS_SCORE)),
-1, --小于下限
(DECODE(DECODE(sign(t.tarsys_step),
0,
0,
1,
1,
-1,
1),
0, --步长为0,就直接返回得分
t.tarsys_score,
1,
(T.TARSYS_UPPER - T.TARSYS_BOTTOM) /
(-T.TARSYS_STEP) * T.TARSYS_SCORE)))) as C_SCORD into LN_RESULT
FROM kpi_kpimodel_targetsystem T WHERE T.p_tarsys_id = as_TARSYS_id
and t.tarsys_upper <= LS_BOTTOM
and t.tarsys_upper > as_bodata
ORDER BY T.TARSYS_UPPER; EXCEPTION
WHEN OTHERS THEN
LN_RESULT := -9997;
END; END IF; END IF;
end if;
END;
RETURN LN_RESULT;
END Get_OneTarget_Score_NEW;
PROCEDURE KERNEL_TARGET_ALL_XS(AS_YEAR IN VARCHAR2) AS
--一年调用一次 写入每月的系数
intI NUMBER;
strMid varchar2(20);
BEGIN
FOR intI in 1 .. 12 LOOP
if intI < 10 then
select AS_YEAR || '-0' || to_char(intI) into strMid from dual;
else
select AS_YEAR || '-' || to_char(intI) into strMid from dual;
end if;
INSERT INTO KPI_PPXH_ALL_UNIT_T T
(T.TID, t.TYEARMONTH, t.TVALUES)
VALUES
(KPI_NDXH_TID.NEXTVAL, strMid, 1);
COMMIT;
end LOOP; END KERNEL_TARGET_ALL_XS; /*利润排名*/
procedure KPI_LR_SJ_PM(as_month varchar2) as
ls_ele_name varchar2(200); --利润元素排名的元素名称
ls_up_ele_name varchar2(200); --需要更新数值的元素
begin
ls_ele_name := '实际利润实际值'; --参与排名的元素
ls_up_ele_name := '实际利润排名'; --需要更新数值的元素 --更新排名默认值
update KPI_MANAGER_BOELEMENT a
set a.defaultvalue =
(select t.pm
from (select t1.department_id,
t1.department_name,
t1.target_name,
t2.bodata sj_value,
rank() over(order by report_month, abs(round((case
when sign(nvl(t2.bodata,
0)) > 0 then
t2.bodata
end), 3)) desc) pm
from KPI_KPITARGET_PREDICT_V t1,
kpi_manager_boresult_report t2
WHERE t1.target_id = t2.target_id
and nvl(weight_scale, 0) = 0
and t1.p_department_id=42
and t1.target_name in
('利润', '利润(实际)', '实际利润')
and nvl(t2.bodata, 0) > 0
and t2.report_month = as_month) t
where a.dep_id = t.department_id)
where a.element_name = ls_up_ele_name;
commit; --更新元素结果表
update kpi_manager_boelement_result r
set r.er_value =
(select a.defaultvalue
from KPI_MANAGER_BOELEMENT a
where a.element_name = ls_up_ele_name
and a.ele_id = r.ele_id)
where r.er_month = as_month
and r.ele_id in (select b.ele_id
from KPI_MANAGER_BOELEMENT b
where b.element_name = ls_up_ele_name); commit; end KPI_LR_SJ_PM; /*利润预算准确率排名*/
procedure KPI_LR_YSZQL_PM(as_month varchar2) as ls_up_ele_name varchar2(200); --需要更新数值的元素
begin ls_up_ele_name := '利润预算准确率排名'; --需要更新数值的元素 --更新排名默认值
update KPI_MANAGER_BOELEMENT a
set a.defaultvalue =
(select t.pm
from (select t1.department_id,
t1.department_name,
t2.bodata2 plan_value,
t2.bodata sj_value,
t1.weight_scale,
abs(round(pack_kpi_base.F_GET_CFYS(t2.bodata -
t2.bodata2,
t2.bodata2) * 100,
3)) yszql,
rank() over(order by report_month, abs(round((case
when nvl(t2.bodata2,
0) <> 0 then
pack_kpi_base.F_GET_CFYS(t2.bodata -
t2.bodata2,
t2.bodata2) * 100
end), 3)) asc) pm
from KPI_KPITARGET_PREDICT_V t1,
kpi_manager_boresult_report t2
WHERE t1.target_id = t2.target_id
and nvl(weight_scale, 0) <> 0
and t1.p_department_id=42
and t1.target_name like '利润%'
and report_month = as_month) t
where a.dep_id = t.department_id)
where a.element_name = ls_up_ele_name;
commit; --更新元素结果表
update kpi_manager_boelement_result r
set r.er_value =
(select a.defaultvalue
from KPI_MANAGER_BOELEMENT a
where a.element_name = ls_up_ele_name
and a.ele_id = r.ele_id)
where r.er_month = as_month
and r.ele_id in (select b.ele_id
from KPI_MANAGER_BOELEMENT b
where b.element_name = ls_up_ele_name); commit; end KPI_LR_YSZQL_PM;
END PACK_KPI_KERNEL;
/
Oracle存储过程(包:PACK_KPI_KERNEL For YS三度评价体系)的更多相关文章
- Oracle 存储过程包(Package、Package Body)
初出茅庐,不知原来存储过程还可以写得如此复杂,而且还竟然可以调试! 好吧,得整理一下存储过程的一些语法,以备以后用到时可以查阅. 使用数据库:Oracle 数据库工具:PL/SQL Developer ...
- oracle 存储过程 包 【转】
一.为什么要用存储过程? 如果在应用程序中经常需要执行特定的操作,可以基于这些操作简历一个特定的过程.通过使用过程可以简化客户端程序的开发和维护,而且还能提高客户端程序的运行性能. 二.过程的优点? ...
- oracle存储过程及sql优化-(三)
接下来介绍上篇接触到的存储过程中的sql语句 insert into TMP_GT3_sbfgl_WJSTJB SELECT NSR.NSRSBH, NSR.NSRMC, NSR.SCJYDZ, ca ...
- Oracle 存储过程包
create or replace package body cuttoship_lots is procedure prod_run(p_w_day date) as begin delete cu ...
- Oracle 存储过程异常处理
Oracle 存储过程异常处理 1.异常的优点 如果没有异常,在程序中,应当检查每个命令的成功还是失败,如 BEGIN SELECT ... -- check for ’no data f ...
- oracle存储过程实例
oracle存储过程实例 分类: 数据(仓)库及处理 2010-05-03 17:15 1055人阅读 评论(2)收藏 举报 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的P ...
- 用java调用oracle存储过程总结(转)
//1.call+包名+存储过程名(传入.传出值用?) String str="{call SMSBUSINESS.deleteZhZMember(?,?,?)}"; //2.建立 ...
- [转]使用ADO.NET访问Oracle存储过程
本文转自:http://www.cnblogs.com/datasky/archive/2007/11/07/952141.html 本文讨论了如何使用 ADO.NET 访问 Oracle 存储过程( ...
- oracle存储过程的例子
oracle存储过程的例子 分类: 数据(仓)库及处理 2010-05-03 17:15 1055人阅读 评论(2)收藏 举报 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的 ...
随机推荐
- PyCharm将选中的内容加上引号
正常情况下,选中一段内容,再按引号,内容会被替换为引号 想要将选中的内容不被替换为引号,而在内容的两端加上引号,只需设置一下即可 File --> Settings --> Edi ...
- docker 私有registry harbor安装
一,harbor安装: 参考:Installation and Configuration Guide 1,安装docker 2,安装docker compose sudo curl -L " ...
- 【西北师大-2108Java】期中成绩汇总
[西北师大-2108Java]期中成绩汇总 作业成绩 2018软件工程 得分排行 千帆竞发图 得分明细 学号 博客 博客 总分 201571030325 325 60 201571030332 htt ...
- CF53E Dead Ends
CF53E Dead Ends 洛谷评测传送门 题目描述 Life in Bertown has become hard. The city has too many roads and the go ...
- asp.net的原理
Asp.net的作业流是指什么?很多人都不是很了解,也不知道是用来干什么的有怎样运用,其实能够从简略的基础了解. 作业流(Workflow),便是“事务进程的部分或全体在核算机使用环境下的主动化”(i ...
- Redis思维导图
Redis基本数据结构 1.String 1.1 数据结构 long len byte数组长度 long free 可用数组长度 char buff[] 数据内容 1.2 命令 键值:设置值通过字符串 ...
- 微服务SpringCloud项目架构搭建入门
Spring的微服务框架SpringCloud受到众多公司欢迎,给大家带来一篇框架搭建入门.本次采用的版本是Spring Cloud版本为Finchley.RELEASE. 一.SpringCloud ...
- C++ day01-C++的函数和对象
C++的函数和对象 1.1 1 混合型语言 c++以.cpp为文件扩展名,有且只有一个名为main的主函数,因保留了这个面向过程的主函数,所以被称为混合语言 2 注释方式 . C++的注释方式有两种, ...
- Django之Django简介,开发环境搭建,项目应用创建
软件及Django框架简介 软件框架 一个软件框架是由其中各个软件模块组成的: 每一个模块都有特定的功能: 模块与模块之间通过相互配合来完成软件的开发. 软件框架是针对某一类软件设计问题而产生的. M ...
- AllowsTransparency="True" 怎么放大缩小窗体
后台都不用写任何代码! xaml: <Window x:Class="TestNoBorderWindow" xmlns="http://schem ...