ABAP面试

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

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>. "获取订单类型

总结

记录 提升 有问题还请大姑们指出

  • 16
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值