美文网首页SAP
ABAP-公式拆分

ABAP-公式拆分

作者: Mmm_余安 | 来源:发表于2019-09-26 16:56 被阅读0次
  call function 'ZFI_SPLIT_FORMULA'
              EXPORTING
                I_FORMULA = LW_FIELD-FORMULA
              TABLES
                OT_LINES  = LT_OT_LINES.



FUNCTION ZFI_SPLIT_FORMULA.

*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(I_FORMULA) TYPE ZZT_FI_003-FORMULA OPTIONAL
*" TABLES
*" OT_LINES STRUCTURE ZZSFORMULA_LINE OPTIONAL
*"----------------------------------------------------------------------

* [Global data declarations](global-zfi_split_formula.html)

  TYPES: BEGIN OF TY_DATA,
           STR TYPE ZZT_FI_003-FORMULA,
         END OF TY_DATA.

*--------------------------------------------------------------------*
*
*--------------------------------------------------------------------*

  DATA: GT_DATA TYPE STANDARD TABLE OF TY_DATA.
  FIELD-SYMBOLS: <GS_DATA> TYPE TY_DATA.

  DATA: TEMP_LG TYPE STANDARD TABLE OF TY_DATA.
  FIELD-SYMBOLS: <GS_TEMP> TYPE TY_DATA.

  DATA: GS_LINEN TYPE ZZSFORMULA_LINE.

  DATA: GV_FORMULA LIKE I_FORMULA. "公式

  DATA: GV_CONDITION TYPE CHAR1.

  DATA: G_TEMP_FORMULA1 LIKE I_FORMULA,
        G_TEMP_FORMULA2 LIKE I_FORMULA,
        G_FLINE         TYPE ZZSFORMULA_LINE-REPT_ITEM,
        G_TLINE         TYPE ZZSFORMULA_LINE-REPT_ITEM.

  DATA: GV_LINE_POS TYPE ZZSFORMULA_LINE-REPT_ITEM.

  DATA: GV_SIGN TYPE CHAR1.

*--------------------------------------------------------------------*
*
*--------------------------------------------------------------------*

  CLEAR: GV_FORMULA,OT_LINES.
  GV_FORMULA = I_FORMULA.

* 分两种情况

  SEARCH GV_FORMULA FOR 'SUM('.
  IF SY-SUBRC = 0.
    GV_CONDITION = 'X'.
  ELSE.
    GV_CONDITION = SPACE.
  ENDIF.

  IF GV_CONDITION EQ SPACE.

* 去掉=

    REPLACE '=' WITH SPACE INTO GV_FORMULA.

* 先通过+来拆分

    SPLIT GV_FORMULA AT '+' INTO TABLE GT_DATA.

* 再通过-来拆分

    LOOP AT GT_DATA ASSIGNING <GS_DATA>.
      IF GV_FORMULA CA ( '+-').
        SPLIT <GS_DATA>-STR AT '-' INTO TABLE TEMP_LG.

* IF LINES( TEMP_LG ) > 1.

        LOOP AT TEMP_LG ASSIGNING <GS_TEMP>.
          IF SY-TABIX = 1.
            GS_LINEN-SIGN = '+'.
          ELSE.
            GS_LINEN-SIGN = '-'.
          ENDIF.
          GS_LINEN-REPT_ITEM = <GS_TEMP>-STR.
          IF GS_LINEN-SIGN IS NOT INITIAL AND GS_LINEN-REPT_ITEM IS NOT INITIAL.
            APPEND GS_LINEN TO OT_LINES.
          ENDIF.
        ENDLOOP.

* ENDIF.

      ENDIF.
    ENDLOOP.

* 再通过 / 来拆分

    LOOP AT GT_DATA ASSIGNING <GS_DATA>.
      SPLIT <GS_DATA>-STR AT '/' INTO TABLE TEMP_LG.
      IF LINES( TEMP_LG ) > 1.
        LOOP AT TEMP_LG ASSIGNING <GS_TEMP>.
          IF SY-TABIX = 1.
            GS_LINEN-SIGN = '+'.
          ELSE.
            GS_LINEN-SIGN = '/'.
          ENDIF.
          GS_LINEN-REPT_ITEM = <GS_TEMP>-STR.
          IF GS_LINEN-SIGN IS NOT INITIAL AND GS_LINEN-REPT_ITEM IS NOT INITIAL.
            APPEND GS_LINEN TO OT_LINES.
          ENDIF.
        ENDLOOP.
      ENDIF.
    ENDLOOP.

* 再通过 *来拆分

    LOOP AT GT_DATA ASSIGNING <GS_DATA>.
      SPLIT <GS_DATA>-STR AT '*' INTO TABLE TEMP_LG.
      IF LINES( TEMP_LG ) > 1.
        LOOP AT TEMP_LG ASSIGNING <GS_TEMP>.
          IF SY-TABIX = 1.
            GS_LINEN-SIGN = '+'.
          ELSE.
            GS_LINEN-SIGN = '*'.
          ENDIF.
          GS_LINEN-REPT_ITEM = <GS_TEMP>-STR.
          IF GS_LINEN-SIGN IS NOT INITIAL AND GS_LINEN-REPT_ITEM IS NOT INITIAL.
            APPEND GS_LINEN TO OT_LINES.
          ENDIF.
        ENDLOOP.
      ENDIF.
    ENDLOOP.

  ELSE.

    SPLIT GV_FORMULA AT '(' INTO G_TEMP_FORMULA1 G_TEMP_FORMULA2. " 用(区分
    REPLACE ')' WITH SPACE INTO G_TEMP_FORMULA2." 去掉)
    SPLIT G_TEMP_FORMULA2 AT ':' INTO G_TEMP_FORMULA1 G_TEMP_FORMULA2."用:区分

    G_FLINE = G_TEMP_FORMULA1.
    G_TLINE =  G_TEMP_FORMULA2.
    IF G_FLINE > G_TLINE.
      RAISE LOW_GT_HIGH.
    ENDIF.

    CLEAR: GV_LINE_POS.
    GV_LINE_POS = G_FLINE." 起始位置赋值给g_line_pos

    IF GV_FORMULA+1(1) = '-'.
      GV_SIGN = '-'.
    ELSE.
      GV_SIGN = '+'.
    ENDIF.

    WHILE GV_LINE_POS LE G_TLINE.

      CLEAR: GS_LINEN.
      GS_LINEN-SIGN = GV_SIGN.
      GS_LINEN-REPT_ITEM = GV_LINE_POS.
      APPEND GS_LINEN TO OT_LINES.

      ADD 1 TO GV_LINE_POS.

    ENDWHILE.

  ENDIF.

ENDFUNCTION.

相关文章

  • ABAP-公式拆分

  • ABAP数据类型定义

    1、ABAP-基本数据类型 2、ABAP-变量声明 根据类型定义变量使用关键字 "DATA" 声明变量:DATA ...

  • 中文在前英文在后的分开

    如图所示 一、使用公式 =LEFT(A1,LENB(A1)-LEN(A1)) 拆分出中文 二、使用公式 =RIGH...

  • 分数式函数积分

    一、分数式函数积分 有理式拆分 常用的相关积分公式 二、相关函数图像

  • 王泽熙:关健明——普通人如何用文案,月入5W+…

    本节课,你将学到: 销售公式:文案黄金法则——高转化率的文案是如何炼成?公式详解:爆款文案4步——拆分细讲。案例拆...

  • ABAP-增强

    教材 基本是看视频、PPT。有关如何找到增强也可以参考:[SAP ABAP开发技术总结]增强Enhancement...

  • 用分组法解数列求和问题

    方法二 分组法 解题步骤: 第一步 定通项公式:即根据已知条件求出数列的通项公式; 第二步 巧拆分:即根据通...

  • ABAP创建Hello World程序

    1、ABAP-创建程序 输入TCODE(事务代码):SE38 输入要创建的程序的名称 —— 点击创建 输入程序标题...

  • 曲凯:怎样成为解决问题的高手?(三)

    【公式化拆解的两个案例】 把复杂问题拆分成一个公式,对解决问题非常重要。下面是课程中专门用于示范的两个拆解案例。 ...

  • ABAP-搜索帮助

    查看某个字段对应的所有的值的表 在SAP的ABAP编程中,如何查看某表中某字段可能输入哪些值,值的含义是什么 创建...

网友评论

    本文标题:ABAP-公式拆分

    本文链接:https://www.haomeiwen.com/subject/bernuctx.html