SAP ABAP 基础语法随笔
SAP ABAP 基础笔记随笔
基础
1、move-corresponding
A(id:10,name:aa,gen:f)
B(id:20,gen:m,dm:01)
move-corresponding A to B.
—>B(id:10,gen:f,dm:01).
B如果有与A相同的Key,则替换对应的Value。
2、IF终止循环
CONTINUE:用于结束当前循环,剩下的代码块不执行,进入下一循环。
CHECK 检查condition是否为真,如果为真就结束循环。
EXIT:立即结束循环并执行ENDDO、ENDWHILE、ENDSELECT,对于嵌套循环,只结束本循环,对其它层循环不影响。
3、CONSTANTS
CONSTANTS:gv_data TYPE string VALUE '类似于JAVA的FINAL'
用于定义固定值,该固定值不可改变
4、LOOP AT
AT FIRST 循环开始时执行
AT LAST 循环结束时执行
AT NEW 出现新的 数据(非数字字段) 时执行
AT END
5、CLEAR & REFRESH
CLEAR用于清空不带表头的表。
REFRESH用于清空WITH HEADER LINE 的表
6、获取select-options和parameters的值
RSPARAMS是select-options和parameters的通用结构,如图:
调用=='RS_REFRESH_FROM_SELECTOPTIONS’可以将s和p的值存入函数内表GIT_PARAMS[]==中,s的KIND为‘S’,p的KIND为‘P’,可以根据不同的KIND循环选出需要的值。
TABLES: MARA.
DATA:GIT_PARAMS TYPE TABLE OF RSPARAMS.
DATA:GWA_PARAMS TYPE RSPARAMS.
*&---------------------------------------------------------------------*
*& Selection Screen
*&---------------------------------------------------------------------*
SELECT-OPTIONS:S_MATNR FOR MARA-MATNR.
PARAMETERS:P_MTART TYPE MARA-MTART.
PARAMETERS:P_MATKL TYPE MARA-MATKL.
*&---------------------------------------------------------------------*
*& Start of Selection
*&---------------------------------------------------------------------*
START-OF-SELECTION.
CALL FUNCTION 'RS_REFRESH_FROM_SELECTOPTIONS'
EXPORTING
CURR_REPORT = SY-REPID
TABLES
SELECTION_TABLE = GIT_PARAMS[].
SORT GIT_PARAMS BY KIND.
WRITE:/ 'Parameters'.
WRITE:/ 'Name' ,20 'Value' .
LOOP AT GIT_PARAMS INTO GWA_PARAMS WHERE KIND = 'P'.
WRITE:/ GWA_PARAMS-SELNAME ,20 GWA_PARAMS-LOW.
ENDLOOP.
SKIP.
WRITE:/ 'Select-Options'.
WRITE:/ 'Name' ,20 'Sign' ,25 'Option',32 'Low',52 'High'.
LOOP AT GIT_PARAMS INTO GWA_PARAMS WHERE KIND = 'S'.
WRITE:/ GWA_PARAMS-SELNAME ,20 GWA_PARAMS-SIGN ,
25 GWA_PARAMS-OPTION, 32 GWA_PARAMS-LOW,
52 GWA_PARAMS-HIGH.
ENDLOOP.
7、TOP-OF-PAGE
在页头执行
8、AT SELECTION-SCREEN OUTPUT 屏幕选择性展示
**AT SELECTION-SCREEN OUTPUT **用于设置画面属性
设置AT SELECTION-SCREEN OUTPUT:
9、MODIFY ID 更改屏幕显示
用于动态显示屏幕
屏幕设计
TABLES:EKKO.
SELECTION-SCREEN BEGIN OF BLOCK BLK01 WITH FRAME.
PARAMETERS:P_MAINT RADIOBUTTON GROUP G1 USER-COMMAND ACTIVE,
P_QUERY RADIOBUTTON GROUP G1 DEFAULT 'X' .
SELECTION-SCREEN END OF BLOCK BLK01.
SELECTION-SCREEN BEGIN OF BLOCK BLK02 WITH FRAME.
SELECT-OPTIONS: S_EBELN FOR EKKO-EBELN MODIF ID M1,
S_BUKRS FOR EKKO-BUKRS MODIF ID M1,
S_EKORG FOR EKKO-EKORG MODIF ID M1.
SELECTION-SCREEN END OF BLOCK BLK02.
屏幕显示逻辑
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
CASE SCREEN-GROUP1.
WHEN 'M1'.
IF P_MAINT = 'X'.
SCREEN-ACTIVE = '0'.
ELSE.
SCREEN-ACTIVE = '1'.
ENDIF.
MODIFY SCREEN.
ENDCASE.
ENDLOOP.
10、设置锁对象
T-CODE :se11
通过调用从锁对象的定义自动生成的特定功能模块,在在线事务的编程中请求和释放锁定。必须在 ABAP 字典中显式创建这些锁对象。
注意事项
- 必须在 ABAP 字典中定义锁对象。锁对象的名称应以 E 开头。
- 必须将激活锁对象时自动创建的用于请求和释放锁定的功能模块链接到相关在线事务的编程。
创建
填写对应信息并激活
点击锁模块查看生成的FM模块
在需要的程序调用即可
PERFORM FRM_LOCK_DATA USING LST_CJ-EMPID "加锁,传入主键
CHANGING O_SUBRC.
PERFORM FRM_UNLOCK_DATA USING LST_CJ-EMPID. "解锁
FORM FRM_LOCK_DATA USING P_LST_CJ_EMPID
CHANGING P_O_SUBRC.
CALL FUNCTION 'ENQUEUE_EZ187386_01'
EXPORTING
MODE_ZT187386CJ = 'E'
MANDT = SY-MANDT
EMPID = P_LST_CJ_EMPID
* X_EMPID = ' '
* _SCOPE = '2'
* _WAIT = ' '
* _COLLECT = ' '
EXCEPTIONS
FOREIGN_LOCK = 1
SYSTEM_FAILURE = 2
OTHERS = 3
.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_UNLOCK_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_LST_CJ_EMPID text
*----------------------------------------------------------------------*
FORM FRM_UNLOCK_DATA USING P_LST_CJ_EMPID.
CALL FUNCTION 'DEQUEUE_EZ187386_01'
EXPORTING
MODE_ZT187386CJ = 'E'
MANDT = SY-MANDT
EMPID = P_LST_CJ_EMPID.
* X_EMPID = ' '
* _SCOPE = '3'
* _SYNCHRON = ' '
* _COLLECT = ' '
ENDFORM.
11、DESCRIBE
DESCRIBE TABLE lt_mat LINES lv_cont.
- 表示计算内表It_mat的数据行数,并将行数放到Iv_cont内。
DESCRIBE FIELD el.
描述数据元素的属性,包括长度、类型、小数点等信息
DESCRIBE FIELD dobj [TYPE typ [COMPONENTS com]] [LENGTH ilen IN { BYTE | CHARACTER } MODE] [DECIMALS dec] [OUTPUT-LENGTH olen] [HELP-ID hlp] [EDIT MASK mask].
typ里放类型,com里放el的子元素,ilen里放长度,dec里放小数位数、olen里放输出长度,
DESCRIBE TABLE itab KIND knd.
- 用于判断内表类型,将itab内表类型赋给knd。
- knd类型分别可以为SYDEX_KIND-standed ,SYDEX_KIND-SORTED,SYDEX_KIND-HASHED。
12、CLEAR、REFRESH、FREE
CLEAR用于清理内表和工作区
对于有表头的内表WA_DATA,CLEAR WA_DATA表示清除工作区域,CLEAR WA_DATA[] 表示清除内表区域内不清楚工作区域。
REFRESH专门用于清理内表
FREE会清除内表并释放所占空间。
13、读取文件
读取Excel表到SAP内表:
屏幕定义
*----------------------------------------------------------------------*
* 选择画面定义
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK BLK01 WITH FRAME.
PARAMETERS:P_FILE LIKE RLGRAP-FILENAME. "FILE SELECT PARAMETRER
SELECTION-SCREEN END OF BLOCK BLK01.
打开选择文件
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG "用于选择文件
EXPORTING
WINDOW_TITLE = 'OPEN FILE'
INITIAL_DIRECTORY = 'C:\' "选择文件打开的初始路径
CHANGING
FILE_TABLE = GT_FILE
RC = GW_RC
EXCEPTIONS
FILE_OPEN_DIALOG_FAILED = 1
CNTL_ERROR = 2
ERROR_NO_GUI = 3
NOT_SUPPORTED_BY_GUI = 4
OTHERS = 5.
IF SY-SUBRC <> 0.
ENDIF.
READ TABLE GT_FILE INTO GST_FILE INDEX 1.
P_FILE = GST_FILE-FILENAME. "将文件名赋值给P_FILE
读取P_FILE路径下的Excel文件到内表GT_DATA。
DATA: LWK_FILENAME TYPE RLGRAP-FILENAME, "字符串
LT_DATA TYPE TRUXS_T_TEXT_DATA.
LWK_FILENAME = P_FILE.
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP' "读取数据到内表
EXPORTING
* I_FIELD_SEPERATOR =
I_LINE_HEADER = 'X'
I_TAB_RAW_DATA = LT_DATA
I_FILENAME = LWK_FILENAME
TABLES
I_TAB_CONVERTED_DATA = GT_DATA
EXCEPTIONS
CONVERSION_FAILED = 1
OTHERS = 2.
14、INNER JOIN使用限制
- 必须要有ON条件语句,多个条件只能用AND连接
- 不能使用NOT、LIKE、IN
15、下载模板
上传模板:输入T-CODE SMW0上传模板,Web对象选择"WebRFC应用程序的二进制数据",然后新建上传即可。
模板下载:
使用以下FORM即可。
FORM FRM_TEMP_DOWNLOAD .
DATA: LWA_WWWDATA_TAB LIKE WWWDATATAB,
L_FILENAME TYPE RLGRAP-FILENAME.
READ TABLE GT_FILE INTO GS_FILE INDEX 1.
L_FILENAME = GS_FILE-FILENAME. "下载路径
SELECT SINGLE *
FROM WWWDATA
INNER JOIN TADIR
ON WWWDATA~OBJID = TADIR~OBJ_NAME
INTO CORRESPONDING FIELDS OF LWA_WWWDATA_TAB
WHERE WWWDATA~SRTF2 = 0
AND WWWDATA~RELID = 'MI' "标识二进制的对象
AND TADIR~PGMID = 'R3TR'
AND TADIR~OBJECT = 'W3MI'
AND TADIR~OBJ_NAME = 'ZTEMP_187386_01'."模板名字
IF SY-SUBRC = 0.
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
KEY = LWA_WWWDATA_TAB
DESTINATION = L_FILENAME.
MESSAGE '模板已下载到桌面' TYPE 'S'.
ENDIF.
ENDFORM.
16、选择文件路径
DATA: GT_FILE TYPE FILETABLE,
GW_RC TYPE I.
FORM FRM_FILE_SEL .
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG "用于选择文件
EXPORTING
WINDOW_TITLE = 'OPEN FILE' "选择窗口名字
INITIAL_DIRECTORY = 'C:\' "选择初始路径
FILE_FILTER = CL_GUI_FRONTEND_SERVICES=>FILETYPE_EXCEL "过滤Excel类型文件
CHANGING
FILE_TABLE = GT_FILE
RC = GW_RC
EXCEPTIONS
FILE_OPEN_DIALOG_FAILED = 1
CNTL_ERROR = 2
ERROR_NO_GUI = 3
NOT_SUPPORTED_BY_GUI = 4
OTHERS = 5.
IF SY-SUBRC <> 0.
ENDIF.
ENDFORM.
17、ASSIGNING FIELD-SYMBOL
基本使用
定义指针直接改变内表值
示例:
LOOP AT GT_DATA ASSIGNING FIELD-SYMBOL(<FS_DATA>).
<FS_DATA>-NUM = '1'.
<FS_DATA>-AGE = '10'.
ENDLOOP.
示例代码作用:将内表GT_DATA的每一行的NUM和AGE字段分别改为“1”和“10”。
进阶
LOOP AT GT_DATA ASSIGNING FIELD-SYMBOL(<FS_OUT>) GROUP BY ( KEY1 = <FS_OUT>-HEADID KEY2 = ... ) ASSIGNING FIELD-SYMBOL(<FS_GROUP>).
LOOP AT GROUP <FS_GROUP> ASSIGNING FIELD-SYMBOL(<FS_LINE>).
<FS_LINE>-BUKRS = ...
<FS_LINE>-BLART = ...
<FS_LINE>-BLDAT = ...
<FS_LINE>-BUDAT = ...
ENDLOOP.
....
ENDLOOP.
对于上图所示数据 相同的凭证序号表示为同一组数据 在使用bapi进行操作时需要将同一凭证的数据导入到对应的内表中 处理起来就比较繁琐
可以使用以上代码实现分组循环:将内表GT_DATA按照HEADID等进行排序和分组 每一组都放到<FS_GROUP>中 然后对分组进行普通的指针循环 <FS_LINE>即指向每一组的每一条数据。
18、内外部转换
使用Function进行内外部转换
"外部转内部-加前导零
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = <FS_DATA>-HKONT
IMPORTING
OUTPUT = <FS_DATA>-HKONT.
"内部转外部-去前导零
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
EXPORTING
INPUT = <FS_DATA>-HKONT
IMPORTING
OUTPUT = <FS_DATA>-HKONT.
SAP S4 新语法
"内部转外部-去前导零
X = |{ X ALPHA = OUT }|.
"外部转内部-加前导零
X = |{ X ALPHA = IN }|.
文章来自于网络,如果侵犯了您的权益,请联系站长删除!