二维码

KO02内部订单关联结算规则

Twilight发表于 2025-04-22 21:24Twilight 最后回复于 2025-04-22 21:24 [复制链接] 23 0

没有标准bapi,可通过一系列函数和ABAP内存传递参数实现。

  1. *.COBRA-Buffer (see FM KOBS)
  2.   TYPES: BEGIN OF ty_cobra_buf.
  3.            INCLUDE STRUCTURE cobra.
  4.            TYPES:   uflag LIKE dkobr-upd_flag,
  5.          END OF ty_cobra_buf.
  6. *.COBRB-Puffer mit Änderungsflag (see FM KOBS)
  7.   TYPES: BEGIN OF ty_cobrb_buf.
  8.            INCLUDE STRUCTURE cobrb.
  9.            TYPES:   uflag LIKE dkobr-upd_flag,
  10.          END OF ty_cobrb_buf.
  11.   DATA:lt_ALV   TYPE TABLE OF ty_alv.
  12.   DATA:ls_alv   TYPE ty_alv.
  13.   DATA:lv_objnr TYPE cobra-objnr.
  14.   DATA:lt_objnr TYPE TABLE OF ionrb WITH HEADER LINE.
  15.   DATA:ls_cobra_buf TYPE ty_cobra_buf.
  16.   DATA:l_mem_cobra TYPE TABLE OF ty_cobra_buf.
  17.   DATA:ls_cobrb_buf TYPE ty_cobrb_buf.
  18.   DATA:l_mem_cobrb TYPE TABLE OF ty_cobrb_buf.
  19.   DATA:ls_cobra TYPE cobra,
  20.        lt_cobra TYPE TABLE OF cobra,
  21.        ls_cobrb TYPE cobrb,
  22.        lt_cobrb TYPE TABLE OF cobrb.

  23.   lt_alv[] = gt_alv[].
  24.   SORT lt_alv BY aufnr_as.
  25.   DELETE ADJACENT DUPLICATES FROM lt_alv COMPARING aufnr_as.

  26.   LOOP AT lt_alv INTO ls_alv.
  27.     CLEAR:lt_objnr[],lt_cobra[],lt_cobrb[],lv_objnr,l_mem_cobra[],l_mem_cobrb[].
  28.     lv_objnr = 'OR' && ls_alv-aufnr_as.

  29.     CLEAR:lt_objnr.
  30.     lt_objnr-objnr = lv_objnr.
  31.     APPEND lt_objnr.
  32.     CALL FUNCTION 'K_SRULE_PRE_READ'
  33.       TABLES
  34.         t_sender_objnr   = lt_objnr[]
  35.         t_cobra          = lt_cobra
  36.       EXCEPTIONS
  37.         wrong_parameters = 1
  38.         OTHERS           = 2.

  39. * Fill internal buffer with settlement rules
  40.     CALL FUNCTION 'K_SETTLEMENT_RULE_GET'
  41.       EXPORTING
  42.         objnr     = lv_objnr
  43.         x_all     = ' '
  44.       TABLES
  45.         e_cobra   = lt_cobra
  46.         e_cobrb   = lt_cobrb
  47.       EXCEPTIONS
  48.         not_found = 1
  49.         OTHERS    = 2.

  50.     IF lt_cobra[] IS INITIAL.
  51.       "create a new rule header
  52.       CALL FUNCTION 'K_SRULE_CREATE'
  53.         EXPORTING
  54.           i_objnr             = lv_objnr
  55.         IMPORTING
  56.           e_cobra             = ls_cobra
  57.         EXCEPTIONS
  58.           rule_already_exists = 1
  59.           OTHERS              = 2.
  60.       APPEND ls_cobra TO lt_cobra.
  61.     ENDIF.

  62. * Save settlement rule in ABAP-Memory
  63.     CALL FUNCTION 'K_SRULE_EXPORT_IMPORT'
  64.       EXPORTING
  65.         i_mode     = 'EX'
  66.       EXCEPTIONS
  67.         wrong_mode = 1
  68.         OTHERS     = 2.

  69. * Read ABAP-Memory
  70.     IMPORT l_mem_cobra l_mem_cobrb FROM MEMORY ID 'K_SRULE'."内存变量不能修改
  71.     CLEAR:l_mem_cobra,l_mem_cobrb.

  72.     "分配结算规则-抬头
  73.     LOOP AT lt_cobra INTO ls_cobra.
  74.       CLEAR:ls_cobra_buf.
  75.       MOVE-CORRESPONDING ls_cobra TO ls_cobra_buf.
  76.       APPEND ls_cobra_buf TO l_mem_cobra.
  77.     ENDLOOP.

  78.     "分配结算规则-行项目
  79.     LOOP AT gt_alv ASSIGNING FIELD-SYMBOL(<fs_alv>) WHERE aufnr_as = ls_alv-aufnr_as.
  80.       CLEAR:ls_cobrb_buf.
  81.       ls_cobrb_buf-objnr = lv_objnr.
  82.       ls_cobrb_buf-uflag = <fs_alv>-uflag.
  83.       ls_cobrb_buf-lfdnr = <fs_alv>-lfdnr.
  84.       ls_cobrb_buf-extnr = <fs_alv>-lfdnr.
  85.       ls_cobrb_buf-gabja = <fs_alv>-gabja."起始-年
  86.       ls_cobrb_buf-gabpe = <fs_alv>-gabpe."起始-月
  87.       ls_cobrb_buf-gbisj = <fs_alv>-gbisj."截止-年
  88.       ls_cobrb_buf-gbisp = <fs_alv>-gbisp."截止-月
  89.       ls_cobrb_buf-avorg = 'KOAO'."结算交易
  90.       ls_cobrb_buf-perbz = 'PER'. "总账科目
  91.       ls_cobrb_buf-prozs = <fs_alv>-rate. "比例
  92.       ls_cobrb_buf-konty = <fs_alv>-konty. "科目分配种类
  93.       ls_cobrb_buf-kokrs = <fs_alv>-kokrs. "成本控制范围
  94.       ls_cobrb_buf-werks = <fs_alv>-werks. "工厂
  95.       ls_cobrb_buf-gsber = <fs_alv>-gsber. "业务范围
  96.       ls_cobrb_buf-bukrs = <fs_alv>-bukrs. "公司代码
  97.       ls_cobrb_buf-kostl = <fs_alv>-kostl. "成本中心
  98.       ls_cobrb_buf-aufnr = <fs_alv>-aufnr_yf. "内部订单
  99.       IF <fs_alv>-konty = 'OR'.
  100.         ls_cobrb_buf-rec_objnr1 = 'OR' && <fs_alv>-aufnr_yf. "研发订单
  101.       ELSEIF <fs_alv>-konty = 'KS'.
  102.         ls_cobrb_buf-rec_objnr1 = 'KS' && <fs_alv>-kokrs && <fs_alv>-kostl.
  103.       ENDIF.
  104.       APPEND ls_cobrb_buf TO l_mem_cobrb.
  105.     ENDLOOP.

  106. * Clear internal buffer
  107.     CALL FUNCTION 'K_SETTLEMENT_RULE_REFRESH'
  108.       EXPORTING
  109.         objnr = lv_objnr.

  110. * Fill ABAP-Memory with new rules
  111.     EXPORT l_mem_cobra l_mem_cobrb TO MEMORY ID 'K_SRULE'.

  112. * Fill internal buffer with new rules
  113.     CALL FUNCTION 'K_SRULE_EXPORT_IMPORT'
  114.       EXPORTING
  115.         i_mode     = 'IM'
  116.       EXCEPTIONS
  117.         wrong_mode = 1
  118.         OTHERS     = 2.

  119. * Save new rules
  120.     CALL FUNCTION 'K_SETTLEMENT_RULE_SAVE'
  121.       EXPORTING
  122.         Dialog            = 'X'
  123.         objnr             = lv_objnr
  124.         i_status_update   = ' '
  125.       EXCEPTIONS
  126.         no_rule_for_objnr = 1
  127.         OTHERS            = 2.
  128.     IF sy-subrc = 0.
  129.       COMMIT WORK.
  130.       LOOP AT gt_alv ASSIGNING <fs_alv> WHERE aufnr_as = ls_alv-aufnr_as.
  131.         <fs_alv>-zid = icon_green_light.
  132.         <fs_alv>-zmessage = '结算规则创建成功'.
  133.       ENDLOOP.
  134.     ELSE.
  135.       ROLLBACK WORK.
  136.       LOOP AT gt_alv ASSIGNING <fs_alv> WHERE aufnr_as = ls_alv-aufnr_as.
  137.         <fs_alv>-zid = icon_red_light.
  138.         <fs_alv>-zmessage = '结算规则创建失败'.
  139.       ENDLOOP.
  140.     ENDIF.
  141.   ENDLOOP.
复制代码


回复

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表