整体主要分两个步骤:1.在查询的ALV状态栏新增按钮2.找到增强点实现打印逻辑
- 新增按钮到ALV输出界面
由于我查找COOIS的时候 只发现了一个增强点WORKORDER_INFOSYSTEM,这里里提供的接口我没找到可以添加按钮的方法,所以我是在它的输出alv的类CL_COIS_DISP_LIST的HANDLE_TOOLBAR中做了隐式增强从而添加按钮。
2.创建增强实施
事务码SE18创建实施ZENH_COOIS_PRINT
在AT_OUTPUT_SCREEN_LAY方法中填写按钮打印逻辑
因为要获取输出界面ALV的数据,所以调用了 CL_GUI_ALV_GRID的友元CL_SALV_GUI_GRID_FACADE->if_salv_gui_grid_data_source~get_r_appl_dat获取界面输出数据
METHOD if_ex_workorder_infosystem~at_output_screen_lay.
DATA lv_space TYPE char10.
DATA lt_ioheader TYPE STANDARD TABLE OF ioheader WITH DEFAULT KEY.
DATA lt_iooper TYPE STANDARD TABLE OF iooper WITH DEFAULT KEY.
DATA lt_prd_data TYPE STANDARD TABLE OF ioheader WITH DEFAULT KEY.
DATA lt_coois_prdlist TYPE STANDARD TABLE OF zspp_coois_prdlist WITH DEFAULT KEY.
DATA lo_logger TYPE REF TO if_salv_logger.
DATA(lo_salv) = NEW cl_salv_gui_grid_facade( o_grid = io_alv_grid o_logger = lo_logger ).
FIELD-SYMBOLS:<ft_data> TYPE table.
IF cv_ucomm EQ 'BPRINT' AND iv_after_ucomm EQ 'X'.
" IMPORT lt_ioheader = lt_ioheader FROM MEMORY ID 'COOIS_ALV_OUTPUT'.
"IMPORT ioheader_tab = lt_ioheader FROM MEMORY ID 'IOA05'.
DATA(lt_data) = lo_salv->if_salv_gui_grid_data_source~get_r_appl_data( ).
ASSIGN lt_data->* TO <ft_data>.
MOVE-CORRESPONDING <ft_data> TO lt_ioheader.
io_alv_grid->get_selected_rows( IMPORTING et_index_rows = DATA(lt_index_rows) et_row_no = DATA(lt_row_no) ).
DESCRIBE TABLE lt_index_rows LINES DATA(lv_lines).
IF lv_lines EQ 0.
MESSAGE '请至少选择一条需要打印的订单'(001) TYPE 'S' DISPLAY LIKE 'E'.
ELSE.
LOOP AT lt_index_rows INTO DATA(ls_row)..
READ TABLE lt_ioheader INTO DATA(ls_ioheader) INDEX ls_row-index.
IF sy-subrc EQ 0.
APPEND ls_ioheader TO lt_prd_data.
ENDIF.
CLEAR ls_ioheader.
ENDLOOP.
SELECT DISTINCT afko~aufnr,afvc~steus, afpo~matnr,afko~gamng, afko~gmein,
afvc~vornr, afvc~ltxa1,crhd~arbpl,afvv~vgw01,afvv~vge01,
CASE afvc~steus
WHEN 'ZN04' THEN afvc~ltxa1
ELSE makt~maktx
END AS maktx
FROM afko AS afko
INNER JOIN afpo AS afpo ON afko~aufnr = afpo~aufnr
INNER JOIN @lt_prd_data AS prd ON afko~aufnr = prd~aufnr
LEFT JOIN makt AS makt ON afpo~matnr = makt~matnr AND spras = @sy-langu
LEFT JOIN afvc AS afvc ON afko~aufpl = afvc~aufpl
LEFT JOIN afvv AS afvv ON afvc~aufpl = afvv~aufpl AND afvc~aplzl = afvv~aplzl
LEFT JOIN crhd AS crhd ON afvc~arbid = crhd~objid AND crhd~objty = 'A'
INTO CORRESPONDING FIELDS OF TABLE @lt_coois_prdlist.
LOOP AT lt_coois_prdlist ASSIGNING FIELD-SYMBOL(<fs_prd>).
<fs_prd>-matnr = COND #( WHEN <fs_prd>-steus EQ 'ZN04' THEN '' ELSE <fs_prd>-matnr ).
<fs_prd>-printdate = |{ sy-datum DATE = ISO }|.
<fs_prd>-quantity = |{ <fs_prd>-gamng } { <fs_prd>-gmein }|.
<fs_prd>-worktime = |{ <fs_prd>-vgw01 } { <fs_prd>-vge01 }|.
<fs_prd>-vornr_int = <fs_prd>-vornr.
<fs_prd>-vornr = <fs_prd>-vornr_int.
ENDLOOP.
SORT lt_coois_prdlist BY aufnr vornr_int.
CALL FUNCTION 'ZPP_COOIS_BATCHPRINT'
EXPORTING
it_prdinf = lt_coois_prdlist.
ENDIF.
" ENDIF.
ENDIF.
ENDMETHOD.
FUNCTION zpp_coois_batchprint.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(IT_PRDINF) TYPE ZTPP_COOIS_PRDLIST
*"----------------------------------------------------------------------
DATA ls_cont TYPE ssfctrlop.
DATA lc_output_options TYPE ssfcompop.
DATA fm_name TYPE rs38l_fnam.
DATA lt_prdtemp TYPE STANDARD TABLE OF zspp_coois_prdlist WITH DEFAULT KEY.
DATA lv_index TYPE int4.
ls_cont-no_open = 'X'.
ls_cont-no_close = 'X'.
CALL FUNCTION 'SSF_OPEN'
EXPORTING
output_options = lc_output_options
control_parameters = ls_cont
EXCEPTIONS
formatting_error = 1
internal_error = 2
send_error = 3
user_canceled = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
formname = 'ZCOOIS_PRINT'
variant = ''
direct_call = ''
IMPORTING
fm_name = fm_name
EXCEPTIONS
no_form = 1
no_function_module = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
DATA(lt_prdinf) = it_prdinf.
LOOP AT lt_prdinf INTO DATA(ls_prd).
LOOP AT lt_prdinf INTO DATA(ls_prd1).
lv_index = sy-tabix.
IF ls_prd1-aufnr NE ls_prd-aufnr OR ls_prd1-steus EQ 'ZN04'.
EXIT.
ENDIF.
APPEND ls_prd1 TO lt_prdtemp.
DELETE lt_prdinf INDEX lv_index.
CLEAR ls_prd1.
ENDLOOP.
CALL FUNCTION fm_name
EXPORTING
control_parameters = ls_cont
user_settings = 'X'
it_prd = lt_prdtemp
is_prd = ls_prd
EXCEPTIONS
formatting_error = 1
internal_error = 2
send_error = 3
user_canceled = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
CLEAR: lt_prdtemp[],ls_prd1,ls_prd.
ENDLOOP.
CALL FUNCTION 'SSF_CLOSE'
EXCEPTIONS
formatting_error = 1
internal_error = 2
send_error = 3
OTHERS = 4.
ENDFUNCTION.
打印结果如下:
- COOIS 生产订单系统报表选择工序时新增物料及物料描述显示
1、显示结构添加新增字段CI_IOOPER
2、上述增强实施中TABLES_MODIFY_LAY方法中新增取数逻辑
IF is_tcoa-oper_sel EQ 'X'."当选择工序时
SELECT DISTINCT afko~aufnr,afko~stlbez AS zzmatnr,makt~maktx AS zzmatxt,makt~spras
FROM afko AS afko
INNER JOIN @ct_iooper AS iooper ON afko~aufnr = iooper~aufnrd
LEFT JOIN makt AS makt ON afko~plnbez = makt~matnr
INTO TABLE @DATA(lt_afko).
SORT lt_afko BY aufnr spras.
SELECT afpo~aufnr,afpo~matnr,makt~maktx,makt~spras
FROM afpo AS afpo
INNER JOIN @lt_afko AS afko ON afpo~aufnr = afko~aufnr
LEFT JOIN makt AS makt ON afpo~matnr = makt~matnr
INTO TABLE @DATA(lt_afpo).
SORT lt_afpo BY aufnr spras.
ENDIF.
LOOP AT ct_iooper ASSIGNING FIELD-SYMBOL(<fs_iooper>).
READ TABLE lt_afko INTO DATA(ls_afko) WITH KEY aufnr = <fs_iooper>-aufnrd spras = sy-langu BINARY SEARCH.
IF sy-subrc NE 0.
READ TABLE lt_afko INTO ls_afko WITH KEY aufnr = <fs_iooper>-aufnrd BINARY SEARCH.
ENDIF.
IF ls_afko-zzmatnr IS NOT INITIAL.
<fs_iooper>-zzmatnr = ls_afko-zzmatnr.
<fs_iooper>-zzmatxt = ls_afko-zzmatxt.
ELSE.
READ TABLE lt_afpo INTO DATA(ls_afpo) WITH KEY aufnr = <fs_iooper>-aufnrd spras = sy-langu BINARY SEARCH.
IF sy-subrc EQ 0.
ELSE.
READ TABLE lt_afpo INTO ls_afpo WITH KEY aufnr = <fs_iooper>-aufnrd BINARY SEARCH.
ENDIF.
<fs_iooper>-zzmatnr = ls_afpo-matnr.
<fs_iooper>-zzmatxt = ls_afpo-maktx.
ENDIF.
CLEAR:ls_afko,ls_afpo.
ENDLOOP.
3、更改显示布局添加显示字段