FICO 三大报表运算维护表计算规则(表里维护行次的)

1+2+3

复制代码
"内表整理科目 报表项目 汇总后计算公式 1+2+3


DATA:
    lv_str   TYPE string,
    lv_str1  TYPE string,
    lt_num   TYPE TABLE OF string,
    lt_sign  TYPE TABLE OF string,
    lv_index TYPE CHAR4,
    lv_i     TYPE i,
    lv_sum   TYPE p DECIMALS 3.

  LOOP AT gt_out ASSIGNING FIELD-SYMBOL(<fs_out>) .

    IF <fs_out>-zformula IS NOT INITIAL.

      lv_str = <fs_out>-zformula.
      lv_str1 = <fs_out>-zformula.

      REPLACE ALL OCCURRENCES OF  '+'  IN lv_str WITH '*'.
      REPLACE ALL OCCURRENCES OF  '-'  IN lv_str WITH '*'.
      SPLIT lv_str AT '*' INTO TABLE lt_num.  "将数字放进内表 lt_num
      "替换数字
      LOOP AT lt_num INTO DATA(ls_num).

        REPLACE  ls_num WITH '*' INTO lv_str1.

      ENDLOOP.

      SPLIT lv_str1 AT '*' INTO TABLE lt_sign.  "将符号放进内表 lt_sign
      DELETE  lt_sign WHERE TABLE_LINE = ''.

      CLEAR: lv_sum , lv_i.

      LOOP AT lt_num INTO ls_num.

        lv_index = ls_num.
        READ TABLE gt_out INTO gs_out WITH KEY zrow = lv_index.
        IF sy-subrc = 0.

          IF lv_i = 0.   
            lv_sum = gs_out-zamount.
            lv_i = 1.
            CONTINUE.
          ENDIF.
          READ TABLE lt_sign INTO DATA(ls_sign) INDEX lv_i.
          IF sy-subrc = 0 .
            IF ls_sign = '+'.
              lv_sum = lv_sum + gs_out-zamount.
            ELSE.
              lv_sum = lv_sum - gs_out-zamount.
            ENDIF.
            lv_i = lv_i + 1.
          ENDIF.
        ENDIF.
      ENDLOOP.

      <fs_out>-zamount = lv_sum.
    ENDIF.
  ENDLOOP.
复制代码

1+2+3+

复制代码
 DATA:
    lv_str   TYPE string,
    lv_str1  TYPE string,
    lt_num   TYPE TABLE OF string,
    lt_sign  TYPE TABLE OF string,
    lv_index TYPE CHAR4,
    lv_i     TYPE i,
    lv_sum   TYPE p DECIMALS 3.

  LOOP AT gt_out ASSIGNING FIELD-SYMBOL(<fs_out>) .

    IF <fs_out>-zformula IS NOT INITIAL.

      lv_str = <fs_out>-zformula.
      lv_str1 = <fs_out>-zformula.

      REPLACE ALL OCCURRENCES OF  '+'  IN lv_str WITH '*'.
      REPLACE ALL OCCURRENCES OF  '-'  IN lv_str WITH '*'.
      SPLIT lv_str AT '*' INTO TABLE lt_num.  "将数字放进内表 lt_num
      "替换数字
      LOOP AT lt_num INTO DATA(ls_num).

        REPLACE  ls_num WITH '*' INTO lv_str1.

      ENDLOOP.

      SPLIT lv_str1 AT '*' INTO TABLE lt_sign.  "将符号放进内表 lt_sign
      DELETE  lt_sign WHERE TABLE_LINE = ''.

      CLEAR: lv_sum , lv_i.


      LV_I = 1.  "计算1+2+3+  如果计算1+2+3 删除
      LOOP AT lt_num INTO ls_num.

        lv_index = ls_num.
        READ TABLE gt_out INTO gs_out WITH KEY zrow = lv_index.
        IF sy-subrc = 0.

*          IF lv_i = 0.   "计算1+2+3
*            lv_sum = gs_out-zamount.
*            lv_i = 1.
*            CONTINUE.
*          ENDIF.
          READ TABLE lt_sign INTO DATA(ls_sign) INDEX lv_i.
          IF sy-subrc = 0 .
            IF ls_sign = '+'.
              lv_sum = lv_sum + gs_out-zamount.
            ELSE.
              lv_sum = lv_sum - gs_out-zamount.
            ENDIF.
            lv_i = lv_i + 1.
          ENDIF.
        ENDIF.
      ENDLOOP.

      <fs_out>-zamount = lv_sum.
    ENDIF.
  ENDLOOP.
复制代码

 

posted @   YangMeiko  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示