abap知识合集

文章目录

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中,方便到时候进行下载
输入事务代码smw0
这边直接点执行就行
点这边进行新建
在这边输入对应的信息,然后选择对应的excel文件就行

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.

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值