ABAP 知识点梳理

1.数据类型

  N 类型本质上是 C,不能用作Collect。

  Char 类型的处理关键字:SPLIT,CONCATEMATE,TRANSLATE,CONDENSE,REPLACE,FIND等。

2.内表

  内表类型:标准表、排序表、哈希表。

  排序表指定表的排序字段,用append插入数据要注意插入数据的顺序,不能对排序表进行排序会发生错误。

  排序表定义:

TYPES:BEGIN OF ty_line,
        col TYPE c,
        seq TYPE i,
      END OF ty_line.
TYPES t_tab TYPE SORTED TABLE OF ty_line WITH UNIQUE KEY col.
DATA itab TYPE t_tab WITH HEADER LINE.

  哈希表没有索引,只能用read table XXX with table key/ with key。

  哈希表定义:

TYPES:BEGIN OF ty_line,
        col TYPE c,
        seq TYPE i,
      END OF ty_line.
TYPES t_tab TYPE HASHED TABLE OF ty_line WITH UNIQUE KEY col.
DATA itab TYPE t_tab WITH HEADER LINE.

  大量数据读取的时候,排序表速度大于标准表,即使标准表用了sort 和 binary search。

  哈希表读取数据使用哈希算法,因此始终是以相同的速度访问表,定义哈希表关键字一定要定义成唯一关键字,读取大量数据建议使用哈希表。

  内表的操作:

  INSERT line INTO TABLE itab.

  APPEND line TO itab.

  MODIFY itab FROM line.

  DELETE itab WHERE cond.

3.数据字典 DDIC:

  SE11表类型:透明表、簇表、池表

  修改表的主键,直接激活会报错,需要在SE14中激活并调整。

  表增强的两种方式:

  INCLUDE 结构体

  APPEND 结构体

  区别:

  3.1 INCLUDE 可以插入到表的任意位置,APPEND只能添加到表末尾。

  3.2 INCLUDE 可以事先SE11建好结构,APPEND只能在添加过程中创建,不能事先创建。

  3.3 INCLUDE 需要表进入编辑模式,APPEND 没有要求。

  3.4 APPEND 不能为 簇表创建,不能含有LCHAR字段。

  3.5 复制表结构的时候,INCLUDE可以复制过来,APPEND不会。

  3.6 INCLUDE 的结构可以复用,APPEND的不可以。

  3.7 INCLUDE 必须是扁平结构,不能包含其他结构了。

视图:

  维护视图:

  SM30:运行视图

  SM34:运行视图簇

  SE54:创建视图/视图簇

  调用视图函数:VIEW_MAINTENANCE_CALL

  调用视图簇函数:VIEWCLUSTER_MAINTENANCE_CALL

数据元素(DATA ELEMENT):

数据元素可以定义字段的文本值等

域(DOMAIN):

定义字段类型、长度、值范围、是否支持大小写、是否有转换关系等

搜索帮助:

把 F4IF_SHLP_EXIT_EXAMPLE Copy 一个出来,然后填写到搜索帮助出口里面,可以实现对搜索帮助的扩展

锁对象:

锁模式:

E:Write Lock :写入锁,当更改数据时,设置此模式

S:Read Lock:共享锁,本身不修改数据,但是希望显示的数据不被别人更改

X:和E类似,不允许累加,完全独占

创建锁对象后会生成连个函数:

ENQUEUE_<LockObjectName>

DEQUEUE_<LockObjectName>

4.OPEN SQL/New OPEN SQL:

  WITH +ekko_ekpo AS ( SELECT DISTINCT ebeln,	
                                       ebelp	
                         FROM @lt_ekko_ekpo AS ekko_ekpo )	
  SELECT a~ebeln,                                      "采购订单	
         a~ebelp,                                      "项目	
         CAST( a~budat AS CHAR( 6 ) ) AS period,       "期间	
	
         CASE a~shkzg	
            WHEN 'H' THEN - a~menge	
           ELSE a~menge	
         END AS menge,                                 "入库数量	
	
         CASE a~shkzg	
           WHEN 'H' THEN - a~bnbtr	
           ELSE a~bnbtr	
         END AS bnbtr,                                 "交货成本	
	
         a~mjahr,                                               "物料凭证的年份	
         a~mblnr,                                               "物料凭证编号	
         CAST( concat( '00', a~zeile ) AS NUMC( 6 ) ) AS zeile  "物料凭证中的项目	
    FROM matdoc AS a INNER JOIN +ekko_ekpo AS b ON a~ebeln = b~ebeln	
                                               AND a~ebelp = b~ebelp	
	
   WHERE a~budat IN @s_budat	
    INTO TABLE @DATA(lt_matdoc).	

  "当a,b情况下:提取 入库单价、入库货物成本:						
  SELECT b~zjsdno,						
         SUM( CASE a~shkzg						
           WHEN 'H'						
           THEN - a~dmbtr						
           ELSE a~dmbtr						
         END ) AS dmbtr,  "入库总成本						
         SUM( CASE a~shkzg						
           WHEN 'H'						
           THEN - a~bnbtr						
           ELSE a~bnbtr						
         END ) AS bnbtr,  "交货总成本						
         SUM( CASE a~shkzg						
           WHEN 'H'						
           THEN - a~menge						
           ELSE a~menge						
         END ) AS menge    "入库数量						
    FROM matdoc AS a						
   INNER JOIN zqmt0009c AS b ON a~ebeln = b~ebeln						
                            AND a~ebelp = b~ebelp						
                            AND a~mblnr = b~belnr						
                            AND a~zeile = b~buzei						
   WHERE b~zjsdno EQ @pv_zjsdno						
     AND a~mjahr  EQ @p_gjahr						
   GROUP BY b~zjsdno						
    INTO TABLE @DATA(lt_sum).						

  

*   过账金额	
    WITH +data AS ( SELECT DISTINCT bukrs,anln1,anln2 FROM @gt_anlp AS zdata )	
    SELECT e~bukrs,e~anln1,e~anln2,	
           CAST( substring( e~bzdat,5,2 ) AS NUMC( 2 ) ) AS monat,e~bzdat,	
           e~anbtr,	
           CASE	
             WHEN e~anbtr < 0 THEN '-'	
             ELSE '+'	
           END AS flag	
      FROM anep AS e	
      INNER JOIN +data AS z	
         ON z~bukrs = e~bukrs	
        AND z~anln1 = e~anln1	
        AND z~anln2 = e~anln2	
      WHERE e~afabe = '01'	
        AND substring( e~bzdat,1,4 ) = @p_gjahr	
        AND substring( e~bzdat,5,2 ) <= @lv_monat	
      INTO TABLE @gt_anep.	

5.子例程:

值传递

引用传递

6.函数:

RFC同步和异步

DESTINATION 远程目标

SM59 配置同步接口地址

* 同步RFC调用
CALL FUNCTION 'XXX' DESTINATION 'XXX'
同步RFC是调用以后会一直等待调用反馈,如果调用没有反馈,就不会进行下一步处理逻辑。

* 异步RFC调用
CALL FUNCTION 'XXX' STARTING NEW TASK 'XXX' 
   PERFORMING 'XXX' ON END OF TASK
异步RFC一般是调用过后,会新起一个Session,然后程序会执行后续操作,不会等待异步RFC
的处理结果,不管异步RFC处理结果如何,都会进行后续的逻辑。

PERFORMING 'XXX' ON END OF TASK:需要在异步RFC模式下接收远程模块的返回结果或特定异常

事务性RFC:多个关联RFC为了实现数据的完整性和一致性,遇到COMMIT WORK语句执行所有计划更新

* tRFC 事务性RFC调用
CALL FUNCTION 'XXX' IN BACKGROUND TASK 'XXX'

BAPI:

SAP BAPI, 全称为 Business Application Programming Interface(业务应用程序编程接口),是 SAP 产品中业务对象模型的标准接口。

BAPI 可以看作一类特殊的函数,主要用来通过程序处理SAP相关业务流的一系列函数。

使用BAPI注意点:

1.BAPI都有统一格式的返回消息table,如果返回table中没有错误,需要调用

CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'

失败的话需要调用函数进行回滚。

CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

2.循环中调用BAPI的话,每次执行完BAPI的COMMIT或者ROLLBACK操作以后,都要清空BAPI的传入传出参数,防止数据重复提交。

3.调用BAPI的时候,如果后续逻辑需要用到BAPI创建修改的数据,那么在提交COMMIT操作的时候需要wait一下,这样后续逻辑才能使用到最新的数据。

4.如果存在多个BAPI调用,为保证所有BAPI都执行成功,可以在所有BAPI执行完成以后统一COMMIT,以保证数据的完整性和一致性。

5.如果多个BAPI调用,但是前面调用的BAPI必须先执行COMMIT操作,如果前面执行成功,后续BAPI执行失败的话,一般可以建一个LOG表,用来记录执行错误的BAPI,然后手动或者自动执行出错的BAPI即可。

BAPI 的增强:

有些自定义字段想要通过BAPI来达到值更新的效果:

一般BAPI的表参数里会有一个叫做:EXTENSIONIN的传递表,表结构如下:

 一般传入的STRUCTURE名称可以在后面显示按钮查看

然后定义一个和上面结构名称相同的局部变量,这个局部变量的字段就会如下所示:

赋值完成后,直接把这个局部结构赋值给 BAPIPAREX,然后append到EXTENSIONIN表传给BAPI即可,需要注意的是,如果 局部结构 长度超过 240,那么多出的值需要给VALUEPART2,以此类推,一直到VALUEPART4。如果还是放不下,那么需要考虑直接update数据库表的自定义字段然后Commit Work。

示例代码如下:

      
      DATA: 
        lt_extensionin        TYPE TABLE OF bapiparex,
        ls_extensionin         TYPE bapiparex,
        ls_mepoitem            LIKE bapi_te_mepoitem,
        ls_mepoitemx           LIKE bapi_te_mepoitemx.

      ls_extensionin-structure  = 'BAPI_TE_MEPOITEM'.
      ls_mepoitem-po_item       = ls_poitem-po_item.
      ls_mepoitem-zzpp          = <fs_data>-zzpp.
      ls_extensionin-valuepart1 = ls_mepoitem.
      APPEND ls_extensionin TO lt_extensionin.

      CALL FUNCTION 'BAPI_PO_CHANGE'
        EXPORTING
          purchaseorder    = ls_poheader-po_number
          poheader         = ls_poheader
          poheaderx        = ls_poheaderx
          testrun          = l_text
          no_price_from_po = 'X'
        TABLES
          return           = lt_return
          poitem           = lt_poitem
          poitemx          = lt_poitemx
          poschedule       = lt_poschedule
          poschedulex      = lt_poschedulex
          poaccount        = lt_poaccount
          poaccountx       = lt_poaccountx
          extensionin      = lt_extensionin
          pocond           = lt_pocond
          pocondx          = lt_pocondx.

7. Field-Symbols 与数据引用

动态编程

7.1 Field-Symbols


  DATA: LO_STRDESC  TYPE REF TO CL_ABAP_STRUCTDESCR,
        LO_TABDESC  TYPE REF TO CL_ABAP_TABLEDESCR,
        LT_COMPENT  TYPE ABAP_COMPONENT_TAB,
        LS_COMPENT  TYPE LINE OF ABAP_COMPONENT_TAB,
        LR_TYPE     TYPE REF TO CL_ABAP_TYPEDESCR.

  CLEAR: LS_COMPENT.
  LS_COMPENT-NAME = 'EBELN'.
  FREE LR_TYPE.
  LR_TYPE =  CL_ABAP_DATADESCR=>DESCRIBE_BY_NAME( EXPORTING P_NAME = 'EKPO-EBELN' ).
  LS_COMPENT-TYPE ?= LR_TYPE.
  APPEND LS_COMPENT TO LT_COMPENT.


  IF LT_COMPENT IS NOT INITIAL.
    LO_STRDESC = CL_ABAP_STRUCTDESCR=>CREATE( EXPORTING P_COMPONENTS = LT_COMPENT ).  
    "生成内表或者结构的结构
  ENDIF.

  IF LO_STRDESC IS BOUND.
    LO_TABDESC = CL_ABAP_TABLEDESCR=>CREATE( EXPORTING P_LINE_TYPE = LO_STRDESC ).
    CREATE DATA DYN_TABLE TYPE HANDLE LO_TABDESC.
    ASSIGN DYN_TABLE->* TO <DYN_TABLE>.

*  创建动态工作区
    UNASSIGN <DYN_WA>.
    CREATE DATA DYN_LINE LIKE LINE OF <DYN_TABLE>.
    ASSIGN DYN_LINE->* TO <DYN_WA>.
  ENDIF.

7.2 Data Reference

7.3 括号加变量

8.SAP 内存 与 ABAP 内存

8.1 SAP 内存

"分配SAP内存
SET PARAMETER ID <pid> FIELD <f>.
"读取SAP内存
GET PARAMETER ID <pid> FIELD <f>.

8.2 ABAP 内存

EXPORT itab TO MEMORY ID key.

IMPORT itab FROM MEMORY ID key. 

传递数据的方式:

1. 通过ABAP内存传递

DATA ::matnr TYPE mara-matnr.
zmatnr = '60000001'.
"将数据上传memory:
EXPORT zmatnr TO MEMORY ID 'MERY_MATNR'.
然后在另外的程序就可以接收到这个内存ID的数据:
IMPORT matnr FROM MEMORY ID 'MERY_MATNR'.

2.SAP内存传递

"填充内存值
SET PARAMETER ID ''MERY_MATNR' FIELD zmatnr.
"接收内存值
GET PARAMETER ID ''MERY_MATNR' FIELD zmatnr.

3.通过存储数据库表的方式进行传递,A程序存储表,B程序读取表

4.文件的方式传递

AL11 文档服务器目录

CG3Y 从文档服务器下载文件

  对于文档服务器读取文件权限的检查:

  CONCATENATE '/usr/sap/tmp/' CNS_FILENAME INTO I_FILE_APPL .
* check the authority to read the file from the application server
  L_AUTH_FILENAME = I_FILE_APPL.
  CALL FUNCTION 'AUTHORITY_CHECK_DATASET'
    EXPORTING
*     PROGRAM          =
      ACTIVITY         = SABC_ACT_READ
      FILENAME         = L_AUTH_FILENAME
    EXCEPTIONS
      NO_AUTHORITY     = 1
      ACTIVITY_UNKNOWN = 2
      OTHERS           = 3.
  IF NOT SY-SUBRC IS INITIAL.
    CASE SY-SUBRC.
      WHEN 1.
*       no auhtority
        RAISE AP_NO_AUTHORITY.
      WHEN OTHERS.
        RAISE AP_FILE_OPEN_ERROR.
    ENDCASE.

写文件到服务器:

*开始写入文件
*文件换行符为WINDOWS换行符。
OPEN DATASET LV_SERVER_FILE FOR OUTPUT IN TEXT MODE ENCODING 
                            DEFAULT MESSAGE LV_MESS
                            WITH SMART LINEFEED.
 
LOOP AT GT_DATA INTO DATA(GS_RESULT_TAB) .
  CLEAR LV_STRING_STR .
*fill data .
  CL_DESCR ?= CL_ABAP_TYPEDESCR=>DESCRIBE_BY_DATA( GS_RESULT_TAB ).
  LOOP AT CL_DESCR->COMPONENTS ASSIGNING <FS_FIELDS>.
    CLEAR LV_CONT_STR .
    ASSIGN COMPONENT <FS_FIELDS>-NAME OF STRUCTURE GS_RESULT_TAB TO <FS_COMP>.
    IF SY-SUBRC = 0 .
      IF <FS_FIELDS>-TYPE_KIND EQ 'C'.
        REPLACE ALL OCCURRENCES OF CNS_SEP IN <FS_COMP> WITH SPACE .
        CONDENSE <FS_COMP> .
      ENDIF.
      LV_CONT_STR  = <FS_COMP> .
      CONDENSE  LV_CONT_STR .
      CONCATENATE LV_STRING_STR  LV_CONT_STR INTO  LV_STRING_STR SEPARATED BY CNS_SEP.
    ENDIF.
  ENDLOOP .
  REPLACE FIRST OCCURRENCE OF CNS_SEP IN LV_STRING_STR WITH SPACE .
  CONDENSE LV_STRING_STR .
  TRANSFER  LV_STRING_STR TO LV_SERVER_FILE .
ENDLOOP .
*关闭文件。
CLOSE DATASET LV_SERVER_FILE .
IF SY-SUBRC = 0 .
  MESSAGE '关闭文件失败' TYPE 'E'.
ENDIF.

从文件服务器读取文件:

DATA: BEGIN OF I_TAB OCCURS 0,
        TEXT(100),
      END OF I_TAB,
      GV_DATASET1(30) VALUE '/usr/sap/tmp/test.txt'.
DATA: LV_MESS TYPE STRING.
 
OPEN DATASET GV_DATASET1 FOR INPUT IN TEXT MODE ENCODING 
                         DEFAULT MESSAGE LV_MESS WITH SMART LINEFEED.
DO.
  IF SY-SUBRC <> 0.
    EXIT.
  ENDIF.
  READ DATASET GV_DATASET1 INTO I_TAB.
  APPEND I_TAB.
  CLEAR I_TAB.
ENDDO.
CLOSE DATASET GV_DATASET1.
 
LOOP AT I_TAB.
  WRITE:/ I_TAB.
ENDLOOP.

从文件服务器删除文件:

* delete file
  DELETE DATASET ev_long_file_path.

SAP 操作FTP文档服务器:

登录FTP服务器:

  DATA:lv_key     TYPE i VALUE 26101957,
       lv_len     TYPE i,
       lv_cmd(80) TYPE c,
       lv_compres TYPE c VALUE 'N',
       lv_file    TYPE string,
       lv_host    TYPE char255.
  DATA:BEGIN OF lt_result OCCURS 0,
         line(100) TYPE c,
       END OF lt_result.

  lv_len = strlen( gs_cmt07-password ).

* "获取加密密码 保存到P_PWD
  CALL FUNCTION 'HTTP_SCRAMBLE'
    EXPORTING
      source      = gs_cmt07-password
      sourcelen   = lv_len
      key         = lv_key
    IMPORTING
      destination = gs_cmt07-password.

* 连接ftp服务器
  lv_host = gs_cmt07-server && | | && gs_cmt07-port.
  CALL FUNCTION 'FTP_CONNECT'
    EXPORTING
      user            = gs_cmt07-xuser
      password        = gs_cmt07-password
      host            = lv_host
      rfc_destination = gv_dest
    IMPORTING
      handle          = gv_hdl "连接的句柄
    EXCEPTIONS
      not_connected   = 1
      OTHERS          = 2.
  IF sy-subrc NE 0."登录失败
    u_flag = abap_true.
  ENDIF.

打开FTP服务器文件目录,如打开失败,则创建文件目录


  DATA:lv_cmd(100) TYPE c.
  DATA:BEGIN OF lt_result OCCURS 0,
         line(100) TYPE c,
       END OF lt_result.

  CLEAR u_flag.

  "文件夹
  DATA(lv_dir) = gs_cmt07-path &&  '/' && u_banfn.
* 执行ftp命令 cd 打开目标ftp的文件夹
  lv_cmd = 'cd'&& | | && lv_dir.
  CALL FUNCTION 'FTP_COMMAND'
    EXPORTING
      handle        = gv_hdl
      command       = lv_cmd
    TABLES
      data          = lt_result
    EXCEPTIONS
      tcpip_error   = 1
      command_error = 2
      data_error    = 3
      OTHERS        = 4.
  IF sy-subrc NE 0.
* 如果不存在,则创建文件夹
    lv_cmd = 'mkdir' && | | && lv_dir.
    CALL FUNCTION 'FTP_COMMAND'
      EXPORTING
        handle        = gv_hdl
        command       = lv_cmd
      TABLES
        data          = lt_result
      EXCEPTIONS
        tcpip_error   = 1
        command_error = 2
        data_error    = 3
        OTHERS        = 4.
    IF sy-subrc NE 0.
      u_flag = abap_true."出错
    ENDIF.
  ENDIF.

9.调试

Call Function In Update Task的debug

906c9442baeb48949fc0c83523530433.png

正在执行的作业:SM50

53e4a26d8ae444d79195ba2fef3efa50.png

后台作业调试:

SM37 选中后输入 JDBG

637a1d78b9a44c58879dae830307882b.png

弹出窗口的debug

[FUNCTION]
Command=/H

Title=Debugger
Type=SystemCommand

10.报表程序

SELECT-OPTION:隐藏OPTION 复选框中的参数

CALL FUNCTION 'SELECT_OPTIONS_RESTRICT'

NO-EXTENSION :隐藏多值输入按钮

NO INTERVALS:隐藏HIGH输入框

搜索帮助:

三种实现方式:

1.SE11 创建搜索帮助

2.POV添加代码

CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'

3.选择屏幕中 MATCHCODE

搜索帮助增强:

F4IF_SHLP_EXIT_EXAMPLE

Function ALV:

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'

11.权限管理

一个权限对象最多可以包含10个字段

SU21 创建权限对象

PFCG 创建角色

12.包与CTS传输

STMS 传输请求

13.ABAP OO

SE24 创建全局类

程序中创建类:

DEFINITION

IMPLEMENTATION

类的定义:

CLASS decls DEFINITION.
  PUBLIC SECTION.
ENDCLASS. 

CLASS decls IMPLEMENTATION.
ENDCLASS.

类延期定义:

CLASS dfcls DEFINITION DEFERRED.

类的继承:

CLASS subclass DEFINITION INHERITING FROM superclass.

类的事件(Events):

事件是没有继承关系的类之间可以互相调用彼此方法的特殊方式。

首先在原始类中定义事件,在处理类里面实现事件。

CLASS c1 DEFINITION.
  PUBLIC SECTION.
    EVENTS e1 EXPORTING VALUE(p1) TYPE i.
    METHODS m1.
  PRIVATE SECTION.
    DATA a1 TYPE i.
ENDCLASS.
CLASS c1 IMPLEMENTATION.
  METHOD m1.
    a1 = 7.
    RAISE EVENT e1 EXPORTING p1 = a1.
  ENDMETHOD.
ENDCLASS.


CLASS c2 DEFINITION.
  PUBLIC SECTION.
    METHODS m2 FOR EVENT e1 OF c1
                   IMPORTING p1.
  PRIVATE SECTION.
    DATA a2 TYPE i.
ENDCLASS.
CLASS c2 IMPLEMENTATION.
  METHOD m2.
    a2 = p1.
  ENDMETHOD.
ENDCLASS.

DATA:lo_ref1 TYPE REF TO c1.
DATA:lo_ref2 TYPE REF TO c2.

CREATE OBJECT lo_ref1.
CREATE OBJECT lo_ref2.

SET HANDLER lo_ref2->m2 FOR lo_ref1.
CALL METHOD lo_ref1->m1.

类和函数的区别

1.SE37 创建函数一般先要创建函数组,函数有传入、传出、Changing、表、Exception、源代码组成,主要实现逻辑在源代码里,函数一般可以在所有程序里面调用,函数一般使用CALL FUNCTION调用,还有一些RFC函数,可以供外部系统调用,一般一个函数实现一个功能

2.SE24 创建全局类,类里面可以定义属性、方法、事件等,一个类可以有多个方法,每个方法可以实现不同的功能,方法里面可以定义传入、传出、Changing、Returning类型的参数。一般调用类的话需要在程序里面声明定义,然后实例化类CREATE OBJECT,再通过CALL METHOD 调用类的具体某一个方法。

区别:函数只能实现一个功能,类可以通过方法实现多个功能。类还可以继承。继承后的子类可以重写父类的一些方法。

CLASS <subclass> DEFINITION INHERITING FROM <superclass>.
CLASS LCL_ALV_GRID DEFINITION INHERITING FROM CL_GUI_ALV_GRID.

  PUBLIC SECTION.
    METHODS:
             M_SET_FIXED_COLS
               IMPORTING IV_COLS TYPE I,
             M_OPTIMIZE_ALL_COLS,
             M_OPTIMIZE_COL_ID
               IMPORTING IO_COL_ID TYPE LVC_S_COL,
             M_SET_RESIZE_ROWS,
             M_SET_CURRENT_CELL_BASE
               IMPORTING IV_ROW TYPE I
                         IV_COL TYPE I.

ENDCLASS.

14.OO ALV

列颜色:LVC_S_FCAT-EMPHASIZE 通过定义Fieldcat,赋值4位颜色,即可实现。

行颜色:内表里面定义一个Char4 的color字段,在layout中设置lvc_s_layo-info_fname = 内表定义的color字段,然后循环内表的时候,给color字段赋值4位颜色值即可。

单元格颜色:内表定义一个深层次结构字段color TYPE lvc_t_scol,在layout中设置lvc_s_layo-ctab_fname = 内表定义的深层次结构字段color,然后循环内表的时候,可以根据fname,给深层次内表字段赋值即可。

单元格按钮:内表定义一个深层次结构字段stylename TYPE lvc_t_styl,在layout中设置lvc_s_layo-stylefname = 内表定义的深层次结构字段stylename,然后循环内表的时候,可以根据filedname,给深层次内表字段style赋值 cl_gui_alv_grid=>mc_style_button。然后在事件类里面定义button_click事件实现相应功能即可。

OO ALV 常用事件:

DATA_CHANGED

TOOLBAR

USER_COMMAND

DOUBLE_CLICK

HOTSPOT_CLICK

TOP_OF_PAGE

ONF4

BUTTON_CLICK

OO ALV实现步骤:

1.TOP中定义事件类,CL_GUI_ALV_GRID类,显示的内表,全局变量、常量,ALV相关参数定义

2.定义选择屏幕,选择屏幕事件,控制数据选择

3.CLASS类的实现,事件类,如果继承了CL_GUI_ALV_GRID的话,那么也可以重写父类方法

*----------------------------------------------------------------------*
* CLASS LCL_EVENT_RECEIVER DEFINITION
*----------------------------------------------------------------------*
CLASS LCL_EVENT_RECEIVER DEFINITION.
  PUBLIC SECTION.
    "Top of Page Event
    METHODS : HANDLE_TOP_OF_PAGE
                FOR EVENT TOP_OF_PAGE OF CL_GUI_ALV_GRID
                IMPORTING E_DYNDOC_ID
                          TABLE_INDEX.

ENDCLASS.
*----------------------------------------------------------------------*
* CLASS LCL_EVENT_RECEIVER IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS LCL_EVENT_RECEIVER IMPLEMENTATION.

  METHOD HANDLE_TOP_OF_PAGE.
    PERFORM HANDLE_TOP_OF_PAGE USING E_DYNDOC_ID
                                     TABLE_INDEX.
  ENDMETHOD.                 "HANDLE_TOP_OF_PAGE

ENDCLASS.

4.提取数据编辑数据

5.CALL SCREEN调用屏幕,设置状态,

创建容器(CL_GUI_CUSTOM_CONTAINER、CL_GUI_DOCKING_CONTAINER),如果是一个屏幕显示多个ALV那么还需要用到拆分控件(CL_GUI_SPLITTER_CONTAINER)

6.然后通过实例化CL_GUI_ALV_GRID类,通过创建FIELDCAT、EVENT、LAYOUT等传入数据,调用set_table_for_first_display方法实现

7.事件的实现通过SET HANDLER 实现

SET HANDLER LCL_EVENT_RECEIVER->handle_top_of_page FOR po_alv_grid.

8.多屏ALV的话,相互之间的联动可以通过事件进行联动,比如双击了第一个屏幕,那么在第一屏幕 Double Click 事件中,对第二屏幕的数据进行相应变更,变更完成以后,调用第二屏幕的刷新,刷新第二屏的显示即可。

CALL MENTHOD CL_GUI_ALV_GRID->REFRESH_TABLE_DISPLAY.

对于多个屏幕,事件类可以使用同一个,但是定义具体事件参数的时候,需要定义隐含参数SENDER,用以区分是哪个屏幕的事件,然后按照屏幕事件触发即可。SENDER的结构会和GO_ALV_GRID类的结构一致,通过比对就可以知道是哪个ALV的GRID事件。

15.BDC 录屏

CALL TRANSACTION t-code WITH AUTHORITY-CHECK 
                        USING bdc_tab 
                         MODE mode
                       UPDATE upd.
                                      
CALL TRANSACTION t-code WITHOUT AUTHORITY-CHECK 
                        USING bdc_tab
                        OPTIONS FROM opt
                        MESSAGES INTO itab. 

BDC Options参数表如下:

对应前台屏幕:

主要字段说明:

DISMODE:

显示所有屏幕 
E显示错误
N后台的处理
P后台处理;可以调试 

UPDMODE:

L本地的 
S同步
A异步

1. "A" 异步更新。被调用程序的更新按照没有指定 COMMIT WORK 语句和 AND WAIT 附加的方式执行。也就是说,数据更新被放到更新队列里,由另一个专门的更新进程执行,主程序一旦提交数据就继续执行,而不管提交的更新是否执行完成。这种方式比较适合于用一个事务码大量更新指定数据,比如维护主数据等。

2."S" 同步更新。被调用程序的更新按照指定了 COMMIT WORK 语句和 AND WAIT 附加的方式执行。也就是说,数据更新被放到更新队列里,由专门的更新进程执行,但是主程序会等到数据提交完成,返回结果信息后才继续执行。这种方式比较适合于数据一致性要求比较高,多个不同事务码的连续处理。

3."L" 本地更新。被调用程序的更新按照执行 SET UPDATE TASK LOCAL 语句的方式执行。也就是说,数据更新在主程序所在的进程中完成,主程序必定等到被调用事务完成才继续执行。

16.Dialog 程序

屏幕流主要包括:
PBO : PROCESS BEFORE OUTPUT
PAI : PROCESS AFTER INPUT
POV : PROCESS ON VALUE-REQUEST
POH : PROCESS ON VALUE-HELP

一般调用屏幕,首先调用PBO,可以设置屏幕初始状态、默认值等。然后展示屏幕,在展示的屏幕中输入值以后或者按相应按钮以后,会进入PAI,这时候就会得到屏幕最新的值,然后就可以根据输入的相应值或者按钮做相应逻辑处理。PAI处理完以后还会再走一遍PBO重新刷新屏幕。

当触发了屏幕字段的F4搜索帮助的时候,会触发POV,POV里可以做相应的搜索帮助逻辑。

当触发F1的时候会进入POH。

FIELD a MODULE frm_check_a ON INPUT.

FIELD b MODULE frm_chec_b ON REQUEST. 

On Input的触发条件是:只要该字段不为空就会触发module

On Request的触发条件是:该字段发生变化后触发module

CHAIN.
FIELD: f1,f2.
FIELD: f3 MODULE mod1 ON INPUT. 只有f3为非初始值时才调用mod1
ENDCHAIN.

CHAIN.
FIELD:f1,f2.
FIELD:f3 MODULE mod1 ON CHAIN-INPUT. f1,f2,f3中任一字段包含非初始值时都调用mod1
ENDCHAIN

屏幕字段下拉列表形式:

CALL FUNCTION 'VRM_SET_VALUES'

Table Control 如何实现某些字段可编辑

1.在PAI中,LOOP 内表 WITH control的时候,在LOOP中写一个module,然后LOOP AT SCREEN,设置screen-input = 1,modify screen即可

 2.Table Control的F4帮助

直接在POV中定义table control字段的搜索帮助module

FIELDS fields MOUDLE f4_search_help_for_fields.


1.如果当前的搜索帮助结果和当前行选中的数据没有关联,那么直接build搜索帮助表,调用函数:

CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'


2.如果搜索帮助的结果和当前选中行的数据有关联,那么需要先调用一个

CALL FUNCTION 'DYNP_GET_STEPL'


然后根据这个STEPL的值,调用

CALL FUNCTION 'DYNP_VALUES_READ'


获取当前行某个字段的值,然后根据得到的值对搜索帮助表进行筛选,build好搜索帮助表以后,调用

CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'


17.Smartforms 打印

TABLE 和 TEMPLATE 的区别:

table可以动态添加行,数据输出时会根据列宽自动换行。一般用于单一样式。

template一般是静态的,可以指定列宽、行高,当输入数据过长时会自动截断,一般用于复杂样式。如果要输出表样式,一般可以搭配LOOP进行数据的填充。

强制换页:

强制换页一般分几种情况:
1)表样的头和结尾不变,只有中间数据变换,如果中间样式简单那么可以在中间的mian windows里面定义一个table,中间main windows空间不够的话,table会自动换页。如果中间样式比较复杂,那么就需要loop一个template,然后根据内表数据行,计算出多少行的时候换页,在LOOP中加一个命令,设置好换页的index条件,再LOOP执行到这个index的时候,进行go to next page.当然,这个next page还是当前页,因为表头和结尾都没变。


2)表头不变,结尾只在打印的最后一页出现,这时候可以考虑使用table,table可以自动换页,把结尾放到table的footer中,这样当表单最后一页的时候,footer输出结尾。


3)表头出现在第一页,中间全是数据,最后一页出现结尾。这时需要创建一个全部放数据的页,一个放数据和结尾的页,当第一页表头加数据达到换页要求的时候,go to 到全是数据的页面,当数据不足以全部放在一页的时候,go to到带结尾的页。

样式:

SMARTFORMS中可以设置段落样式,字符样式

设置二维码,条形码

SE73 创建,创建完成以后,在样式里面的字符样式,指定创建好的条形码,smartfomrs中给某个元素字符样式赋值即可实现。

设置图片

SE78 创建,创建图片需要注意像素的问题,一般保存的图片要是BMP 256像素,这样打印出的图片不会有色差阴影。

Smartforms表格中动态文本样式一般在样式的表头数据里面定义。

页码大于9显示星号的问题

SFSY-FORMPAGES显示总页数的时候,如果页数大于9,,将会在前10页显示成星号。用一个单独的窗口来存放显示页码的文本,并且把窗口的类型设置为L(最终窗口)就OK了。

纸张打印机设置 :SPAD

查看打印 :SP01

18.接口相关

18.1 WebService

SAP的web service是在Netweaver组件通过UDDI工具,采用SOAP和WSDL这两种web服务技术,将SAP已有功能封装成webservice对象,供其他系统调用或者调用其他系统的webservice,从而实现SAP与非SAP系统(如OA、PLM等)系统的集成。

1) 外部系统访问SAP Webservice服务配置(Service Provider)

创建RFC函数

给RFC函数配置WS(webservice)

使用 SOAMANAGER 生成WSDL(可供外部访问的XML链接)

2) SAP访问外部 Webservice配置(Service Consumer)

SE80 创建企业服务,选择Service Consumer -> External WSDL/Schema -> URL

LPCONFIG 配置逻辑端口

在程序中创建代理类,然后通过代理类进行服务调用

18.2 Restful

18.3 PO

19.增强

20.OData

21.CDS

22.性能优化

  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Object-oriented programming with ABAP Objects(基于ABAP对象的面向对象编程)是SAP开发平台ABAP中的一种编程范例。它利用面向对象的思想,将数据(对象的属性)和行为(对象的方法)封装在一起,以便更好地组织和管理代码。 在ABAP Objects中,可以定义类(class)来描述一个对象的特征和行为。通过类的实例化,可以创建具体的对象,并调用对象的方法来实现特定的功能。这种面向对象的编程模式使得代码更加模块化、可重用,并且更易于维护和扩展。 在ABAP Objects中,支持面向对象的四大特性:封装、继承、多态和抽象。封装可以将对象的内部状态和行为隐藏起来,只暴露必要的接口;继承可以通过创建子类来扩展和重用已有类的特性;多态可以实现在不同的对象上调用相同的方法,产生不同的行为;抽象可以定义接口规范,让具体的类去实现。 通过ABAP Objects,开发人员可以更加灵活地进行程序设计和实现,也能够更好地应对复杂的业务需求。同时,由于ABAP Objects与SAP系统集成紧密,因此可以很方便地访问和操作SAP系统中的数据和服务,为企业的业务流程提供更多的可能性。 总之,Object-oriented programming with ABAP Objects在SAP开发中扮演着重要的角色,它为开发人员提供了更加高效、可维护的编程模式,也为企业的信息化建设带来了更多的价值和机遇。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值