1.首頁
INCLUDE Z_MAT_TOP. "数据定义
INCLUDE Z_YY_E01. "选择事件
INCLUDE Z_YY_F01. "子例程
2.数据定义
*&---------------------------------------------------------------------*
*& Include Z_MAT_TOP
*&---------------------------------------------------------------------*
TABLES:mara , makt.
* reuse_alv_list_display用法的命名
DATA: "lt_fieldcat TYPE slis_t_fieldcat_alv, " 列名内表宏
ls_fieldcat TYPE slis_fieldcat_alv, " 结构 列名工作区、
ls_layout TYPE slis_layout_alv. " 结构 alv全局属性
*定義結構
TYPES: BEGIN OF ty_mat,
* icon_mark type icon-internal,
* sel(1),
* ckbox as checkbox,
status type char04, "状态
matnr TYPE mara-matnr,
maktx TYPE makt-maktx,
mtart TYPE mara-mtart,
matkl TYPE mara-matkl,
ernam TYPE mara-ernam,
ersda TYPE mara-ersda,
laeda TYPE mara-laeda,
aenam TYPE mara-aenam,
lvorm TYPE mara-lvorm,
END OF ty_mat.
DATA: lt_mat TYPE TABLE OF ty_mat,
wa_mat TYPE ty_mat,
lt_mat1 TYPE TABLE OF ty_mat,
wa_mat1 TYPE ty_mat,
git_mot TYPE TABLE OF ty_mat,
wa_mot TYPE ty_mat.
include <icon>.
constants: light_r LIKE icon-internal VALUE '@0A@',"红灯
light_y LIKE icon-internal VALUE '@09@',"黄灯
light_g LIKE icon-internal VALUE '@08@',"绿灯
light_non LIKE icon-internal VALUE '@EB@'."全熄灭
DATA is_variant LIKE disvariant.
DATA: ls_setting TYPE lvc_s_glay.
DATA: headdata LIKE bapimathead.
DATA: maktdesc TYPE TABLE OF bapi_makt WITH HEADER LINE.
DATA: return TYPE bapiret2,
g_no_changes TYPE c.
DATA: lt_sval TYPE TABLE OF sval WITH HEADER LINE,
ls_sval TYPE sval.
DATA l_return_code TYPE C.
DATA: lr_grid TYPE REF TO cl_gui_alv_grid.
SELECTION-SCREEN BEGIN OF BLOCK bk1 WITH FRAME TITLE TEXT-t01.
SELECT-OPTIONS:
cons1 FOR mara-matnr, "'物料符号
cons2 FOR mara-mtart , "'物料类型'
cons3 FOR mara-matkl. "'物料组'
SELECTION-SCREEN END OF BLOCK bk1.
3.选择事件
INITIALIZATION.
AT SELECTION-SCREEN.
START-OF-SELECTION.
PERFORM display_alv.
END-OF-SELECTION.
4.function
FORM display_alv.
*抓取数据资料
SELECT * FROM mara AS a INNER JOIN makt AS b ON a~matnr = b~matnr INTO CORRESPONDING FIELDS OF TABLE lt_mat UP TO 50 ROWS
WHERE b~spras = sy-langu
AND a~matnr IN cons1 AND a~matkl IN cons3 AND a~mtart IN cons2 .
IF lt_mat IS NOT INITIAL.
lt_mat1[] = lt_mat.
ENDIF.
*alv定義報表格式
DATA: fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.
DEFINE fieldcatset. " 定义宏来设置fieldcat属性
CLEAR fieldcat.
fieldcat-fieldname = &1.
fieldcat-seltext_l = &2.
* fieldcat-outputlen = &3.
fieldcat-edit = &4.
fieldcat-no_out = &3.
fieldcat-icon = 'X'. " 图标功能
APPEND fieldcat.
END-OF-DEFINITION.
fieldcatset 'STATUS' '状态' '10' 'X'.
fieldcatset 'MATNR' '物料符号' '40' ''.
fieldcatset 'MAKTX' '物料描述' '20' 'X' .
fieldcatset 'MTART' '物料类型' '20' '' .
fieldcatset 'MATKL' '物料组' '20' '' .
fieldcatset 'ERNAM' '物料创建人' '20' '' .
fieldcatset 'CREATE_AT_TIME' '物料创建日期时间' '20' '' .
fieldcatset 'AENAM' '物料修改人' '20' '' .
fieldcatset 'LAEDA' '物料修改日期时间' '20' '' .
fieldcatset 'LVORM' '冻结标识' '20' '' .
*alv 控制
ls_setting-edt_cll_cb = 'X'. "实现编辑单元格后,返回给程序编辑后的值
ls_layout-zebra = 'X'. "交替顏色
* ls_layout-detail_popup = 'X'. "是否出現詳細信息窗口
* ls_layout-detail_titlebar = '詳細信息'. "
* ls_layout-f2code = '&ETA'. "&ETA雙擊 出現詳細信息.
ls_layout-colwidth_optimize = 'X'. "優化列寬
*制作红绿灯
LOOP AT lt_mat into wa_mat.
if wa_mat-matnr <= '1760'.
wa_mat-status = '@0A@'.
endif.
if wa_mat-matnr > '1760' and wa_mat-matnr <= '1775'.
wa_mat-status = '@09@'.
endif.
if wa_mat-matnr > '1775'.
wa_mat-status = '@08@'.
endif.
modify lt_mat from wa_mat.
ENDLOOP.
* 定义事件
*ALVX
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_bypassing_buffer = 'X'
i_callback_program = sy-repid
i_callback_pf_status_set = 'SET_PF_STATUS'
i_callback_user_command = 'USER_COMMAND'
i_callback_top_of_page = 'FORM_TOP_OF_PAGE'
i_grid_title = 'ALV TEST'
i_grid_settings = ls_setting "設置保存 "实现编辑单元格后,返回给程序编辑后的值
is_layout = ls_layout
it_fieldcat = fieldcat[]
i_default = 'X'
i_save = 'A'
is_variant = is_variant
TABLES
t_outtab = lt_mat
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.
FORM user_command USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield.
DATA: lr_grid TYPE REF TO cl_gui_alv_grid.
DATA: lt_rows TYPE lvc_t_row WITH HEADER LINE.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lr_grid.
CALL METHOD lr_grid->check_changed_data.
rs_selfield-refresh = 'X'. "更新修改后的数据至内表 CASE r_ucomm.
case r_ucomm.
WHEN 'ZSAVE'.
PERFORM frm_save_data.
WHEN '&IC1'. "
MESSAGE 'double click!' TYPE 'S'.
PERFORM popup_save_data. "USING rs_selfield-tabindex rs_selfield-fieldname rs_selfield-value USING r_ucomm rs_selfield
WHEN OTHERS.
ENDCASE.
CALL METHOD lr_grid->check_changed_data.
rs_selfield-refresh = 'X'. "更新修改后的数据至内表
* lr_grid->set_frontend_layout( is_layout = ls_layout ).
"Refresh ALV display
* lr_grid->refresh_table_display( is_stable = VALUE lvc_s_stbl( row = 'X' col = 'X' ) ).
ENDFORM.
FORM set_pf_status USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'STANDARD'. "SE37 --> SALV --> SE41 SAPLSALV
ENDFORM.
**调用自定义按钮事件 刷新alV
*&---------------------------------------------------------------------*
*& Form popup_save_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM popup_save_data. "USING p_tabindex p_fieldname p_value USING r_ucomm rs_selfield
*DATA FIELDS TYPE STANDARD TABLE OF SVAL.
* matnr TYPE mara-matnr,
* maktx TYPE makt-maktx,
* mtart TYPE mara-mtart,
CLEAR: ls_sval,lt_sval,lt_sval[].
ls_sval-tabname = 'MARA'.
ls_sval-fieldname = 'MATNR'. "'MTART '. " AKTX
* ls_sval-value = p_value.
ls_sval-field_obl = 'X'.
APPEND ls_sval TO lt_sval.
CLEAR ls_sval.
ls_sval-tabname = 'MAKT'.
ls_sval-fieldname = 'MAKTX'.
ls_sval-field_obl = 'X'.
APPEND ls_sval TO lt_sval.
CLEAR ls_sval.
ls_sval-tabname = 'MARA'.
ls_sval-fieldname = 'MTART'.
ls_sval-field_obl = 'X'.
APPEND ls_sval TO lt_sval.
CALL FUNCTION 'POPUP_GET_VALUES'
EXPORTING
* NO_VALUE_CHECK = ' '
popup_title = '物料描述'
* START_COLUMN = '5'
* START_ROW = '5'
IMPORTING
returncode = l_return_code
TABLES
fields = lt_sval
EXCEPTIONS
error_in_fields = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
CLEAR headdata.
READ TABLE lt_sval WITH KEY fieldname = 'MATNR'.
IF sy-subrc = 0.
headdata-material = lt_sval-value.
headdata-basic_view = 'X'.
ENDIF.
CLEAR maktdesc[].
READ TABLE lt_sval WITH KEY fieldname = 'MAKTX'.
IF sy-subrc = 0.
maktdesc-langu = sy-langu.
maktdesc-matL_desc = lt_sval-value.
APPEND maktdesc TO maktdesc[].
ENDIF.
READ TABLE lt_sval WITH KEY fieldname = 'MTART'.
IF sy-subrc = 0.
headdata-matl_type = lt_sval-value.
headdata-basic_view = 'W'.
ENDIF.
* 数据回写
IF l_return_code <> 'A'. " A 取消
* CLEAR return.
CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA'
EXPORTING
headdata = headdata
IMPORTING
return = return
TABLES
materialdescription = maktdesc.
IF return-type NE 'E'.
MESSAGE 'ok!' TYPE 'S'.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.
WRITE : / return-type , return-message.
MOVE headdata-material TO wa_mat-matnr .
MOVE maktdesc-matL_desc TO wa_mat-maktx .
MOVE headdata-matl_type TO wa_mat-mtart .
modify lt_mat from wa_mat transporting maktx where matnr = headdata-material .
* update lt_mat set MAKTX = maktdesc-matL_desc
* where matnr = headdata-material ."mtart = headdata-matl_type.
ENDIF.
ENDFORM.
FORM frm_save_data.
CALL FUNCTION 'CTVB_COMPARE_TABLES'
EXPORTING
table_old = lt_mat1
table_new = lt_mat
key_length = 40
IMPORTING
table_mod = git_mot
no_changes = g_no_changes.
IF g_no_changes IS INITIAL.
IF lt_mat1 IS NOT INITIAL.
LOOP AT git_mot INTO wa_mot.
CLEAR headdata.
headdata-material = wa_mot-matnr.
headdata-basic_view = 'X'.
CLEAR maktdesc[].
maktdesc-langu = sy-langu.
maktdesc-matl_desc = wa_mot-maktx.
APPEND maktdesc TO maktdesc[].
CLEAR return.
CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA'
EXPORTING
headdata = headdata
IMPORTING
return = return
TABLES
materialdescription = maktdesc.
IF return-type NE 'E'.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.
CLEAR wa_mot.
ENDLOOP.
WRITE : / return-type , return-message.
ENDIF.
ENDIF.
ENDFORM.
FORM form_top_of_page .
DATA lt_commentary TYPE slis_t_listheader.
DATA wa_commentary TYPE slis_listheader.
wa_commentary-typ = 'H'. "標題大小 H大 S中 A小
wa_commentary-info = '物料查询修改报表'.
APPEND wa_commentary TO lt_commentary.
CLEAR wa_commentary.
wa_commentary-typ = 'S'.
wa_commentary-info = '物料查询修改报表'.
APPEND wa_commentary TO lt_commentary.
CLEAR wa_commentary.
wa_commentary-typ = 'A'.
wa_commentary-info = '物料查询修改报表'.
APPEND wa_commentary TO lt_commentary.
CLEAR wa_commentary.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
it_list_commentary = lt_commentary
i_logo = 'Z1783_ALV'.
ENDFORM.