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三度评价体系)的更多相关文章

  1. Oracle 存储过程包(Package、Package Body)

    初出茅庐,不知原来存储过程还可以写得如此复杂,而且还竟然可以调试! 好吧,得整理一下存储过程的一些语法,以备以后用到时可以查阅. 使用数据库:Oracle 数据库工具:PL/SQL Developer ...

  2. oracle 存储过程 包 【转】

    一.为什么要用存储过程? 如果在应用程序中经常需要执行特定的操作,可以基于这些操作简历一个特定的过程.通过使用过程可以简化客户端程序的开发和维护,而且还能提高客户端程序的运行性能. 二.过程的优点? ...

  3. oracle存储过程及sql优化-(三)

    接下来介绍上篇接触到的存储过程中的sql语句 insert into TMP_GT3_sbfgl_WJSTJB SELECT NSR.NSRSBH, NSR.NSRMC, NSR.SCJYDZ, ca ...

  4. Oracle 存储过程包

    create or replace package body cuttoship_lots is procedure prod_run(p_w_day date) as begin delete cu ...

  5. Oracle 存储过程异常处理

    Oracle 存储过程异常处理 1.异常的优点    如果没有异常,在程序中,应当检查每个命令的成功还是失败,如  BEGIN  SELECT ...  -- check for ’no data f ...

  6. oracle存储过程实例

    oracle存储过程实例 分类: 数据(仓)库及处理 2010-05-03 17:15 1055人阅读 评论(2)收藏 举报 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的P ...

  7. 用java调用oracle存储过程总结(转)

    //1.call+包名+存储过程名(传入.传出值用?) String str="{call SMSBUSINESS.deleteZhZMember(?,?,?)}"; //2.建立 ...

  8. [转]使用ADO.NET访问Oracle存储过程

    本文转自:http://www.cnblogs.com/datasky/archive/2007/11/07/952141.html 本文讨论了如何使用 ADO.NET 访问 Oracle 存储过程( ...

  9. oracle存储过程的例子

    oracle存储过程的例子 分类: 数据(仓)库及处理 2010-05-03 17:15 1055人阅读 评论(2)收藏 举报 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的 ...

随机推荐

  1. PyCharm将选中的内容加上引号

    正常情况下,选中一段内容,再按引号,内容会被替换为引号 想要将选中的内容不被替换为引号,而在内容的两端加上引号,只需设置一下即可 File  -->  Settings  -->  Edi ...

  2. docker 私有registry harbor安装

    一,harbor安装: 参考:Installation and Configuration Guide 1,安装docker 2,安装docker compose sudo curl -L " ...

  3. 【西北师大-2108Java】期中成绩汇总

    [西北师大-2108Java]期中成绩汇总 作业成绩 2018软件工程 得分排行 千帆竞发图 得分明细 学号 博客 博客 总分 201571030325 325 60 201571030332 htt ...

  4. CF53E Dead Ends

    CF53E Dead Ends 洛谷评测传送门 题目描述 Life in Bertown has become hard. The city has too many roads and the go ...

  5. asp.net的原理

    Asp.net的作业流是指什么?很多人都不是很了解,也不知道是用来干什么的有怎样运用,其实能够从简略的基础了解. 作业流(Workflow),便是“事务进程的部分或全体在核算机使用环境下的主动化”(i ...

  6. Redis思维导图

    Redis基本数据结构 1.String 1.1 数据结构 long len byte数组长度 long free 可用数组长度 char buff[] 数据内容 1.2 命令 键值:设置值通过字符串 ...

  7. 微服务SpringCloud项目架构搭建入门

    Spring的微服务框架SpringCloud受到众多公司欢迎,给大家带来一篇框架搭建入门.本次采用的版本是Spring Cloud版本为Finchley.RELEASE. 一.SpringCloud ...

  8. C++ day01-C++的函数和对象

    C++的函数和对象 1.1 1 混合型语言 c++以.cpp为文件扩展名,有且只有一个名为main的主函数,因保留了这个面向过程的主函数,所以被称为混合语言 2 注释方式 . C++的注释方式有两种, ...

  9. Django之Django简介,开发环境搭建,项目应用创建

    软件及Django框架简介 软件框架 一个软件框架是由其中各个软件模块组成的: 每一个模块都有特定的功能: 模块与模块之间通过相互配合来完成软件的开发. 软件框架是针对某一类软件设计问题而产生的. M ...

  10. AllowsTransparency="True" 怎么放大缩小窗体

    后台都不用写任何代码! xaml: <Window x:Class="TestNoBorderWindow"         xmlns="http://schem ...