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_
DEQUEUE_
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 = -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 .
* 创建动态工作区
UNASSIGN .
CREATE DATA DYN_LINE LIKE LINE OF .
ASSIGN DYN_LINE->* TO .
ENDIF.
7.2 Data Reference
7.3 括号加变量
8.SAP 内存 与 ABAP 内存
8.1 SAP 内存
"分配SAP内存
SET PARAMETER ID FIELD .
"读取SAP内存
GET PARAMETER ID FIELD .
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 .
CLEAR LV_CONT_STR .
ASSIGN COMPONENT -NAME OF STRUCTURE GS_RESULT_TAB TO .
IF SY-SUBRC = 0 .
IF -TYPE_KIND EQ 'C'.
REPLACE ALL OCCURRENCES OF CNS_SEP IN WITH SPACE .
CONDENSE .
ENDIF.
LV_CONT_STR = .
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
正在执行的作业:SM50
后台作业调试:
SM37 选中后输入 JDBG
弹出窗口的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 DEFINITION INHERITING FROM .
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:
A | 显示所有屏幕 |
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.性能优化