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 @ 2024-01-22 15:30  YangMeiko  阅读(18)  评论(0)    收藏  举报