新进入一家公司,是搞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