关于在财务月结的标准事务码中获取执行结果的增强(二)

1、书接上回

在第一篇《关于在财务月结的标准事务码中获取执行结果的增强》中,介绍了在KSS2/CON2/KSII中获取执行完结果的增强,本篇文章继续介绍获取财务月结标准事务代码执行结果的增强和相关处理。

2、KKAO

2.1、多服务器调用

image

此处需要勾选后台处理后,在对应的弹框中输入作业和服务器组,因此不能使用submit,需要用BDC录屏调用事务代码

但因为通过标准后台作业执行,不能通过常规手段获取执行结果,也不能ABAP内存抛数据(因为不在同一个External Session中),所以需要找增强,通过SAP内存进行传值

仍然是在调用前先抛内存

image

执行完BDC后等待后台作业执行结束

  REFRESH gt_messtab[].
  CALL TRANSACTION 'KKAO' USING gt_bdcdata
        MODE gv_ctumode
        UPDATE gv_updmode
        MESSAGES INTO gt_messtab.

  "等待KKAO标准后台作业结束
  CLEAR:lv_exit.
  DO.

    WAIT UP TO 1 SECONDS.

    "查找作业执行状态
    CLEAR:ls_tbtco.
    SELECT SINGLE
      status
      strtdate
      strttime
      enddate
      endtime
    FROM tbtco
    INTO ls_tbtco
    WHERE 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输出前,将内表抛内存

image

之后在主程序中获取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中

image

3、CKMVFM

3.1、默认显示

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

image

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

image

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

image

3.2、后台处理

标准代码中,如果后台执行CKMVFM,则直接跳过了ALV的显示,导致无法获取ALV的值。而CKMVFM中后台运算结果和ALV展示的数据又经过了复杂的逻辑运算,两者不相同,所以最好的方式还是要获取ALV展示的内表数据。

此处没有找到更加丝滑的解决办法,只能在标准逻辑中插入一段代码,将ALV展示前的用于计算的子例程拷贝过来,获取最终要展示在ALV中的内表数据,并抛内存给主程序。

image

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

image

 4、CKMLCP

4.1、创建成本核算运行

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

image

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'
    EXPORTING
      werks    = p_werks "工厂
      run_type = p_run "成本核算运行
      last_day = p_bldat 
      gjahr    = lv_grahr
      poper    = lv_poper.

  DO 5 TIMES.
    SELECT SINGLE
      run_type
    FROM ckmlrunperiod
    INTO lv_runtype
    WHERE run_type = p_run
      AND last_day = p_bldat
      AND gjahr = gv_year
      AND 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:

image

对应的程序

"--------------------@斌将军--------------------
选择: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:

image

对应的程序

"--------------------@斌将军--------------------
选择:fcml4h_selection
准备:fcml4h_preprocessor
结算:fcml4h_settlement
过账关账:fcml4h_post_closing
"--------------------@斌将军--------------------

以上步骤的执行显示界面,均可通过cl_salv_bs_runtime_info=>get_data_ref方式获取ALV数据 

4.3、MESSAGE

各个步骤执行的结果,可以在函数中通过抛内存的方式获取到

image

4.4、解锁

4.4.1、CKMLCP解锁

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

image

可以复制标准解锁代码进行处理

"--------------------@斌将军--------------------
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,"记帐日期 YYYY
    lv_poper TYPE poper."记帐期间.

  ip_allow_pd = 'X'."单级处理确定和多级处理确定中的锁
*  ip_allow_pc = 'X'."过帐清算

  "查询成本运行的ID
  SELECT SINGLE
    run_id"成本核算运行编号
  FROM ckmlrunperiod
  INTO ip_runid
  WHERE run_type = p_run.
  IF sy-subrc NE 0.
    MESSAGE '未找到对应成本核算运行编号,不能解锁' TYPE 'E'.
  ENDIF.
"---------------------------------调用标准解锁逻辑-------------------------------------
  "获取成本运行的数据
  CALL FUNCTION 'CKML_RUN_VALAREAS_GET'
         EXPORTING
              i_run_id         = ip_runid
*           I_RUN_TYPE       =
*           I_LAST_DAY       =
*           I_POPER          =
*           I_GJAHR          =
              i_appl           = '    '
        IMPORTING
              et_valareas      = lt_run_va_with_period
*     EXCEPTIONS
*           RUN_NOT_EXISTENT = 1
*           OTHERS           = 2
              .

* convert interfaces
  LOOP 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 allowed
  CALL FUNCTION 'CKML_ORG_M_FOR_MULTIPLE_VA_GET'
    EXPORTING
      it_va_with_period = lt_va_with_period
    IMPORTING
      e_abrerl          = l_abrerl
      e_abserl          = l_abserl.

  IF  ( NOT ip_allow_pd IS INITIAL )
  AND ( NOT l_abrerl    IS INITIAL ).  "PD already allowed
    MESSAGE s834(c+).
    EXIT.
  ELSE.                                "do nothing
  ENDIF.

  IF  ( NOT ip_allow_pc IS INITIAL )
  AND ( NOT l_abserl    IS INITIAL ).  "PC already allowed
    MESSAGE s835(c+).
    EXIT.
  ELSEIF ( NOT ip_allow_pc IS INITIAL )
  AND    (     l_abrerl    IS INITIAL ).  "PD not yet allowd
    MESSAGE e836(c+).
  ENDIF.

* Check authority
  LOOP 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'
         EXPORTING
              i_allow_price_determination = ip_allow_pd
              i_allow_post_closing        = ip_allow_pc
              i_bwkey                     = lf_va_with_period-bwkey
              i_poper                     = lf_va_with_period-poper
              i_bdatj                     = lf_va_with_period-bdatj
         EXCEPTIONS
*             NO_AUTHORITY                = 1
              already_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中新增和修改对应的锁字段

image

效果如下

image

4.4.2、CK40N解锁

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

image

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

image

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

image

模拟系统标准的处理代码

image

在自定义逻辑中加入解锁功能,参考代码如下:

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'
    EXPORTING
      p_klvar = p_klvar
    IMPORTING
      f_tck03 = f_tck03
      f_tck01 = f_tck01
    EXCEPTIONS
      OTHERS  = 0.

  IF f_tck03 IS INITIAL.
    MESSAGE s487(ck) RAISING error_occured.
* Bitte geben Sie eine vorhandene Kalkulationsvariante ein
    f_tck01-valuation = 0.
  ENDIF.

*get representative ledger if parallel accounting is not active
  IF 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_bukrs
                                              iv_valutyp = f_tck01-valuation
                                              iv_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'
    EXPORTING
      p_bukrs      = p_bukrs
      p_bdatj      = p_zukges
      p_poper      = p_zukper
      p_rldnr      = p_rldnr
      p_valuation  = f_tck01-valuation
      p_valusubtyp = f_tck01-valusubtyp
    IMPORTING
      ev_bwvar     = bewertungsvariante
    EXCEPTIONS
      not_found    = 1
      OTHERS       = 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'
    EXPORTING
      p_bukrs       = p_bukrs
      p_zukper      = p_buper
      p_zukges      = p_gjahr
      p_klvar       = 'PPC1'
      p_tvers       = '01'
      p_rldnr       = ''
    EXCEPTIONS
      error_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 WITH
                                        sy-msgv1
                                        sy-msgv2
                                        sy-msgv3
                                        sy-msgv4.
* Bewertungsvariante wird initial zurückgeliefert, was bedeutet,
* dass kein Update auf der Ausgabetabelle stattfindet...
  ENDIF.
ENDFORM.         

上述代码查询对应的成本核算运行是否已经解锁,如果解锁就退出,没有就最终调用函数CK_F_ALLOW_MARKING解锁。

以上就是本文档的全部内容,希望对你有所帮助

定期更文,欢迎关注

 

posted @ 2025-12-24 10:50  斌将军  阅读(2)  评论(0)    收藏  举报