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.



