使用
在ABAP程序中将数值与表达式分别存放,通过表达式计算对应的结果。
一、调用BAPI:EVAL_FORMULA
TYPES:BEGIN OF TY_VAL,
OPERAND TYPE C,
VALUE TYPE STRING,
END OF TY_VAL.
TYPES:BEGIN OF TY_FRM,
NO TYPE I,
FORMULA TYPE CHAR50,
END OF TY_FRM.
DATA:IT_VAL TYPE TABLE OF TY_VAL,
WA_VAL TYPE TY_VAL.
DATA:IT_FORMULA TYPE TABLE OF TY_FRM,
WA_FRM TYPE TY_FRM.
DATA:WF_STRING TYPE CHAR255,
WF_LEN TYPE I,
WF_FORMULA TYPE CHAR50.
DATA: WF_RETCODE LIKE SY-SUBRC,
WF_FUNCNAME(30) TYPE C,
WF_MESSAGE(70) TYPE C,
WF_POS TYPE I,
WF_C TYPE P LENGTH 15 DECIMALS 2.
WA_VAL-OPERAND = 'A'.
WA_VAL-VALUE = '1'.
APPEND WA_VAL TO IT_VAL.
WA_VAL-OPERAND = 'B'.
WA_VAL-VALUE = '2'.
APPEND WA_VAL TO IT_VAL.
WA_VAL-OPERAND = 'C'.
WA_VAL-VALUE = '3'.
APPEND WA_VAL TO IT_VAL.
WA_FRM-NO = 1.
WA_FRM-FORMULA = 'A*B+C'.
APPEND WA_FRM TO IT_FORMULA.
WA_FRM-NO = 2.
WA_FRM-FORMULA = 'C*(A-B)'.
APPEND WA_FRM TO IT_FORMULA.
LOOP AT IT_FORMULA INTO WA_FRM.
WF_STRING = WA_FRM-FORMULA.
WF_FORMULA = WA_FRM-FORMULA.
REPLACE ALL OCCURRENCES OF REGEX '[^[:alpha:]]' IN WF_STRING WITH ` `.
CONDENSE WF_STRING NO-GAPS.
WF_LEN = STRLEN( WF_STRING ).
DO WF_LEN TIMES.
SY-INDEX = SY-INDEX - 1.
READ TABLE IT_VAL INTO WA_VAL WITH KEY OPERAND = WF_STRING+SY-INDEX(1).
IF SY-SUBRC = 0.
REPLACE ALL OCCURRENCES OF WF_STRING+SY-INDEX(1)
IN WF_FORMULA
WITH WA_VAL-VALUE.
ENDIF.
ENDDO.
CALL FUNCTION 'CHECK_FORMULA'
EXPORTING
FORMULA = WF_FORMULA
IMPORTING
SUBRC = WF_RETCODE
FUNCNAME = WF_FUNCNAME
MESSAGE = WF_MESSAGE
POS = WF_POS.
IF WF_RETCODE IS INITIAL.
CALL FUNCTION 'EVAL_FORMULA'
EXPORTING
FORMULA = WF_FORMULA
IMPORTING
VALUE = WF_C
EXCEPTIONS
OTHERS = 1.
IF SY-SUBRC = 0.
WRITE: / WA_FRM-FORMULA,'-', WF_C.
ELSE.
WRITE: / 'Error'..
ENDIF.
ELSE.
WRITE: / WF_FUNCNAME, WF_MESSAGE, WF_POS.
ENDIF.
ENDLOOP.
替换表达式的运算单位
REPLACE ALL OCCURRENCES OF REGEX '[^[:alnum:]]' IN WF_STRING WITH ‘ ’.REPLACE ALL OCCURRENCES OF REGEX '[^[:alpha:]]' IN WF_STRING WITH ‘ ’.- ``:两个表示空格
将字符串切分保存到内表
SPLIT WF_STRING AT SPACE INTO TABLE table_name.
二、通过直接调用表达式完成计算
DATA: MESSAGE TYPE STRING,
SOURCE TYPE STRING,
RETURN_VALUE TYPE P LENGTH 15 DECIMALS 2,
TXT_VAR1 TYPE CHAR40,
TXT_VAR2 TYPE CHAR40,
TXT_VAR3 TYPE CHAR40 VALUE '987979.234-'.
CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
CHANGING
VALUE = TXT_VAR3.
MESSAGE = '(-351422999.55+-59211228.95+-1297670.94+-3135583.53+-35337844.40)*100/(613848716.07+0.00+-1552672.73)'.
DATA: JS_PROCESSOR TYPE REF TO CL_JAVA_SCRIPT.
JS_PROCESSOR = CL_JAVA_SCRIPT=>CREATE( ).
CONCATENATE
'var string = ' MESSAGE ';'
'function Set_String() '
' { string = eval(string); '
' } '
'Set_String(); '
'string; '
INTO SOURCE SEPARATED BY
CL_ABAP_CHAR_UTILITIES=>CR_LF.
RETURN_VALUE = JS_PROCESSOR->EVALUATE( SOURCE ).
WRITE: RETURN_VALUE.
实际使用
可以将以上两种方法进行结合,计算出表达式的结果。