ALV实质是一个屏幕控件对象,它通过程序传递数据内表的方式来显示数据
实现方法:
1.调用标准函数
2.优化接口:用户可以实现对字段的排序,筛选以及统计等功能
fieldcat TYPE slis_t_fieldcat_alv
作用
1.列格式设置(表单)
2.字段名称,列是否可修改,列宽度等设置
layout TYPE slis_layout_alv
作用:
1.全局格式设置(结构)
2.整表字段是否可修改,是否以斑马纹输出,是否显示选择按钮字段等
函数:REUSE_ALV_FIELDCATLOG_MERGE
作用:
1.根据内表结构返回FIELDCAT字段结构信息
函数:REUSE_ALV_GRID_DISPLAY/REUSE_ALV_LIST_DISPLAY
作用:
1.使用GRID/LIST模式输出ALV报表
START-OF-SELECION
作用:
数据表单的选取
END-OF-SELECTION
作用:
1.对FIELDCAT赋值:设置每列格式
2.对LAYOUT赋值:设置表单格式(可选)
3.对SORT表等赋值:设置排序内容等(可选)
4.给EVENT表赋值:增加程序交互事件(可选)
5.调用函数,输出ALV
REPORT ZHQ_10 MESSAGE-ID ZHQ.
INCLUDE ZHQ_10TOP.
INCLUDE ZHQ_10FORM.
START-OF-SELECTION.
PERFORM GET_DATA.
END-OF-SELECTION.
IF GT_MARD[] IS NOT INITAL.
PERFORM WRITE_DATA.
ELSE.
MESSAGE S001 DISPLAY LIKE 'E' .
ENDIF.
FORM WRITE_DATA.
PERFORM BUILD_FIELDCAT.
PERFORM BUILD_LAYOUT.
PERFORM BUILD_SORT.
PERFORM BUILD_EVENT.
PERFORM BUILD_ALV.
ENDFORM.
我们一般的的习惯是,在START-OF-SELECTION下面写GET_DATA 获取数据
在END-OF-SELECTION 后面写展示数据。
START-OF-SELECTION.
PERFORM GET_DATA.
END-OF-SELECTION.
PERFORM DISPLAY_DATA.
我们一般如此定义我们数据所在的内表 GT_STUDENT
以及我们数据所在的工作区 GS_STUDENT
DATA GT_STUDENT TYPE TABLE OF ZSTUDENT_HQ_03.
DATA GS_STUDENT TYPE TYPE ZSTUDENT_HQ_03.
我们如此命名 FUNCTION ALV 来控制我们的列属性
DATA GT_FIELDCAT TYPE SLIS_T_FIELDCAT_LAV. "列属性
DATA GS_FIELDCAT TYPE SLIS_FIELDCAT_ALV. "
其中我们的display_DATA.这样写
FORM DISPLAY_DATA.
PERFORM BUILD_FIELDCAT.
PERFORM BUILD_ALV.
ENDFORM.
然后下面是我们BUILD_的具体内容
FORM BUILD_FIELDCAT.
CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = '1'.
GS_FIELDCAT-FIELDNAME = 'ZCODE'.
GS_FIELDCAT-OUTPUTLEN = '10'.
GS_FIELDCAT-SELTEXT_M = '学生编号'.
APPEND GS_FIELDCAT TO GT_FIELDCAT.
CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = '2'.
GS_FIELDCAT-FIELDNAME = 'ZNAME'.
GS_FIELDCAT-OUTPUTLEN = '20'.
GS_FIELDCAT-SELTEXT_M = '学生姓名'.
APPEND GS_FIELDCAT TO GT_FIELDCAT.
我们是这样创建宏的
*每个宏中最多可以定义9个参数
DEFINE %%APPEND_FIELDCAT. "两个百分号是为了与其他变量形成命名上的区别,不是强制要求的
CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = &1. "&代表对应的占位符
GS_FIELDCAT-FIELDNAME = &1.
GS_FIELDCAT-OUTPUTLEN = &1.
GS_FIELDCAT-SELTEXT_M = &1.
APPEND GS_FIELDCAT TO GT_FIELDCAT.
上述这样的代码写完之后我们 FORM BUILD_FIELDCAT中的内容就可以变成
FORM BUILD_FIELDCAT.
%%APPEND_FIELDCAT: '1' 'ZCODE' '10' '学生编号',
'2' 'ZNAME' '20' '学生姓名'.
我们需要一列来定义图标输出的内容
TYPES: BEGIN OF GTY_STUDENT.
INCLUDE STRUCTURE ZSTUDENT_HQ_03.
TYPES: ICON TYPE C LENGTH 4 . "图标
TYPES: CHCHK TYPE C LENGTH 1. "复选框
TYPES: END OF GTY_STUDENT.
如果我们选择了加上图标或者复选框
那么我们对应的宏定义应该修改成如下的样子
CASE &2.
WHEN 'ZCODE' .
GS_FIELDCAT-KEY = 'X' .
WHEN 'ICON' ,
GS_FIELDCAT-ICON = 'X'.
WHEN 'CHECK'.
GS_FIELDCAT-CHECKBOX = 'X'.
WHEN 'WEIGHT'.
GS_FIELDCAT-DO_SUM = 'X'. ''DO-SUM会在最下面一行显示合计数量
ENDCASE.
APPEND GS_FIELDCAT TO GT_FIELDCAT.
同时要注意在宏定义里面进行修改
%%APPEND_FIELDCAT: '1' 'ZCODE' '10' '学生编号',
'2' 'ZNAME' '20' '学生姓名',
'3' 'SEX' '3' '姓名',
'4' 'ZSCHOOL' '10' '学校',
'5' 'WEIGH' '20' '体重',
'6' 'ZUNIT' '20' '单位',
'7' 'ICON' '20' '图标',
'8' 'CHECK' '20' '复选框'.
我们在子程序DISPLAY_DATA中,专门创建一个perform BUILD_LAYOUT
FORM DISPLAY_DATA.
PERFORM BUILD_FIELDCAT.
PERFORM BUILD_LAYOUT.
PERFORM BUILD_ALV.
ENDFORM.
并创建FORM BUILD_LAYOUT.
FORM BUILD_LAYOUT.
GS_LAYOUT-colwidth_optimize = 'X'.
GS_LAYOUT-ZEBRA = 'X'.
GS_LAYOUT-KEY_HOTSPOT = 'X'.
ENDFORM.
FORM BUILD_LAYOUT.
我们还可以这样设置
FORM BUILD_LAYOUT.
GS_LAYOUT-colwidth_optimize = 'X'. "优化列宽
GS_LAYOUT-ZEBRA = 'X' . "斑马纹输出
GS_LAYOUT-KEY-HOTSPOT = 'X'. "热点
GS_LAYOUT-BOX_FIELDNAME = 'BOX' . "内表中字段名称 - 定义为当前行的选择
GS_LAYOUT-DETALL_INITIAL_LINES = 'X'.
GS_LAYOUT-WINDOW_TITLEBAR = '窗体抬头'.
GS_LAYOUT-confirmation_prompt = 'X'.
我们的FORM BUILD_SORT.可以这么写
FORM BUILD_SORT.
*1.按照学生升序
CLEAR GS_SORT.
GS_SORT-spos = '1'.
GS_SORT-fieldname = 'ZSCHOOL'.
GS_SORT-UP = 'X'.
GS_SORT-subtot = 'X'.
APPEND GS_SORT TO GT_SORT.
*2.按照性别降序
CLEAR GS_SORT.
GS_SORT-spos = '2'.
GS_SORT-fieldname = 'SEX'.
GS_SORT-DOWN = 'X' .
APPEND GS_SORT TO GT_SORT .
ENDFORM.
此时FUNCITON ALV 应该如下
DATA GT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV. "列属性
DATA GS_FIELDCAT TYPE SLIS_FIELDCAT_ALV.
DATA GS_LAYOUT TYPE SLIS_LAYOUT_ALV . "全局参数
DATA GT_SORT TYPE SLIS_T_SORTINFO_ALV. "排序
DATA GS_SORT TYPE SLIS_SORTINFO_ALV.
DATA GT_FILTER TYPE SLIS_T_FILTER_ALV. "筛选
DATA GS_FILTER TYPE SLIS_FILTER_ALV .
现在我们要写这样一个ALV
要求如下:
1.从STUDENT表单进行取数,使用FUNCTION ALV进行输出
2.设置重量单位的关联
3.设置斑马纹
4.设置学号字段为KEY
测试it_filter字段:
要求:性别不为空
字段名
插入类型select-option的限制
SIGN OPTION LOW
E EQ ‘’
现在我们来写这样一个FORM BUILD_FILTER.
FORM BUILD_FILTER.
CLEAR GS_FILTER.
GS_FILTER-FIELDNAME = 'SEX'. "字段名
GS_FILTER-SIGN0 = 'E' "不包含
GS_FILTER-OPTIO = 'EQ' "等于
GS_FILTER-VALUF = ' ' "空值
APPEND GS_FILTER TO GT_FILTER.
ENDFORM.
ALV事件
处理ALV事件我们一般就是控制 ‘REUSE_ALV_GRID_DISPLAY’ 中的 CALLBACK选项
例如
I_CALLBACK_PROGRAM
I_CALLBACK_PF_STATUS_SET
I_CALLBACK_USER_COMMAND
I_CALLBACK_TOP_OF_PAGE
I_CALLBACK_HTML_TOP_OF_PAGE
I_CALLBACK_HTML_END_OF_LIST
还有IT_EVENT 选项,并需要定义内表
DATA GT_EVENTS TYPE SLIS_T_EVENT.
DATA GS_EVENTS TYPE SLIS_ALV_EVENT.
并创建 FORM BUILD_EVENTS.
FORM BUILD_EVENTS.
CLEAR GS_EVENTS.
GS_EVENTS-NAME = 'PF_STATUS_SET'.
GS_EVENTS-FORM = 'SET_STATUS'. “自定义的子程序名
APPEND GS_EVENTS TO GT_EVENTS.
CLEAR GS_EVENTS.
GS_EVENTS-NAME = 'USER_COMMAND'.
GS_EVENTS-FORM = 'FM_USER_COMMAND'.
APPEND GS_EVENTS TO GT_EVENTS.
ENDFORM.
*根据自定义的子程序名来定义
FORM SET_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB.
SET PF-STATUS 'STATUS' EXCLUDING RT_EXTAB.
ENDFORM.
FORM FM_USER_COMMAND USING R_UCOMM LIKE SY-UCOMM
R_SELFIELD TYPE SLIS_SELFIELD
CASE R_UCOMM.
WHEN 'CALLSF'.
"PERFORM CALL_SMARTFORMS.
WHEN 'DOWNLOAD'.
"PERFORM DOWNLOAD_FILE.
ENDCASE.
ENDFORM.
ALV如何增加按钮
那么便是通过 IT_EVENTS 这个选项
1.此处增加按钮到应用工具栏
2.创建GUI_STATUS
FORM SET_STATUS USING P_EXTAB TYPE SLIS_T_EXTAB,
SET PF-STAUS 'STATUS'.
ENDFORM.
DATA: GT_EVENT TYPE SLIS_T_EVENT,
GS_EVENT TYPE SLIS_ALV_EVENT.
3.增加一个FORM
传入参数参照SLIS_T_EXTAB
使用SET PF-STATUS语句设置按钮
4.向EVENT表中增加事件
事件名:PF_STATUS_SET
子程序名:设置按钮的子程序
5修改ALV调用参数
给IT_EVENTS传EVENT表
FORM BUILD_EVENT.
GS_EVENT-NAME = 'PF_STATUS_SET'.
GS_EVENT-FORM = 'SET_STATUS'.
APPEND GS_EVENT TO GT_EVENT.
ENDFORM.
6.或者不向EVENT传值,而是在ALV的创建函数中,向 I_CALLBACK_PF_STATUS_SET直接传子程序的名称。
```abap
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
IT_EVENT = GT_EVENT
假设我们要取如下字段,分为 SPFLI 和 SFLIGHT 两张表 并且我们查出来两个表中的关联关系如下图,
那么我们根据上表中的关联关系(即两张表都共有的属性,可以写出如下的SQL语句来取数)
第一步,去航线信息 SPFLI (包括选择界面的4个条件)
第二步,取航班信息,for all entries in 航线信息
第三步,要注意循环数据量更大的表,例如在上图中,SPFLI 航线信息为15条数据,而SFLIGHT为150条信息,若选择
SPFLI,则一定有135条数据无法被读到。
SELECT CARRID CONNID COUNTRYFR CITYFROM COUNTRYTO CITYTO
FROM SPFLI
INTO CORRESPONDING FIELDS OF TABLE GT_SPFLI
WHERE CARRID IN S_CARRID
AND CONNID IN S_CONNID
AND COUNTRYFR IN S_CONFR
AND COUNTRYTO IN S_CONTO.
CHECK GT_SPFLI[] IS NOT INITIAL.
SELECT CARRID CONNID FLDATE PRICE CURRENCY
FROM SFLIGHT
INTO CORRESPONDING FIELDS OF TABLE GT_SFLIGHT
FOR ALL ENTRIES IN GT_SPFLI
WHERE CARRID = GT_SPFLI-CARRID
AND CONNID = GT_SPFLI-CONNID
AND FLDATE IN S_FLDATE.
LOOP AT GT_SFLIGHT.
MOVE-CORRESPONDING GT_SFLIGHT TO GT_TOTAL.
READ TABLE GT_SPFLI WITH KEY CARRID = GT_SFLIGHT-CARRID CONNID = GT_SFIGHT-CONNID BINARY SEARCH
IF SY-SUBRC = 0.
GT_TOTAL-PRICE = …….
GT_TOTAL-CURRENCY=......
mard 物料在库存地点下的数据
mara 物料的一般数据
makt 物料描述文本
ALV的布局管理
ALV中,若想保存布局,要添加I_SAVE参数
I_SAVE 定义为C数据类型,值如下:
- ‘’ = 不能保存布局
- ‘X’ = 布局只能被保存为标准布局
- ‘U’ = 只能指定用户布局
- ‘A’ = 既能选择标准布局,也可以选择指定用户布局
为了进一步管理布局,则需要加入 IS_VARIANT参数
- 其数据结构参考DISVARIANT
- 设置字段
- REPORT = SY-REPID "程序名称
- VARIANT 为布局保存格式
- 有三个有用函数供调用保存的格式布局,分别为
- REUSE_ALV_VARIANT_DEFAULT_GET 读取默认的布局
- REUSE_ALV-VARIANT_EXISTENCE 检测指定布局是否存在
- REUSE_ALV_VARIANT_F4 显示布局格式选择对话窗
优先级
- 当排序,筛选等也设置时,以布局管理参数设置优先
- 当用户设置布局参数默认值时,以布局参数传值优先
https://blog.csdn.net/sunnyonly1992/article/details/51783665
简单来说:collect 在非数值字段相同的情况下,起到了数值字段汇总作用。
非数值字段不同的情况下,效果和append相同执行插入内表操作,当非数值字段相同的时候,则相当于modify的效果,只不过是将数值字段进行汇总相加后更新。
语法:
collect w_table into i_table.
目标是实现几个需要计算的数据的显示
有如下: 已入库数量的汇总,未入库数量汇总,最晚入库日期,是否及时交付,及时交付率
最简单的是及时交付率和是否及时交付
我们仅需要如下代码:
*及时率和是否及时交付
if gs_sec_name > 0 .
gs_sec-rate = gs_sec-menge2/gs_sec-menge*100. "我们在前面的订单中将不及时的订单数放入了menge2中
endif.
if gs_sec-rate = 1.
gs_sec-zsfjf = '是'.
else.
gs_sec-zsfjf = '否'.
然后是未入库数量的计算
gs_sec-zerks = gs_sec-menge - gs_sec-menge2.
*未入库数量等于主表中的订单总数减去已入库数量。
然后是入库数量的汇总
首先在get_data里面定义SQL语句,用select来选取数据
*已入库数量汇总
select mseg~mblnr " 物料凭证编号
mseg~zeile " 物料凭证中的项目
mseg~ebeln " 采购订单号
mseg~ebelp " 采购订单行号
mseg~erfmg as menge "订单数量
mseg~shkzg " 借方/贷方标志
mkpf~budat "入库日期
into corresponding fields of table gt_mseg_3
*我们选取了以上数据,然后使用into corresponding fields of table 语句,使其gt_mseg_3中的对应位置
from mseg
inner join mkpf on mseg~mblnr = mkpf~mblnr
*来自于mseg表和与其相连的mkpf表
for all entries in gt_sec
*for all entries 代表将如上筛选过后的数据去重后进入gt_sec表中
where mseg~ebeln = gt_sec-ebeln "限制条件如下
and mseg~ebelp = gt_sec-ebelp
and mseg~bwart in ('101','103','102','121','124','122','123','161','162').
*然后在加上如上限制条件,这样我们就完成了SQL部分的筛选工作
然后在 frm_process中写下数据处理过程
* 总入库数量
loop at gt_mseg_3 into gs_mseg_3 where ebeln = gs_sec-ebeln and ebelp = gs_sec-ebelp.
*要求循环的同时订单号和订单行号
if gs_mseg_3-shkzg = 'S'.
gs_first-menge3 = gs_first-menge3 + gs_mseg_3-menge.
*如果是收入方,那么数量相加,存储在gs_first中
elseif gs_mseg_3-shkzg = 'H'.
gs_first-menge3 = gs_first-menge3 - gs_mseg_3-menge.
*如果是借出方,那么数量相减,存储在gs_first中
endif.
clear:gs_mseg_3.
endloop.
"及时收货数量
loop at lt_mseg into ls_mseg where ebeln = gs_sec-ebeln and ebelp = gs_sec-ebelp and budat <= gs_sec-eindt.
gs_sec-menge2 = gs_sec-menge2 + ls_mseg-menge.
clear:ls_mseg.
endloop.
* 读取 lt_mseg表中的内容进入其工作区 限制条件为其等于主表中的订单号,订单行号,并且早于采购交期
然后计算的是及时率和是否及时,
*计算及时率首先我们要计算的是及时收货数量
*及时收货数量
loop at lt_mseg into ls_mseg where ebeln = gs_sec-ebeln and ebelp = gs_sec-ebelp and budat <= gs_sec-eindt.
gs_sec_menge2 = gs_sec-menge2 - ls_mseg2-menge.
clear_mseg_2.
endloop.
*及时率
IF gs_sec-menge > 0.
gs_sec-rate = gs_sec-menge2 / gs_sec-menge *100.
ENDIF.
IF gs_sec-rate = 1.
gs_sec-zsfjf = '是' .
ELSE.
gs_sec-zsfjf = '否'.
ENDIF.
综上,用一道公式解决
未入库数量 = 总订单数量 减去 及时收货数量
gs_sec-zwrks = gs_sec-menge - gs_sec-menge2.
及时率 = 及时收货数量 / 订单总数
IF gs_sec-menge > 0 .
gs_sec-rate = gs_sec-menge2 / gs-sec-menge * 100
ENDIF.
是否及时
IF gs_sec-rate =1 .
gs_sec-zsfjf = '是' .
ELSE.
gs_sec-zsfjf = '否'.
ENDIF.
已入库数量的汇总
if gs_mseg-shkzg = 'S'.
gs_first-menge3 = gs_first-menge3 + gs_mseg_3-menge.
ELSEIF gs_mseg-shkzg = 'H'
gs_first-menge3 = gs_first-menge3 - gs_mseg_3-menge.
ENDIF.
最晚入库日期
sort gt_mseg descending by budat.
*先进行排序,按照入库日期降序排序,这样日期最大的就会排在第一条
*然后读取数据 read table into 来读取第一条数据,并且 加上限制条件 with key xxxxx,以便不会读取到太大量的数据
read table gt_mseg_2 into gs_mseg_2 with key ebeln = gs_sec_ebeln ebelp =gs_sec-ebelp.
if sy-subrc = 0.
gs_sec-budat = gs_mseg-budat.
modify gt_sec from gs_sec transporting eindt budat .
endif.
https://www.cnblogs.com/BruceKing/p/10716856.html
READ table 是用来遍历内表,取第一条符合条件的记录。
READ TABLE [INTO ] WITH KEY [BINARY SEARCH].
WITH KEY 中的检索条件比较符不能使用 ‘<>’ (不等于)
如果只想取得内部表中不等于某条件的一条记录,那么请使用下面的变通方法
LOOP AT itab WHERE KEY <> ‘XX’
此处取得第一条记录。
EXIT.
ENDLOOP.
如果在运行时 值为空,则统一忽略该关键字段。另外可对关键字段指定偏移量和长度。
TYPES:定义类型
DATA:定义变量
range:abap特殊区间,结构为SIGN OPTION LOW HIGH
table:内表,sap内存表,这个是比较重要的变量
like type: 指定变量的类型,如定义内表后面可以指定table of ,如定义工作区则接 line of 等
field-symbol:定义指针,一般循环时候使用,loop asign
下面是一个定义内表的范例:
*1.通过类型定义内表
types: begin of ty_header,
sign type char1,
option type char2,
*------------------------初始定义
report zalvtest022
type-pools:slis.
tables: ekko,ekpo,eket,mara. "此处的tables定义用于选择屏幕中的选项
*-----------------------声明固定的相关变量
data: lt_fieldcat type slis_t_fieldcat_alv, "存储fieldcat的内表
wa_fieldcat type slis_fieldcat_alv, "定义工作区
gs_layout type slis_layout_alv, "alv格式控制的结构体:layout
*----------------------定义内表结构
types:begin of ty_alvshow, "我们把自定义的内表的结构定义为TY_alvshow
vbeln type ekkn-vbeln, "销售订单号
erfmg type mseg-erfmg, "入库数量
budat type mkpf-budat, "入库日期
eindt type eket-eindt, "采购交期
ebeln type ekko-ebeln, "采购订单号
ebelp type ekpo-ebelp, "行项目号
matnr type mara-matnr, "零件号
txz01 type ekpo-txz01, "零件描述
meins type ekpo-meins, "订单单位
bukrs type ekko-bukrs, "公司
werks type ekpo-werks, "工厂
ekorg type ekko-ekorg, "采购组织
ekgrp type ekko-ekgrp, "采购组
submi type ekko-submi, "汇总号
matkl type ekpo-matkl, "物料组
bedat type ekko-bedat, "下单日期
vbeln1 type ekkn-vbeln, "销售订单号行项目
bstnk type vbak-bstnk, "客户参考号
kunnr type vbak-kunnr, "客户代号
kvgr2 type vbak-kvgr2, "品牌
edatu type vbep-edatu, "销售订单评审交期
bsart type ekko-bsart, "凭证类型
lifnr type ekko-lifnr, "供应商代码
vbelp type ekkn-vbelp, "销售订单号备注
jyrq type qave-vdatum, “虽然此数据我们不需要展示,但是查询过程中要用到,所以也写进去
qinspst type mseg-qinspst, “同上
vdatum type qave-vdatum, “同上
end of ty_alvshow.
*-------------定义内表和工作区
data:
gt_ty_alvshow type table of ty_alvshow,
gs_ty_alvshow type ty_alvshow.
*------------定义ALV格式控制-选择界面(也可以称为laout参数控制),用来定义进入表格前的筛选界面------
select-options:
s_werks for ekpo-werks obligatory, "工厂 obligatory 定义为不可输入空值
s_matkl for ekpo-matkl, “物料组
s_labor for mara_labor, "实验室
s_lifnr for ekko-lifnr, "供应商
s_eindt for eket-eindt obligatory. "采购订单交货日期
start-of-selection. "数据表单数据选取
perform get_data. "获取数据 "将封装好的get_data在这里调用
end-of-selection.
perform call_alv. "展示 "将封装好的call_alv在这里调用
&---------------------------------------------------------------------
*& Form F_SET_FIELDCAT
&---------------------------------------------------------------------
*& 创建一个名为F_SET_FIELDCAT的子例程
&---------------------------------------------------------------------
*& --> p1 text
*& <-- p2 text
&---------------------------------------------------------------------
form f_set_fieldcat.
clear wa_fieldcat. "清除工作区中内容(可去掉,目的是防止未清除的内容干扰)
refresh lt_fieldcat. "刷新内表中的内容
define alv_append_field. "宏定义
wa_fieldcat-fieldname = &1 . "定义wa_fieldcat(工作区)的fieldname属性,放在第一个位置
wa_fieldcat-seltext_l = &2. "定义wa_fieldcat(工作区)的seltext_l(备注)属性,放在第二个位置
APPEND wa_fieldcat TO lt_fieldcat " 将这些外部显示内容从工作区进入内表
CLEAR wa_fieldcat.
end-of-definition.
alv_append_field: "在已经定义好的alv_append_field里写入内表内容
‘VBELN’ ‘销售订单号’, "由于我们将fieldname放在第一个位置,备注放在第二个位置,故如此写
‘ERFMG’ ‘入库数量’,
‘BUDAT’ ‘入库日期’,
‘EINDT’ ‘采购交期’,
‘EBELN’ ‘采购订单号’,
‘EBELP’ ‘行项目号’,
‘MATNR’ ‘零件号’,
‘TXZ01’ ‘零件描述’,
‘MEINS’ ‘订单单位’,
‘BUKRS’ ‘公司’,
‘WERKS’ ‘工厂’,
‘EKORG’ ‘采购组织’,
‘EKGRP’ ‘采购组’,
‘SUBMI’ ‘汇总号’,
‘BEDAT’ ‘物料组’,
‘MATKL’ ‘下单日期’,
‘BSTNK’ ‘客户参考号’,
‘KUNNR’ ‘客户代号’,
‘KVGR2’ ‘品牌’,
‘EDATU’ ‘销售订单评审交期’,
‘BSTNK’ ‘凭证类型’,
‘LIFNR’ ‘供应商代码’,
‘VBELP’ ‘销售订单号备注’,
‘JYRQ’ ‘检验日期’.
endform.
&---------------------------------------------------------------------
*& Form GET_DATA
&---------------------------------------------------------------------
*& 定义了GET_DATA这个子例程
&---------------------------------------------------------------------
*& --> p1 text
*& <-- p2 text
&---------------------------------------------------------------------
from get_data.
‘’编写sql语句获取数据数据
"步骤,先编写from语句,将各种需要用到的表简写,然后每简写一个表就添加这个表中的属性,然后通过关联关系将各种表串联,即可完成,(于此同时要注意使用内连接or左连接,例如当我们的左表连接右表时,右边的属性如果可能会没有,应该使用左连接)
from mseg as a
inner join mkpf as b on a~mblnr = b~mblnr and a~mjahr = b~mjahr
inner join ekpo as c on c~ebeln = a~ebeln and c~ebelp = a~ebelp
inner join eket as d on d~ebeln = c~ebeln and d~ebelp = c~ebelp and d~etenr = '0001'
inner join ekko as e on e~ebeln = c~ebeln
left join ekkn as f on f~ebeln = c~ebeln and f~ebelp = c~ebelp
left join vbap as g on f~vbeln = g~vbeln and f~vbelp = g~posnr
left join vbak as h on h~vbeln = g~vbeln
left join vbep as i on i~vbeln = g~vbeln and i~posnr = g~posnr and i~etenr = '0001'
left join qals as j on a~mblnr = j~mblnr and a~mjahr = j~mjahr and a~zeile = j~zeile
inner join mara as l on a~matnr = l~matnr
left join qave as k on j~prueflos = k~prueflos
where c~werks in @s_werks and c~matkl in @s_matkl *where部分要注意写的是选择界面部分,也就是进入表格之前的界面
and l~labor in @s_labor and e~lifnr in @s_lifnr
and d~eindt in @s_eindt and a~qinspst in ('','4','1') "并且where还可以进行条件筛选
into corresponding fields of table @gt_ty_alvshow. "取出所有的字段对应放入内表中的字段
loop at gt_ty_alvshow into gs_ty_alvshow. ‘’以每次内表的内容进入工作区为条件进行循环
IF gs_ty_alvshow-qinspst = ‘’ OR gs_ty_alvshow-qinspst = ‘4’ . " 如果gs_ty_alvshow中的qinspst属性等于空或4
gs_ty_alvshow-JYRQ = gs_ty_alvshow-budat.
gs_ty_alvshow-JYRQ = gs_ty_alvshow-budat.
ELSEIF gs_ty_alvshow-qinspst = ‘1’.
gs_ty_alvshow-JYRQ = gs_ty_alvshow-vdatum.
ENDIF.
MODIFY gt_ty_alvshow FROM gs_ty_alvshow.
ENDLOOP.
endform.
&---------------------------------------------------------------------
*& Form F_CALL_ALV
&---------------------------------------------------------------------
*& 创建了一个名为F_CALL_ALV的子例程
&---------------------------------------------------------------------
*& --> p1 text
*& <-- p2 text
&---------------------------------------------------------------------
form f_call_alv .
call function ‘REUSE_ALV_GRID_DISPLAY’
exporting
i_callback_program = sy-repid "当前程序名
-
i_callback_pf_status_set = 'PF_STATUS_SET' "触发事件调用子程序
-
tablesi_callback_user_command = 'USER_COMMAND' "鼠标事件操作子程序 is_layout = gs_layout "输出样式 it_fieldcat = lt_fieldcat "字段定义描述表 i_default = 'X' i_save = 'A' "i_save有4个可选值,其中A代表(缺省默认和特定用户都可以)
t_outtab = gt_ty_alvshow "所用的内表
exceptions
program_error = 1
others = 2.
if sy-subrc <> 0. - Implement suitable error handling here
message id sy-msgid type sy-msgty number sy-msgno
with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
endif.
endform.
类型池:SLIS
Fieldcat TYPE slis_t_fieldcat_alv
作用:
列格式设置(表单)
字段名称,列是否可修改,列宽度等
Layout YEPE slis_layout_alv
作用:
全局格式设置(结构)
整表字段是否可修改,是否以斑马纹输出,是否显示选择按钮字段等
函数:REUSE_ALV_FIELDCATALOG_MERGE
根据内表结构返回fieldcat字段结构信息
函数:REUSE_ALV_GRID_DISPLAY/REUSE_ALV_LIST_DISPLAY
使用GRID/LIST模式输出ALV报表
ALV调用设计内容
START-OF-SELECTION
数据表单数据选取
END-OF-SELECTION
作用:
对FIELDCAT赋值:设置每列格式
对LAYOUT赋值:设置表单格式(可选)
对SPRT表等赋值:设置排序内容等(可选)
给EVENT表赋值:增加程序交互事件(可选)
调用函数,输出ALV
案例:
REPORT ZHQ_10 MESSAGE-ID ZHQ.
INCLUDE ZHQ_10TOP.
INCLUDE ZHQ_10FORM.
START-OF-SELECTION.
PERFORM GET_DATA.
ENDOF SELECTION.
IF GET_MARD[] IS NOT INITIAL.
PERFORM WRITE_DATA.
ELSE
MESSAGE S001 DISPLAY LIKE 'E'.
ENDIF.
FORM WRITE DATA.
PERFORM BUILD_FIELDCAT.
PERFORM BUILD_LAYOUT.
PERFORM BUILD_SORT.
PERFORM BUILD_EVEBT.
PERFORM BUILD_ALV.
ENDFORM.
创建fieldcat
fieldcat是一张内表,记录的是ALV输出时每列的属性信息
字段 说明
KEY 将该列设置为关键字(‘X’/“)
ICON 以图表显示(‘X’/”)
CHECKBOX 以复选框显示(‘X’/“)
JUST 定义对齐方式(‘R’/‘L’/‘C’)
IZERO 增加前导零
NO_SIGN 不显示符号(‘X’/”)
NO_ZERO 不显示前导零(‘X’/“)
COL_POS 作为第几列输出(数字)
DO_SUM 对字段进行汇总(‘X’/”)
SELTEXT_L/M/S 字段名称描述长/中/短(字符串)
HOTSPOT 设置为热点(显示为有下划线)
案例
写法一:
FORM BUILD_FIELDCAT.
GS_FIELDCAT-COL_POS = '1'.
GS_FIELDCAT-FIELDNAME = 'ZCODE'.
GS_FIELDCAT-OUTPUTLEN = '10'.
GS_FIELDCAT-SELTEXT_M = '学生编号'.
APPEND GS_FIELDCAT TO GT_FIELDCAT.
FORM BUILD_FIELDCAT.
GS_FIELDCAT-COL_POS = '2'.
GS_FIELDCAT-FIELDNAME = 'ZCODE'.
GS_FIELDCAT-OUTPUTLEN = '20'.
GS_FIELDCAT-SELTEXT_M = '学生姓名'.
APPEND GS_FIELDCAT TO GT_FIELDCAT.
ENDFORM.
写法二:宏相关
*宏 ---每个宏中最多可以定义9个参数
FORM BUILD_FIELDCAT.
%%APPEND_FIELDCAT: '1' 'ZCODE' '10' '学生编号',
'2' 'ZNAME' '20' '姓名编号',
'3' 'SEX' ' 3' '性别',
'4' 'ZSCHOOL' '10' '学校',
'5' 'WEIGHT' '15' '体重',
ENDFORM
DEFINE %%APPEND_FIELDCAT. "一般用两个百分号开头,但并不是强制如此,只是为了与其他变量区别
CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = &1.
GS_FIELDCAT-FIELDNAME = &2.
GS_FIELDCAT-OUTPUTLEN = &3.
GS_FIELDCAT-SELTEXT_M = &4.
APPEND GS_FIELDCAT TO GT_FIELDCAT.
使用子程序或者宏等方式,向FIELDCAT的内表中增加行
表单中的每一列为FIELDCAT中的一行
*ALV输出参数
DATA: GT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
GS_FIRLDCAT TYPE SLIS_FIELDCAT_ALV,
FROM BUILD_FIELDCAT.
CLEAR GT_FIELDCAT[].
PERFORM ADD_FIELDCAT USING ‘WERKS’ ‘工厂’ ‘1’ ‘5’ ‘’.
PERFORM ADD_FIELDCAT USING ‘LGORT’ ‘仓库’ ‘2’ ‘5’ ‘’.
PERFORM ADD_FIELDCAT USING ‘WERKS’ ‘工厂’ ‘3’ ‘20’ ‘’.
PERFORM ADD_FIELDCAT USING ‘WERKS’ ‘工厂’ ‘4’ ‘20’ ‘X’.
FORM ADD_FIELDCAT USING P_FIELDNAME
P_SELTEXT
P_COL
P_LEN
P_SUM.
CLEAR GS_FIELDCAT.
GS_FIELDCAT-FIELDNAME = P_FIELDNAME. "字段名
GS_FIELDCAT-SELTEXT_M = P_SELTEXT . "描述文本
GS_FIELDCAT-COL_POS = P_COL. "列
GS_FIELDCAT-OUTPUTLEN = P_LEN. "输出长度
GS_FIELDCAT-DO_SUM = P_SUM. "是否合计
APPEND GS_FIELDCAT TO GT_FIELDCAT.
ENDFORM.
使用函数: REUSE_ALV-FIELDCATALOG_MERGE
作用:
参照数据库(给I_STRUCTURE_NAME传值)或参照内表(给I_INTERNAL_TABNAME传值),直接将内表格式转为fieldcat表单内容
注意转换过的fieldcat可能需要再次修改
直接在ALV调用时,给I_STRUCTURE_NAME传值数据字典结构
作用:
可以混合使用,
https://www.cnblogs.com/zs-chenkang/p/13655850.html
REUSE_ALV_GRID_DISPLAY详解
调用功能模块:
CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY’
EXPORTING
i_interface_check = '' 接口一致性检查
i_callback_program = sy-repid 当前程序名
is_layout = layout 输出样式
it_fieldcat = fieldcat[] 字段定义描述表
i_callback_pf_status_set = 'PF_STATUS_SET' 触发事件调用子程序
i_callback_user_command = 'USER_COMMAND' 鼠标事件操作子程序
it_events = i_events[] 出口程序触发事件
i_callback_html_top_of_page = 'ALV_TOP_OF_PAGE' ALV输出表头设置
i_grid_settings = wl_lvc_s_glay 打印表头设置
it_sort = sortable[] 排序设置
TABLES
t_outtab = ig_out
EXCEPTIONS
program_error = 1
OTHERS = 2.
常用属性:(赋值’’中内容必须为大写)
1. Fieldcat
data: fieldcat type slis_t_fieldcat_alv with header line.
it_fieldcat = fieldcat[]
属性
(用来定义表单中的各个列的相关信息)
Fieldcat-col_pos = n. 输出列
Fieldcat-tabname = ‘FIELDNAME’. 对应的内表字段名
Fieldcat-seltext_s/m/l = ‘列名’. 输出列文本
(_s:短文本
_l:长文本)
Fieldcat-emphasize = ‘CX10’. 带有颜色的高亮列
(其中X=(1-7)
颜色同format)
Fieldcat-hotspot = ‘X’. 作为热点显示
可触发鼠标触发事件
Fieldcat-currency = ‘CURRKEY’. 表 TCURX 中的货币名称
Fieldcat-quantity(3) 计量单位
Fieldcat-qfieldname 参考计量单位的字段名称
Fieldcat-round = n. 四舍五入至小数位数下
n 位
Fieldcat-exponent = n. 浮点数的幂指数为n
Fieldcat-key = ‘X’. 关键字段
Fieldcat-icon = ‘X’. 作为图标输出
Fieldcat-symbol = ‘X’. 输出作为符号
Fieldcat-checkbox = ‘X’. 作为复选框输出
Fieldcat-just = SPACE, ‘R’, ‘L’, ‘C’. 对齐方式
Fieldcat-lzero = ‘X’. 输出前导零
Fieldcat-no_sign = ‘X’. 输出抑制符号
Fieldcat-no_zero = ‘X’. 为输出隐藏零
Fieldcat-edit_mask = SPACE, mask… 输出为mask的模式
Fieldcat-fix_column = ‘X’. 固定列
Fieldcat-do_sum = ‘X’. 总计列值总和
Fieldcat-no_out = ‘X’. 列不输出
Fieldcat-tech = ‘X’. 该字段为技术字段
Fieldcat-outputlen = n 列的字符宽度为n
Fieldcat-decimals_out = n 能控制小数点的位数为n
Fieldcat-datatype = C,I,N… 定义数据类型
2. SORT
data: sortable type slis_t_sortinfo_alv with header line.
it_sort = sortable[]
属性
(排序)
Sortable-Fieldname 字段名
Up 升序排列
Down 降序排列
Subtot
3. Layout
data: layout type slis_layout_alv .
is_layout = layout
属性 (用于定义ALV表单的相关格式、属性)
info_fieldname = 'LINE_COLOR'. 设置特殊行颜色
(将LINE_COLOR增加到内表字段,写’CX10’到特殊行的LINE_COLOR, X为颜色值)
colwidth_optimize = ‘X’. 优化列宽设置
no_colhead = ‘X’. 不显示列名
no_vline = ‘X’. 不显示列间竖线
zebra
f2code = '&ETA'. 设置触发弹出详细信息窗口的功能码,这里是双击
no_vline 这个用来设置列间隔线
detail_initial_lines
detail_popup 是否弹出详细信息窗口
detail_titlebar 设置弹出窗口的标题栏
totals_text
totals_only
group_change_edit
header_text
4.按钮
DATA: i_events TYPE slis_t_event WITH HEADER LINE.
事件:
it_events = i_events[]
i_callback_pf_status_set = ‘PF_STATUS_SET’
i_callback_user_command = ‘USER_COMMAND’
出口程序触发事件对应子程序:
FORM PF_STATUS_SET USING rt_extab TYPE slis_t_extab.
FORM user_command USING ucomm LIKE sy-ucomm selfield TYPE slis_selfield.
系统按钮功能码:
功能代码: 函数文本: 图标名称:
&ETA 细节 ICON_SELECT_DETAIL
&EB9 调用报告… ICON_TABLE_SETTINGS
&REFRESH 刷新 ICON_REFRESH
&ALL 全部选择 ICON_SELECT_ALL
&SAL 取消全选 ICON_DESELECT_ALL
&OUP 按升序排列 ICON_SORT_UP
&ODN 按降序排列 ICON_SORT_DOWN
&ILT 设置过滤器 ICON_FILTER
&UMC 总计 ICON_SUM
&SUM 小计… ICON_INTERMEDIATE_SUM
&RNT_PREV 打印预览 ICON_LAYOUT_CONTROL
&VEXCEL Microsoft Excel ICON_XLS
&AQW 字处理… ICON_WORD_PROCESSING
%PC 本地文件 … ICON_EXPORT
%SL 邮件收件人 ICON_MAIL
&ABC ABC 分析 ICON_ABC
&GRAPH 图形 ICON_GRAPHICS
&OL0 更改布局… ICON_ALV_VARIANTS
&OAD 选择格式… ICON_ALV_VARIANT_CHOOSE
&AVE 保存格式… ICON_ALV_VARIANT_SAVE
&INFO 信息 ICON_INFORMATION
4. ALV表头设置
i_callback_html_top_of_page = ‘ALV_TOP_OF_PAGE’
form top_of_page using cl_dd type ref to cl_dd_document.
语法同HTML fomat
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_interface_check = '' 接口一致性检查
i_callback_program = sy-repid 当前程序名
is_layout = layout 输出样式
it_fieldcat = fieldcat[] 字段定义描述表
i_callback_pf_status_set = 'PF_STATUS_SET' 触发事件调用子程序
i_callback_user_command = 'USER_COMMAND' 鼠标事件操作子程序
it_events = i_events[] 出口程序触发事件
i_callback_html_top_of_page = 'ALV_TOP_OF_PAGE' ALV输出表头设置(面向对象实现) i_callback_top_of_page = 'TOP_OF_PAGE' ALV输出表头设置(function实现)
i_grid_settings = wl_lvc_s_glay 打印表头设置
it_sort = sortable[] 排序设置 i_save ='X' I_SAVE 参数有四个可选值 分别是 空(两个功能都关闭,只能选择更改不能保存) X(只保留缺省默认的) U(只保留特定用户功能) A(缺省默认和特定用户都可以)
TABLES
t_outtab = ig_out
EXCEPTIONS
program_error = 1
OTHERS = 2.
关于使用READ TABLE语句
READ table 是用来遍历内表,取第一条符合条件的记录
READ TABLE [INTO ] WITH KEY [BINARY SEARCH].
阅读某一张表的数据,读取第一条符合条件的记录(主键为key)进去某个表,
add-20200427
WITH KEY 中的检索条件比较符不能使用 ‘<>’ (不等于)。
如果只想取得内部表中不等于某条件的一条记录,那么请使用下面的变通方法
LOOP AT itab WHERE KEY <> 'XX'.
此处取得第一条记录。
EXIT.
ENDLOOP.
如果在运行时值为空,则统一忽略该关键字段。另外可对关键字段指定偏移量和长度。
用INTO选项可以指定目标区域。如果表格由表头行,则可以忽略INTO选项。这样,表格工作区域就成了目标区域。
系统读取中匹配中所定义的关键字的第一个条目。
如果使用二分搜索法的话,需要先对内表进行相关条件的排序。
如果找到由适当关键字的条目,则将系统字段SY-SUBRC设置为0,并且SY-TABIX包含该行的索引。否则,将SY-SUBRC设置为非0值。
DATA: IT_TAB1 TYPE STANDARD TABLE OF EKPO WITH HEADER LINE,
IT_TAB2 TYPE STANDARD TABLE OF EKPO,
IT_TAB3 TYPE STANDARD TABLE OF EKPO,
WA_TAB1 TYPE EKPO,
WA_TAB2 TYPE EKPO,
WA_TAB3 TYPE EKPO,
WA_TAB3 TYPE EKPO,
SELECT * FROM EKPO INTO TABLE IT_TAB1 UP TO 10 ROWS.
SELECT * FROM EKPO INTO TABLE IT_TAB2 UP TO 10 ROWS.
SELECT * FROM EKPO INTO TABLE IT_TAB3 UP TO 10 ROWS.
SORT IT_TAB1.
SORT IT_TAB2.
SORT IT_TAB3.
READ TABLE IT_TAB1 WITH KEY MATNR = 'QQQ'..
WRITE:/ SY-SUBRC,SY-TABIX.
READ TABLE IT_TAB2 INTO WA_TAB2 WITH KEY MATNR = 'M06A-CAA42' TXZ01 = '芯片M06A-CAA42'.“这个是多个KEY的
WRITE:/ SY-SUBRC,SY-TABIX.
READ TABLE IT_TAB3 INTO WA_TAB3 WITH KEY MATNR = 'M06A-CAA42' TXZ01 = '三氧化二铝'.
WRITE:/ SY-SUBRC,SY-TABIX.
READ TABLE IT_TAB1 WITH KEY '4500000002'.
WRITE:/ SY-SUBRC,SY-TABIX.
LOOP AT 语句
LOOP AT [INTO ]
[FROM ] [TO ] [WHERE ].
…
ENDLOOP.
-指定内部表。
–指定表格工作区。
FROM- 指定要读取的第一行索引
TO- 指定要读取的最后一行的索引
WHERE- 指定逻辑表达式,逻辑表达式中的操作数必须是的组成部分。
一旦执行了LOOP语句,SY-TABIX包含当前检索行的索引。一旦处理完表格的所有行,循环处理就结束。
SY-SUBRC = 0; 如果至少检索到一行。否则设置为4.
FROM和 TO选项限制行数并指定系统必须读取的行数。WHERE选项过滤满足条件的行。如果没有WHERE选项,系统将读取所有行。因此,最佳实践始终是指定FROM,TO或者WHERE选项以提高性能
案例:下面使用LOOP语句从具有以下结构的产品信息内部表中读取数据的简单实例。
REPORT Z_INTERNAL_TABLE.
TYPE : BEGIN OF t_product,
pid(10) TYPE C,
pname(40) TYPE C,
pamount(10) TYPE P,
END OF t_product.
DATA: wa TYPE t_product, "工作区
it TYPE TABLE OF t_product, “定义内表
it1 TYPE TABLE OF t_product "再定义一张内表
wa-pid = 'IFB1'.
wa-pname = 'IFB SPLIT AC'.
wa-pamount = 38000.
INSERT wa INTO TABLE it.
wa-pid = 'IFB2'.
wa-pname = 'IFB SPLIT AC'.
wa-pamount = 38000.
INSERT wa INTO TABLE it.
WRITE 'displaying' IT table data...'
*Reading internal table for all the records
LOOP AT it INTO wa.
IF sy-subrc = 0.
WRITE :/ wa-pid , wa-pname , wa-pamount.
ELSE.
WRITE 'No Record Found'.
ENDIF.
ENDLOOP.
上面两段代码达到同样的效果
SQL之CASE WHEN的用法详解
简单的CASE WHEN函数:
CASE SCORE WHEN 'A' THEN '优' ELSE “不及格” END
CASE SCORE WHEN 'A' THEN '良" ELSE “不及格” END
CASE SCORE WHEN 'A' THEN '中' ELSE “不及格” END
等同于下面
CASE WHEN SCORE = 'A' THEN '优'
WHEN SCORE = 'B' THEN ‘’良'
WHEN SCORE = 'C' THEN '中' ELSE '不及格' END
CASE WHEN语句的 IF ELSE结构
SELECT
STUDENT_NAME,
(CASE WHEN score <60 THEN '不及格'
WHEN score >= 60 AND score < 80 THEN '及格'
WHEN score >=80 THEN '优秀'
ELSE '异常' END) AS REMARK
FROM
TABLE
MySQL GROUP BY语句
group by 语句可以根据一个或者多个列对结果集进行分组。
在分组的列上我们可以使用COUNT,SUM,AVG等函数。
语法
SELECT column_name,function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
案例:
假设我们拥有一个客户订单表
O_Id OrderDate OrderPrice Customer
1 2008/12/29 1000 Bush
2 2008/11/23 1600 Carter
3 2008/10/05 700 Bush
4 2008/09/28 300 Bush
5 2008/08/06 2000 Adams
6 2008/07/21 100 Carter
现在我们希望查找到每个客户的总金额(或者总订单)
我们想要使用GROUP BY 语句对客户进行组合。
SELECT Customer, SUM(OrderPrice) FROM Orders
GROUP BY Customer
然后就会出现如下结果
Customer SUM(OrderPrice)
Bush 2000
Carter 1700
Adams 2000
INTO TABLE与APPENDING TABLE的区别
从字面看好像作用是相同的,但具体使用以来还是有区别的。如果都是从数据库表中select一次数据,添加到内表中,他们的作用相同;但是多次,他们的作用则有很大差别,INTO TABLE:将数据select出来添加到内表时会将内表先清空再添加,而APPENDING TABLE则会直接追加,实现累计效果。
For All entries的用法
for all entries in 语句将数据库表与内表串联
for all entries in 类似于外连接的时候,为避免多次重复数据库查询,用内表的某一个字段为条件,从数据库中取得数据,有相同的数据则筛除,相当于过滤数据的作用。
语法:
SELECT <column list>
FROM <database tables>
FOR ALL ENTRIES IN @itab
WHERE <clause containing databse table columns and itab columns>
@DATA用法
@DATA 按取数指定的字段定义内表结
MESSAGE用法
information message(弹出一个对话框)
MESSAGE gv_message TYPE ‘I’.
success message(左下角显示一个成功的提示框)
MESSAGE gv_message TYPE ‘S’.
warning message(左下角显示一个黄色叹号警告消息)
MESSAGE gv_message TYPE ‘W’.
error message(左下角显示一个红色叹号错误消息)
MESSAGE gv_message TYPE ‘E’.
SY-SUBRC的含义
使用SELECT语句选择查询:
SY-SUBURC = 0 :至少有一行数据,当ENDSELECT语句执行完,SY-DBCNT中保存着记录的个数
SY-SUBRC = 4 :没有数据
SY-SUBRC = 8 :只有使用 “SELECT SINGLE FOR UPDATE” 时才会有
表示: WHERE条件指定的记录不止一行,结果是没有记录被选中
使用INSERT语句,向表中插入一行,必须注意INSERT的顺序与表中字段的顺序一致:
SY-SUBRC = 0 :插入成功,SY-DBCNT包含了插入的行数,0或1
SY-SUBRC = 4 : 循环没有被执行,可能是没有数据,也可能是没有符合条件的记录。
使用DELETE语句来删除一条数据
SY-SUBRC = 0 : 找到一行并删除之,如果该表有不唯一主键,也就是有多条重复的记录,则只删除第一条记录。
SY-SUBRC = 4 : 没有找到符合条件的记录,也没有删除。
使用UPDATE语句来更新一条记录:
SY-SUBRC = 0 : 找到记录并更新,(如果有多条记录呢?)
SY-SUBRC = 4 : 没有找到符合条件的记录,也没有更新。
LEAVE TO LIST-PROCESSING 和 LEAVE LIST-PROCESSING
LEAVE TO LIST-PROCESSING:指退出其他屏幕后,到List输入的屏幕,例如:WRITE 语句输入的屏幕
LEAVE LIST-PROCESSING:是在其他屏幕退出,到LIST输入屏幕间的动作
leave list-processing
如果写在 at selection-screen 就会返回到输出界面
如果写在 start-of-selection 就返回到initialization事情
分类
第一类,销售订单交期,不需要计算,但是需要数据库读取,那么代码如下
READ TABLE lt_vbep INTO(ls_vebp) WITH KEY vbeln = gs_so_inf-vbeln posnr = gs_so_inf-posnr
* 即,读取lt_vbep表进入 ls_vebp,并且要求主键是vbeln(销售订单号)的同时,其销售订单号和等于内表的销售订单号
IF sy-subrc EQ 0 . *如果读取成功,(标志为sy-subrc=0)
gs_so_inf_edatu = ls_vbep-edatu. "那么gs_so_inf_edatu = ls_vbep-edatu.
END IF.
第二类,销售订单数据,不需要计算,但是需要相连
https://www.cnblogs.com/jiangzhengjun/p/4264698.html#_Toc410466920
SELECT , INSERT ,UPDATE , DELETE , MODIFY
SELECT SINGLE … INTO…WHERE/
INNER JOIN ,LEFT OUTER JION 使用限制
ON 后面的条件与WHERE条件类似,但是有以下不同
1.必需有ON条件语句,且多个条件之间只能使用AND连接
2.在每个条件表达式中,两个操作数之中必需有一个字段是来自于JOIN右表
3.如果是LEFT OUTER JOIN,则至少有一个条件表达式的两个操作数一个是来自于左表,一个时来自于右边
4.不能使用NOT,LIKE,IN(但如果是INNER JOIN,则> , < , BETWEEN … AND , <> 都可以使用)
5.如果是LEFT OUTER JOIN ,则只能使用等号操作符:( = , EQ)
6.如果是LEFT OUTER JOIN ,同一右表不能多次出现在不同的LEFT OUTER JOIN的 ON条件表达式中
7. LEFT OUTER JOIN 的右表所有字段不能出现在WHERE中
8. 如果是LEFT OUTER JOIN, 则在同一个ON 条件语句中,只能与同一个左表进行关联。
几个案例
*销售订单数据
SELECT vbeln,bstnk,kunnr,kvgr2 (vbeln为销售订单号,bstnk为客户参考号,kunnr为客户代号,kvgr2为品牌)
FROM vbak
FOR ALL ENTRIES IN @gt_so_inf
WHERE vbeln = @gt_so_inf_vbeln
INTO TABLE @DATA(lt_vbak).
SORT lt_vbak BY vbeln.
其中sort为排序的意思,以为lt_vak以vbeln为标准进行默认升序排序
For all entries in什么时候使用?
答:
1.对于不能join的表,使用for all entries in语句将数据库表域内表串联
for all entries in 类似于外连接的时候,为避免多次重复数据库查询,用内表的某一字段为条件,从数据库表中取得数据,
有一样的则选出,相当于过滤数据的作用
2.检查内表是否为空,如果为空,将取得全部数据
3.不能使用LIKE,BETWEEN 和IN(因为这些操作符都是不确定比较操作符(将选择条件设定在一个范围内))
FOR ALL ENTRIES IN 语句的作用相当于将选择条件块全部并列开来。
ABAP中FOR ALL ENTRIES IN 的使用指南
在ABAP开发中,对于不能使用join的聚集表或者需要使用SELECT的内表,我们一般使用for all entries in 语句将该表与内表串联,查询出需要的数据,例如;以BSEG聚集表为例,如下:
SELECT bseg~kunnr bseg~lifnr bseg~belnr INTO TABLE itab_bseg FROM bseg FOR ALL ENTRIES IN itab_main
WHERE bukrs in_bukrs and (belnr = itab_main-belnr AND hkont = itab_main-hkont).
由于BSEG不能和BSIS做inner join所以先将BSIS内容放到itab_main中,然后用FOR ALL ENTRIES IN 来串联
OPENSQL学习
1.SELECT语句
INTO语句的结果不是保存到内表,是字段或者结构体的时候,最后要加ENDSELECT语句,这种语句相当于LOOP循环中执行SELECT语句,每取出一条数据,就把它追加到结构体中,一直读取全部符合条件的数据为止。
*-------------使用结构体
*使用的结构体,因此使用SELECT ENDSELECT 语句
DATA: gs_zht6 TYPE STANDRAD TABLE OF ZHR_TRAIN_ZHT_1,
gs_zht7 TYPE ZHR_TRAIN_ZHT_1.
SELECT * INTO gs_zht7 FROM ZHR_TRAIN_ZHT_1
WHERE name EQ '周0'
WRITE : /gs_zht7-sex,
/gs_zht7-te1.
ENDSELECT.
*-------------使用内表
*使用了内表一次性保存所有的值,因此不存在ENDSELECT.
DATA: gs_zht9 TYPE STANDARD TABLE OF ZHR_TRAIN_ZHT_1,
gs_zht8 TYPE ZHR_TRAIN_ZHT_1.
SELECT * INTO TABLE gs_zht9 FROM ZHR_TRAIN_ZHT_1
WHERE name EQ '周0'.
LOOP AT gs_zht9 INTO gs_zht8.
WRITE: /gs_zht8-tel,
/gs_zht8-sex.
ENDLOOP.
第五步:定义事件
ls_event-name = ‘USER_CMMAND’. "用户响应事件
ls_event-from = ‘FORM_USER_COMMAND’.
APPEND ls_event to lt_event.
ls_event-name = ‘TOP_OF_PAGE’. "显示标题
ls_event-form = ‘FORM_TOP_OF_PAGE’.
APPEND ls_event to lt_event.
ls_event-name = ‘PF_STATUS_SET’. "设置GUI-STATUS
ls_event-name = ‘FROM_PF_STATUS_SET’.
APPEND ls_event TO lt_event.
写在最后面的子例程(子例程与函数类似)
-------------form定义------------
form FORM_USER_COMMAND.
ENDFORM.
form PF_STATUS_SET.
ENDFORM.
form FORM_PF_STATUS_SET.
ENDFORM.
关于ALV格式控制部分的写法
ALV格式控制有两种写法,一种分开控制每个属性的格式,一种统一控制每个属性的格式
下面我们分别写出两种情况
首先是分开控制每个属性,案例如下:
我们将每个属性编号 colpos ,然后第一个lv_colpos设为1,后面的设为自增
ls_fieldcat-fieldname为属性名 (ls_fieldcat是我们自己设置的内表名)
然后可以自己设置数据类型和数据长度(即ls_fieldcat-datatype和ls_fieldcat-outputlen)
然后ls_fieldcat-seltext_m即为备注
注意加上APPEND ls_fieldcat TO lt_fieldcat.
其中lt_fieldcat为我们的内表名
*销售凭证
lv_colpos = 1.
ls_fieldcat-fieldname = ‘VBELN’.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = ‘X’.
ls_fieldcat-datatype = ‘CHAR’.
ls_fieldcat-outputlen = ‘10’.
ls_fieldcat-seltext_m = ‘销售凭证’.
APPEND ls_fieldcat TO lt_fieldcat.
*凭证日期
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = ‘ERDAT’.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = ‘X’.
ls_fieldcat-datatype = ‘CHAR’.
ls_fieldcat-outputlen = ‘10’.
ls_fieldcat-seltext_m = ‘销售日期’.
APPEND ls_fieldcat TO lt_fieldcat.
*工厂
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = ‘werks’.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-ref_tabname = ‘VBAP’.
APPEND ls_fieldcat TO lt_fieldcat.
*库存
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = ‘LOGORT’.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-ref_tabname = ‘VBAP’.
APPEND ls_fieldcat TO lt_fieldcat.
第一种方式显得略微麻烦(主要是占用的长度过长,但其实只是复制粘贴的功夫)
我们同样可以使用第二种方法,那就是用一个子例程,来统一安排这些属性
例如如下
定义一个子例程F_SET_LAYOUT
然后将统一的属性写进去,
即gs_layout-zebra = ‘X’. (gs同样为自己定义的,等同于上面的ls)
gs_layout-colwidth_optimize = ‘X’.
- gs_layout-f2code = ‘&ETA’.
&---------------------------------------------------------------------
*& Form F_SET_LAYOUT
&---------------------------------------------------------------------
*& text
&---------------------------------------------------------------------
*& --> p1 text
*& <-- p2 text
&---------------------------------------------------------------------
FORM f_set_layout .
CLEAR gs_layout.
gs_layout-zebra = ‘X’.
gs_layout-colwidth_optimize = ‘X’.
- gs_layout-f2code = ‘&ETA’.
gs_layout-info_fieldname = ‘COL_LINE’."行颜色显示
gs_layout-coltab_fieldname = ‘COL_CELL’."单元格颜色显示
ENDFORM.
上面这部分我们已经统一写好了每个属性的布局设置,现在我们要写哪些属性应该被我们展示
可以看到下面我们的子例程,使用了宏定义 ,定义了alv_appen_field
&---------------------------------------------------------------------
*& Form F_SET_FIELDCAT
&---------------------------------------------------------------------
*& text
&---------------------------------------------------------------------
*& --> p1 text
*& <-- p2 text
&---------------------------------------------------------------------
FORM f_set_fieldcat .
CLEAR gs_fieldcat.
REFRESH gt_fieldcat.
DEFINE alv_appen_field.
gs_fieldcat-fieldname = &1.
gs_fieldcat-seltext_l = &2.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR gs_fieldcat.
END-OF-DEFINITION.
alv_appen_field:
‘VBELN’ ‘销售订单号’,
‘MENGE’ ‘采购订单号’,
‘ERFMG’ ‘收货数量’,
‘ERFMG_JS’ ‘及时入库数量’,
‘ERFMG_BJS’ ‘不及时入库数量’,
‘JSL’ ‘及时率’,
‘EINDT’ ‘采购交期’,
‘EBELN’ ‘采购订单号’,
‘EBELP’ ‘采购订单行号’,
‘MATNR’ ‘零件号’,
‘TXZ01’ ‘零件号描述’,
‘MEINS’ ‘订单单位’,
‘BUKRS’ ‘公司’,
‘WERKS’ ‘工厂’,
‘EKORG’ ‘采购组织’,
‘EKGRP’ ‘采购组’,
‘SUBMI’ ‘汇总号’,
‘BEDAT’ ‘下单日期’,
‘MATKL’ ‘物料组’,
‘ERFMG_WRK’ ‘未入库数量汇总’,
‘BUDAT’ ‘最晚入库日期’,
‘POSNR’ ‘销售订单行号’,
‘BSTNK’ ‘客户参考号’,
‘KUNNR’ ‘客户代号’,
‘KVGR2’ ‘品牌’,
‘EDATU’ ‘销售订单评审交期’,
‘SFJH’ ‘是否及时交货’,
‘BSART’ ‘凭证类型’,
‘LIFNR’ ‘供应商代码’.
ENDFORM.
然后把这个子例程写在call_alv这个子例程里二次封装
&---------------------------------------------------------------------
*& Form CALL_ALV
&---------------------------------------------------------------------
*& text
&---------------------------------------------------------------------
*& --> p1 text
*& <-- p2 text
&---------------------------------------------------------------------
FORM call_alv .
PERFORM f_set_fieldcat.
PERFORM f_set_layout.
PERFORM f_call_alv.
ENDFORM.
在程序中写入下面这一行即可,一般写在选择界面这一步之后
PERFORM call_alv. "展示
两种方法展示完毕
内连接也被称为等同连接,返回的结果集是两个表中所有相匹配的数据,而舍弃不匹配的数据。也就是说,在这种查询中,DBMS只返回来自源表中的相关的行,即查询的结果表包含的两源表行,必须满足ON子句中的搜索条件。作为对照,如果在源表中的行在另一张表中没有对应的行,则该行就被过滤掉,不会包括在结果表中。内连接使用比较运算符来完成。内连接可分为两种。
1.等值连接
使用等于号(=)比较被连接列的列值,在查询结果中列出被连接表中的所有列,包括其中的重复列。
案例:使用INNER JOIN内连接查询
从STUDENT表和TEACHER表中查询学生姓名,所在系,所修的所有课程的课程号以及开课教师姓名。
SELECT SNAME,S.DNAME,S.CNO,TNAME
FROM STUDENT AS S
INNER JOIN TEACHER AS T
ON S.CNO = T.CNO
ORDER BY SNAME
接下来写一下左连接的简单案例
所谓左连接,即 LEFT JION子句,其允许我们从两个或多个数据库表查询数据。
LEFT JION子句 是 SELEC 语句的可选部分,其出现在FROM子句之后。
我们假设要从两个表t1和t2查询数据。以下语句说明了连接两个表的LEFT JOIN 子句的语法:
SELECT
t1.c1,t1.c2,t2.c1,t2.c2
FROM
t1
LEFT JOIN
t2 ON t1.c1 = t2.c1;
当使用LEFT JOIN子句将t1表加入t2表时,如果来自左表t1
REPORT ZALVTEST006.
第一步:声明ALV相关变量
分别为定义ALV所要用到的类型池:TYPE-POOLS:SLIS
针对ALV的控制信息数据(Layout&Fieldcat)
TYPE-POOLS:slis.
DATA: lt_fieldcat TYPE slis_t_fieldcat_alv, "存储fieldcat的内表
wa_fieldcat TYPE slis_fieldcat_alv, "定义工作区
ls_layout TYPE slis_layout_alv. "ALV格式控制的结构体:layout
一般情况下就是命名 xx_fieldcat 这样一个变量来参考slis_t_fieldcat,来做为存储内表用的控制信息数据
同理也会命名一个 xx_fieldcat 这样一个变量来参考slis_fieldcat,来作为定义工作区用的控制信息数据
下面的xx_layout也是如此
第二步:定义内表
当我们字典中有这样一张表VBAK(即销售凭证:抬头数据表,是SAP自带的表)
我们查询这张表后,发现由这样几个数据
即
VBELN 销售凭证
ERDAT 记录的创建日期
ERNAM 订货人姓名
KUNNER 售达方
它们都属于VBAK这张表
同样的还有VBAP这张表(即销售凭证:项目数据,同样为SAP自带)
ZMENG 销售单位目标数量
ZIEME 目标数量计量单位
所以我们如此定义内表
TYPE:BEGIN OF TY_ALVSHOW ‘’ALVSHOW是我们自己定义的内表的结构的名字
VBELN TYPE VBAK-VBELN,
ERDAT TYPE VBAK-ERDAT,
ERNAM TYPE VBAK-ERNAM,
KUNNR TYPE VBAK-KUNNR,
POSNR TYPE VBAP-POSNR,
MATNR TYPE VBAP-POSNR,
MATKL TYPE VBAP-MATKL,
ZMENG TYPE VBAP-ZMENG,
ZIEME TYPE VBAP-ZIEME,
WERKS TYPE VBAP-WERKS,
LGORT TYPE VBAP-LGORT.
END OF TY_ALVSHOW.
DATA: LT_ALVSHOW TYPE TABLE OF TY_ALVSHOW. “定义相关的内表的名字为LT_ALVSHOW,其结构参照我们上面定义好的结构”
WA_ALVSHOW TYPE TY_ALVSHOW. "定义工作区WA_ALVSHOW
第三步:读取数据
由于要读取两张表,我们需要用来连接来读取,并且一般我们通过内连接来读取。
SELECT
VBELN ERDAT ERNAM KUNNR POSNRMATNR
MATKL ZMENG ZIEME WERKS LGORT
FROM VBAK as a INNER as b
on a~vbeln = b~vbeln
into TABLE LT_ALVSHOW
UP TO 100 ROWS.
第四步: ALV格式控制(其实就是layout参数控制)
*我们命名的格式控制信息的名称为ls_layout
ls_layout-zebra = ‘X’. “在ABAP里很多时候X表示‘是‘的意思
ls_layout-detail-popup = ‘X’. "是否弹出详细信息串口
layout
ETA代表双击的功能码,是固定的
SE11
然后输入VBAK,点击显示,就可以找到这张表。
&---------------------------------------------------------------------
*& Report ZALVTEST006
&---------------------------------------------------------------------
*&
&---------------------------------------------------------------------
REPORT ZALVTEST006.
-
第一步: 声明ALV相关变量
TYPE-POOLS:slis.
DATA: lt_fieldcat TYPE slis_t_fieldcat_alv, "存储fieldcat的内表
wa_fieldcat TYPE slis_fieldcat_alv, "定义工作区
ls_layout TYPE slis_layout_alv. "ALV格式控制的结构体:layout
-
第二步: 定义内表
TYPES: BEGIN OF TY_ALVSHOW,
VBELN TYPE VBAK-VBELN,
ERDAT TYPE VBAK-ERDAT,
ERNAM TYPE VBAK-ERNAM,
KUNNR TYPE VBAK-KUNNR,
POSNR TYPE VBAP-POSNR,
MATHR TYPE VBAP-MATNR,
MATKL TYPE VBAP-MATKL,
ZMENG TYPE VBAP-ZMENG,
ZIEME TYPE VBAP-ZIEME,
WERKS TYPE VBAP-WERKS,
LGORT TYPE VBAP-LGORT,
END OF TY_ALVSHOW.
-
定义相关的内表的名字为 LT_ALVSHOW,其结构参照我们卸载开头的结构
DATA: lt_alvshow TYPE TABLE OF TY_ALVSHOW,
LS_alvshow TYPE TY_ALVSHOW. -
定义工作区wa_alvshow
-
第三步:读取数据
SELECT
VBELN ERDAT ERNAME KUNNR POSNRMATNR
MATKL ZMENG ZIEME WERKS LGORT
FROM VBAK as a INNER JOIN vbap as b
on a~vbeln = b~vbeln
into TABLE LT_ALVSHOW
UP TO 100 ROWS.
-
第四步:ALV格式控制
ls_layout-zebra = ‘X’.
ls_layout-detail_popup = ‘X’.
ls_layout-detail_titlebar = ‘X’.
ls_layout-f2code = ‘X’.
ls_layout-colwidth_optimize = ‘X’.
"fieldcat
*销售凭证
lv_colpos = 1.
ls_fieldcat-fieldname = ‘VBELN’.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = ‘X’.
ls_fieldcat-datatype = ‘CHAR’.
ls_fieldcat-outputlen = ‘10’.
ls_fieldcat-seltext_m = ‘销售凭证’.
APPEND ls_fieldcat TO lt_fieldcat.
*凭证日期
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = ‘ERDAT’.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = ‘X’.
ls_fieldcat-datatype = ‘CHAR’.
ls_fieldcat-outputlen = ‘10’.
ls_fieldcat-seltext_m = ‘销售日期’.
APPEND ls_fieldcat TO lt_fieldcat.
*创建时间
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = ‘ERNAME’.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = ‘X’.
ls_fieldcat-datatype = ‘CHAR’.
ls_fieldcat-outputlen = ‘10’.
ls_fieldcat-seltext_m = ‘创建时间’.
APPEND ls_fieldcat TO lt_fieldcat.
*创建人
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = ‘ERNAM’.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = ‘X’.
ls_fieldcat-datatype = ‘CHAR’.
ls_fieldcat-outputlen = ‘12’.
ls_fieldcat-seltext_m = ‘销售人’.
APPEND ls_fieldcat TO lt_fieldcat.
*售达方
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = ‘kunnr’.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = ‘X’.
ls_fieldcat-datatype = ‘CHAR’.
ls_fieldcat-outputlen = ‘10’.
ls_fieldcat-seltext_m = ‘售达方’.
APPEND ls_fieldcat TO lt_fieldcat.
*项目编码
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = ‘POSNR’.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = ‘X’.
ls_fieldcat-datatype = ‘NUMC’.
ls_fieldcat-outputlen = ‘6’.
ls_fieldcat-seltext_m = ‘项目编码’.
APPEND ls_fieldcat TO lt_fieldcat.
*物料
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = ‘MATNR’.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = ‘X’.
ls_fieldcat-datatype = ‘CHAR’.
ls_fieldcat-outputlen = ‘18’.
ls_fieldcat-seltext_m = ‘物料’.
APPEND ls_fieldcat TO lt_fieldcat.
*物料组
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = ‘MATKL’.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = ‘X’.
ls_fieldcat-datatype = ‘CHAR’.
ls_fieldcat-outputlen = ‘9’.
ls_fieldcat-seltext_m = ‘物料组’.
APPEND ls_fieldcat TO lt_fieldcat.
*数量
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = ‘ZMENG’.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = ‘X’.
ls_fieldcat-datatype = ‘QUAN’.
ls_fieldcat-outputlen = ‘13’.
ls_fieldcat-seltext_m = ‘数量’.
APPEND ls_fieldcat TO lt_fieldcat.
*单位
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = ‘ZIEME’.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = ‘X’.
ls_fieldcat-datatype = ‘CUNIT’.
ls_fieldcat-outputlen = ‘3’.
ls_fieldcat-seltext_m = ‘单位’.
APPEND ls_fieldcat TO lt_fieldcat.
*工厂
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = ‘werks’.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-ref_tabname = ‘VBAP’.
APPEND ls_fieldcat TO lt_fieldcat.
*库存
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = ‘LOGORT’.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-ref_tabname = ‘VBAP’.
APPEND ls_fieldcat TO lt_fieldcat.
-
第五步:定义事件(省略)
-
第六步: 显示ALV
CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY’
EXPORTING -
I_INTERFACE_CHECK = ’ ’
-
I_BYPASSING_BUFFER = ’ ’
-
I_BUFFER_ACTIVE = ’ ’
-
I_CALLBACK_PROGRAM = ’ ’
-
I_CALLBACK_PF_STATUS_SET = ’ ’
-
I_CALLBACK_USER_COMMAND = ’ ’
-
I_CALLBACK_TOP_OF_PAGE = ’ ’
-
I_CALLBACK_HTML_TOP_OF_PAGE = ’ ’
-
I_CALLBACK_HTML_END_OF_LIST = ’ ’
-
I_STRUCTURE_NAME =
-
I_BACKGROUND_ID = ’ ’
-
I_GRID_TITLE =
-
I_GRID_SETTINGS =
IS_LAYOUT = LS_LAYOUT
IT_FIELDCAT = LT_FIELDCAT -
IT_EXCLUDING =
-
IT_SPECIAL_GROUPS =
-
IT_SORT =
-
IT_FILTER =
-
IS_SEL_HIDE =
-
I_DEFAULT = ‘X’
-
I_SAVE = ’ ’
-
IS_VARIANT =
-
IT_EVENTS =
-
IT_EVENT_EXIT =
-
IS_PRINT =
-
IS_REPREP_ID =
-
I_SCREEN_START_COLUMN = 0
-
I_SCREEN_START_LINE = 0
-
I_SCREEN_END_COLUMN = 0
-
I_SCREEN_END_LINE = 0
-
I_HTML_HEIGHT_TOP = 0
-
I_HTML_HEIGHT_END = 0
-
IT_ALV_GRAPHICS =
-
IT_HYPERLINK =
-
IT_ADD_FIELDCAT =
-
IT_EXCEPT_QINFO =
-
IR_SALV_FULLSCREEN_ADAPTER =
-
IMPORTING
-
E_EXIT_CAUSED_BY_CALLER =
-
ES_EXIT_CAUSED_BY_USER =
TABLES
T_OUTTAB = LT_ALVSHOW
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2
.
IF SY-SUBRC <> 0. -
Implement suitable error handling here
ENDIF.
REPORT程序的结构
1.数据声明
2.选择屏幕的设定
3.初始化
4.选择屏幕处理
5.主程序
6.执行后处理(子程序)
REPORT 程序名
NO STANDARD PAGE HEADING
LINE-SIZE col
LINE-COUNT n(m)
表单输出每页由n行,其中的m行作为页脚;
MESSAGE-ID mid
消息对象
DEFINING DATABASE ldb
使用逻辑数据库,自动产生
数据定义——Tables语句
基本格式
TABLES dbtab.
Dbtab是指ABAP字典的一个数据库对象,可以是透明表格,视图和结构。
该语句的作用是声明了一个表工作区,类似于C语言里面的STRUCTURE
这个表工作区由多个字段组成,其名称,类型和dbtab的字段完全相同
ABAP字典对象中字段的类型自动的转换为ABAP程序的类型;
表工作区通常是一个全局变量。
数据定义——TYPES语句
1.TYPE typ.
2.TYPE type(len).
3.TYPE:BEGIN OF structype
…
END OF structype.
4. TYPE itabtype {TYPE tabking OF linetype|like tabkind OF lineobj}[WITH [UNIQUE|NON-UNIQUE] keydef] [INITIAL SIZE n].
5. TYPES itabtype TYPE RANGE OF type.
TYPES itabtype LIKE RANGE OF f.
##. 数据定义+DATA语句
1.定义一个简单类型的变量
2.定义一个内表
3.定义一个共享的数据区域
用于外部的子程序调用
数据定义——定义输入屏幕
用SELECTION-SCREEN语句来定义输入屏幕
1.产生空白列
语法: SELECTION SKIP []
案例
SELECT-SCREEN SKIP 2.
产生两列空白列
2.产生底线
语法: SELCTION-SCREEN ULINE /(length)
案例:
SELECTION-SCREEN ULINE /10(30).
自第10格开始产生长度30的底线
3.打印备注说明
语法:SELECTION-SCREEN COMMENT /(length)
Example:
REMARK = ‘Pls enter your name’.
SELECTION-SCREEN COMMENT /10()
REMARK.
4.同一列中输入数个资料项
语法:
SELECTION-SCREEN BEGIN OF LINE.
…
SELECTION-SCREEN END OF LINE.
案例:
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 20.
PARAMETERS NAME(10).
SELECTION-SCREEN POSITION 40.
PARAMETERS BIRTH TYPE D.
SELECTION-SCREEN END OF LINE.
在20格输入NAME内容,40格输入,BIRTH的内容
PARAMETERS语句
PARAMETERS是基本的输入命令,类似于BASIC的INPUT命令,但无法使用浮点格式
语法:
PARAMETERS
[DEFAULT ] [LOWER CASE]
[OBLIGATORY] [AS CHECKBOX]
[RADIOBUTTON GROUP ]
案例:
PARAMETER : NAME(8),
AGE TYPE I,
BIRTH TYPE D.
执行结果
在日期输入格式上为 MM/DD/YY,MM/DD/YY,MMDDYY或MMDDYYYY,如输入020165表示1965年02月01日
日期输入范围为1950至2049年
1.DEFAULT 设定输入的预设值,
案例
PARAMETERS: COMPANY(20) DEFAULT “DELTA”,
BIRTH TYPE D DEFAULT “19650201”\
2.LOWER CASE
ABAP预设是将字符串输入值自动转换为大写,加上此参数会将输入的内容转成小写
3.OBLIGATORY
强制要求输入,加上此参数会要求使用者必须在此行输入才可以
4.AS CHECKBOX
输入CHECKBOX的格式(即勾选框的格式)
Example:
PARAMETERS: TAX AS CHECKBOX DEFAULT ‘X’.
NTD AS CHECKBOX
执行结果
5.RADIOBUTTON GROUP 点选框模式
输入 RADIO BUTTON GROUP的方式
Example:
PARAMETERS:BOY RADIOBUTTON GROUP SEX DEFAULT ‘X’,
GIRL RADIOBUTTON GROUP SEX.
SELECT-OPTIONS语句
SELECTION-OPTIONS所输入的值实际上是放在internal table 中的,该Internal table有四个选项
分别是:SIGN,OPTION,LOW,HIGH…
条件筛选,检查条件,输入屏幕指定,输入条件 后可配合SELECT指令自TABLE读取符合条件的资料,
直接执行或放入Internal Table中,条件有四个参数:
-
SIGN:
I : 表筛选条件符合的资料
E : 表筛选条件不符合的资料 -
OPTION: 比较的条件符号
EQ(等于),NE(不等于),GT(大于),LE(小于),CP(包含),NP(不包含)
3.LOW:最小值
4.HIGH:最大值
语法:
SELECTION-OPTIONS FOR
Example:
TABLES SPFLI.
SELECTION-OPTIONS AIRLINE FOR SPFLI-CONNID.
将条件的输入值存放入AIRLINE,并选择为SPFLI中的CONNID选项
执行结果:
条件输入选择画面
1.自Table中选取
按下输入项的右边乡下箭头,交出
第一步,类型组
TYPE-POOLS:SLIS.
此类型组中有很多ALV的自定义数据类型以及结构化数据类型
我们常用的有
data: i_fieldcat_alv type slis_t_fieldcat_alv wth header line. "用来存储我们将要在表单显示区域显示出来的表单的列名,每个列名以及列表头其他相关属性信息的数据类型。
i_layout type slis_layout_alv. "ALV的格式
i_list_comments type slis_t_listheader. "用来填充表单标题区域的数据类型
"下面这三个类型的使用视情况而定
i_events type silis_t_event,
i_event_exit type slis_t_event_exit,
i_excluding type slis_t_extab.
第二步: 写ALV的基本流程
第一步:定义将要用到的表,即TALBES定义部分,然后定义TYPE-POOLS:SLIS.
第二步:定义第一步中这些数据类型或者内表的实体对象。
第三步:定义一些需要用到的变量,比如我们常定义的有:
Data: w_repid like sy-repid, "ABAP程序,我们一般取当前程序
w_callback_ucomm type slis_forname_alv, "字符型,功能
w_print type slis_print_alv "类型组
w_layout type slis_layout_alv, "类型组
w_html_top_of_age type slis_forname, "字符型
w_fieldcat_alv like line of i_fieldcat_alv, "从上面的数据结构类型引用过来的
w_excluding like line of i_excluding, "同上
w_events like line of i_events "同上
w_event_exit like line of i_event_exit, "同上
第四步: 定义自己的选择屏幕
第五步: 定义INITIALIZATION部分,在这个部分往往要指定w_repid
w_repid = sy-repid "sy-repid是系统变量。. 在程序中可以实时记录当前的程序名称
第六步:start-of-selection部分
1.用一个子函数完成对alv表单标题区域而定赋值(i_list_comments).
2.用一个子函数完成自己所需要数据的抓取
3.用一个子函数完成要显示列表的列名行(第一行)的相关赋值(i_fieldcat_alv)以及设置
4.用一个子函数完成输出格式的设置,比如双击一条记录是否弹出对话框?使用哪个功能键触发等等
5.用一个子函数FORM DISPLAY_DATA来显示上面我们已经分别封装好的数据,需要调用两个常用的FUNCTION MODULE:
FUNCTION ' REUSE_ALV_GRID_DISPLAY "用来显示表单数据
FUNCTION 'REUSE_ALV_COMMENTARY_WRITE "用来显示表单标题
*&---------------------------------------------------------------------*
*& Report ZALVTEST002
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZALVTEST002.
TYPE-POOLs:slis.
tables:vbak.
TYPES: BEGIN OF gty_alv,
vkorg TYPE vbak-vkorg , "销售组织
vtweg TYPE vbak-vtweg , "分销渠道
vkgrp TYPE vbak-vkgrp , "销售组
auart TYPE vbak-auart , "订单类型
erdat TYPE vbak-erdat , "订单日期
vbeln TYPE vbak-vbeln , "订单号
END OF gty_alv.
data gt_vbak type table of gty_alv.
data gs_vbak type gty_alv.
DATA gt_fieldcat TYPE slis_t_fieldcat_alv.
DATA gs_fieldcat TYPE slis_fieldcat_alv.
DATA gs_layout TYPE slis_layout_alv.
*宏定义
DEFINE %%append_fieldcat.
CLEAR gs_fieldcat.
gs_fieldcat-fieldname = &1.
gs_fieldcat-seltext_m = &2.
APPEND gs_fieldcat TO gt_fieldcat.
END-OF-DEFINITION.
SELECTION-SCREEN : BEGIN OF BLOCK vie WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS s_vbeln FOR vbak-vbeln.
*单选
PARAMETERS: p_1 RADIOBUTTON GROUP grp1 DEFAULT 'X' .
PARAMETERS: p_2 RADIOBUTTON GROUP grp1 .
SELECTION-SCREEN:END OF BLOCK vie.
start-of-selection.
perform get_data. "取数
IF gt_vbak IS NOT INITIAL.
PERFORM show_data. "显示数据
ELSE.
MESSAGE s000 WITH '没数据'.
FORM get_data . "取数
IF p_1 = 'X'.
SELECT
vkorg "销售组织
vtweg "分销渠道
vkgrp "销售组
auart "订单类型
erdat "订单日期
vbeln "订单号
FROM vbak
INTO CORRESPONDING FIELDS OF TABLE gt_vbak
WHERE vbeln IN s_vbeln.
ELSE.
MESSAGE s000 WITH '暂无'.
ENDIF.
ENDFORM.
FORM show_data . "显示数据
PERFORM bulid_fieldcat. "字段显示
PERFORM build_alv. "alv显示
PERFORM bulid_layout. "layout显示
ENDFORM.
FORM build_alv .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER = ' '
* I_BUFFER_ACTIVE = ' '
I_CALLBACK_PROGRAM = sy-repid
* I_CALLBACK_PF_STATUS_SET = ' '
* I_CALLBACK_USER_COMMAND = ' '
* I_CALLBACK_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_END_OF_LIST = ' '
* I_STRUCTURE_NAME =
* I_BACKGROUND_ID = ' '
* I_GRID_TITLE =
* I_GRID_SETTINGS =
is_layout = gs_layout
it_fieldcat = gt_fieldcat
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS =
* IT_SORT =
* IT_FILTER =
* IS_SEL_HIDE =
* I_DEFAULT = 'X'
* I_SAVE = ' '
* IS_VARIANT =
* IT_EVENTS =
* IT_EVENT_EXIT =
* IS_PRINT =
* IS_REPREP_ID =
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* I_HTML_HEIGHT_TOP = 0
* I_HTML_HEIGHT_END = 0
* IT_ALV_GRAPHICS =
* IT_HYPERLINK =
* IT_ADD_FIELDCAT =
* IT_EXCEPT_QINFO =
* IR_SALV_FULLSCREEN_ADAPTER =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab = gt_vbak
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.
FORM bulid_fieldcat .
%%append_fieldcat:
'vkorg' '销售组织',
'vtweg' '分销渠道',
'vkgrp' '销售组',
'auart' '订单类型',
'erdat' '订单日期',
'vbeln' '订单号'.
ENDFORM.
FORM bulid_layout .
gs_layout-colwidth_optimize = 'X'.
gs_layout-zebra = 'X'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Report ZALVTEST003
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZALVTEST003."报表程序声明
TYPE-POOLS:slis."调用系统存在的类型池
*在调用ALV之前,需要先定义Layout和Fieldcat,他们属于slis类型池
DATA:fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE,
layout TYPE slis_layout_alv,
w_repid TYPE sy-repid."记录系统当前的程序名
TABLES:bkpf.
DATA:lbkpf LIKE STANDARD TABLE OF bkpf WITH HEADER LINE."标准表格式的内表lbkpf
SELECTION-SCREEN BEGIN OF BLOCK blk WITH FRAME TITLE t0."定义屏幕
SELECT-OPTIONS:s_bukrs FOR bkpf-bukrs OBLIGATORY,"条件输入框,一个for对应一个
s_belnr FOR bkpf-belnr,"for前面的是字段显示的名称,可以修改,但是注意不要超过8个字符,否则会报错
s_gjahr FOR bkpf-gjahr.
SELECTION-SCREEN END OF BLOCK blk.
START-OF-SELECTION.
*调用子程序
PERFORM getdata.
PERFORM catalog.
PERFORM alvshow.
*定义子程序
FORM getdata."查询语句
SELECT *
FROM bkpf INTO CORRESPONDING FIELDS OF TABLE lbkpf
WHERE bukrs IN s_bukrs
AND belnr IN s_belnr
AND gjahr IN s_gjahr.
ENDFORM.
FORM catalog."表头
w_repid = sy-repid.
CLEAR fieldcat.
DEFINE fieldcatset."宏定义
fieldcat-just = 'C'."字段居中显示
fieldcat-outputlen = 10."自定义字段的长度
fieldcat-ref_tabname = 'BKPF'."调用透明表的数据结构
fieldcat-fieldname = &1."透明表字段名
fieldcat-seltext_l = &2."ALV列名
fieldcat-col_pos = &3."列位置
APPEND fieldcat.
END-OF-DEFINITION.
fieldcatset 'BUKRS' '公司代码' sy-tabix.
fieldcatset 'gjahr' '会计年度' sy-tabix.
fieldcatset 'BUKRS' '会计期间' sy-tabix.
fieldcatset 'BELNR' '凭证编号' sy-tabix.
fieldcatset 'BLART' '凭证类型' sy-tabix.
fieldcatset 'BLDAT' '凭证日期' sy-tabix.
fieldcatset 'BUDAT' '过账日期' sy-tabix.
fieldcatset 'XSTOV' '冲销标识' sy-tabix.
fieldcatset 'STBLG' '冲销凭证' sy-tabix.
fieldcatset 'PPNAM' '制单人' sy-tabix.
fieldcatset 'USNAM' '过账人' sy-tabix.
READ TABLE fieldcat INDEX 3."读取报表第三列
fieldcat-hotspot = 'X'."鼠标热点事件
fieldcat-key = 'X'."定义为主键(颜色改变)
MODIFY fieldcat INDEX 3."修改样式
READ TABLE fieldcat INDEX 4.
fieldcat-HOTSPOT = 'X'.
fieldcat-emphasize = 'C500'.
MODIFY fieldcat INDEX 4.
READ TABLE fieldcat INDEX 1.
fieldcat-emphasize = 'C600'.
MODIFY fieldcat INDEX 1.
READ TABLE fieldcat INDEX 2.
fieldcat-emphasize = 'C300'.
MODIFY fieldcat INDEX 2.
READ TABLE fieldcat INDEX 5.
fieldcat-emphasize = 'C600'.
MODIFY fieldcat INDEX 5.
READ TABLE fieldcat INDEX 6.
fieldcat-emphasize = 'C600'.
MODIFY fieldcat INDEX 6.
READ TABLE fieldcat INDEX 7.
fieldcat-emphasize = 'C100'.
MODIFY fieldcat INDEX 7.
READ TABLE fieldcat INDEX 8.
fieldcat-emphasize = 'C200'.
MODIFY fieldcat INDEX 8.
READ TABLE fieldcat index 9.
fieldcat-checkbox = 'X'.
MODIFY fieldcat index 9.
*layout-colwidth_optimize = 'X'.
layout-zebra = 'X'."斑马线的样式
ENDFORM.
*响应鼠标点击时间的子程序
FORM ALV_USER_COMMAND USING R_UCOMM LIKE SY-ucomm
RS_SELFIELD TYPE SLIS_SELFIELD.
CASE R_UCOMM.
WHEN '&IC1'."默认的值就是这个,网上查资料据说能修改~
READ TABLE lbkpf INDEX RS_SELFIELD-tabindex.
SET PARAMETER ID 'BLN' FIELD lbkpf-belnr.
CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.
ENDCASE.
ENDFORM.
FORM FRM_SET_PF_STATUS USING PT_EXTAB TYPE SLIS_T_EXTAB.
SET PF-STATUS 'ZHKALV1'.
ENDFORM.
FORM alvshow.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER = ' '
* I_BUFFER_ACTIVE = ' '
i_callback_program = w_repid"程序名称
I_CALLBACK_PF_STATUS_SET = 'FRM_SET_PF_STATUS'
I_CALLBACK_USER_COMMAND = 'ALV_USER_COMMAND'"对ALV操作的时候触发所定义的子程序
* I_CALLBACK_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_END_OF_LIST = ' '
* I_STRUCTURE_NAME =
* I_BACKGROUND_ID = ' '
i_grid_title = '会计凭证'"标题名
* I_GRID_SETTINGS =
is_layout = layout"程序所定义的layout名称
it_fieldcat = fieldcat[]"定义fieldcat数据
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS =
* IT_SORT =
* IT_FILTER =
* IS_SEL_HIDE =
* I_DEFAULT = 'X'
* I_SAVE = ' '
* IS_VARIANT =
* IT_EVENTS =
* IT_EVENT_EXIT =
* IS_PRINT =
* IS_REPREP_ID =
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* I_HTML_HEIGHT_TOP = 0
* I_HTML_HEIGHT_END = 0
* IT_ALV_GRAPHICS =
* IT_HYPERLINK =
* IT_ADD_FIELDCAT =
* IT_EXCEPT_QINFO =
* IR_SALV_FULLSCREEN_ADAPTER =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab = lbkpf
EXCEPTIONS"下面都是默认的
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM.
https://blog.csdn.net/Kang_xiong/article/details/64922576
了解需求
1.假设目前我们需要开发一个销售订单报表,报表应该包含的字段由:销售订单号(so),行项目,工厂,物料号,库存地点,需求数量,订单数量,创建日期,交货日期等等
2.接到需求进行可行性分析,如果SAP存在可满足需求的报表则不用进行开发或者修改;如果不存在则考虑报表开发是否可行,如果能做就准备开发,否则再和客户进行讨论。
3.如何下手开发
1.分析需求,该报表的要点是关于SO
2.熟悉表
报表中的数据从何而来,需求中的订单号,物料号都来自于数据库。所以我们需要分析需要那些表。
使用T-CODE:se16n可以查询透明表
通过查询我们得知,需要用到以下的一些表
1.【VBAK:销售凭证】
字段:vbeln(销售凭证)、erdat(创建日期)、ername(创建者)、auart(销售类型)、bstnk(采购订单)、bsark(采购订单类型)、bstdk(采购日期)
2.【VBAP:销售凭证行项目】
字段:vbeln(销售凭证)、posnr(项目)、matnr(物料)、werks(工厂)、lgort(库存地点)、erdat(销售订单创建日期)、PRCTR(利润中心)、aufnr(订单)
3.【VBPA:销售凭证合作伙伴】
字段: vbeln(销售凭证)、posnr(项目)、kunnr(客户)、lifnr(供应商)
3.【MAKT:物料描述】
字段:matnr(物料号)、spras(语言)、maktx(描述)
4.【LIPS:SD凭证交货项目数据】
字段:vbeln(交货)、posnr(项目)、werks(工厂)、lgort(地点)、lfimg(交货数量)
5.【VBKD:销售凭证业务数据】
字段: vbeln(销售凭证)、posnr(项目)、bstkd(PO)、inco1(国际贸易条件)、
6.【VBEP:销售凭证计划行数据】
字段: vbeln(销售凭证)、posnr(项目)、ETENR(计划行)、edatu(交货日期)、ezit(到达时间)、wmeng(订单数量)、lmeng(需求数量)、bmeng(确认的数量)
然后我们就可以开始我们的报表开发
报表开发
REPORT zbsdr_025.
*-----------------------声明需要的变量
TABLES : vbak,mara,t001w,vbap,vbep.
*-----------------------类型池定义
TYPE-POOLS: slis .
DATA : t_fieldcat TYPE slis_t_fieldcat_alv,
w_fieldcat TYPE LINE OF slis_t_fieldcat_alv,
t_layout TYPE slis_layout_alv.
*-----------------------定义输出表结构
TYPES:BEGIN OF ty_result,
vbeln TYPE vbak-vbeln, "so
auart TYPE vbak-auart, "销售类 型
posnr TYPE vbap-posnr, "项目
bstkd TYPE vbkd-bstkd, "po
aufnr TYPE vbap-aufnr,
werks TYPE vbap-werks, "工厂
lgort TYPE vbap-lgort, "库存地点
matnr TYPE vbap-matnr, "物料
maktx TYPE makt-maktx,
kunnr TYPE vbpa-kunnr, "客户
lifnr TYPE vbpa-lifnr, "供应商
* lfimg TYPE lips-lfimg, "交货数量
edatu TYPE vbep-edatu, "计划交货日期
erdat TYPE vbap-erdat, "创建日期
lmeng TYPE vbep-lmeng, "需求数量
wmeng TYPE vbep-wmeng, "订单数量
END OF ty_result.
*-----------------------------定义输出表和工作区域
DATA:t_result TYPE TABLE OF ty_result.
DATA:w_result TYPE ty_result.
1.类型池: slis.类型池顾名思义就是装了许多类型的代码池,其中开发ALV报表就一般用slis这个类型池
2,DATA:主要用于声明变量, TYPE 表示变量参考的类型。在报表里一般都用来定义两个东西:内表和工作区
3.内表和工作区。内表可以理解为临时表,对内表操作不影响数据库中的表。如果频繁地从数据库中取数会导致效率降低,
所以可以用内表临时存放数据;工作区只能存放一条数据,对数据进行处理,一般用于循环中。
DATA:t_fieldcat TYPE slis_t_fieldcat_alv,
w_fieldcat TYPE LINE OF slis_t_fieldcat_alv,
t_layout TYPE slis_layout_alv.
4.按se11查看类型池
5.TYPES自定义结构,可以的字段可以来自于不同的表,一般先定义输出表结构(把报表需要展示的字段都放在一个结构里),当然为了后面的操作也要定义内表和工作区,参考的类型就是该结构。
DATA:t_result TYPE TABLE OF ty_result.
DATA:w_result TYPE ty_result.
TYPES:BEGIN OF ty_vbakp,
vbeln TYPE vbak-vbeln, "so
auart TYPE vbak-auart, "销售类型
posnr TYPE vbap-posnr, "项目
werks TYPE vbap-werks, "工厂
lgort TYPE vbap-lgort, "库存地点
matnr TYPE vbap-matnr, "物料
erdat TYPE vbap-erdat, "创建日期
bstkd TYPE vbkd-bstkd, "po
END OF ty_vbakp.
DATA:t_vbakp TYPE TABLE OF ty_vbakp,
w_vbakp TYPE ty_vbakp.
*----------------------------------------------
"引入makt主要是为了获取物料描述信息
DATA:t_makt TYPE STANDARD TABLE OF makt,
w_makt TYPE makt.
DATA:rt_extab TYPE slis_t_extab.
*----------------------------------------------
"引入vbpa主要是为了获取客户和供应商
DATA:t_vbpa TYPE STANDARD TABLE OF vbpa,
w_vbpa TYPE vbpa.
*-------------------------------------------
"为获取计划交货时间,需求数量,订单数量
data:t_vbep type STANDARD TABLE OF vbep,
w_vbep type vbep.
需要什么,就声明什么。比如需要获取物料描述信息就定义一个内表参考类型为物料描述表(makt),如果需要的多个表由联系,也可以定义结构,把所需字段放在结构里。如上面的结构ty_vbakp.(表vbak,vbap,vbkd都有销售凭证字段)
3.选择屏幕
*-------------------------------定义选择屏幕
SELECTION-SCREEN:BEGIN OF BLOCK a1 WITH FRAME TITLE text-001.
SELECT-OPTIONS:s_vbeln FOR vbak-vbeln,
s_matnr FOR mara-matnr,
s_werks FOR t001w-werks,
s_erdat FOR vbap-erdat, "创建日期
s_edatu FOR vbep-edatu. "交货日期
SELECTION-SCREEN:END OF BLOCK a1.
选择屏幕一般就是SAP的前台,一般为一些查询条件
select-options可以进行多值查询(有范围的),如上图会有两个输入框。比如用户想查询1000到1010工厂的销售订单。点击输入框后面的搜索按钮,会从数据库里查询,关键字【FOR】后面就是数据源。要注意的是,select-options里的数据源表都要在TABLS里声明下,不然会出错
TABLES:vbak,mara,t001w,vbap,vbep.
SELECT-OPTIONS:s_vbeln FOR vbak-vbeln.
3.parameters 用于单值查询
PARAMETERS p_matnr like mara-matnr.
4.设置选择屏幕的文本值
5.获取数据
START-OF-SELECTION.
*-----------------------获取数据
PERFORM frm_get_data.
*-------------------------处理数据
PERFORM frm_handle_data.
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
IF t_result IS NOT INITIAL.
PERFORM frm_alv_show.
ELSE.
MESSAGE '没有符合的数据,请重新查询' TYPE 'S' DISPLAY LIKE 'E'.
ENDIF.
END-OF-SELECTION.
(1)START-OF-SELECTION.程序的开始,PERFORM frm_get_data可以创建子程序,点击子程序名系统自动创建,选第二个,子程序会包含在当前程序里面,如下
最后的代码整合
FORM frm_get_data .
SELECT * INTO CORRESPONDING FIELDS OF TABLE t_vbakp
FROM vbak
JOIN vbap ON vbak~vbeln = vbap~vbeln
JOIN vbkd ON vbap~vbeln = vbkd~vbeln AND vbap~posnr = vbkd~posnr
WHERE vbak~vbeln IN s_vbeln
AND vbap~werks IN s_werks
AND vbap~matnr IN s_matnr
AND vbap~erdat IN s_erdat.
IF t_vbakp[] IS NOT INITIAL.
*物料描述
SELECT * INTO TABLE t_makt
FROM makt
FOR ALL ENTRIES IN t_vbakp
WHERE matnr = t_vbakp-matnr.
* 客户供应商
SELECT * INTO CORRESPONDING FIELDS OF TABLE t_vbpa
FROM vbpa
FOR ALL ENTRIES IN t_vbakp
WHERE vbpa~vbeln = t_vbakp-vbeln.
* AND vbpa~posnr = t_vbakp-posnr.
*计划交货时间
SELECT * INTO CORRESPONDING FIELDS OF TABLE t_vbep
from vbep
FOR ALL ENTRIES IN t_vbakp
where vbeln = t_vbakp-vbeln
and posnr = t_vbakp-posnr
and edatu in s_edatu.
ENDIF.
ENDFORM. " FRM_GET_DATA
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Report ZALVTEST006
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZALVTEST006.
* 第一步: 声明ALV相关变量
TYPE-POOLS:slis.
DATA: lt_fieldcat TYPE slis_t_fieldcat_alv, "存储fieldcat的内表
wa_fieldcat TYPE slis_fieldcat_alv, "定义工作区
ls_layout TYPE slis_layout_alv. "ALV格式控制的结构体:layout
* 第二步: 定义内表
TYPES: BEGIN OF TY_ALVSHOW,
VBELN TYPE VBAK-VBELN,
ERDAT TYPE VBAK-ERDAT,
ERNAM TYPE VBAK-ERNAM,
KUNNR TYPE VBAK-KUNNR,
POSNR TYPE VBAP-POSNR,
MATHR TYPE VBAP-MATNR,
MATKL TYPE VBAP-MATKL,
ZMENG TYPE VBAP-ZMENG,
ZIEME TYPE VBAP-ZIEME,
WERKS TYPE VBAP-WERKS,
LGORT TYPE VBAP-LGORT,
END OF TY_ALVSHOW.
* 定义相关的内表的名字为 LT_ALVSHOW,其结构参照我们卸载开头的结构
DATA: lt_alvshow TYPE TABLE OF TY_ALVSHOW,
LS_alvshow TYPE TY_ALVSHOW.
* 定义工作区wa_alvshow
* 第三步:读取数据
SELECT
VBELN ERDAT ERNAME KUNNR POSNRMATNR
MATKL ZMENG ZIEME WERKS LGORT
FROM VBAK as a INNER JOIN vbap as b
on a~vbeln = b~vbeln
into TABLE LT_ALVSHOW
UP TO 100 ROWS.
* 第四步:ALV格式控制
ls_layout-zebra = 'X'.
ls_layout-detail_popup = 'X'.
ls_layout-detail_titlebar = 'X'.
ls_layout-f2code = 'X'.
ls_layout-colwidth_optimize = 'X'.
"fieldcat
*销售凭证
lv_colpos = 1.
ls_fieldcat-fieldname = 'VBELN'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = 'X'.
ls_fieldcat-datatype = 'CHAR'.
ls_fieldcat-outputlen = '10'.
ls_fieldcat-seltext_m = '销售凭证'.
APPEND ls_fieldcat TO lt_fieldcat.
*凭证日期
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = 'ERDAT'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = 'X'.
ls_fieldcat-datatype = 'CHAR'.
ls_fieldcat-outputlen = '10'.
ls_fieldcat-seltext_m = '销售日期'.
APPEND ls_fieldcat TO lt_fieldcat.
*创建时间
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = 'ERNAME'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = 'X'.
ls_fieldcat-datatype = 'CHAR'.
ls_fieldcat-outputlen = '10'.
ls_fieldcat-seltext_m = '创建时间'.
APPEND ls_fieldcat TO lt_fieldcat.
*创建人
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = 'ERNAM'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = 'X'.
ls_fieldcat-datatype = 'CHAR'.
ls_fieldcat-outputlen = '12'.
ls_fieldcat-seltext_m = '销售人'.
APPEND ls_fieldcat TO lt_fieldcat.
*售达方
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = 'kunnr'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = 'X'.
ls_fieldcat-datatype = 'CHAR'.
ls_fieldcat-outputlen = '10'.
ls_fieldcat-seltext_m = '售达方'.
APPEND ls_fieldcat TO lt_fieldcat.
*项目编码
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = 'POSNR'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = 'X'.
ls_fieldcat-datatype = 'NUMC'.
ls_fieldcat-outputlen = '6'.
ls_fieldcat-seltext_m = '项目编码'.
APPEND ls_fieldcat TO lt_fieldcat.
*物料
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = 'MATNR'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = 'X'.
ls_fieldcat-datatype = 'CHAR'.
ls_fieldcat-outputlen = '18'.
ls_fieldcat-seltext_m = '物料'.
APPEND ls_fieldcat TO lt_fieldcat.
*物料组
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = 'MATKL'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = 'X'.
ls_fieldcat-datatype = 'CHAR'.
ls_fieldcat-outputlen = '9'.
ls_fieldcat-seltext_m = '物料组'.
APPEND ls_fieldcat TO lt_fieldcat.
*数量
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = 'ZMENG'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = 'X'.
ls_fieldcat-datatype = 'QUAN'.
ls_fieldcat-outputlen = '13'.
ls_fieldcat-seltext_m = '数量'.
APPEND ls_fieldcat TO lt_fieldcat.
*单位
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = 'ZIEME'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = 'X'.
ls_fieldcat-datatype = 'CUNIT'.
ls_fieldcat-outputlen = '3'.
ls_fieldcat-seltext_m = '单位'.
APPEND ls_fieldcat TO lt_fieldcat.
*工厂
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = 'werks'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-ref_tabname = 'VBAP'.
APPEND ls_fieldcat TO lt_fieldcat.
*库存
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = 'LOGORT'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-ref_tabname = 'VBAP'.
APPEND ls_fieldcat TO lt_fieldcat.
* 第五步:定义事件(省略)
* 第六步: 显示ALV
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER = ' '
* I_BUFFER_ACTIVE = ' '
* I_CALLBACK_PROGRAM = ' '
* I_CALLBACK_PF_STATUS_SET = ' '
* I_CALLBACK_USER_COMMAND = ' '
* I_CALLBACK_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_END_OF_LIST = ' '
* I_STRUCTURE_NAME =
* I_BACKGROUND_ID = ' '
* I_GRID_TITLE =
* I_GRID_SETTINGS =
IS_LAYOUT = LS_LAYOUT
IT_FIELDCAT = LT_FIELDCAT
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS =
* IT_SORT =
* IT_FILTER =
* IS_SEL_HIDE =
* I_DEFAULT = 'X'
* I_SAVE = ' '
* IS_VARIANT =
* IT_EVENTS =
* IT_EVENT_EXIT =
* IS_PRINT =
* IS_REPREP_ID =
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* I_HTML_HEIGHT_TOP = 0
* I_HTML_HEIGHT_END = 0
* IT_ALV_GRAPHICS =
* IT_HYPERLINK =
* IT_ADD_FIELDCAT =
* IT_EXCEPT_QINFO =
* IR_SALV_FULLSCREEN_ADAPTER =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
T_OUTTAB = LT_ALVSHOW
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2
.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
首先最常用的类组为:
TYPE-POOLS:SLIS.
这个类型组中有很多ALV的自定义数据类型以及结构化数据类型(通过TYPE来定义的,)是我们在写ALV表单的时候需要调用的。
其中常用的有:
我们写第一个ALV程序的基本流程如下:
第一步:定义将要用到的表,即TALBES定义部分,然后定义TYPE-POOLS:SLIS.
第二步:定义“1”中提到的这些数据类型或者内表的实体对象
第三步:定义一些需要用到的变量,比如我们常定义的有:
Data: w_repid like sy-repid, "ABAP程序,我们一般取当前程序
w_callback_ucomm type sils_formname, “字符型,功能
w_print type slis_print_alv, "类型组
w_layout type slis_layout_alv, "类型组
w_html_top_of_page type slis_formname, "字符型
w_fieldcat_alv like line of i_fieldcat_alv, “从上面的数据结构类型引用过来的
w_excluding like line of i_excluding, “同上
w_events like line of i_events, “同上
w_event_exit like line of i_event_exit, “同上
w_list_comments like line of i_list_comments.“同上
第四步: 定义自己的选择屏幕
第五步: 定义INITIALIZATION部分,在这个部分往往要指定w_repid的值, w_repid = sy-repid
第六步: start-of-selection部分
用一个子函数完成对ALV表单标题区域的赋值(i_list_comments)。
用一个子函数完成自己所需要数据的抓取
用一个子函数完成要显示列表的列名行(第一行)的相关赋值(i_fieldcat_alv)以及设置
用一个子函数完成输出格式的设置(i_layout),比如双击一条记录是否弹出对话框啊?是用哪个功能键触发等等
用一个子函数FORM DISPLAY_DATA来显示上面我们已经分别封装好的数据,需要调用两个常用的FUNCTION MODULE:
FUNCTION ‘REUSE_ALV_GRID_DISPLAY’ “用来显示表单数据
FUNCTION ‘REUSE_ALV_COMMENTARY_WRITE’ “用来显示表单标题
https://zhuanlan.zhihu.com/p/355316708
写一个ALV报表的步骤如下:
1.声明需要用到的变量
TABLES: mseg , mkpf , ztmm063h , mara , makt , ekpo , ekko ,ztbc120h.
2.定义屏幕的各种选项:
例如
SELECT-OPTIONS : s_mblnr FOR mseg-mblnr,
s_budat FOR mkpf-budat,
s_werks FOR mseg-werks,
s_lgort FOR mseg-lgort,
s_matnr FOR mara-mathn,
s_charg FOR ztmm063h-charg,
s_ebeln FOR ekpo-ebeln,
s_lifnr FOR mseg-lifnr.
SELECT-OPTIONS END OF BLOCK b1.
3.引用输出结构
DATA: gt_alv TYPE TABLE OF zsmm141a_alv,
gwa_alv TYPE zsmm141a_alv.
4.定义数据加工逻辑
START-OF-SELECTION.
PERFORM frm_get_data.
相关知识点
内部表
内部表是一个包含相同类型的数据对象的序列。
内部表只在程序运行过程中存在。
1.内部表的用途:
暂时存放从数据库表中读取的数据,以便作进一步的处理
暂时存放用于显示的清单数据
作为数据缓冲用于同其他程序进行数据交换
2.内部表的特性
内部表的行数不是预先定义的,而是动态增长的(每次增长8K)
内部表的行类型(LINETYPE)可以是任意一种ABAP数据类型。
3.内部表的类型:
标准表,有一个线性索引,主要通过索引访问。
排序表,定义了主键,可以通过主键和索引访问。
哈希表,没有索引,只能通过主键访问。
4.内部表的处理关键字
APPEND: 将工作区的内容添加到内部表的末尾
INSERT: 将工作区的内容添加到内部表指定的位置(行号)
COLLECT: 比较非数值型字段,将数值型字段累加到内部表中
MODIFY: 将工作区的内容覆盖内部表指定的行
DELECT: 从内部表中删除指定的行
LOOP AT: 将内部表的数据逐行读到工作区中
READ TABLE: 将内部表的某一特定行的数据读到工作区中
SORT: 对内部进行排序
CLEAR: 清楚工作区的内容
REFRESH:删除内部表中的所有记录
数据库
在ABAP程序中,可以通过两种方式访问数据库
OPEN SQL :标准SQL的子集,与ABAP完全集成,具有数据库无关性,数据库接口会自动将其转换为所使用的的数据库的标准SQL。
NATIVE SQL: 与数据库相关,使用数据库提供的标准SQL,不经过数据库接口的语法检查和转换。
避免使用NATIVE SQL
OPENSQL访问介绍
OPENSQL只包含函数据操作语言DML,数据定义语言DDL通过ABAP字典对象控制。
通过OPEN SQL可以执行的操作:SELECT , UPDATE , INSERT , DELETE , MODIFY
可以通过系统变量SY-SUBRC判断操作成功与否,SY-SUBRC = 0 表示执行成功 , SYBRC <>0 则表示执行不成功,
更详细的信息参考在线帮助文档
SAP SQL基本格式
SELECT子句用于确定读取什么数据-结果包含哪些字段-需要读取单挑记录还是多条记录(SINGLE)-结果是否可以包含重复记录(DISTINCT)
INTO子句表示读取的数据放入内存的声明位置(变量,工作区,内部表)FROM子句表示数据源(表或者视图)
SAP SQL读取方式
可以使用SELECT SINGLE读取单条记录,要确保读出的记录是唯一的,需要在WHERE语句中判断所有主键
如果不适用SINGLE关键字,则读取所有满足WHERE条件的记录,读取方式有两种:
1.以循环的方式逐行读入目标区域,需要由ENDSELECT语句配合使用。
2.使用SELECT…INTO TABLE 语句,一次将所有满足条件的记录读入内部表中,没有使用循环,步需要ENDSELECT。这种方式读取数据比前一种由更高的效率。
3.在INO子句中,可以使用CORRENPSONDING FIELDS OF , 系统只填充由相同名称的字段,如果不适用,则按照从左向右的顺序填充
4.在字段清单和WHERE子句中,只需指定字段名称,不需指定表名称。•WHERE子句中可以使用AND或OR实现复杂的逻辑条件。
5.SELECT *语句读取透明表的所有字段,可以没有INTO子句,但是必须使用TABLES声明透明表。
SAP SQL表链接方法
可以使用JOIN连接多个透明标进行查询
INNER JOIN
LEFT OUTER JOIN
RIGHT OUTER JOIN
透明表可以使用别名。
字段如果只存在于一个表中,不需要指定表名称
https://blog.csdn.net/qq_41401008/article/details/103575163
第一步:申明变量
TYPE-POOLS:sils.
DATA: lt_fieldcat TYPE slis_t_fieldcat_alv,
wt_fieldcat TYPE slis_fieldcat_alv,
ls_layout TYPE slis_layout_alv.
第二步:定义内表
TYPE:BEGIN OF lt_xs,
vbeln TYPE vbak-vbeln,
matnr TYPE vbap_matnr,
END OF lt_xs.
DATA :gw_xs TYPE lt_xs,
gt_xs TYPE TABLE OF lt_xs.
第三步:读取数据
SELECT vbak~vbeln matnr FROM vbak
LEFT JOIN vbap
on vbak~vbeln = vbap~vbeln
INTO TABLE gt_xs.
第四步:ALV格式控制
ls_layout-zebra = ‘X’.
ls_layout-detail_popup = ‘X’.
ls_layout-detail_titlebar = ‘详细信息’.
ls_layout-f2code = ‘&ETA’.
ls_layout-colwidth_optimize = ‘X’.
wt_fieldcat-fieldname = ‘VBELN’.
wt_fieldcat-col_pos = ‘1’.
wt_fieldcat-key = ‘X’.
wt_fieldcat-datatype = ‘CHAR’.
wt_fieldcat-outputlen = ‘10’.
wt_fieldcat-seltext_m = ‘销售凭证’.
APPEND wt_fieldcat TO lt_fieldcat.
wt_fieldcat-fieldname = ‘MATNR’.
wt_fieldcat-col_pos = ‘2’.
wt_fieldcat-key = ‘X’.
wt_fieldcat-datatype = ‘CHAR’.
wt_fieldcat-outputlen = ‘18’.
wt_fieldcat-seltext_m = ‘物料号’.
APPEND wt_fieldcat TO lt_fieldcat.
第五步:ALV数据显示
CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY’
EXPORTING
-
I_INTERFACE_CHECK = ' '
-
I_BYPASSING_BUFFER = ' '
-
I_BUFFER_ACTIVE = ' '
-
I_CALLBACK_PROGRAM = ' '
-
I_CALLBACK_PF_STATUS_SET = ' '
-
I_CALLBACK_USER_COMMAND = ' '
-
I_CALLBACK_TOP_OF_PAGE = ' '
-
I_CALLBACK_HTML_TOP_OF_PAGE = ' '
-
I_CALLBACK_HTML_END_OF_LIST = ' '
-
I_STRUCTURE_NAME =
-
I_BACKGROUND_ID = ' '
-
I_GRID_TITLE =
-
IS_LAYOUT = ls_layoutI_GRID_SETTINGS =
IT_FIELDCAT = lt_fieldcat -
IT_EXCLUDING =
-
IT_SPECIAL_GROUPS =
-
IT_SORT =
-
IT_FILTER =
-
IS_SEL_HIDE =
-
I_DEFAULT = 'X'
-
I_SAVE = ' '
-
IS_VARIANT =
-
IT_EVENTS =
-
IT_EVENT_EXIT =
-
IS_PRINT =
-
IS_REPREP_ID =
-
I_SCREEN_START_COLUMN = 0
-
I_SCREEN_START_LINE = 0
-
I_SCREEN_END_COLUMN = 0
-
I_SCREEN_END_LINE = 0
-
I_HTML_HEIGHT_TOP = 0
-
I_HTML_HEIGHT_END = 0
-
IT_ALV_GRAPHICS =
-
IT_HYPERLINK =
-
IT_ADD_FIELDCAT =
-
IT_EXCEPT_QINFO =
-
IR_SALV_FULLSCREEN_ADAPTER =
- IMPORTING
-
E_EXIT_CAUSED_BY_CALLER =
-
TABLESES_EXIT_CAUSED_BY_USER =
t_outtab = gt_xs
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2
.
IF sy-subrc <> 0. - Implement suitable error handling here
ENDIF.
https://www.cnblogs.com/VerySky/articles/2192401.html
开发ALV的基本流程
第一步:定义一些基本的数据结构,主要用于存数和alv的一些参数变量
第三步:定义一些显示ALV时所要使用到的变量,例如:
Data: w_repid like sy-repid, “ABAP程序,我们一般取当前程序
w_callback_ucomm type slis_formname, "字符型,功能
w_print type slis_print_alv, "类型组
w_layout type slis_layout_alv, "类型组
w_html_top_of_page type slis_formname, "字符型
w_fieldcat_alv like line of i_fieldcat_alv, “从上面的数据结构类型引用过来的
w_excluding like line of i_excluding, “同上
w_events like line of i_events, “同上
w_event_exit like line of i_event_exit, “同上
w_list_comments like line of i_list_comments.“同上
第二步:制作屏幕
第三步:获取屏幕输入的数据,用该数据从数据库中获取所需的数据放到前面定义的内表中
第四步:调用ALV生成函数。其中还要为ALV定义表结构,布局等信息,主要是layout和fieldcat.其中定义报表字段fieldcat的时候可以用子程序便捷的赋值
其中我们可以分解成如下几个步骤
(1)调用一个子程序,(通常命名为frm_get_dataXXX(X代表任意自定义字母)),用于获取ALV所要显示的数据;
例如:
FROM frm_get_data.
… … "其他处理逻辑
SELECT lifnr "供应商账号
ktokk "账号组
name1 ''名称1
name2 "名称2
INTO CORRESPONDING FIELDS OF TABLE it_main
FROM zmmjyht003
WHERE (l-where)
.
… …
ENDFORM.
2)调用一个子程序(通常命名为frm_alv_layout_build),用于设置ALV所要显示的样式;
例如:
FROM frm_alv_layout_build.
g_layout-zebra = ‘X’ .
g_layout-colwidth_optimize = ‘X’ "列数据最优化显示
g_layout-box-fieldname = ‘SELFLAG’. *表示ALV行项目选中的字段
ENDFORM.
(3)调用一个子程序(通常命名为frm_alv_set_columns),用于完成ALV索要显示的列的相关设置;
例如:
FROM frm_alv_set_columns.
REFRESH g_fieldcat_alv.
PERFROM frm_set_l_fieldcat USING 1 ‘LIFNR’ ‘供应商账号’.
ENDFORM.
FORM frm_set_l_fieldcat USING p_pos p_name p_text.
DATA: l_fieldcat TYPE slis_fieldcat_alv.
l_fieldcat TO g_fieldcat_alv.
EMDFORM.
(4)调用显示ALV的函数,例如:REUSE_ALV_GRID_DISPLAY ;
FORM frm_alv_display_data.
CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY’
EXPORTING
i_callback_program = g_repid
i_callback_pf_status_set = ‘FRM_STATUS_ALV’
i_callback_user_command = ‘FRM_USER_COMMAND_ALV’
is_layout = g_layout
it_fieldcat = g_fieldcat_alv[]
TABLES
t_outtab = it_main
EXCEPTIONS
program_error = 1
OTHERS = 2
.
ENDFORM.