1、书接上回
在第一篇《关于在财务月结的标准事务码中获取执行结果的增强》中,介绍了在KSS2/CON2/KSII中获取执行完结果的增强,本篇文章继续介绍获取财务月结标准事务代码执行结果的增强和相关处理。
2、KKAO
2.1、多服务器调用

此处需要勾选后台处理后,在对应的弹框中输入作业和服务器组,因此不能使用submit,需要用BDC录屏调用事务代码
但因为通过标准后台作业执行,不能通过常规手段获取执行结果,也不能ABAP内存抛数据(因为不在同一个External Session中),所以需要找增强,通过SAP内存进行传值
仍然是在调用前先抛内存

执行完BDC后等待后台作业执行结束
REFRESH gt_messtab[].CALL TRANSACTION 'KKAO' USING gt_bdcdataMODE gv_ctumodeUPDATE gv_updmodeMESSAGES INTO gt_messtab."等待KKAO标准后台作业结束CLEAR:lv_exit.DO.WAIT UP TO 1 SECONDS."查找作业执行状态CLEAR:ls_tbtco.SELECT SINGLEstatusstrtdatestrttimeenddateendtimeFROM tbtcoINTO ls_tbtcoWHERE jobname = lv_name."AND jobcount = lv_number."R 活动的(运行中) Y 就绪的 P 已调度的 S 已释放 A 已取消(出错终止) F 已完成(结束) Z Released/Susp.(无中文)IF ls_tbtco-status = 'A' OR ls_tbtco-status = 'F'." EXIT.ENDIF.ENDDO.
2.2、ALV
相同的原理,在ALV输出前,将内表抛内存

之后在主程序中获取ALV内存结果
"获取ALV内存传值DELETE FROM SHARED BUFFER indx(aa) ID 'ZKKAO'.IMPORT t_auftlst[] FROM SHARED BUFFER indx(aa) ID 'ZNEFI_KKAO_ALV'.DELETE FROM SHARED BUFFER indx(aa) ID 'ZNEFI_KKAO_ALV'.
2.3、MESSAGE
消息获取仍然是在CM_F_INFO中

3、CKMVFM
3.1、默认显示
值流监控器不能通过BDC的方式进行调用,录屏时无法进入下层的ALV界面,所以需要使用SUBMIT。

而执行结果中,需要默认“货币/评估”为集团货币,“查看”为FM物料清单,这样主程序才能通过cl_salv_bs_runtime_info=>get_data_ref获取对应的ALV数据。因此需要对这两处做默认值增强

其中集团货币直接修改值即可,但是物料清单在标准代码中是获取了内存值,所以索性直接用SET PARAMETER覆盖内存中的值,让后续获取到的值为物料清单

3.2、后台处理
标准代码中,如果后台执行CKMVFM,则直接跳过了ALV的显示,导致无法获取ALV的值。而CKMVFM中后台运算结果和ALV展示的数据又经过了复杂的逻辑运算,两者不相同,所以最好的方式还是要获取ALV展示的内表数据。
此处没有找到更加丝滑的解决办法,只能在标准逻辑中插入一段代码,将ALV展示前的用于计算的子例程拷贝过来,获取最终要展示在ALV中的内表数据,并抛内存给主程序。

主程序中,如果是后台执行调用CKMVFM,则通过接内存方式获取ALV数据;如果是前台调用,则直接通过cl_salv_bs_runtime_info=>get_data_ref获取ALV数据

4、CKMLCP
4.1、创建成本核算运行
前台创建时,点击创建按钮,填入成本核算运行,期间,以及工厂

ECC中也可以调用函数CKML_RUN_ADMIN_INTERFACE
"--------------------@斌将军-------------------- DATA:lv_runtype TYPE ckmlrunperiod-run_type,lv_grahr TYPE ckmlrunperiod-gjahr,lv_poper TYPE ckmlrunperiod-poper.lv_grahr = gv_year.lv_poper = gv_mon.CALL FUNCTION 'CKML_RUN_ADMIN_INTERFACE'EXPORTINGwerks = p_werks "工厂run_type = p_run "成本核算运行last_day = p_bldat gjahr = lv_grahrpoper = lv_poper.DO 5 TIMES.SELECT SINGLErun_typeFROM ckmlrunperiodINTO lv_runtypeWHERE run_type = p_runAND last_day = p_bldatAND gjahr = gv_yearAND poper = gv_mon.IF lv_runtype IS NOT INITIAL.MESSAGE s005 WITH '成本运行创建'.EXIT.ENDIF.ENDDO.IF lv_runtype IS INITIAL.MESSAGE s006 WITH '成本运行创建'.ENDIF. "--------------------@斌将军--------------------
4.2、调用步骤
不同版本对应的流程步骤
ECC:

对应的程序
"--------------------@斌将军-------------------- 选择:saprckmlmv_run_basic_list 确定顺序:saprckmlmv_run_create_steps 单级处理确定:saprckma_run_settle 多级处理确定:saprckmlmv_run_mlevel_settle 消耗的重新评估:vnb_revaluate_sl_consumption 过帐清算:saprckma_run_close 标记物料价格:saprckm_prmt_run_type "--------------------@斌将军--------------------
S4:

对应的程序
"--------------------@斌将军-------------------- 选择:fcml4h_selection 准备:fcml4h_preprocessor 结算:fcml4h_settlement 过账关账:fcml4h_post_closing "--------------------@斌将军--------------------
以上步骤的执行显示界面,均可通过cl_salv_bs_runtime_info=>get_data_ref方式获取ALV数据
4.3、MESSAGE
各个步骤执行的结果,可以在函数中通过抛内存的方式获取到

4.4、解锁
4.4.1、CKMLCP解锁
在执行单级、多级处理确定和过账清算前,需要先点击界面上的锁进行解锁操作

可以复制标准解锁代码进行处理
"--------------------@斌将军-------------------- FORM frm_allow_pd.DATA:lt_run_va_with_period TYPE ckml_run_t_valarea_with_period,lf_run_va_with_period LIKE LINE OF lt_run_va_with_period,lt_va_with_period TYPE ckml_t_va_with_period,lf_va_with_period LIKE LINE OF lt_va_with_period,l_abrerl TYPE ml_abrerl,l_abserl TYPE ml_abserl.DATA:ip_runid TYPE ckmlrunperiod-run_id,ip_allow_pd TYPE boole_d, "allow Price Determ.ip_allow_pc TYPE boole_d,lv_bwkey TYPE bwkey,"评估范围lv_bdatj TYPE bdatj,"记帐日期 YYYYlv_poper TYPE poper."记帐期间. ip_allow_pd = 'X'."单级处理确定和多级处理确定中的锁 * ip_allow_pc = 'X'."过帐清算"查询成本运行的IDSELECT SINGLErun_id"成本核算运行编号FROM ckmlrunperiodINTO ip_runidWHERE run_type = p_run.IF sy-subrc NE 0.MESSAGE '未找到对应成本核算运行编号,不能解锁' TYPE 'E'.ENDIF. "---------------------------------调用标准解锁逻辑-------------------------------------"获取成本运行的数据CALL FUNCTION 'CKML_RUN_VALAREAS_GET'EXPORTINGi_run_id = ip_runid * I_RUN_TYPE = * I_LAST_DAY = * I_POPER = * I_GJAHR =i_appl = ' 'IMPORTINGet_valareas = lt_run_va_with_period * EXCEPTIONS * RUN_NOT_EXISTENT = 1 * OTHERS = 2 .* convert interfacesLOOP AT lt_run_va_with_period INTO lf_run_va_with_period.lf_va_with_period-bwkey = lf_run_va_with_period-bwkey.lf_va_with_period-bdatj = lf_run_va_with_period-gjahr.lf_va_with_period-poper = lf_run_va_with_period-poper.APPEND lf_va_with_period TO lt_va_with_period.ENDLOOP.* check if already allowedCALL FUNCTION 'CKML_ORG_M_FOR_MULTIPLE_VA_GET'EXPORTINGit_va_with_period = lt_va_with_periodIMPORTINGe_abrerl = l_abrerle_abserl = l_abserl.IF ( NOT ip_allow_pd IS INITIAL )AND ( NOT l_abrerl IS INITIAL ). "PD already allowedMESSAGE s834(c+).EXIT.ELSE. "do nothingENDIF.IF ( NOT ip_allow_pc IS INITIAL )AND ( NOT l_abserl IS INITIAL ). "PC already allowedMESSAGE s835(c+).EXIT.ELSEIF ( NOT ip_allow_pc IS INITIAL )AND ( l_abrerl IS INITIAL ). "PD not yet allowdMESSAGE e836(c+).ENDIF.* Check authorityLOOP AT lt_va_with_period INTO lf_va_with_period.AUTHORITY-CHECK OBJECT 'K_ML_VA'ID 'ACTVT' FIELD '45'ID 'BWKEY' FIELD lf_va_with_period-bwkey.IF sy-subrc <> 0.MESSAGE e813(c+) WITH lf_va_with_period-bwkey.ENDIF.ENDLOOP.LOOP AT lt_va_with_period INTO lf_va_with_period.CALL FUNCTION 'CKML_ORG_MEASURE_ALLOW'EXPORTINGi_allow_price_determination = ip_allow_pdi_allow_post_closing = ip_allow_pci_bwkey = lf_va_with_period-bwkeyi_poper = lf_va_with_period-poperi_bdatj = lf_va_with_period-bdatjEXCEPTIONS * NO_AUTHORITY = 1already_allowed = 0 * FIRST_ALLOW_PRICE_DETERM = 3 * OTHERS = 4 .IF sy-subrc EQ 0.COMMIT WORK AND WAIT.ENDIF.ENDLOOP. ENDFORM. "--------------------@斌将军--------------------
在以上代码中,通过成本运行查询到对应的ID,执行标准解锁的校验逻辑,最终在函数CKML_ORG_MEASURE_ALLOW中实现解锁。
其中单级、多级处理确定,同属于i_allow_price_determination参数控制,(简称为PD锁),两个步骤同时解锁。
过账清算,属于i_allow_post_closing参数控制,(简称为PC锁)。
函数CKML_ORG_MEASURE_ALLOW最终在表CKMLO中新增和修改对应的锁字段

效果如下

4.4.2、CK40N解锁
在执行标记动作时,需要先进行解锁

解锁的方式,略有不同。需要点击对应公司代码,保存成本核算变式

之后会在表FVMKLD中插入一条数据(S4),ECC版本会在FVMK表中插入数据

模拟系统标准的处理代码

在自定义逻辑中加入解锁功能,参考代码如下:
FORM frm_allow_marking.DATA:f_tck01 TYPE tck01,f_tck03 TYPE tck03,p_bukrs TYPE fvmk-bukrs,p_zukper TYPE fvmk-poper,p_zukges TYPE fvmk-bdatj,bewertungsvariante TYPE tck05-bwvar,kalkulationsversion TYPE keko-tvers,p_buper TYPE mbew-pprdz,p_gjahr TYPE mbew-pdatz,p_rldnr TYPE fins_ledger, * kalkulationsversion TYPE ck_tvers VALUE '01', * kalkulationsvariante TYPE ck_klvar VALUE 'PPC1',p_klvar TYPE tck03-klvar VALUE 'PPC1'."检查是否已经解锁CALL FUNCTION 'CK_F_TCK03_HIERARCHY_READING'EXPORTINGp_klvar = p_klvarIMPORTINGf_tck03 = f_tck03f_tck01 = f_tck01EXCEPTIONSOTHERS = 0.IF f_tck03 IS INITIAL.MESSAGE s487(ck) RAISING error_occured. * Bitte geben Sie eine vorhandene Kalkulationsvariante einf_tck01-valuation = 0.ENDIF.*get representative ledger if parallel accounting is not activeIF NOT cl_fml_toggle=>get_instance( )->is_ml_full_parall_actg_active( ).p_rldnr = cl_org_measure_service=>get_default_ml_ledger(EXPORTING iv_bukrs = p_bukrsiv_valutyp = f_tck01-valuationiv_valusubtyp = f_tck01-valusubtyp ).ENDIF.p_bukrs = p_werks.p_gjahr = p_zukges = p_ersda+0(4).p_buper = p_zukper = p_ersda+4(2).CALL FUNCTION 'CK_F_FVMKLD_READ'EXPORTINGp_bukrs = p_bukrsp_bdatj = p_zukgesp_poper = p_zukperp_rldnr = p_rldnrp_valuation = f_tck01-valuationp_valusubtyp = f_tck01-valusubtypIMPORTINGev_bwvar = bewertungsvarianteEXCEPTIONSnot_found = 1OTHERS = 2.IF sy-subrc = 0. * MESSAGE e185(ck) WITH p_zukper p_zukges p_bukrs * RAISING error_occured.RETURN."已经解锁就返回ENDIF."解锁 * organisatorische Maßnahme durchführen...CALL FUNCTION 'CK_F_ALLOW_MARKING'EXPORTINGp_bukrs = p_bukrsp_zukper = p_buperp_zukges = p_gjahrp_klvar = 'PPC1'p_tvers = '01'p_rldnr = ''EXCEPTIONSerror_occured = 01.IF sy-subrc EQ 0.MESSAGE s796(ck). ** Die Vormerkerlaubnis wurde erteilt... * * ** Die Werte Kalkulationsversion und Bewertungsariante muessen ** zurueckgeliefert werden, damit das ALV-TOOL die neu gesetzten Werte ** anzeigen kann... * CALL FUNCTION 'CK_F_TCK03_HIERARCHY_READING' * EXPORTING * P_KLVAR = KALKULATIONSVARIANTE * IMPORTING * F_TCK03 = F_TCK03. * * BEWERTUNGSVARIANTE = F_TCK03-BWVAR.ELSE.MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno WITHsy-msgv1sy-msgv2sy-msgv3sy-msgv4. * Bewertungsvariante wird initial zurückgeliefert, was bedeutet, * dass kein Update auf der Ausgabetabelle stattfindet...ENDIF. ENDFORM.
上述代码查询对应的成本核算运行是否已经解锁,如果解锁就退出,没有就最终调用函数CK_F_ALLOW_MARKING解锁。
以上就是本文档的全部内容,希望对你有所帮助
定期更文,欢迎关注
