新进入一家公司,是搞erp的,用的sap,我是一点不懂啊,本来就是初级程序员,这下郁闷了,每人带,自己学……
开始的任务就是实现个报表和单据打印,中途出现了很多问题,现在把简单报表实现步骤写出来,希望大鸟指正错误和不足
*&---------------------------------------------------------------------*
*& Report ZMM_TEST01
*& Author: 杨路
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ZMM_TEST01.
TABLES:EKKO,EKPO,EKET,MAKT. "引入tables
TYPE-POOLS: SLIS. "类似.net引入命名空间
*-----------------------------------------------------------------------*
* Define types
*-----------------------------------------------------------------------*
TYPES: BEGIN OF TYP_LIST,
BUKRS TYPE EKKO-BUKRS,
EKORG TYPE EKKO-EKORG,
EKGRP TYPE EKKO-EKGRP,
EBELN TYPE EKKO-EBELN,
EBELP TYPE EKPO-EBELP,
MATNR TYPE MAKT-MATNR,
MAKTX TYPE MAKT-MAKTX,
MENGE TYPE EKPO-MENGE,
MEINS TYPE EKPO-MEINS,
NETPR TYPE EKPO-NETPR,
WAERS TYPE EKKO-WAERS,
EINDT TYPE EKET-EINDT,
END OF TYP_LIST. "定义结构
*-----------------------------------------------------------------------*
* Define data
*-----------------------------------------------------------------------*
DATA: GTD_DATA TYPE STANDARD TABLE OF TYP_LIST,
GTH_DATA TYPE TYP_LIST.
DATA: GTD_TITLE TYPE SLIS_T_LISTHEADER,
GTH_TITLE TYPE SLIS_LISTHEADER.
DATA: GTD_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
GTH_FIELDCAT TYPE SLIS_FIELDCAT_ALV.
DATA: GTH_LAYOUT TYPE SLIS_LAYOUT_ALV.
DATA: GD_SPRAS TYPE SPRAS.
data P_DATUM type d. "定义时间变量,后面设置默认时间
*--------------------------------------------------------------------------*
* selection-screen
*--------------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001. "双击text-001,给屏幕字段写汉语
SELECT-OPTIONS:
S_LLIEF FOR EKKO-LLIEF,
S_EBELN FOR EKKO-EBELN,
S_MATNR FOR EKPO-MATNR ,
S_AEDAT for EKKO-AEDAT OBLIGATORY. "时间必输项
SELECTION-SCREEN END OF BLOCK B1.
INITIALIZATION. "设置默认时间为本月初到当前时间
P_DATUM = sy-datum.
P_DATUM+6(2) = '01'.
P_DATUM = P_DATUM .
S_AEDAT-low = P_DATUM.
S_AEDAT-high = sy-datum .
APPEND S_AEDAT.
*----------------------------------------------------------------------*
* START-OF-SELECTION
*----------------------------------------------------------------------*
START-OF-SELECTION. "执行各个函数调用
PERFORM SUB_GET_DATA.
PERFORM SUB_DISPLAY.
PERFORM SUB_CLEAR.
*&---------------------------------------------------------------------*
*& Form SUB_GET_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM SUB_GET_DATA .
SELECT
EKKO~BUKRS
EKKO~EKORG
EKKO~EKGRP
EKKO~EBELN
EKPO~EBELP
MAKT~MATNR
MAKT~MAKTX
EKPO~MENGE
EKPO~MEINS
EKPO~NETPR
EKKO~WAERS
EKET~EINDT
INTO CORRESPONDING FIELDS OF TABLE GTD_DATA
FROM EKKO
INNER JOIN EKPO ON EKKO~EBELN = EKPO~EBELN
LEFT JOIN EKET ON EKPO~EBELN = EKET~EBELN
AND EKPO~EBELP = EKET~EBELP
LEFT JOIN MAKT ON EKPO~MATNR = MAKT~MATNR
WHERE EKKO~AEDAT in S_AEDAT "屏幕的选择条件
AND EKKO~LLIEF IN S_LLIEF
AND EKKO~EBELN IN S_EBELN
AND EKPO~MATNR IN S_MATNR.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form SUB_TITLE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM SUB_TITLE. "表头显示信息
REFRESH GTD_TITLE.
CLEAR GTH_TITLE.
PERFORM SUB_SET_TITLE USING 'H' '' '采购订单报表'.
PERFORM SUB_SET_TITLE USING 'S' '日期 :' SY-DATUM.
PERFORM SUB_SET_TITLE USING 'S' '作者 :' SY-UNAME.
ENDFORM. "SET_TITLE
*&---------------------------------------------------------------------*
*& Form sub_field
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM SUB_FIELD .
* PERFORM SUB_SET_FIELD USING 1 'CHECK_BOX' 'GTD_DATA' '' '1'
* '选取' 'X' 'X' '' .
PERFORM SUB_SET_FIELD USING 1 'BUKRS' 'GTD_DATA' '' '10'
'公司代码' '' '' 'X' .
PERFORM SUB_SET_FIELD USING 2 'EKORG' 'GTD_DATA' '' '4'
'采购组织' '' '' 'X' .
PERFORM SUB_SET_FIELD USING 3 'EKGRP' 'GTD_DATA' '' '3'
'采购组' '' '' '' .
PERFORM SUB_SET_FIELD USING 4 'EBELN' 'GTD_DATA' '' '4'
'采购凭证号' '' '' '' .
PERFORM SUB_SET_FIELD USING 5 'EBELP' 'GTD_DATA' '' '3'
'项目编号' '' '' '' .
PERFORM SUB_SET_FIELD USING 6 'MATNR' 'GTD_DATA' '' '10'
'物料号' '' '' '' .
PERFORM SUB_SET_FIELD USING 7 'MAKTX' 'GTD_DATA' '' '5'
'物料描述' '' '' 'X' .
PERFORM SUB_SET_FIELD USING 8 'MENGE' 'GTD_DATA' '' '18'
'数量' '' '' 'X' .
PERFORM SUB_SET_FIELD USING 9 'MEINS' 'GTD_DATA' '' '40'
'单位' '' '' '' .
PERFORM SUB_SET_FIELD USING 10 'NETPR' 'GTD_DATA' '' '9'
'价格' '' '' '' .
PERFORM SUB_SET_FIELD USING 11 'WAERS' 'GTD_DATA' '' '4'
'货币' '' '' '' .
PERFORM SUB_SET_FIELD USING 12 'EINDT' 'GTD_DATA' '' '17'
'交货日期' '' '' '' .
ENDFORM. " sub_field
*&---------------------------------------------------------------------*
*& Form sub_set_layout
*&---------------------------------------------------------------------*
* 设置ALV列表显示的布局
*&---------------------------------------------------------------------*
FORM SUB_SET_LAYOUT.
CLEAR GTH_LAYOUT.
GTH_LAYOUT-COLWIDTH_OPTIMIZE = 'X'. "设置为最适合的布局
GTH_LAYOUT-ZEBRA = 'X'.
ENDFORM. " sub_set_layout
*&---------------------------------------------------------------------*
*& Form set_pf_status
*&---------------------------------------------------------------------*
* AVL STATUS
*&---------------------------------------------------------------------*
FORM SET_PF_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB.
SET TITLEBAR 'PO2'. "设置报表标题
SET PF-STATUS 'ZSTATUS2' . "设置工具栏等
ENDFORM. "set_pf_status
*&---------------------------------------------------------------------*
*& Form sub_display
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM SUB_DISPLAY .
PERFORM SUB_TITLE.
PERFORM SUB_FIELD.
PERFORM SUB_SET_LAYOUT.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_CALLBACK_PROGRAM = SY-CPROG
I_CALLBACK_TOP_OF_PAGE = 'ALV_TOP_OF_PAGE'
I_CALLBACK_PF_STATUS_SET = 'SET_PF_STATUS'
I_CALLBACK_USER_COMMAND = 'USER_COMMAND_ALV'
IT_FIELDCAT = GTD_FIELDCAT
IS_LAYOUT = GTH_LAYOUT
TABLES
T_OUTTAB = GTD_DATA "内表
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDFORM. "SUB_DISPLAY
*&---------------------------------------------------------------------*
*& Form alv_top_of_page
*&---------------------------------------------------------------------*
* ALV列表抬头的设定
*&---------------------------------------------------------------------*
FORM ALV_TOP_OF_PAGE.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
IT_LIST_COMMENTARY = GTD_TITLE.
ENDFORM. "alv_top_of_page
*&---------------------------------------------------------------------*
*& Form user_command_alv
*&---------------------------------------------------------------------*
* ALV 用户事件
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form sub_clear
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM SUB_CLEAR .
FREE: GTD_DATA,
GTH_DATA.
ENDFORM. " sub_clear
*&---------------------------------------------------------------------*
*& Form sub_set_title
*&---------------------------------------------------------------------*
* ALV列表抬头信息的属性设置
*&---------------------------------------------------------------------*
* --> i_typ "输出的类型
* --> i_key "文本
* --> i_info "数值
*&---------------------------------------------------------------------*
FORM SUB_SET_TITLE USING I_TYP TYPE ANY
I_KEY TYPE ANY
I_INFO TYPE ANY.
CLEAR GTH_TITLE.
GTH_TITLE-TYP = I_TYP. "输出的类型
GTH_TITLE-KEY = I_KEY. "文本
GTH_TITLE-INFO = I_INFO. "数值
APPEND GTH_TITLE TO GTD_TITLE.
ENDFORM. "sub_set_title
*&---------------------------------------------------------------------*
*& Form sub_set_field
*&---------------------------------------------------------------------*
* 设置ALV字段的属性
*&---------------------------------------------------------------------*
* -->i_pos "显示列的位置
* -->i_fieldname "内表的字段名
* -->i_tabname "内表名
* -->i_box "显示复选框
* -->i_edit "是否为可输入
* -->i_key "设置主键
* -->i_hotspot "单击控制
* -->i_outputlen "控制输出列的宽度
* -->i_seltext "设置列的名称
* -->i_edit "可编辑
*&---------------------------------------------------------------------*
FORM SUB_SET_FIELD USING I_POS TYPE ANY
I_FIELDNAME TYPE ANY
I_TABNAME TYPE ANY
I_KEY TYPE ANY
I_OUTPUTLEN TYPE ANY
I_SELTEXT TYPE ANY
I_EDIT TYPE ANY
I_BOX TYPE ANY
I_NO_ZERO TYPE ANY.
GTH_FIELDCAT-COL_POS = I_POS. "显示列的位置
GTH_FIELDCAT-FIELDNAME = I_FIELDNAME. "内表的字段名
GTH_FIELDCAT-TABNAME = I_TABNAME. "内表名
GTH_FIELDCAT-KEY = I_KEY. "设置主键
GTH_FIELDCAT-OUTPUTLEN = I_OUTPUTLEN. "控制输出列的宽度
GTH_FIELDCAT-SELTEXT_M = I_SELTEXT. "设置列的名称
GTH_FIELDCAT-EDIT = I_EDIT.
GTH_FIELDCAT-CHECKBOX = I_BOX.
GTH_FIELDCAT-NO_ZERO = I_NO_ZERO.
APPEND GTH_FIELDCAT TO GTD_FIELDCAT.
CLEAR GTH_FIELDCAT.
ENDFORM. "sub_set_field