二维码

[RFC] 销售订单结算规则-修改

Twilight发表于 2026-03-12 10:48Twilight 最后回复于 2026-03-12 10:48 [复制链接] 2 0

  1. FUNCTION zsdfm036.
  2. *"----------------------------------------------------------------------
  3. *"*"本地接口
  4. *"  IMPORTING
  5. *"     VALUE(I_VBELN) TYPE  VBELN_VA
  6. *"  EXPORTING
  7. *"     VALUE(E_MESSAGE) TYPE  ZOTS001
  8. *"  TABLES
  9. *"      T_ITEM STRUCTURE  ZSDS187 OPTIONAL
  10. *"----------------------------------------------------------------------
  11. *.COBRA-Buffer (see FM KOBS)
  12.   TYPES: BEGIN OF ty_cobra_buf.
  13.            INCLUDE STRUCTURE cobra.
  14.            TYPES:   uflag LIKE dkobr-upd_flag,
  15.          END OF ty_cobra_buf.
  16. *.COBRB-Puffer mit Änderungsflag (see FM KOBS)
  17.   TYPES: BEGIN OF ty_cobrb_buf.
  18.            INCLUDE STRUCTURE cobrb.
  19.            TYPES:   uflag LIKE dkobr-upd_flag,
  20.          END OF ty_cobrb_buf.
  21.   DATA: ls_objnr TYPE ionrb,
  22.         lt_objnr TYPE TABLE OF ionrb,
  23.         ls_cobra TYPE cobra,
  24.         lt_cobra TYPE TABLE OF cobra,
  25.         ls_cobrb TYPE cobrb,
  26.         lt_cobrb TYPE TABLE OF cobrb.
  27.   DATA:ls_mem_cobra TYPE ty_cobra_buf.
  28.   DATA:lt_mem_cobra TYPE TABLE OF ty_cobra_buf.
  29.   DATA:ls_mem_cobrb TYPE ty_cobrb_buf.
  30.   DATA:lt_mem_cobrb TYPE TABLE OF ty_cobrb_buf.
  31.   DATA:l_mem_cobra  TYPE TABLE OF ty_cobra_buf.
  32.   DATA:l_mem_cobrb  TYPE TABLE OF ty_cobrb_buf.
  33.   DATA:lv_objnr     TYPE cobra-objnr.

  34. *-->数据转换
  35.   CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
  36.     EXPORTING
  37.       input  = i_vbeln
  38.     IMPORTING
  39.       output = i_vbeln.

  40. *-->数据获取
  41.   LOOP AT t_item ASSIGNING FIELD-SYMBOL(<fs_item>).
  42.     CALL FUNCTION 'CONVERSION_EXIT_OBART_INPUT'
  43.       EXPORTING
  44.         input     = <fs_item>-konty
  45.       IMPORTING
  46.         output    = <fs_item>-konty
  47.       EXCEPTIONS
  48.         not_found = 1
  49.         OTHERS    = 2.

  50.     CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
  51.       EXPORTING
  52.         input  = <fs_item>-hkont
  53.       IMPORTING
  54.         output = <fs_item>-hkont.

  55.     CLEAR:ls_objnr.
  56.     ls_objnr-objnr =  'VB' && i_vbeln && <fs_item>-posnr.
  57.     APPEND ls_objnr TO lt_objnr.
  58.   ENDLOOP.

  59.   SELECT vbeln,
  60.          posnr
  61.     FROM vbap
  62.     WHERE vbeln = @i_vbeln
  63.     INTO TABLE @DATA(lt_vbap).

  64.   lv_objnr = 'VB' && i_vbeln && '%'.
  65.   SELECT objnr
  66.     FROM cobra
  67.    WHERE objnr LIKE @lv_objnr
  68.   INTO TABLE @DATA(lt_cobra_db).

  69.   SELECT objnr
  70.     FROM cobrb
  71.    WHERE objnr LIKE @lv_objnr
  72.   INTO TABLE @DATA(lt_cobrb_db).

  73.   CALL FUNCTION 'K_SRULE_PRE_READ'
  74.     TABLES
  75.       t_sender_objnr   = lt_objnr[]
  76.     EXCEPTIONS
  77.       wrong_parameters = 1
  78.       OTHERS           = 2.

  79.   CLEAR:lt_mem_cobra,lt_mem_cobrb.
  80. * Fill internal buffer with settlement rules
  81.   LOOP AT lt_objnr INTO ls_objnr.
  82.     CLEAR:lt_cobra[],lt_cobrb[].
  83.     CALL FUNCTION 'K_SETTLEMENT_RULE_GET'
  84.       EXPORTING
  85.         objnr     = ls_objnr-objnr
  86.         x_all     = ''
  87.       TABLES
  88.         e_cobra   = lt_cobra
  89.         e_cobrb   = lt_cobrb
  90.       EXCEPTIONS
  91.         not_found = 1
  92.         OTHERS    = 2.
  93.     IF lt_cobrb[] IS INITIAL. "修改时,新增行项目
  94.       "create a new rule header
  95.       CALL FUNCTION 'K_SRULE_CREATE'
  96.         EXPORTING
  97.           i_objnr             = ls_objnr-objnr
  98.         EXCEPTIONS
  99.           rule_already_exists = 1
  100.           OTHERS              = 2.
  101.       CALL FUNCTION 'K_SETTLEMENT_RULE_GET'
  102.         EXPORTING
  103.           objnr     = ls_objnr-objnr
  104.           x_all     = ''
  105.         TABLES
  106.           e_cobra   = lt_cobra
  107.           e_cobrb   = lt_cobrb
  108.         EXCEPTIONS
  109.           not_found = 1
  110.           OTHERS    = 2.
  111.     ENDIF.

  112.     "分配结算规则-抬头
  113.     LOOP AT lt_cobra INTO ls_cobra.
  114.       CLEAR:ls_mem_cobra.
  115.       MOVE-CORRESPONDING ls_cobra TO ls_mem_cobra.
  116.       READ TABLE lt_vbap TRANSPORTING NO FIELDS WITH KEY posnr = ls_cobra-objnr+12(6).
  117.       IF sy-subrc = 0.
  118.         READ TABLE lt_cobra_db TRANSPORTING NO FIELDS WITH KEY objnr = ls_cobra-objnr.
  119.         IF sy-subrc = 0.
  120.           ls_mem_cobra-uflag = 'U'.
  121.         ELSE.
  122.           ls_mem_cobra-uflag = 'I'.
  123.         ENDIF.
  124.       ELSE.
  125.         READ TABLE lt_cobra_db TRANSPORTING NO FIELDS WITH KEY objnr = ls_cobra-objnr.
  126.         IF sy-subrc = 0.
  127.           ls_mem_cobra-uflag = 'D'.
  128.         ENDIF.
  129.       ENDIF.
  130.       APPEND ls_mem_cobra TO lt_mem_cobra.
  131.     ENDLOOP.

  132.     "分配结算规则-行项目
  133.     LOOP AT lt_cobrb INTO ls_cobrb.
  134.       CLEAR:ls_mem_cobrb.
  135.       MOVE-CORRESPONDING ls_cobrb TO ls_mem_cobrb.
  136.       READ TABLE t_item WITH KEY posnr = ls_cobrb-objnr+12(6).
  137.       IF sy-subrc = 0.
  138.         IF t_item-hkont IS NOT INITIAL.
  139.           ls_mem_cobrb-hkont = t_item-hkont. "总账科目
  140.         ENDIF.
  141.         IF t_item-prctr IS NOT INITIAL.
  142.           ls_mem_cobrb-prctr = t_item-prctr. "利润中心
  143.         ENDIF.
  144.         IF t_item-konty IS NOT INITIAL.
  145.           ls_mem_cobrb-konty = t_item-konty. "科目分配种类
  146.         ENDIF.
  147.       ENDIF.
  148.       READ TABLE lt_vbap TRANSPORTING NO FIELDS WITH KEY posnr = ls_cobrb-objnr+12(6).
  149.       IF sy-subrc = 0.
  150.         READ TABLE lt_cobrb_db TRANSPORTING NO FIELDS WITH KEY objnr = ls_cobrb-objnr.
  151.         IF sy-subrc = 0.
  152.           ls_mem_cobrb-uflag = 'U'.
  153.         ELSE.
  154.           ls_mem_cobrb-uflag = 'I'.
  155.           ls_mem_cobrb-avorg = 'KOAW'.       "结算交易
  156.           ls_mem_cobrb-srstrat = ''.         "审批策略必须为空 不然会默认给2
  157.         ENDIF.
  158.       ELSE.
  159.         READ TABLE lt_cobrb_db TRANSPORTING NO FIELDS WITH KEY objnr = ls_cobrb-objnr.
  160.         IF sy-subrc = 0.
  161.           ls_mem_cobrb-uflag = 'D'.
  162.         ENDIF.
  163.       ENDIF.
  164.       APPEND ls_mem_cobrb TO lt_mem_cobrb.
  165.     ENDLOOP.
  166.   ENDLOOP.

  167.   CHECK e_message-type <> 'E'.

  168.   LOOP AT lt_objnr INTO ls_objnr.
  169.     CLEAR:l_mem_cobra,l_mem_cobrb.
  170. * Save settlement rule in ABAP-Memory
  171.     CALL FUNCTION 'K_SRULE_EXPORT_IMPORT'
  172.       EXPORTING
  173.         i_mode     = 'EX'
  174.       EXCEPTIONS
  175.         wrong_mode = 1
  176.         OTHERS     = 2.

  177. * Read ABAP-Memory
  178.     IMPORT l_mem_cobra l_mem_cobrb FROM MEMORY ID 'K_SRULE'."内存变量不能修改
  179.     "ABAP内存赋值
  180.     CLEAR:l_mem_cobra,l_mem_cobrb.
  181.     LOOP AT lt_mem_cobra INTO ls_mem_cobra WHERE objnr = ls_objnr-objnr.
  182.       APPEND ls_mem_cobra TO l_mem_cobra.
  183.     ENDLOOP.
  184.     LOOP AT lt_mem_cobrb INTO ls_mem_cobrb WHERE objnr = ls_objnr-objnr.
  185.       APPEND ls_mem_cobrb TO l_mem_cobrb.
  186.     ENDLOOP.

  187. * Clear internal buffer
  188.     CALL FUNCTION 'K_SETTLEMENT_RULE_REFRESH'
  189.       EXPORTING
  190.         objnr = ls_objnr-objnr.

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

  193. * Fill internal buffer with new rules
  194.     CALL FUNCTION 'K_SRULE_EXPORT_IMPORT'
  195.       EXPORTING
  196.         i_mode     = 'IM'
  197.       EXCEPTIONS
  198.         wrong_mode = 1
  199.         OTHERS     = 2.

  200. * Save new rules
  201.     CALL FUNCTION 'K_SETTLEMENT_RULE_SAVE'
  202.       EXPORTING
  203.         Dialog            = 'X'
  204.         objnr             = ls_objnr-objnr
  205.         i_status_update   = ' '
  206.       EXCEPTIONS
  207.         no_rule_for_objnr = 1
  208.         OTHERS            = 2.
  209.     IF sy-subrc = 0.
  210.       COMMIT WORK.
  211.       e_message-type = 'S'.
  212.       e_message-message = '结算规则更新成功'.
  213.     ELSE.
  214.       ROLLBACK WORK.
  215.       e_message-type = 'E'.
  216.       e_message-message = '结算规则更新失败'.
  217.       EXIT.
  218.     ENDIF.
  219.   ENDLOOP.

  220. ENDFUNCTION.
复制代码
回复

使用道具 举报

快速回帖

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

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