*&---------------------------------------------------------------------**& Report ZRPP021*&---------------------------------------------------------------------**& 计划订单查询*&---------------------------------------------------------------------*REPORT zrpp021 NO STANDARD PAGE HEADING.
DATA: gt_fldct TYPE lvc_t_fcat, gs_slayt TYPE lvc_s_layo, gs_varnt TYPE disvariant, gv_repid TYPE sy-repid.DATA: BEGIN OF gs_out, plnum TYPE plaf-plnum, matnr TYPE plaf-matnr, maktx TYPE makt-maktx, gsmng TYPE plaf-gsmng, meins TYPE plaf-meins, psttr TYPE plaf-psttr, pedtr TYPE plaf-pedtr, dispo TYPE plaf-dispo, beskz TYPE plaf-beskz, berid TYPE plaf-berid, fevor TYPE marc-fevor, fetxt TYPE t024f-txt, END OF gs_out.DATA: gt_out LIKE TABLE OF gs_out.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE btxt1. PARAMETERS p_werks TYPE plaf-plwrk DEFAULT '6900'. SELECT-OPTIONS s_matnr FOR gs_out-matnr. SELECT-OPTIONS s_berid FOR gs_out-berid. SELECT-OPTIONS s_dispo FOR gs_out-dispo. SELECT-OPTIONS s_beskz FOR gs_out-beskz. SELECT-OPTIONS s_fevor FOR gs_out-fevor.SELECTION-SCREEN END OF BLOCK b1.AT SELECTION-SCREEN OUTPUT. btxt1 = '数据筛选'(t01).
AT SELECTION-SCREEN. "PAI CASE sy-ucomm. WHEN 'ONLI'. PERFORM auth_check. ENDCASE.
INITIALIZATION. PERFORM catset TABLES gt_fldct USING: 'PLNUM' 'PLAF ' 'PLNUM' '', 'MATNR' 'PLAF ' 'MATNR' '', 'MAKTX' 'MAKT ' 'MAKTX' '', 'GSMNG' 'PLAF ' 'GSMNG' '', 'MEINS' 'PLAF ' 'MEINS' '', 'PSTTR' 'PLAF ' 'PSTTR' '', 'PEDTR' 'PLAF ' 'PEDTR' '', 'DISPO' 'PLAF ' 'DISPO' '', 'BESKZ' 'PLAF ' 'BESKZ' '', 'BERID' 'PLAF ' 'BERID' '', 'FEVOR' 'MARC ' 'FEVOR' 'LINE'(f01), 'FETXT' 'T024F' 'TXT ' 'LINE NAME'(f02).
START-OF-SELECTION. PERFORM getdata. PERFORM outdata.
*&---------------------------------------------------------------------**& Form auth_check*&---------------------------------------------------------------------*FORM auth_check. AUTHORITY-CHECK OBJECT 'M_BEST_WRK' ID 'ACTVT' DUMMY ID 'WERKS' FIELD p_werks. IF sy-subrc <> 0. MESSAGE e000(oo) WITH '无工厂权限:'(m01) p_werks. ENDIF.ENDFORM.
*&---------------------------------------------------------------------**& getdata*&---------------------------------------------------------------------*FORM getdata. CLEAR gt_out.
SELECT plaf~plnum plaf~matnr makt~maktx plaf~gsmng plaf~meins plaf~psttr plaf~pedtr plaf~dispo plaf~beskz plaf~berid marc~fevor t024f~txt AS fetxt INTO CORRESPONDING FIELDS OF TABLE gt_out FROM plaf INNER JOIN marc ON marc~matnr = plaf~matnr AND marc~werks = plaf~plwrk INNER JOIN makt ON makt~matnr = plaf~matnr AND makt~spras = sy-langu LEFT JOIN t024f ON t024f~werks = marc~werks AND t024f~fevor = marc~fevor WHERE plaf~plwrk EQ p_werks AND plaf~matnr IN s_matnr AND plaf~berid IN s_berid AND plaf~dispo IN s_dispo AND plaf~beskz IN s_beskz AND marc~fevor IN s_fevor. IF gt_out IS INITIAL. MESSAGE s000(oo) WITH 'No Data'. ENDIF.ENDFORM.*---------------------------------------------------------------------** outdata*---------------------------------------------------------------------*FORM outdata. gv_repid = sy-repid. gs_slayt-zebra = 'X'. gs_varnt-report = sy-repid. gs_varnt-handle = 1.
CHECK gt_out IS NOT INITIAL. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING it_fieldcat_lvc = gt_fldct i_save = 'A' is_variant = gs_varnt is_layout_lvc = gs_slayt i_callback_program = gv_repid i_callback_user_command = 'USER_COMMAND' i_callback_pf_status_set = 'SET_STATUS' TABLES t_outtab = gt_out.ENDFORM.
*&---------------------------------------------------------------------**& set_status*&---------------------------------------------------------------------*FORM set_status USING pt_extab TYPE slis_t_extab ##CALLED. SET PF-STATUS 'STD_FULL' EXCLUDING pt_extab.ENDFORM.
*&--------------------------------------------------------------------**& ALV user_command*&--------------------------------------------------------------------*FORM user_command USING pv_ucomm TYPE sy-ucomm ##CALLED pv_field TYPE slis_selfield.
READ TABLE gt_out INTO gs_out INDEX pv_field-tabindex. CASE pv_ucomm. WHEN '&IC1'. CASE pv_field-fieldname. WHEN 'MATNR' OR 'MAKTX'. SET PARAMETER ID 'MXX' FIELD 'K'. SET PARAMETER ID 'MAT' FIELD gs_out-matnr. SET PARAMETER ID 'WRK' FIELD p_werks. CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN. WHEN 'PLNUM'. SET PARAMETER ID 'PAF' FIELD gs_out-plnum. CALL TRANSACTION 'MD13' AND SKIP FIRST SCREEN. WHEN OTHERS. ENDCASE. WHEN 'TCLIP'. PERFORM alvtoclip IN PROGRAM zrpubform IF FOUND TABLES gt_out USING 'X'. WHEN 'REFRE'. PERFORM getdata. pv_field-row_stable = 'X'. pv_field-col_stable = 'X'. pv_field-refresh = 'X'. ENDCASE.ENDFORM.*---------------------------------------------------------------------** set fieldcat*---------------------------------------------------------------------*FORM catset TABLES t_fldcat USING pv_field pv_reftab pv_reffld pv_text. DATA: ls_fldcat TYPE lvc_s_fcat.
ls_fldcat-fieldname = pv_field. "字段名 ls_fldcat-scrtext_l = pv_text. "长描述 ls_fldcat-coltext = pv_text. "列描述 ls_fldcat-ref_table = pv_reftab. "参考表名 ls_fldcat-ref_field = pv_reffld. "参考字段名 ls_fldcat-col_opt = 'A'. "自动优化列宽
CASE ls_fldcat-fieldname. WHEN 'GSMNG'. ls_fldcat-qfieldname = 'MEINS'. ls_fldcat-no_zero = 'X'. WHEN 'MENGE'. ls_fldcat-qfieldname = 'MEINS'. ls_fldcat-no_zero = 'X'. WHEN 'WRBTR'. ls_fldcat-cfieldname = 'WAERS'. WHEN 'LIFNR' OR 'AUFNR' OR 'KUNNR'. ls_fldcat-edit_mask = '==ALPHA'. WHEN 'MATNR' OR 'IDNRK'. ls_fldcat-edit_mask = '==MATN1'. WHEN 'MEINS' . ls_fldcat-edit_mask = '==CUNIT'. ENDCASE.
APPEND ls_fldcat TO t_fldcat. CLEAR ls_fldcat.ENDFORM.几点说明:
1、使用函数的方式实现。如果仅仅是显示数据,或者有简单的交互,没有必须使用OO ALV,简洁高效是永远的神。
2、为了程序的扩展方便,以及能兼容OO ALV的参数定义,请使用REUSE_ALV_GRID_DISPLAY_LVC代替 REUSE_ALV_G
RID_DISPLAY,如无特殊场合,请勿再使用REUSE_ALV_GRID_DISPLAY。
3、权限检查放到PAI里面,即AT SELECTION-SCREEN事件,方便E类型MESSAGE的使用。
GS_等),内表考虑到扩展检查,没有使用带表头内表,因为CLASS内不允许使用带表头内表,所以请尽量减少带表头内表使用。
5、Status使用事务码SE41复制于程序SAPLKKBL的状态STANDARD_FULLSCREEN。如果想完整的连同翻译一起复制,请复制整个用户接口,而不是仅仅一个状态。复制完再删除没用的Status即可。
6、给Fieldcat赋值,请务必不要使用宏。根据我多年积累的经验,赋值的子程序使用字段名、参考表、参考字段、列名,这四个是最适合的,如果有例外,在FORM内根据列名处理例外。
Fieldcat使用参数col_opt实现,而不是layout的参数cwidth_opt实现。原因是前者可以把控制列宽优化细化到每一列,而且在ALV更改刷新后可以自动对有长度更改的列做列宽优化。
8、如果有翻译的需求, Fieldcat的列名赋值请使用 'XXXXX'(F01)
这种方式,而不要用TEXT-001这种方式,因为你也不知道TEXT-001是什么内容,还得双击一下进入到文本元素界面去看,其他文本亦是如此。
9、如无必要,SELECT的FROM部分,请务必不要使用AS语句,如果JOIN的表比较多的情况更是如此,谁也记不清A~ B~ C~ D~...是哪个表。
如下例:
改成:
立刻结构就清晰多了,看上去也赏心悦目。
10、TOCLIP功能很好用,可以直接复制ALV的表和抬头文本到剪贴板,如果用户选中了某几个列,则只复制选中列的内容。这个代码一般放到公用的子程序池程序中。
*&---------------------------------------------------------------------**& ALV内容复制到剪贴板*&----------------------------------
...