提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
report
内表
创建内表
1、第一种方式
先定义types ,然后再type table of 定义内表
types : begin of <typ_name>,
end of <typ_name>.
dara : <itab> type table of <typ_name>.
4、第四种方法
引用标准表创建内表
data : <i_tab> type table of mara .
5、第五种方法,
引用标准表并且添加自定义字段创建内表
data : begin of <itab>,
include structure mara.
data : clr type char4,
end of <itab>.
获取内表行数
通过describe获得内表行数。
describe table <itab> line n.
不用modify直接更新内表
LOOP AT ASSIGNING FIELD SYMBOL
loop at gt_alv assigning field-symbol(<fs_output>).
fs_output-waers = ls_prcd_elements-waers.
endloop.
选择屏幕
屏幕元素创建
1、select-options
对象名称for参考对象,定义范围选择条件
select-options : s_bukrs for bukrs.
生成一个含有4个字段的内表: sign option low high
ranges : s_bukrs for bukrs.
sign : 标志位 值为I或者E 意义为option运算符是否取反,I表示包含,E表示排除
option: 运算符 如果high不为空,这可以使用bt(between and) 或者nb(not between)。
2、parameters
对象名称 type/ like 对象名称,定义单选条件。
屏幕输入域显示参数控制
obligatory : 必输
no-display: 显示控制
no-extension : 多行输入控制
as CheckBox : 创建复选框
visible length vlen : 显示控制长度
parameters 对象名 as listbox visible length vlen 创建下拉列表
3、输入值的控制
default : 默认值
lower case 允许输入小写字母(sap 屏幕会默认把输入后的字母转换为大写)
matchcode object search_help : 为屏幕对象加上指定的F4帮助对象. se11 定义搜索帮助对象
memory id : 定义select-option 内存参数,可以讲屏幕对象输入的值保存到指定的内在参数中,通过get parameter 方法直接从内存读取该对象的值。
4、选择屏幕事件流
load-of-program 程序执行时,自动触发该事件
initialization 该事件在屏幕未显示前执行,初始化程序
at selection-screen output 选择屏幕PBO事件,显示选择屏幕之前触发
at selection-screen 选择屏幕PAI事件,在选择屏幕上点击执行后触发。
start-of-selection 数据选择行开始
end-of-selection数据选择行结束
top-of-page 页眉控制
end-of-page 页脚控制
at line-selection 行选择控制,用户选择或者双击某行是触发
at user-command 用户交互控制,用户选择某个GUI功能是触发
5、选择屏幕动态展示
拿冲销和过账举例子
先设置过账和冲销两个单选按钮 RADIOBUTTON r1 / r2 按钮需要分配user-command 属性
然后给需要动态显示的项设置不同的组 MODIF ID md1/md2
在选择屏幕的pbo事件中 判断screen-group1 = ‘md1’ screen-active = ‘0’. 就把md1下所有项都隐藏掉了
IF r_cancel = 'X'.
LOOP AT SCREEN.
IF screen-group1 = 'MD1'.
screen-active = '0'.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
ELSEIF r_run = 'X'.
LOOP AT SCREEN.
IF screen-group1 = 'MD2' .
screen-active = '0'.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
ENDIF.
6、选择屏幕两个按钮同一行显示
comment xx(Y): 、 这条语句的作用是讲该语句后面的第一个screen element 定位在这一行的XX位置,长度为y
selection-screen begin of line.
selection-screen comment(10) for field but1.
selection-screen comment(15) for field but1.
selection-screen end of line。
opensql
inner 和left,right 是且与或的关系
1、不要使用select * ,会占用大量abap 内存
2、 不要使用select distinct 使用 sort + delete adjacent duplicates
3、不要使用嵌套select 。。。 endselect。
4、确定只查询一条数据时,应用select single
5、需要统计时,可以使用sql+聚合函数
6、尽可能的使用abap sort 排序 不使用order by
7、使用二分法查询内表数据速度
read table itab with key binary search.
for all entries in
1、in 条件所在内表不能为空(空值相当于没有任何条件,会取出所有数据)
2、in条件内表数据大于5000时不建议使用,一定要使用尽量每次使用3000,循环方式
3、该语句会自动去重,相当于distinct ,使用时尽量带出主键
alv
alv 是 abap list view 是abap报表显示工具,它把内表中的内容以设定的格式显示出来,并且可以添加自定义的功能,比如打印出来
alv 分为两种 function alv 和oo alv
function alv
reuse_alv_grid_displary 网格展示 (常用)
reuse_alv_list_displary 列表展示
类型池slis
fieldcat 字段设置
gs_field type slis_t_fieldcat_alv
wa_field type slis_fieldcat_alv
常用的field设置
wa_field-fieldname :内表字段名称
seltext : 展示名称 (seltext_l 长 seltext_m 中 seltext_s 短)
du-sum : 总计列值
edit : 可编辑
just : 对齐 R L C
emphasize 设置列颜色 使用4位字符代表颜色
首位C(color)
二位1-7数字代表颜色 3黄色,5绿色 6红色
三位 1/0 代表反转颜色启用
四位 1/0 增强颜色启用
设置单元格颜色
内标准含有字段
color TYPE LVC_S_scol.
设置某单元格可编辑
FIELD_STYLE TYPE LVC_T_STYL, " 为结果内表添加设置编辑状态所需的字段
DATA STYLELIN TYPE LVC_S_STYL.
STYLELIN-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED. " 循环内表设置为不可编辑状态
DATA: BEGIN OF ITAB OCCURS 0,
ZQRFH_ICON TYPE STRING,
ZLDATE TYPE ZLDATE,
ZLUSR TYPE ZLUSR,
K TYPE STRING,
FIELD_STYLE TYPE LVC_T_STYL, " 为内表添加设置编辑状态所需的字段
END OF ITAB.
S_FIELDCAT-FIELDNAME = 'ZBQFS'. " 设置列可编辑
S_FIELDCAT-EDIT = 'X'.
APPEND S_FIELDCAT TO T_FIELDCAT.
DATA STYLELIN TYPE LVC_S_STYL.
LOOP AT ITAB.
IF ITAB-ZXMDM = 'D' OR ITAB-ZXMDM = 'F' OR ITAB-ZXMDM = 'H'.
STYLELIN-FIELDNAME = 'ZBQFS'. " 需要编辑的列名
STYLELIN-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED. " 设置为不可编辑状态
APPEND STYLELIN TO ITAB-FIELD_STYLE.
CLEAR STYLELIN.
MODIFY ITAB.
ENDIF.
endloop.
layout 布局控制
gs_layout type slis_layout_alv
常用layout设置
gs_layout-colwidth_optimize = ‘X’ 自动设置列宽
coltab_fieldname = ‘CELLCOLOR’ 设置某个字段值显示颜色
info_fieldname = ‘CLR’ 设置行显示颜色 ,CLR为结果内表里的字段
zebra = ‘X’ 设置斑马线条显示颜色
box_fieldname = ‘XH’ alv 选中行 ,XH为结果内表里的字段
call function ’REUSE_ALV_GRID_DISPLAY‘
exporting
i_callback_program = g_repid
is_layout = gs_layout
it_fieldcat = gs_fieldcat
it_sort = lt_sort : 排序
i_save = ’A‘ 生成布局
i_callback_pf_status_set = ‘FRM_ALV_PF_STATUS’ : gui状态
i_callback_user_command = ‘FRM_ALV_USER_COMMAND’ : 用户pai事件
tables
t_outtab = it_out[]
it_sort-fieldname = ‘’ 设置需要排序的字段名
it_sort-up = ‘X’ 设置升序
或者
it_sort-down = ‘X’ 设置降序
如何做到单击跳转事务
1、首先在fieldcat中设置hotspot = ’X‘
2、然后再user_command事件中加入
case r_ucomm
wuth ‘&IC1’
set parameter id ‘GJR’ p_gjahr. 设置参数
call transaction ‘MM03’ and skip firsy screen.调用mm03事务码
GUI状态栏
隐藏gui状态栏按钮: excluding
DATA : lt_exfcode TYPE TABLE OF sy-ucomm.
IF p_aqkcsq <> 'X'.
append 'SAVE' to lt_exfcode.
ENDIF.
SET PF-STATUS 'STANDARD' EXCLUDING lt_exfcode.
dialog
对话框事件和逻辑流
调用时首先触发PBO->子屏幕PBO,然后显示屏幕,在屏幕上点击按钮后,触发PAI事件->子屏幕PAI,触发结束后又会执行PBO->子屏幕PBO
字段输入事件
ON INPUT:指定某子工程只在给定字段具有非初始化值时才被调用。
ON REQUEST:当屏幕中文本输入字段的值发生变化
会触发该程序所定义的子程序。该事件适合于屏幕中所有字段值的变化时检查更新。
CHAIN-INPUT | CHAIN-REQUEST :该语法可以同时控制屏幕中多个字段的输入事件。
屏幕退出事件
module exit at exit-command。
leave to screen 0.
常用标准T-CODE
me21n : 创建采购订单
me22n : 更改采购订单
me23n : 查看采购订单
me41 : 创建询价
mir4 : 查看发票信息
mm03 : 查看物料主数据
cs03 : 查看bom
mb52 : 批量查询库存
mb51 : 查看物料移动记录
mb03 : 查询物料凭证
常用bapi
bapi_po_create1
: 创建采购订单
bapi_po_change
: 更改采购订单
bapi_goodsmvt_creaate :
物料移动,创建物料凭证
call function 'BAPI_GOODSMVT_CREATE'
exporting
goodsmvt_header = '' 抬头
goodsmvt_code = '' 移动货物代码
importing
goodsmvt_headret = '' 返回包含凭证编号和凭证日期的结构
table
goodsmvt_items = '' 明细数据
return = '' 返回值
GOODSMVT_CODE就控制了对应哪个事物码的功能,下面给出该参数的值和对应的事务码:
01 MB01 : 采购订单收货
02 MB31 : 订单收货
03 MB1A : 发货过账
04 MB1B : 转移过账
05 MB1C : 投料
06 MB11 :
07 MB04
数据存放在表T158G 中。
BAPI_TRANSACTION_ROLLBACK
BAPI_TRANSACTION_COMMIT
BAPI_MATERIAL_SAVEDATA 创建物料主数据
BAPI_SALESORDER_CREATEFROMDAT2
创建销售订单
LOGIC_SWITCH-PRICING = ‘G'
A 复制价格组件和重新确定等级
B 执行新的定价
C 复制手工定价因素且重新确定其它因素
D 复制不变的定价因素
E 采用价格组件和固定值
F 复制价格元素,调整价值与固定
G 复制不变定价因素且重定税款
H 重新确定运费条件
J 重新确定确认的采购净价格/价值(KNTYP=D)
K 采纳价格组件和重新确定税收
M 复制价格要素,转换值
N 传输定价组件未更改, 新成本
O 重新确定变式条件(KNTYP=0)
Q 重新确定计算条件(KNTYP=Q)
R 应用价格部分和奖金条件
U 重新确定贵重金属条件(KNTYP=U)
S 装运&借方 (IBU HiTec)
常用表
1、MARA: 常规物料数据
2、MARC: 物料的工厂数据
3、MAKT: 物料描述
9、LFA1: 供应商主数据(一般数据)
10、LFB1: 供应商主数据(公司代码)
23、KNA1: 客户主数据(一般数据)
24、KNB1: 客户主数据(公司代码)
14、EKKO: 采购订单抬头
15、EKPO: 采购订单行项目
16、MKPF:物料凭证抬头
17、MSEG : 物料凭证行项目
BDC录屏
CALL TRANSACTION ‘ME41’ USING bdcdata
* OPTIONS FROM BDCOPT
MESSAGES INTO bdcmsg
UPDATE ‘S’
MODE lv_mode. .MODE ‘N’ . "显示模式:A ;N 后台 ;E
增强
常用增强:出口 userexit badi ,隐式增强 ;前两种可以用程序找,也可以找到程序对应的包,然后包里搜索;隐式增强就是触发事件,需要debug在标准程序里找地方加代码
一代增强
基于源代码的增强
第一代增强基于源代码,是SAP系统提供一个空代码的子过程,在这个子过程中用户可以添加自己的代码。
这类增强需要修改SAP标准代码,他们发布时都是空的,集中在一些文件名倒数第二个字符为Z的包含过程中,由于实在标准程序中,所以所有程序的全局数据都可以使用,而且系统升级时会被覆盖掉。所以一般不用此类增强。
查找一代增强的方法
1、在主程序中查找倒数第二个字符为Z的包含程序
2、在程序中搜索userexit_开头的子程序
二代增强
基于函数模块的增强
用增强管理smod和增强编辑cmod 维护。在标准程序中,使用call customer-function 'XXX’调用函数模块,
查找二代增强的方法
所以可以通过在程序中搜索customer-function来查找二代增强,第二代增强函数名构成是exit_ 程序名_‘XXX’ (XXX是call function中的编号)。
针对数据表的增强出口是“CL”打头的结构,这些结构将以.include结构的形式包含到相应的数据表中,用户可以通过向这些结构中添加字段从而达到对数据表字段的增加。
第二代增强主要包括四类:
函数增强:E.Ehancement Exits(函数增强) : 这些出口以exit_程序名 _‘编号’ ,可以在se37中查看,也可以在数据字典TFDIR中查询Exit_开头的函数。
GUI增强:C.GUI codes : 用于区域菜单和工具栏菜单的增强
屏幕增强 : S.Subscreens : 用于子屏幕设计增强
表结构增强 : include structure : 用于表结构的增强
按照用途分类:
功能模块出口(Function Module exits) : 在SAP标准事务中添加业务逻辑,一般用于验证标准事务中的字段
屏幕出口(Screen Exits) : 定义自己的子屏幕或激活屏蔽标准事务中的菜单项
关键字出口(keyword exits) : 在
三代增强 badi
se18 创建及维护badi对象
se19 维护badi实例,badi功能的实现
1、先创建增强点
2、在增强点元素定义标签创建badi
3、然后在菜单中的“接口" 创建接口 ,并且维护方法和参数。
4、然后就可以创建BADI实施
调用方法
method baid~方法名.
endmethod.
创建的badi可以在程序中直接调用
badi1 type ref to zbadi_test_F01. 参照接口对象
badi2 type ref of zbadi_test001_class. 参照实施类.
查找badi的方法
通过SE24,输入CL_EXITHANDLER,然后在方法GET_INSTANCE中设置断点,然后运行事务代码判断 exit_name的值
四代增强
RFC函数
1、任何一个abap程序都可以调用一个远程调用函数,使用语句:CALL FUNCTION …DESTINATION. sm59 创建abap链接
无论是in update task 还是in background task的函数。
都是遇到了commit work语句之后才调用的,
如果没有commit work,
函数不会被触发。
防止重复调用
未有答案
调用日志
未有答案
RFC通讯模式
DESTINATION
同步通信
异步通信
smartform ----0331:面试
模板与table的区别
1、table可以动态添加行,数据输出时会根据列宽自动换行,可以固定列宽,但是默认情况下控制不了行高,如果想要模板一样固定行高,需要将table的无换页属性打钩
2、模板是静态的,固定列宽,行高,当输出数据过长时会自动截断,通常用于静态表单开发,模板与loop嵌套使用,可以实现固定行高,列宽的表单表单开发。
模板分页如何操作
首先创建一个loop循环
然后创建一个可选逻辑流,用于判断变量值是否需要分页,判断条件结果为true
smartform打断点
可以在程序行里面输入 断点语句 break-point
webservice
公司结构 FI SD MM PP basia
内存
EXPORT p1 FROM ekko-submi TO MEMORY ID ‘ZXRMM04’.放入内存
IMport p1 from ekko-submi from memory id ‘’ 从内存中读取
程序优化
优化程序性能的基本原则
1、减少对数据库的访问
访问数据库会消耗非常多的时间,频繁的访问数据库,对程序性能的影响是显而易见的。
2、减少循环次数
循环会增加CPU的负载。虽然每次循环执行的时间比较短,但是随着循环的次数增加,累计的处理时间就很长
3、减少网络往返传输的数据量
网络传输也很明显的影响程序的执行时间。数据量越大,网络延迟的时间就会很明显
优化程序性能的方法
1、确定影响程序性能的主要原因
要解决问题,就要先确定问题出在哪里
2、通过内表处理减少对数据库的访问
2.1、使用select。。。into table 一次性的把要处理的数据读入到内表中进行处理
2.2、如果表字段很多的情况下,尽量不要使用select * 返回所以字段值,只返回指定的字段值,
尽量避免CORRESPONDING。因为CORRESPONDING存在系统内部存在隐式操作,影响性能。
- 检查元素名称匹配;
- 检查元素类型匹配;
- 元素类型转换。
2.3、尽量在where语句中使用索引字段限定数据的范围,索引字段按顺序排列。
- where 语句中尽量使用 = 、IN
- 控制使用>、<、>=、<=、between and
- 避免使用<> 、 like、not like
2.4、如果要取一批数据的最大值,最小值,平均数、总数,可以使用select+聚合函数来取值,而不是将数据取到内表中再进行处理。
2.5、如果确定返回只有一条记录,使用select single 或者select 。。up to 1 rows读取记录
2.6、使用for all entries 减少批量条件下对数据库的访问次数,条件内表需要根据结合条件排序并删除重复数据,并判断不能为空。
2.7、需要排序是,不要使用order by进行排序,应当用sort操作内表排序
2.8、更新\插入\删除数据表数据时,尽量使用内表一次更新。
双LOOP循环优化
指针
此方法 标准程序可以获得任何字段
ASSIGN (‘(SAPMV45A)VBAK-AUART’) TO <LS_AUART>. "获取订单类型
总结
记录 提升 有问题还请大姑们指出