文章目录
- 1、对于sap表的操作
- 2、把数据从excel导入sap(TEXT_CONVERT_XLS_TO_SAP)
- 3、常用的函数
- 4、获取用户登录的电脑名和IP地址
- 5、指针的声明和使用
- 6、smw0上传Excel模板
- 7、下载smw0上传的模板
- 8、弹窗输入内容
- 9、打印logo及logo下载
- 10、SELECTION-SCREEN BEGIN OF BLOCK定义一个块
- 11、AT SELECTION-SCREEN ON VALUE-REQUEST FOR(自定义选择屏幕对呀输入框帮忙的输入帮忙选项)
- 12、SELECTION_TEXTS_MODIFY(在选择屏幕显示对段对应的中文,类似于选择文本)
- 13、MODIF ID
- 14、LIKE和TYPE的区别
- 15、USER-COMMAND uc
- 16、smartform打印
- 19、sap新建一个表并定义一个事务代码调用SM30维护
- 20、BAPI合集
- 22、新建一个MESSAGE类,用来自定义提示消息
- 23、abap的宏
- 24、 类
- 25、方法
- 26、增加前导0
- 27、获取内表的行数
- 28、SPLIT:对字符进行拆分
- 29、AUTHORITY-CHECK OBJECT(权限控制)
1、对于sap表的操作
a、通过表名查询是否有事务代码可以维护表内容
通过se16n进入表查询界面:
1、查询表:TVDIR
2、把我们要查询的表名输入到:视图/表,点击查询
3、可以在TVDIR中找到对应的一条记录。这就意味着,我们要查询的表已经生成了对应的维护视图。
4、查询表TSTCP,根据下图的方式填入
5、输入带**的参数进行模糊查询
6、就可以查询到对应维护表的前台事务代码
b、新建一个表,复制老表的字段
维护好表的属性后,点击字段这一栏,然后点击左上角的编辑-传输字段。
在这边输入要复制的表或者结构的名称,点击选择则是选中要复制的行。
先点击1,把焦点定义到表格内,然后点击2粘贴,把刚刚复制的全部粘贴过来,就完成了。
2、把数据从excel导入sap(TEXT_CONVERT_XLS_TO_SAP)
a、excel表格导入
"定义一个结构和内表,用来存储导入的excel的数据
TYPES: BEGIN OF TY_DATA,
USERNO(20) TYPE C,
USERNAME(10) TYPE C,
POSITION(10) TYPE C,
END OF TY_DATA.
DATA: LT_DATA TYPE TABLE OF TY_DATA.
DATA :LV_RAW TYPE TRUXS_T_TEXT_DATA. " 定义一个未使用的变量,作为I_TAB_RAW_DATA的占位符
"选择要导入的路径
PARAMETERS: P_FILE TYPE RLGRAP-FILENAME.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
CLEAR P_FILE.
CALL FUNCTION 'F4_FILENAME'
IMPORTING
FILE_NAME = P_FILE.
"调用函数把excel数据导入
START-OF-SELECTION.
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
I_FILENAME = P_FILE
"I_FIELD_SEPARATOR = 'X' " 对于Excel文件,此参数通常不需要设置
I_LINE_HEADER = 'X' " 如果Excel文件的第一行是标题,则设置为'X'
I_TAB_RAW_DATA = LV_RAW " 占位符
TABLES
I_TAB_CONVERTED_DATA = LT_DATA.
这样子就把excel的数据按顺序都导入到内表LT_DATA中了
注意:
I_FIELD_SEPARATOR:是分隔符,一般导入的文件是excel的话可以不用,注释掉就可以。
I_TAB_RAW_DATA :是占位符,一般是必填,定义个字段,放在函数里面就行。
表格的导入是按顺序导入的,导入前必须有个列名数量和列类型一样的内表去接数据,不然会报错。
b、定义一个文件选择框用来导入excel表格数据
"先设计一个内表用来放置导入的EXCEL表格数据
TYPES: BEGIN OF TY_DATA,
NAME(20) TYPE C,
AGE(10) TYPE C,
END OF TY_DATA.
DATA: LT_DATA TYPE TABLE OF TY_DATA.
DATA :LV_RAW TYPE TRUXS_T_TEXT_DATA. " 定义一个未使用的变量,作为I_TAB_RAW_DATA的占位符
PARAMETERS:
"设置两个单选按钮,并设置对应的事件,来显示和隐藏文件选择框
P_DDPC TYPE CHAR01 RADIOBUTTON GROUP G1 USER-COMMAND UC DEFAULT 'X',
P_EXCEL TYPE CHAR01 RADIOBUTTON GROUP G1.
"起新行
SELECTION-SCREEN BEGIN OF LINE .
"COMMENT 1(7)显示的位置
"TEXT-SE9用来显示标题,在左上角的转到--文本元素--文本符号中输入内容
SELECTION-SCREEN COMMENT 1(7) TEXT-SE9 MODIF ID S2 .
"设置选择框的位置
SELECTION-SCREEN POSITION 8.
PARAMETERS P_FILE TYPE RLGRAP-FILENAME VISIBLE LENGTH 37 MODIF ID S2 .
"设置个按钮及事件,用来下载模块的时候使用
SELECTION-SCREEN:PUSHBUTTON 48(8) P_PB1 USER-COMMAND CLICK MODIF ID S2 .
SELECTION-SCREEN END OF LINE .
INITIALIZATION.
P_PB1 = '模板下载'.
AT SELECTION-SCREEN .
CASE SY-UCOMM.
WHEN 'ONLI'."左上角的执行按钮
IF P_FILE = SPACE AND P_EXCEL = 'X'.
MESSAGE '必须指定上载文件路径' type 'E' .
ENDIF.
WHEN 'CLICK'.
"PERFORM . "模版下载的代码前面有
ENDCASE.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE .
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
MASK = ',EXCEL FILE,*.XLS;*.XLSX;'
"文件格式
MODE = 'O' "S为保存,O为打开
IMPORTING
FILENAME = P_FILE "路径
EXCEPTIONS
INV_WINSYS = 1
NO_BATCH = 2
SELECTION_CANCEL = 3
SELECTION_ERROR = 4
OTHERS = 5.
IF SY-SUBRC <> 0.
MESSAGE '文件读取失败' type 'I'.
"RETURN.
ENDIF.
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
"设置文件选择框的显示和隐藏
IF P_EXCEL = 'X' AND SCREEN-GROUP1 = 'S2'.
SCREEN-ACTIVE = '1' .
MODIFY SCREEN.
ELSEIF P_EXCEL <> 'X' AND SCREEN-GROUP1 = 'S2'.
SCREEN-ACTIVE = '0' .
MODIFY SCREEN.
ENDIF.
ENDLOOP.
START-OF-SELECTION .
IF P_EXCEL = 'X' AND P_FILE <> ''.
PERFORM FRM_EXCEL_UPLOAD .
ENDIF.
FORM FRM_EXCEL_UPLOAD .
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
I_FILENAME = P_FILE
"I_FIELD_SEPARATOR = 'X' " 对于Excel文件,此参数通常不需要设置
I_LINE_HEADER = 'X' " 如果Excel文件的第一行是标题,则设置为'X'
I_TAB_RAW_DATA = LV_RAW " 占位符
TABLES
I_TAB_CONVERTED_DATA = LT_DATA.
ENDFORM.
c、写一个文件选择的屏幕
"先设计一个内表用来放置导入的EXCEL表格数据
TYPES: BEGIN OF TY_DATA,
NAME(20) TYPE C,
AGE(10) TYPE C,
END OF TY_DATA.
DATA: LT_DATA TYPE TABLE OF TY_DATA.
DATA :LV_RAW TYPE TRUXS_T_TEXT_DATA. " 定义一个未使用的变量,作为I_TAB_RAW_DATA的占位符
PARAMETERS:
"设置两个单选按钮,并设置对应的事件
P_DDPC TYPE CHAR01 RADIOBUTTON GROUP G1 USER-COMMAND UC DEFAULT 'X',
P_EXCEL TYPE CHAR01 RADIOBUTTON GROUP G1.
INITIALIZATION.
SELECTION-SCREEN BEGIN OF SCREEN 4000. "Excel上传
SELECTION-SCREEN BEGIN OF LINE . "BEGIN OF LINE---END之间的内容置于同一行
SELECTION-SCREEN COMMENT 1(20) TEXT-SE9 . "se1文本内容:文件上传路径
PARAMETERS P_FILE TYPE RLGRAP-FILENAME VISIBLE LENGTH 40 DEFAULT '' . "程序字段,上传文件路径
SELECTION-SCREEN END OF LINE .
SELECTION-SCREEN END OF SCREEN 4000 .
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE .
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
MASK = ',EXCEL FILE,*.XLS;*.XLSX;'
"文件格式
MODE = 'O' "S为保存,O为打开
IMPORTING
FILENAME = P_FILE "路径
EXCEPTIONS
INV_WINSYS = 1
NO_BATCH = 2
SELECTION_CANCEL = 3
SELECTION_ERROR = 4
OTHERS = 5.
IF SY-SUBRC <> 0.
MESSAGE '文件读取失败' type 'S'. "I000' WITH '文件读取失败'.
ENDIF.
AT SELECTION-SCREEN .
CASE SY-UCOMM.
WHEN 'ONLI'."左上角的执行按钮
IF P_FILE = SPACE AND P_EXCEL = 'X'.
MESSAGE '必须指定上载文件路径' type 'E' .
ENDIF.
WHEN 'CLICK'.
"PERFORM . "模版下载的代码前面有
WHEN 'UC'.
IF P_EXCEL = 'X'.
CALL SELECTION-SCREEN 4000 STARTING AT 5 5 ENDING AT 70 8.
"IF P_FILE <> ''.
"PERFORM FRM_REAEXCEL.
"ENDIF.
IF P_FILE = SPACE AND P_EXCEL = 'X'.
MESSAGE '必须指定上载文件路径' type 'E' .
ENDIF.
ENDIF.
ENDCASE.
IF P_EXCEL = 'X' AND P_FILE <> ''.
PERFORM FRM_EXCEL_UPLOAD .
ENDIF.
FORM FRM_EXCEL_UPLOAD .
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
I_FILENAME = P_FILE
"I_FIELD_SEPARATOR = 'X' " 对于Excel文件,此参数通常不需要设置
I_LINE_HEADER = 'X' " 如果Excel文件的第一行是标题,则设置为'X'
I_TAB_RAW_DATA = LV_RAW " 占位符
TABLES
I_TAB_CONVERTED_DATA = LT_DATA.
ENDFORM.
d、画一个屏幕–选择文件
(1)程序的代码如下:
"先设计一个内表用来放置导入的EXCEL表格数据
TYPES: BEGIN OF TY_DATA,
NAME(20) TYPE C,
AGE(10) TYPE C,
END OF TY_DATA.
DATA: LT_DATA TYPE TABLE OF TY_DATA.
DATA :LV_RAW TYPE TRUXS_T_TEXT_DATA. " 定义一个未使用的变量,作为I_TAB_RAW_DATA的占位符
DATA P_FILE like RLGRAP-FILENAME."要这个类型,不然导入的函数会报错
PARAMETERS:
"设置两个单选按钮,并设置对应的事件,来显示和隐藏文件选择框
P_DDPC TYPE CHAR01 RADIOBUTTON GROUP G1 USER-COMMAND UC DEFAULT 'X',
P_EXCEL TYPE CHAR01 RADIOBUTTON GROUP G1.
INITIALIZATION.
AT SELECTION-SCREEN .
CASE SY-UCOMM.
WHEN 'ONLI'."左上角的执行按钮
IF P_FILE = SPACE AND P_EXCEL = 'X'.
MESSAGE '必须指定上载文件路径' type 'E' .
ENDIF.
WHEN 'CLICK'.
"PERFORM . "模版下载的代码前面有
WHEN 'UC'.
IF P_EXCEL = 'X'.
CALL SELECTION-SCREEN 3000 STARTING AT 5 5 ENDING AT 70 8.
"IF P_FILE <> ''.
"PERFORM FRM_REAEXCEL.
"ENDIF.
IF P_FILE = SPACE AND P_EXCEL = 'X'.
MESSAGE '必须指定上载文件路径' type 'E' .
ENDIF.
ENDIF.
ENDCASE.
IF P_EXCEL = 'X' AND P_FILE <> ''.
PERFORM FRM_EXCEL_UPLOAD .
ENDIF.
"用来选择文件,获取路径
MODULE %_P_FILE_VAL INPUT.
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
MASK = ',EXCEL FILE,*.XLS;*.XLSX;'
"文件格式
MODE = 'O' "S为保存,O为打开
IMPORTING
FILENAME = P_FILE "路径
EXCEPTIONS
INV_WINSYS = 1
NO_BATCH = 2
SELECTION_CANCEL = 3
SELECTION_ERROR = 4
OTHERS = 5.
IF SY-SUBRC <> 0.
MESSAGE '文件读取失败' type 'I'.
"RETURN.
ENDIF.
ENDMODULE.
FORM FRM_EXCEL_UPLOAD .
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
I_FILENAME = P_FILE
"I_FIELD_SEPARATOR = 'X' " 对于Excel文件,此参数通常不需要设置
I_LINE_HEADER = 'X' " 如果Excel文件的第一行是标题,则设置为'X'
I_TAB_RAW_DATA = LV_RAW " 占位符
TABLES
I_TAB_CONVERTED_DATA = LT_DATA.
ENDFORM.
(2)屏幕中要做如下操作:
名称要对应程序中的变量名;
这边的长度要长点,不然路径显示不完全 ;
这边可能的条目简直选择1
屏幕中的代码如下:
PROCESS BEFORE OUTPUT.
PROCESS AFTER INPUT.
* MODULE USER_COMMAND_3000.
"触发右上角的关闭按钮
MODULE %_BACK AT EXIT-COMMAND.
"在用户输入数据并提交后触发,通常在按下回车键或点击按钮后。
MODULE %_INIT_PAI.
"FIELD 关键字通常用于定义屏幕(Dynpro)上的字段。如果你在屏幕上定义了一个字段
"P_FILE,那么这个字段可以用于用户输入或显示数据。
FIELD !P_FILE MODULE %_P_FILE .
CHAIN.
FIELD P_FILE .
MODULE %_END_OF_SCREEN.
MODULE %_OK_CODE_3000.
ENDCHAIN.
"用于输入框可以选择文件
PROCESS ON VALUE-REQUEST.
FIELD P_FILE MODULE %_P_FILE_VAL .
3、常用的函数
CS_BOM_EXPL_MAT_V2:获取物料的bom&展开下一层的bom
DATA:LT_STB TYPE TABLE OF STPOX.
DATA:LT_MATCAT TYPE TABLE OF CSCMAT.
DATA:L_TOPMAT TYPE CSTMAT .
DATA:L_DSTST TYPE CSDATA-XFELD .
CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
EXPORTING
CAPID = 'PP01'"一般情况下,我们所取的都生产用BOM,所以必须指定为PP01
DATUV = SY-DATUM"当前的日期
EMENG = '1'"基本数量,我这边是默认1
STLAL = '01'"可选bom的类型
MTNRV = '物料号'
MDMPS = '' "虚拟件
MEHRS = 'X' "是否展开下一层的BOM,X:展开;空值:不展开
WERKS = '工厂代码'
IMPORTING
TOPMAT = L_TOPMAT
DSTST = L_DSTST
TABLES
STB = LT_STB
MATCAT = LT_MATCAT
EXCEPTIONS
ALT_NOT_FOUND = 1
CALL_INVALID = 2
MATERIAL_NOT_FOUND = 3
MISSING_AUTHORIZATION = 4
NO_BOM_FOUND = 5
NO_PLANT_DATA = 6
NO_SUITABLE_BOM_FOUND = 7
CONVERSION_ERROR = 8
OTHERS = 9.
注:
1、和cs03类似,DATUV的值设置成当天的时间,可以获取到最新的bom数据。.
2、capid参数:
一般情况下,我们所取的都生产用BOM,所以必须指定为"PP01" 。如果是其它类型的BOM应用,则可以按需要选择:
PP01:Production(生产)
BEST: Inventory management(库存管理)
INST: Plant maintenance(Plant maintenance)
PC01 :Costing(成本核算)
PI01:Process manufacturing(流程制造业)
SD01:Sales and distribution(销售及分销)
POPUP_TO_CONFIRM:弹窗确定信息
DATA:GV_ANSWERGD TYPE CHAR1.
CALL FUNCTION 'POPUP_TO_CONFIRM'
EXPORTING
TITLEBAR = '选择'
* DIAGNOSE_OBJECT = ' '
TEXT_QUESTION = '弹窗需要确定的内容!'
TEXT_BUTTON_1 = '确认'
TEXT_BUTTON_2 = '取消'
DISPLAY_CANCEL_BUTTON = ''
IMPORTING
ANSWER = GV_ANSWERGD
* TABLES
* PARAMETER =
EXCEPTIONS
TEXT_NOT_FOUND = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
IF GV_ANSWERGD <> '1'.
LEAVE LIST-PROCESSING.
"LEAVE LIST-PROCESSING:会立即终止当前的列表处理,并返回到选择屏幕或程序的调用点。
ENDIF.
RP_CALC_DATE_IN_INTERVAL(年/月/日加减计算)
DATA: lv_date TYPE dats.
"计算前一年的日期
CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
EXPORTING
date = sy-datum
days = 0
months = 0
signum = '-'
years = 1
IMPORTING
calc_date = lv_date.
WRITE: 'Today:', sy-datum, 'Previous year:', lv_date.
"计算下一个月的
CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
EXPORTING
date = sy-datum
days = 0
months = 1
signum = '+'
years = 0
IMPORTING
calc_date = lv_date.
WRITE:/ 'Today:', sy-datum, 'Next month:', lv_date.
POPUP_TO_DECIDE_LIST:弹窗选择
TYPES: LTY_SPOPLI TYPE TABLE OF SPOPLI WITH EMPTY KEY.
DATA L_ANSWER TYPE C.
"提示用户选择打印模式
CLEAR: L_ANSWER.
DATA(LT_SPOPLI) = VALUE LTY_SPOPLI(
( SELFLAG = 'X' VAROPTION = '香蕉')
( VAROPTION = '苹果')
( VAROPTION = '橘子')
).
"选择
CALL FUNCTION 'POPUP_TO_DECIDE_LIST'
EXPORTING
CURSORLINE = 1
MARK_FLAG = ''
MARK_MAX = 1
START_COL = 5"显示的列
START_ROW = 3"显示的行
TEXTLINE1 = '请选择 [香蕉] 或 [苹果] 或 [橘子]操作'
* TEXTLINE2 = ' '
* TEXTLINE3 = ' '
TITEL = '功能选择'
* DISPLAY_ONLY = ' '
IMPORTING
ANSWER = L_ANSWER
TABLES
T_SPOPLI = LT_SPOPLI
EXCEPTIONS
NOT_ENOUGH_ANSWERS = 1
TOO_MUCH_ANSWERS = 2
TOO_MUCH_MARKS = 3
OTHERS = 4.
IF SY-SUBRC NE 0.
MESSAGE '请选择一个功能' TYPE 'I'.
RETURN.
ENDIF.
write l_ANSWER.
4、获取用户登录的电脑名和IP地址
REPORT ZALV_TEST.
DATA: OPCODE(1) TYPE X VALUE 5,
COMPUTER_NAME TYPE USR41-TERMINAL.
CALL 'ThUsrInfo' ID 'OPCODE' FIELD OPCODE
ID'TERMINAL' FIELD COMPUTER_NAME.
WRITE COMPUTER_NAME.
DATA(IP_ADDRESS) = CL_GUI_FRONTEND_SERVICES=>GET_IP_ADDRESS( ).
WRITE IP_ADDRESS.
批注
在 SAP 的 ABAP 编程语言中,DATA 关键字用于声明变量。这行代码 DATA: code TYPE x LENGTH 声明了一个名为 code 的变量,具体特征如下:
1、TYPE x 表示变量 code 是一个十六进制类型。
2、LENGTH 2 指定这个变量的长度为 2 个字节。
3、十六进制类型的变量通常用于处理二进制数据,比如文件、加密数据或是系统级的操作,其中对精确的字节控制非常重要。
5、指针的声明和使用
TYPES: BEGIN OF T_MARC,
MATNR TYPE MARC-MATNR,
BSTRF TYPE MARC-BSTRF,
END OF T_MARC.
DATA:LT_MARC TYPE TABLE OF T_MARC,
LS_MARC TYPE T_MARC.
FIELD-SYMBOLS <FS_MARC> TYPE T_MARC."通过结构定义一个指针
FIELD-SYMBOLS <FS_MARC02> LIKE LT_MARC."通过内表定义一个指针
"通过指针循环对内表进行操作
LOOP AT LT_MARC ASSIGNING <FS_MARC>.
<FS_MARC>-BSTRF = '5653.360'."这个时候内表的bstrf的值就直接改变了,就不需要在进行modify了
ENDLOOP.
"临时定义一个指针进行操作
LOOP AT LT_MARC ASSIGNING FIELD-SYMBOL(<FS_MARC03>).
ENDLOOP.
6、smw0上传Excel模板
把我们需要导入数据的模板上传到sap中,方便到时候进行下载
7、下载smw0上传的模板
DATA:c_export_filename_xls TYPE string VALUE '模板名称.xlsx', "导出模板默认文件名
c_objid_xls TYPE wwwdatatab-objid VALUE '模板在swm0中的ID'. "存放模板的对象id
DATA: lo_objdata LIKE wwwdatatab, "Excel模板对象
ls_destination LIKE rlgrap-filename, "下载保存的目标路径
lc_path TYPE string, "存储路径
lc_fullpath TYPE string, "文件完整路径
li_rc LIKE sy-subrc. "返回值
DATA :l_obj TYPE REF TO cl_gui_frontend_services .
DATA: l_path TYPE string,l_fpath TYPE string,l_rc TYPE i.
* 检查模板是否存在
SELECT SINGLE relid objid FROM wwwdata INTO CORRESPONDING FIELDS OF lo_objdata
WHERE srtf2 = 0
AND relid = 'MI'
AND objid = c_objid_xls.
IF sy-subrc NE 0 OR lo_objdata-objid EQ space.
MESSAGE '还未上传模板,无法下载' TYPE 'E'.
ENDIF.
CREATE OBJECT l_obj .
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
* WINDOW_TITLE =
file_filter = '.xls|.xlsx'
initial_directory = 'C:'
default_extension = 'XLSX' "默认保存文件格式
default_file_name = c_export_filename_xls "默认文件名称
* WITH_ENCODING =
* FILE_FILTER =
* INITIAL_DIRECTORY =
* PROMPT_ON_OVERWRITE = 'X'
CHANGING
filename = c_export_filename_xls "默认文件名称
path = l_path "文件路径
fullpath = lc_fullpath "文件路径
user_action = l_rc
* FILE_ENCODING =
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE '保存文件出错!' TYPE 'E'.
ENDIF.
IF l_rc <> 0."l_rc=0,表示按下确认按钮,9表示取消
"STOP.
RETURN.
ENDIF.
* 下载模板
ls_destination = lc_fullpath.
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
key = lo_objdata
destination = ls_destination
IMPORTING
rc = li_rc.
IF li_rc NE 0.
MESSAGE e027(zfimsg) WITH c_export_filename_xls.
ENDIF.
8、弹窗输入内容
a、POPUP_GET_VALUES:根据现有表显示弹窗
DATA: lt_values TYPE TABLE OF sval,
wa_values LIKE LINE OF lt_values.
DATA: return_code TYPE string .
"物料组
CLEAR wa_values.
wa_values-tabname = 'MARA' . ""物料主数据的表名
wa_values-fieldname = 'MATKL' . "物料组
wa_values-field_obl = 'X' . "是否为必填
wa_values-FIELDTEXT = '请输入物料组'.
APPEND wa_values TO lt_values.
CALL FUNCTION 'POPUP_GET_VALUES'
EXPORTING
* NO_VALUE_CHECK = ' '
popup_title = '请输入参数'
* START_COLUMN = '5'
* START_ROW = '5'
IMPORTING
returncode = return_code
TABLES
fields = lt_values
EXCEPTIONS
error_in_fields = 1
OTHERS = 2.
IF sy-subrc = 0.
LOOP AT lt_values INTO wa_values.
if wa_values-value = '1234'.
WRITE:/ wa_values-fieldname, wa_values-value.
endif.
ENDLOOP.
ENDIF.
b、自己画一个弹窗
先右键创建一个屏幕,然后点格式进入画屏界面,从左边的工具栏拉去对应需要的控件
双击输入框把属性设置调出来,点击程序勾选输入和输出字段,并点检显示勾选不可见(显示成*****)
并设置按钮的功能码,确定设置成"OK",取消设置成"CANC"
加下来就是对应的代码:
MODULE STATUS_2000 OUTPUT.
* SET PF-STATUS 'xxxxxxxx'.
SET TITLEBAR '请输入密码'.
ENDMODULE.
MODULE USER_COMMAND_2000 INPUT.
CASE sy-ucomm.
WHEN 'OK'.
IF ls_2000-password <> '123'.
MESSAGE '密码填写错误' TYPE 'S'.
ls_2000-password = ''.
screen-invisible = '1'."screen-invisible = '1'.把字段显示出来
modify screen.
ELSE.
"获取填写的信息
WRITE:/ ls_2000-password.
CLEAR ls_2000.
LEAVE TO SCREEN 0.
ENDIF.
WHEN 'CANC'.
CLEAR ls_2000.
LEAVE TO SCREEN 0.
WHEN OTHERS.
ENDCASE.
ENDMODULE.
9、打印logo及logo下载
a、logo上传及打印
输入事务代码se78,双击1,然后点击2,在弹窗内选择对应路径下的图纸,并输入名称及选择类型
格式需要时BPM格式
创建完之后要点击下这个小车的符号,才可以把这个图片包含在请求中,到时候一起上传
在要打印的位置,输入对应的图片名称即可
b、se78所上传图片下载到本地
DATA : g_bytecount TYPE i,
g_content TYPE STANDARD TABLE OF
bapiconten INITIAL SIZE 0,
g_bitmap_file_bytecount TYPE i,
g_file_name TYPE string,
BEGIN OF g_bitmap_file OCCURS 0,
line(255) TYPE x,
END OF g_bitmap_file,
l_bitmaps TYPE TABLE OF stxbitmaps WITH HEADER LINE,
lit_scrfields TYPE TABLE OF dynpread WITH HEADER LINE.
PARAMETER: p_image LIKE stxbitmaps-tdname, "需要下载的图片名称
*
p_file LIKE ibipparms-path. "下载到PC的路径
*
" Download File path
*F4 help to get file path
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
CALL FUNCTION 'F4_FILENAME'
IMPORTING
file_name = p_file.
*F4 help search for image files
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_image.
CALL FUNCTION 'SAPSCRIPT_SEARCH_GRAPHIC_BDS'
EXPORTING
selection_screen = 'X'
select_entry = 'X'
selection_show = 'X'
IMPORTING
e_name = p_image
TABLES
t_selections = l_bitmaps
EXCEPTIONS
nothing_found = 1
selection_canceled = 2
internal_error = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
START-OF-SELECTION.
MOVE p_file TO g_file_name.
*Get graphics to BDS
CALL FUNCTION 'SAPSCRIPT_GET_GRAPHIC_BDS'
EXPORTING
i_object = 'GRAPHICS'
i_name = p_image
i_id = 'BMAP'
i_btype = 'BCOL'
IMPORTING
e_bytecount = g_bytecount
TABLES
content = g_content
EXCEPTIONS
not_found = 1
bds_get_failed = 2
bds_no_content = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE i208(00) WITH 'Image does not exists.'(000).
ENDIF.
IF NOT g_content[] IS INITIAL.
*Convert to BITMAP
CALL FUNCTION 'SAPSCRIPT_CONVERT_BITMAP'
EXPORTING
old_format = 'BDS'
new_format = 'BMP'
bitmap_file_bytecount_in = g_bytecount
IMPORTING
bitmap_file_bytecount = g_bitmap_file_bytecount
TABLES
bds_bitmap_file = g_content
bitmap_file = g_bitmap_file
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
*Download to PC
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
bin_filesize = g_bitmap_file_bytecount
filename = g_file_name
filetype = 'BIN'
TABLES
data_tab = g_bitmap_file
EXCEPTIONS
file_write_error = 1
no_batch = 2
gui_refuse_filetransfer = 3
invalid_type = 4
no_authority = 5
unknown_error = 6
header_not_allowed = 7
separator_not_allowed = 8
filesize_not_allowed = 9
header_too_long = 10
dp_error_create = 11
dp_error_send = 12
dp_error_write = 13
unknown_dp_error = 14
access_denied = 15
dp_out_of_memory = 16
disk_full = 17
dp_timeout = 18
file_not_found = 19
dataprovider_exception = 20
control_flush_error = 21
OTHERS = 22.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDIF.
10、SELECTION-SCREEN BEGIN OF BLOCK定义一个块
a、text-xxx
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(79) text-002.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(79) text-002.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK b1.
b、TITLE tpltx
SELECTION-SCREEN BEGIN OF BLOCK pl WITH FRAME TITLE tpltx.
PARAMETERS p_werks TYPE marc-werks.
SELECTION-SCREEN END OF BLOCK pl.
INITIALIZATION.
tpltx = '标题内容'.
11、AT SELECTION-SCREEN ON VALUE-REQUEST FOR(自定义选择屏幕对呀输入框帮忙的输入帮忙选项)
SELECTION-SCREEN BEGIN OF BLOCK pl WITH FRAME TITLE tpl.
SELECT-OPTIONS: s_ktext1 FOR tablename-ktext1.
SELECTION-SCREEN END OF BLOCK pl.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_ktext1-low.
PERFORM frm_f4_get USING 'S_KTEXT1-LOW'.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_ktext1-high.
PERFORM frm_f4_get USING 'S_KTEXT1-HIGH'.
FORM frm_f4_get USING p_field TYPE help_info-dynprofld.
TYPES:BEGIN OF typ_f4,
zzcate TYPE tablename-zzcate,
zktext TYPE tablename-zktext,
END OF typ_f4.
DATA: lw_f4 TYPE typ_f4,
lt_f4 LIKE STANDARD TABLE OF lw_f4.
SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_f4
FROM tablename.
SORT lt_f4 BY zzcate.
DELETE ADJACENT DUPLICATES FROM lt_f4 COMPARING zzcate.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'ZKTEXT'
dynpprog = sy-repid
dynpnr = sy-dynnr
dynprofield = p_field
value_org = 'S'
TABLES
value_tab = lt_f4
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
ENDFORM.
12、SELECTION_TEXTS_MODIFY(在选择屏幕显示对段对应的中文,类似于选择文本)
PERFORM frm_gui_text USING sy-repid 'S' 'S_KTEXT1' '内容'.
FORM frm_gui_text USING i_repid TYPE repid
i_kind TYPE c
i_params TYPE clike
i_text TYPE clike.
DATA: lw_text TYPE rsseltexts,
lt_text LIKE STANDARD TABLE OF lw_text.
REFRESH lt_text.
lw_text-name = i_params.
lw_text-kind = i_kind.
lw_text-text = i_text.
APPEND lw_text TO lt_text.
CALL FUNCTION 'SELECTION_TEXTS_MODIFY'
EXPORTING
program = i_repid
TABLES
seltexts = lt_text
EXCEPTIONS
program_not_found = 1
program_cannot_be_generated = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM.
13、MODIF ID
PARAMETERS: p_werks type marc-werks MODIF ID P1,
p_matnr type marc-matnr MODIF ID P2.
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
CASE SCREEN-GROUP1 .
WHEN 'P1'.
SCREEN-ACTIVE = 0."隐藏
WHEN 'P2'.
SCREEN-ACTIVE = 1."显示
ENDCASE.
MODIFY SCREEN.
ENDLOOP.
14、LIKE和TYPE的区别
TYPE 用于直接指定变量的数据类型。它可以引用标准ABAP数据类型或数据字典中的数据类型。
LIKE 用于声明一个变量,使其数据类型与另一个变量或数据字典字段的数据类型相同。它允许你复制现有变量或字段的类型。
DATA: lv_matnr1 TYPE matnr, " 使用TYPE声明(matnr:数据类型)
lv_matnr2 LIKE lv_matnr1, " 使用LIKE声明
lv_matnr3 LIKE mara-matnr, " 使用LIKE引用数据字典字段
lv_flag TYPE c LENGTH 1."使用TYPE声明(使用标准ABAP数据类型)
DATA: LT_MARC TYPE TABLE OF MARC,"定义内表
LS_MARC TYPE MARC."定义工作区
15、USER-COMMAND uc
SELECTION-SCREEN BEGIN OF BLOCK b1.
PARAMETERS: p1 TYPE c RADIOBUTTON GROUP g1 USER-COMMAND uc DEFAULT 'X',
p2 TYPE c RADIOBUTTON GROUP g1,
p3 TYPE c RADIOBUTTON GROUP g1.
SELECTION-SCREEN END OF BLOCK b1.
AT SELECTION-SCREEN.
CASE sy-ucomm.
WHEN 'UC'.
" 用户点击了单选按钮
IF p1 = 'X'.
" 处理 p1 被选中的逻辑
WRITE: / 'Option 1 selected'.
ELSEIF p2 = 'X'.
" 处理 p2 被选中的逻辑
WRITE: / 'Option 2 selected'.
ELSEIF p3 = 'X'.
" 处理 p3 被选中的逻辑
WRITE: / 'Option 3 selected'.
ENDIF.
WHEN OTHERS.
" 处理其他功能码
ENDCASE.
16、smartform打印
a、创建样式
右键段落格式创建节点
设置对应的段落格式
右键字符格式创建节点
设置对应的字体样式
在打印模板中进行引用
b、创建打印模板
(1)全局设置
表格属性
表格接口
在这边设置对应的参数
全局定义
在这边定义全局的数据,定义一个STRING变量以及一个工作区用来接收表格接口中ITAB的值。
初始化设置输入参数和输出参数,通过代码设置标题的名称
(2)页和窗口
TITLE标题
右键页面,新建一个TITLE标题窗口,在这边去设置对应要显示的LOGO和标题,以及设置边距和高宽
这边的LOGO图片由se78上传,前面章节有,这边直接填写上传的时候设置的图片名称就行。
设置LOGO要显示的位置
右键标题新建一个文本。在这边输入对应要体现的标题名,对应的段落格式和字符格式,在上方的输出选项中选择对应的样式,在这边就可以进行选择
HEADER抬头窗口
设置对应的边距,要结合上方标题的边距设置
新建个模板,用来设置输出的格式,这边点击细节来设置对应的行和列的大小
表格设计完之后返回,右键模板新建文本文件
1、在这边根据传入的内表,去显示对应的数据
2、设置完后在输出选项中,设置具体要输出的行和列
MIAN主窗口
这边就是我们主要数据显示的位置了。
由于需求不一样,显示的字段名可能不一样,我们通过全局变量FLAG来控制分支。创建-流逻辑-可选的
这边设置分支的条件
然后在TRUE或者FALSE右键创建表用来显示数据。
创建完表之后也是点击细节设置对应的行和列
在数据页面要设置我们内表的LOOP循环
表头
表的基本属性设置完之后,就可以设计我们的表头了,右键表头选择新建表行,然后选择行类型,行类型就是我们前面设计表格显示的那个名称,选择完行类型后,就会根据表设计的列数,自动生成对应的表格
在对应的格子右键新建文本,就可以设置表头的列名
主要区域
也是右键创建表行,然后选择行类型,自动生成对应的格子
在对应的格子右键创建文本,根据传入的内表的字段名去显示数据
脚标
本次的打印没有涉及到脚标就没写,后续补充
*在FALSE那边也是和TRUE这边一样的操作,只是显示的列不一样。
*
这边可以设置边框显示
FOOTER页脚
页脚这边由于要显示的不一样我也是整了个可选的分支,我们具体看F2页脚的。
创建对应的模板,并设置宽度、对齐、高度和列宽等信息
这边可以右键模板创建文本,在这边显示对应的内表的信息获取固定的信息
设置完之后,设置输出选项中的输出位置
整完之后就可以执行查询设计的模板了
输入一个输出设备
c、程序调用smartfrom并传入参数
DATA: LV_FORMNAME TYPE TDSFNAME,
FUNCTION_MODULE_NAME TYPE RS38L_FNAM,
LT_ITAB TYPE TABLE OF XXXX,
LS_ITAB TYPE XXXX,
LT_RETURN TYPE TABLE OF BAPIRET2,
CONTROL_PARAMETERS TYPE SSFCTRLOP,
OUTPUT_OPTIONS TYPE SSFCOMPOP.
LS_ITAB-AUART = '测试'.
LS_ITAB-BEZEI = '测试'.
LS_ITAB-AUDAT = '20250306'.
LS_ITAB-VBELN = '13152'.
LS_ITAB-BSTKD = '23656'.
LS_ITAB-POSNR = '10'.
LS_ITAB-MATNR = '1365-965'.
LS_ITAB-MAKTX = '物料描述'.
LS_ITAB-KDMAT = '26455'.
LS_ITAB-KWMENG = '785'.
LS_ITAB-KWMENG = '265'.
APPEND LS_ITAB TO LT_ITAB.
" 调用 SmartForms
LV_FORMNAME = 'YTEST'. " 替换为你的 SmartForms 名称
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
FORMNAME = LV_FORMNAME
IMPORTING
FM_NAME = FUNCTION_MODULE_NAME
EXCEPTIONS
NO_FORM = 1
NO_FUNCTION_MODULE = 2
OTHERS = 3.
IF SY-SUBRC <> 0.
MESSAGE 'Error in calling SmartForms' TYPE 'E'.
ENDIF.
"定义SMARTFORMS参数
OUTPUT_OPTIONS-TDNEWID = 'X'."参数用于控制是否为每次打印请求生成一个新的 spool ID
* control_parameters-no_close = space."用于防止打印对话框在打印完成后自动关闭
* control_parameters-no_open = 'X'."参数用于控制是否在每次调用时打开打印对话框。当设置为 'X' 时,不会打开打印对话框
CONTROL_PARAMETERS-PREVIEW = 'X'." 参数用于控制是否直接显示打印预览。
"当设置为 'X' 时,SmartForms 会直接显示打印预览,而不是先显示打印对话框
* control_parameters-no_dialog = 'X'."参数用于控制是否显示打印对话框
" 调用 SmartForms 的函数模块
CALL FUNCTION FUNCTION_MODULE_NAME
EXPORTING
CONTROL_PARAMETERS = CONTROL_PARAMETERS
OUTPUT_OPTIONS = OUTPUT_OPTIONS
VBELN = '123456'"对应smartform中的全局变量
FLAG = 'X'
TABLES
ITAB = LT_ITAB
EXCEPTIONS
FORMATTING_ERROR = 1
INTERNAL_ERROR = 2
SEND_ERROR = 3
USER_CANCELED = 4
OTHERS = 5.
IF SY-SUBRC <> 0.
MESSAGE 'Error in printing SmartForms' TYPE 'E'.
ENDIF.
d、smartform中增加条形码/二维码显示
se73事务代码创建条形码
19、sap新建一个表并定义一个事务代码调用SM30维护
a、设置完表的列名以及其他属性后,点击表维护生成器
b、对应的数据填写完之后,点击左上角的创建
c、双击1,进去表维护
d、点击格式,在里面输入对应的列名,保存后返回就行
e、事务代码SE93创建维护表的事务
f、选择最后一个选项
g、输入事务SM30,并跳过初始屏幕;
VIEWNAME:TABLENAME
UPDATE:X
20、BAPI合集
VL10B–BAPI_OUTB_DELIVERY_CREATE_STO创建交货单(采购凭证)
"变量及内表的定义就省略了,放主要的bapi部分
CLEAR LS_STORETURN.
"这边勾选的采购凭证都是一样的
READ TABLE LT_STORETURN INTO LS_STORETURN WITH KEY SEL = 'X'.
IF SY-SUBRC = 0.
SELECT SINGLE EBELN INTO WA_EBELN FROM EKKO
WHERE EBELN = LS_STORETURN-EBELN
AND BSART = 'ZRN1'."这边创建的是ZRN1类型的交货单
IF SY-SUBRC NE 0.
MESSAGE '请输入正确的转储订单编号' TYPE 'I'.
RETURN.
ENDIF.
SELECT EBELN EBELP MENGE MEINS
FROM EKPO
INTO CORRESPONDING FIELDS OF TABLE IT_EKPO
WHERE EBELN = LS_STORETURN-EBELN
AND LOEKZ = ''.
IF SY-SUBRC NE 0.
MESSAGE '转储订单编号行项目为空' TYPE 'I'.
RETURN.
ENDIF.
SELECT SINGLE BELNR INTO WA_VBELN
FROM EKBE
WHERE EBELN = LS_STORETURN-EBELN
AND BEWTP = 'L'.
IF SY-SUBRC = 0.
MESSAGE '转储订单已创建交货单' TYPE 'I'.
RETURN.
ENDIF.
"获取eket中的交货时间,得出要生成多少个交货单号,用来比较所有的凭证是否都对应生成交货单
SELECT EBELN, EINDT
INTO TABLE @DATA(LT_EKET)
FROM EKET
WHERE EBELN = @LS_STORETURN-EBELN.
SORT LT_EKET BY EINDT.
DELETE ADJACENT DUPLICATES FROM LT_EKET COMPARING EINDT.
LOOP AT IT_EKPO.
CLEAR IT_DLVREF.
IT_DLVREF-REF_DOC = IT_EKPO-EBELN. "采购凭证
IT_DLVREF-REF_ITEM = IT_EKPO-EBELP. "项目
IT_DLVREF-DLV_QTY = IT_EKPO-MENGE. "数量
IT_DLVREF-SALES_UNIT = IT_EKPO-MEINS. "单位
IT_DLVREF-SALES_UNIT_ISO = IT_EKPO-MEINS. "单位
APPEND IT_DLVREF.
ENDLOOP.
CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_STO'
EXPORTING
SHIP_POINT = '6000' "装运点/接收点
DUE_DATE = SY-DATUM
* DEBUG_FLG =
* NO_DEQUEUE = ' '
IMPORTING
DELIVERY = EP_VBELN
NUM_DELIVERIES = WA_VBNUM
TABLES
STOCK_TRANS_ITEMS = IT_DLVREF
RETURN = RETURN.
CONDENSE WA_VBNUM.
APPEND LINES OF RETURN TO IT_RETURN.
IF SY-SUBRC = 0 AND EP_VBELN IS NOT INITIAL AND LINES( LT_EKET ) = WA_VBNUM.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
CONCATENATE '生成交货单' WA_VBNUM '张' INTO EP_MSG SEPARATED BY SPACE.
"刷新alv
"LS_STORETURN-VBELN = EP_VBELN .
"MODIFY LT_STORETURN FROM LS_STORETURN TRANSPORTING VBELN WHERE EBELN = LS_STORETURN-EBELN.
PERFORM FRM_GET_DATA.
PERFORM FRM_REF_ALV.
MESSAGE EP_MSG TYPE 'I'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
LOOP AT RETURN WHERE TYPE = 'E' OR TYPE = 'A' OR TYPE = 'W'.
IF EP_MSG IS INITIAL.
EP_MSG = RETURN-MESSAGE.
ELSE.
CONCATENATE EP_MSG RETURN-MESSAGE INTO EP_MSG SEPARATED BY SPACE.
ENDIF.
ENDLOOP.
MESSAGE EP_MSG TYPE 'I'.
ENDIF.
ELSE.
MESSAGE '请先勾选对应的退货单' TYPE 'I'.
ENDIF.
FORM FRM_REF_ALV .
DATA: LS_STBL TYPE LVC_S_STBL.
LS_STBL-ROW = ABAP_TRUE.
LS_STBL-COL = ABAP_TRUE.
CALL METHOD GO_GRID->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = LS_STBL.
ENDFORM.
装运点/接收点:通过事务码 OVXD 或 SM30 维护视图 V_TVST 定义装运点
注:BAPI_OUTB_DELIVERY_CREATE_STO生成的交货单,会根据采购凭证的交货日期去生成,相同交货日期的行项目生成的交货单是一样的,交货日期根据采购凭证到表EKET查询字段EINDT
BAPI_GOODSMVT_CREATE(物料过账)
BAPI_GOODSMVT_CREATE 是一个标准的 SAP 函数模块,用于创建物料凭证。它通常用于处理库存的收货和发货(物料过账)
DATA: LX_BAPI_HEADER TYPE BAPI2017_GM_HEAD_01,
LX_BAPI_CODE TYPE BAPI2017_GM_CODE,
LI_BAPI_RET TYPE TABLE OF BAPIRET2,
LX_BAPI_RET TYPE BAPIRET2,
LI_BAPI_ITEM TYPE TABLE OF BAPI2017_GM_ITEM_CREATE,
LX_BAPI_ITEM TYPE BAPI2017_GM_ITEM_CREATE,
L_MJAHR TYPE BAPI2017_GM_HEAD_RET-DOC_YEAR.
data:MBLNR02 type ZZMBLNR02.
CLEAR: LI_BAPI_RET, LI_BAPI_ITEM, LX_BAPI_HEADER, LX_BAPI_CODE.
IF LT_PO IS NOT INITIAL.
LOOP AT LT_PO INTO LS_PO.
"bapi head
LX_BAPI_HEADER-PSTNG_DATE = SY-DATUM. "过帐日期
LX_BAPI_HEADER-DOC_DATE = SY-DATUM. "凭证日期
"HEAD CODE
LX_BAPI_CODE-GM_CODE = '05'. "按mb1c
"bapi item
LX_BAPI_ITEM-MATERIAL = LS_PO-MATNR. "物料
LX_BAPI_ITEM-PLANT = '9000'. "工厂
LX_BAPI_ITEM-STGE_LOC = LS_PO-LGORT."库存地址
LX_BAPI_ITEM-MOVE_TYPE = '511'. "移动类型
LX_BAPI_ITEM-VENDOR = LS_PO-LIFNR. "供应商
LX_BAPI_ITEM-ENTRY_QNT = LS_PO-MENGE. "数量
LX_BAPI_ITEM-ENTRY_UOM = LS_PO-MEINS. "单位
APPEND LX_BAPI_ITEM TO LI_BAPI_ITEM.
ENDLOOP.
ENDIF.
"BAPI CALL
CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
EXPORTING
GOODSMVT_HEADER = LX_BAPI_HEADER
GOODSMVT_CODE = LX_BAPI_CODE
IMPORTING
MATERIALDOCUMENT = MBLNR02
MATDOCUMENTYEAR = L_MJAHR
TABLES
GOODSMVT_ITEM = LI_BAPI_ITEM
RETURN = LI_BAPI_RET.
IF MBLNR02 = ''. "失败
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
LOOP AT LI_BAPI_RET INTO LX_BAPI_RET WHERE TYPE = 'E' OR TYPE = 'A'.
CONCATENATE '' LX_BAPI_RET-MESSAGE INTO data(L_MESSAGE) SEPARATED BY ';'.
CLEAR LX_BAPI_RET.
ENDLOOP.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
ENDIF.
补充(LX_BAPI_CODE-GM_CODE = ‘05’. ) :
这个05要通过事务代码OMJJ进去后然后通过01-07去选择对应允许的事务。比如这边的05对应mblc,那么对应的移动类型是属于可以移动货物的。
BAPI_MATERIAL_SAVEDATA(修改物料主数据)
DATA: ls_plantdata TYPE bapi_marc,
ls_plantdatax TYPE bapi_marcx,
ls_zexten LIKE bapi_te_marc,
ls_zextenx LIKE bapi_te_marcx,
lt_extensionin TYPE TABLE OF bapiparex,
ls_extensionin TYPE bapiparex,
lt_extensioninx TYPE TABLE OF bapiparexx,
ls_extensioninx TYPE bapiparexx,
ls_return TYPE bapiret2, "用来判断返回情况
ls_header TYPE bapimathead. "带有控制信息的表头段,也就是各视图
* 采购视图
ls_header-purchase_view = 'X'.
* 存储视图
ls_header-storage_view = 'X'.
* 基本视图
ls_header-material = '1300472-022'. "物料编码
ls_plantdata-plant = '8000'."工厂
ls_plantdatax-plant = '8000'. "工厂
ls_plantdata-PUR_GROUP = '304'. "采购组
ls_plantdatax-PUR_GROUP = 'X'. "采购组
ls_header-mrp_view = 'X' . "这边要加这个才可以修改mrp
ls_plantdata-MRP_CTRLER = '165'."MRP控制者
ls_plantdatax-MRP_CTRLER ='X' ."MRP控制者
ls_plantdata-ROUND_VAL = 10 ."舍入值
ls_plantdatax-ROUND_VAL = 'X'."舍入值
ls_plantdata-PROC_TYPE = 'F' ."采购类型
ls_plantdatax-PROC_TYPE = 'X'."采购类型
ls_plantdata-SPPROCTYPE = ''."特殊采购类型
ls_plantdatax-SPPROCTYPE = 'X'."特殊采购类型
ls_plantdata-ISS_ST_LOC = '1004' ."生产仓储地址
ls_plantdatax-ISS_ST_LOC = 'X' ."生产仓储地址
ls_plantdata-SLOC_EXPRC = '1004'."外部仓储地址
ls_plantdatax-SLOC_EXPRC = 'X'."外部仓储地址
ls_plantdata-INHSEPRODT = '0' ."自制生产时间
ls_plantdatax-INHSEPRODT = 'X'."自制生产时间
ls_plantdata-GR_PR_TIME = '3' ."收货处理时间
ls_plantdatax-GR_PR_TIME = 'X'."收货处理时间
ls_plantdata-PLND_DELRY = '0'."计划交货时间
ls_plantdatax-PLND_DELRY = 'X'."计划交货时间
CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA'
EXPORTING
headdata = ls_header
plantdata = ls_plantdata
plantdatax = ls_plantdatax
IMPORTING
return = ls_return
TABLES
extensionin = lt_extensionin
extensioninx = lt_extensioninx.
IF ls_return-type = 'E' OR ls_return-type = 'A'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
sy-subrc = 4.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
WS_DELIVERY_UPDATE(交货单过帐)
外向交货:是用在客户与企业之间的交货单(我们的物料出库出去,库位不在我们自己工厂),
内向交货:则是用在供应商与企业之间的交货单(外面的物料购入,入库到我们工厂的库位);
换言之,外向交货多用于SD 模块,而内向交货单则用于MM模块。
vl03n:可以看到交货单的过账情况。
DATA:ls_deli TYPE bapishpdelivnumb.
DATA:v_error,v_error_any,lv_posnr TYPE posnr_vl.
DATA:i_vbkok LIKE vbkok. "Delivery header
DATA:vbpok_tab TYPE vbpok OCCURS 0 WITH HEADER LINE,
xlips TYPE lips OCCURS 0 WITH HEADER LINE.
DATA:i_prot LIKE prott OCCURS 0 WITH HEADER LINE,
ls_vbuk TYPE vbuk,
i_lips LIKE lips OCCURS 0 WITH HEADER LINE.
DATA:lv_text TYPE t100-text.
DATA:VBELN LIKE LIPS-VBELN.
VBELN = LV_VBELN."这边的LV_VBELN交货单是作为参数传入
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = VBELN
IMPORTING
output = VBELN.
SELECT SINGLE * FROM vbuk
INTO ls_vbuk
WHERE vbeln = VBELN.
IF sy-subrc = 0 AND ls_vbuk-wbstk = 'C' ."已过账
message '该交货单已经处于过账完成状态!' type e.
RETURN.
ENDIF.
REFRESH:xlips,vbpok_tab.
DATA:lt_lips_ch TYPE TABLE OF lips WITH HEADER LINE.
REFRESH lt_lips_ch.
SELECT * FROM lips INTO TABLE xlips
WHERE vbeln = VBELN.
LOOP AT xlips.
CLEAR: vbpok_tab.
vbpok_tab-vbeln_vl = xlips-vbeln.
vbpok_tab-posnr_vl = xlips-posnr.
vbpok_tab-vbeln = xlips-vbeln.
vbpok_tab-posnn = xlips-posnr.
IF vbpok_tab-vrkme IS INITIAL.
vbpok_tab-vrkme = xlips-vrkme.
ENDIF.
vbpok_tab-meins = xlips-meins.
* VBPOK_TAB-NDIFM = 0. "按库存计量单位的目的地差异数量
* VBPOK_TAB-TAQUI = ' '. "ID:MM-WM传递定单确定
vbpok_tab-charg = xlips-charg. "批次
vbpok_tab-matnr = xlips-matnr. "物料
* VBPOK_TAB-ORPOS = 0.
APPEND vbpok_tab.
ENDLOOP.
i_vbkok-vbeln_vl = VBELN.
i_vbkok-wabuc = 'X'. "Post Good Issue Automatic
i_vbkok-wadat_ist = SY-DATUM.
CLEAR:v_error,i_prot[].
SET UPDATE TASK LOCAL .
CALL FUNCTION 'WS_DELIVERY_UPDATE'
EXPORTING
vbkok_wa = i_vbkok
commit = 'X'
delivery = i_vbkok-vbeln_vl
update_picking = 'X'
IMPORTING
ef_error_in_goods_issue_0 = v_error
TABLES
vbpok_tab = vbpok_tab
prot = i_prot.
READ TABLE i_prot WITH KEY msgty = 'E'.
IF sy-subrc = 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
LOOP AT i_prot WHERE msgty CA 'AE'.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = i_prot-msgid
msgnr = i_prot-msgno
msgv1 = i_prot-msgv1
msgv2 = i_prot-msgv2
msgv3 = i_prot-msgv3
msgv4 = i_prot-msgv4
IMPORTING
message_text_output = lv_text.
ENDLOOP.
ELSE.
message VBELN && '发货过账成功!' type e.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
VL01N–BAPI_OUTB_DELIVERY_CREATE_SLS创建外向交货单
DATA: LF_VBELN TYPE VBELN_VL,
LF_NUM TYPE VBNUM,
LS_DELI TYPE BAPISHPDELIVNUMB,
LT_DELI TYPE TABLE OF BAPISHPDELIVNUMB,
LT_ORDER TYPE TABLE OF BAPIDLVREFTOSALESORDER,
LS_ORDER TYPE BAPIDLVREFTOSALESORDER,
LS_ITM TYPE BAPIDLVITEMCREATED,
LT_ITM TYPE TABLE OF BAPIDLVITEMCREATED,
LS_EXT TYPE BAPIPAREX,
LT_EXTIN TYPE TABLE OF BAPIPAREX,
LT_EXTOUT TYPE TABLE OF BAPIPAREX,
LS_RET TYPE BAPIRET2,
LT_RETURN TYPE TABLE OF BAPIRET2 WITH HEADER LINE.
DATA:BS TYPE STRING.
SELECT VBELN, POSNR, KWMENG, MEINS INTO TABLE @DATA(LT_VBAP) FROM VBAP WHERE VBELN = '1000009746' AND POSNR = '000010'.
LOOP AT LT_VBAP INTO DATA(LS_VBAP).
LS_ORDER-REF_DOC = LS_VBAP-VBELN.
LS_ORDER-REF_ITEM = LS_VBAP-POSNR.
LS_ORDER-DLV_QTY = LS_VBAP-KWMENG.
LS_ORDER-SALES_UNIT = LS_VBAP-MEINS.
APPEND LS_ORDER TO LT_ORDER.
ENDLOOP.
CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_SLS'
IMPORTING
DELIVERY = LF_VBELN
NUM_DELIVERIES = LF_NUM
TABLES
SALES_ORDER_ITEMS = LT_ORDER
EXTENSION_IN = LT_EXTIN
DELIVERIES = LT_DELI
CREATED_ITEMS = LT_ITM
EXTENSION_OUT = LT_EXTOUT
RETURN = LT_RETURN.
IF NOT LF_VBELN IS INITIAL.
LOOP AT LT_ORDER INTO LS_ORDER.
READ TABLE LT_ITM INTO LS_ITM WITH KEY REF_DOC = LS_ORDER-REF_DOC DELIV_ITEM = LS_ORDER-REF_ITEM.
IF SY-SUBRC NE 0.
CONCATENATE BS LS_ORDER-REF_ITEM '项目未创建交货单' INTO BS.
ELSE.
IF LS_ORDER-DLV_QTY <> LS_ITM-DLV_QTY.
CONCATENATE BS LS_ORDER-REF_ITEM '项目数量与交货单数量不一致' INTO BS.
ENDIF.
ENDIF.
ENDLOOP.
IF BS <> ''.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
COMMIT WORK.
ENDIF.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
LOOP AT LT_RETURN WHERE TYPE = 'E' OR TYPE = 'A'.
BS = LT_RETURN-MESSAGE.
CONCATENATE '销售订单号:' BS INTO BS SEPARATED BY SPACE.
ENDLOOP.
ENDIF.
错误:项目 000010 不完整 -维护销售订单
解决:进入VA02维护
进入到VA02
输入订单号后回车,明细出来之后,选择左上角菜单中的编辑中的未完成日志
双击对应丢失数据的内容
进来后下方也会提示丢失的数据是啥,然后点放大镜,选择对应的类型,然后在后面输入对应的单价回车,然后返回并保存就好了
VL31N–GN_DELIVERY_CREATE创建内向交货单(含供应商)
DATA: LS_VBSK LIKE VBSK,
ES_VBSK LIKE VBSK,
LT_SPE_VBFS TYPE TABLE OF /SPE/VBFS,
LS_SPE_VBFS TYPE /SPE/VBFS,
LT_KOMDLGN TYPE TABLE OF KOMDLGN,
LS_KOMDLGN TYPE KOMDLGN,
LT_VBFS TYPE TABLE OF VBFS,
LT_VBLS TYPE TABLE OF VBLS,
LT_LIPS TYPE TABLE OF LIPS.
DATA:L_MSGTXT TYPE STRING.
CLEAR: LS_VBSK, LT_SPE_VBFS, LS_SPE_VBFS, LT_KOMDLGN, LS_KOMDLGN, LT_VBFS, LT_VBLS.
DATA:LV_MATNR TYPE MARC-MATNR VALUE '1475477-001'."这边过的是销售订单对应物料的下阶
SELECT SINGLE *
FROM EKPO
WHERE EKPO~EBELN = '9400000854' AND EKPO~EBELP = '000010'
INTO @DATA(LS_EKPO).
SELECT SINGLE LIFNR,KUNNR
FROM EKKO
INTO @DATA(LS_EKKO)
WHERE EBELN = '9400000854'.
SELECT WERKS,VKORG,VTWEG,SPART
INTO TABLE @DATA(LT_T001W)
FROM T001W.
SORT LT_T001W BY WERKS.
SELECT VSBED,LADGR,WERKS,LGORT,VSTEL
INTO TABLE @DATA(LT_TVSTZ)
FROM TVSTZ.
SORT LT_TVSTZ BY VSBED LADGR WERKS.
IF LS_EKPO IS NOT INITIAL.
SELECT MATNR,WERKS,LADGR
INTO TABLE @DATA(LT_MARC)
FROM MARC
WHERE MATNR = @LV_MATNR
AND WERKS = '1000'.
SORT LT_MARC BY MATNR WERKS.
SELECT MATNR,VKORG,VTWEG
INTO TABLE @DATA(LT_MVKE)
FROM MVKE
WHERE MATNR = @LV_MATNR.
SORT LT_MVKE BY MATNR VKORG VTWEG.
SELECT LIFNR,KUNNR
INTO TABLE @DATA(LT_LFA1)
FROM LFA1
WHERE LIFNR = @LS_EKKO-LIFNR.
SORT LT_LFA1 BY LIFNR.
IF LT_LFA1[] IS NOT INITIAL.
SELECT KUNNR,VKORG,VTWEG,SPART,VSBED
INTO TABLE @DATA(LT_KNVV)
FROM KNVV
FOR ALL ENTRIES IN @LT_LFA1
WHERE KUNNR = @LT_LFA1-KUNNR.
SORT LT_KNVV BY KUNNR VKORG VTWEG SPART.
ENDIF.
SELECT EBELN,EBELP,ETENR
INTO TABLE @DATA(LT_EKET)
FROM EKET
WHERE EBELN = @LS_EKPO-EBELN
AND EBELP = @LS_EKPO-EBELP.
SORT LT_EKET BY EBELN EBELP ETENR.
ENDIF.
READ TABLE LT_T001W INTO DATA(LS_T001W) WITH KEY WERKS = '1000'.
READ TABLE LT_MARC INTO DATA(LS_MARC) WITH KEY MATNR = LV_MATNR WERKS = '1000'.
IF LS_MARC-LADGR IS INITIAL.
write '工厂视图未维护(装载组)' .
RETURN.
ENDIF.
READ TABLE LT_MVKE INTO DATA(LS_MVKE) WITH KEY MATNR = LV_MATNR
VKORG = LS_T001W-VKORG
VTWEG = LS_T001W-VTWEG BINARY SEARCH.
IF SY-SUBRC NE 0.
write '物料未维护销售视图'.
RETURN.
ENDIF.
"供应商
READ TABLE LT_LFA1 INTO DATA(LS_LFA1) WITH KEY LIFNR = LS_EKKO-LIFNR BINARY SEARCH.
IF SY-SUBRC <> 0.
write '供应商未维护' .
RETURN.
ELSE.
READ TABLE LT_KNVV INTO DATA(LS_KNVV) WITH KEY KUNNR = LS_LFA1-KUNNR
VKORG = LS_T001W-VKORG
VTWEG = LS_T001W-VTWEG
SPART = LS_T001W-SPART BINARY SEARCH.
IF LS_KNVV-VSBED IS INITIAL.
write '客户销售视图未维护' .
RETURN.
ENDIF.
ENDIF.
READ TABLE LT_TVSTZ INTO DATA(LS_TVSTZ) WITH KEY VSBED = LS_KNVV-VSBED
LADGR = LS_MARC-LADGR
WERKS = '1000' BINARY SEARCH.
IF SY-SUBRC NE 0.
write '装运点未维护' .
RETURN.
ENDIF.
* 创建内向交货单行项
LS_KOMDLGN-LFART = 'LF'. " 交货类型
LS_KOMDLGN-VGTYP = 'V'. " 类型
LS_KOMDLGN-KZAZU = 'X'.
LS_KOMDLGN-LIFNR = LS_LFA1-LIFNR. "供应商
LS_KOMDLGN-WERKS = '1000'. "工厂
LS_KOMDLGN-KUNWE = LS_LFA1-KUNNR. " 售达方
LS_KOMDLGN-VKORG = LS_T001W-VKORG. " 销售组织
LS_KOMDLGN-VTWEG = LS_T001W-VTWEG. " 渠道
LS_KOMDLGN-SPART = LS_T001W-SPART. " 产品组
LS_KOMDLGN-VSTEL = LS_TVSTZ-VSTEL. " 装运点
LS_KOMDLGN-WADAT = SY-DATUM. " 发货日期
LS_KOMDLGN-LFDAT = SY-DATUM. " 计划交货日期
* LS_KOMDLGN-lifexpos = LS_EKPO-zitem. " 委外领料单行项目
LS_KOMDLGN-MATNR = LV_MATNR. " 组件物料 ZTMRP-IDNRK
LS_KOMDLGN-LGORT = LS_EKPO-LGORT. " 库位
LS_KOMDLGN-LFIMG = '1'. " 数量
LS_KOMDLGN-VRKME = LS_EKPO-MEINS. " 单位
LS_KOMDLGN-VGBEL = LS_EKPO-EBELN. " 采购凭证
LS_KOMDLGN-VGPOS = LS_EKPO-EBELP. " 项目
LS_KOMDLGN-BWART = '542'. " 移动类型
APPEND LS_KOMDLGN TO LT_KOMDLGN.
CLEAR LS_KOMDLGN.
LS_VBSK-MANDT = SY-MANDT.
LS_VBSK-ERNAM = SY-UNAME.
LS_VBSK-ERDAT = SY-DATUM.
LS_VBSK-UZEIT = SY-UZEIT.
LS_VBSK-SMART = 'L'.
CALL FUNCTION 'GN_DELIVERY_CREATE'
EXPORTING
VBSK_I = LS_VBSK
IMPORTING
VBSK_E = ES_VBSK
TABLES
XVBFS = LT_VBFS
XVBLS = LT_VBLS
XKOMDLGN = LT_KOMDLGN
XXLIPS = LT_LIPS
ET_SPE_VBFS = LT_SPE_VBFS.
LOOP AT LT_SPE_VBFS INTO LS_SPE_VBFS WHERE MSGTY CA 'EAX'.
MESSAGE ID LS_SPE_VBFS-MSGID
TYPE LS_SPE_VBFS-MSGTY
NUMBER LS_SPE_VBFS-MSGNO
INTO L_MSGTXT
WITH LS_SPE_VBFS-MSGV1 LS_SPE_VBFS-MSGV2
LS_SPE_VBFS-MSGV3 LS_SPE_VBFS-MSGV4.
ENDLOOP.
IF SY-SUBRC = 0. "创建失败了
ROLLBACK WORK.
ELSE.
COMMIT WORK.
ENDIF.
22、新建一个MESSAGE类,用来自定义提示消息
REPORT 程序名 MESSAGE ID 消息类名写在程序的第一行,调用消息时用MESSAGE S消息编号
REPORT ZALV_TEST MESSAGE-ID YTEST.
IF 5 > 2.
"注意:MESSAGE 后的字母表示不同的消息类型
"S成功 E错误 W警告 I消息框 A错误 X系统错误
"MESSAGE E000."警告!警告!
MESSAGE E002 WITH '149556-001'."你没有 &1 物料的权限
ENDIF.
23、abap的宏
1、宏可以包含多个参数,这些参数在宏定义时用 &1、&2、&3 等表示。在宏调用时,传递的参数将替换这些占位符。
2、宏最多可以有 9 个参数(&1 到 &9)。
DEFINE WRITE_TWO_MESSAGES.
WRITE: / &1.
WRITE: / &2.
END-OF-DEFINITION.
DATA: LV_MESSAGE1 TYPE STRING,
LV_MESSAGE2 TYPE STRING.
LV_MESSAGE1 = 'First message'.
LV_MESSAGE2 = 'Second message'.
WRITE_TWO_MESSAGES LV_MESSAGE1 LV_MESSAGE2.
24、 类
DATA O_CLASS TYPE REF TO CLASS_NAME.
DATA:用于声明变量。
O_CLASS:变量名称,通常以 o_ 开头表示这是一个对象引用。
TYPE REF TO:表示这是一个对象引用,指向一个类的实例。
CLASS_NAME:类的名称,表示这个对象引用指向 ZCL_CBASE 类的实例。
实例:
CLASS Z_COMPUTE DEFINITION.
PUBLIC SECTION.
DATA MATNR02 TYPE MATNR.
METHODS:
SET_VALUE CHANGING MATNR03 TYPE MATNR,
GET_VALUE.
ENDCLASS.
CLASS Z_COMPUTE IMPLEMENTATION.
METHOD SET_VALUE.
MATNR03 = MATNR03 && 'SET中的值'.
"ME 是一个特殊的对象引用,指向当前类的实例。这种语法通常用于在类的方法中调用同一个类的其他方法。
ME->GET_VALUE( ).
ENDMETHOD.
METHOD GET_VALUE.
WRITE:/ MATNR02.
ENDMETHOD.
ENDCLASS.
DATA: O_COMPUTE TYPE REF TO Z_COMPUTE,
MATNR04 TYPE MATNR VALUE '13656223'.
"无法访问语句”的错误,尤其是在使用 CREATE OBJECT 时,
"这通常是因为编译器无法执行该语句,
"因为它没有分配到隐式的 START-OF-SELECTION 块
START-OF-SELECTION.
CREATE OBJECT O_COMPUTE.
"给方法内的变量MATNR02赋值
O_COMPUTE->MATNR02 = '123456789'.
"这边是changing,所以matnr04的位置要传一个变量
O_COMPUTE->SET_VALUE( CHANGING MATNR03 = MATNR04 ).
WRITE:/ MATNR04."输出13656223SET中的值
O_COMPUTE->GET_VALUE( ).
25、方法
DATA: VALUE1 TYPE I VALUE 1,
VALUE2 TYPE I VALUE 2,
VALUE3 TYPE I.
TYPES: BEGIN OF T_VALUE,
VALUE01 TYPE I,
VALUE02 TYPE I,
END OF T_VALUE.
DATA: LT_VALUE TYPE TABLE OF T_VALUE,
LS_VALUE TYPE T_VALUE.
DATA:LT_MARC TYPE TABLE OF MARC.
"参数为单个的值
PERFORM FRM_ADD USING VALUE1 VALUE2 CHANGING VALUE3.
WRITE:/'VALUE3的值是' && VALUE3.
"参数是内表
LS_VALUE-VALUE01 = 6.
LS_VALUE-VALUE02 = 5.
APPEND LS_VALUE TO LT_VALUE.
PERFORM FRM_T_VALUE TABLES LT_VALUE.
"参数是内表
PERFORM FRM_TABLE TABLES LT_MARC.
”参数是内表的一行
PERFORM FRM_TABLE02 USING LS_MARC.
FORM FRM_ADD USING VALUE1 VALUE2 CHANGING VALUE3 .
VALUE3 = VALUE1 + VALUE2.
ENDFORM.
FORM FRM_T_VALUE TABLES LT_VALUE .
LOOP AT LT_VALUE INTO LS_VALUE.
WRITE:/ LS_VALUE-VALUE01, LS_VALUE-VALUE02.
ENDLOOP.
ENDFORM.
FORM FRM_TABLE TABLES LT_MARC STRUCTURE MARC.
ENDFORM.
FORM FRM_TABLE02 USING LS_MARC STRUCTURE MARC.
ENDFORM.
26、增加前导0
" 添加前导零
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = lv_num
IMPORTING
output = lv_num.
27、获取内表的行数
DESCRIBE TABLE LT_TABLE LINES LV_LINE. "将lt_table的当前行数存储在lv_line变量中
LV_LINE = LINES ( LT_TABLE ). "将lt_table的当前行数存储在lv_line变量中
28、SPLIT:对字符进行拆分
DATA:BEGIN OF LT_TABLE1 OCCURS 0,
LINE TYPE CHAR100,
END OF LT_TABLE1.
"把字符拆分到表中
SPLIT '1.2.3' AT '.' INTO TABLE LT_TABLE1.
"把字符拆分到变量中
SPLIT '1.2' AT '.' INTO data(lv_value1) data(lv_value2).
29、AUTHORITY-CHECK OBJECT(权限控制)
su20进入维护权限字段
点击创建,这边输入对应的字段名和数据元素,点击保存
su21进入权限维护对象
右键新建的对象类去创建授权对象
输入SU20创建的权限字段,以及ACTVT(用来控制动作的,如:增,删,改)
su02打开工作区域,生成工作区域
进入PFCG,创建一个单一角色
回车进入后选择下方权限的菜单,然后点击更改权限数据
进入后选择手动分配权限
设置对应的数据权限
然后返回添加用户
事务su01,输入刚刚配置的用户名,回车
回车后在这边检查是否有亮红灯的错误,根据提示去操作,确保不报错
然后就可以通过对应的代码去调用测试了
PARAMETERS P_VKORG TYPE ZTCONFIG-VKORG DEFAULT '5500'.
START-OF-SELECTION.
AUTHORITY-CHECK OBJECT 'ZVKORG'
ID 'ZVKORG' FIELD P_VKORG
ID 'ACTVT' FIELD '01'.
"用户使用程序,想要查询部门的员工信息,
"通过authority-check object 来进行权限检查,ID是字段名,field是要检查的
"'actvt': 01 创建,02更改,03查询,06删除
IF SY-SUBRC <> 0.
MESSAGE S001(00) WITH '您没有权限查看此数据' DISPLAY LIKE 'E'.
ELSE.
MESSAGE S001(00) WITH '您可以查看此数据' DISPLAY LIKE 'S'.
ENDIF.