REPORT zqm_mm_qmview_mass_update. *---------------------------------------------------------------------* * QM Material Master QM View Mass Update (MARC / QMAT) * 목적: Plant 단위 QM View 핵심 값을 대량 반영하는 CBO 샘플 * 주의: MARC/QMAT 직접 UPDATE는 SAP 표준 로직을 우회합니다. * 반드시 TEST MODE로 검증 후 개발/품질 시스템에서 사용하십시오. *---------------------------------------------------------------------* TABLES: marc, qmat. PARAMETERS: p_marc TYPE rlgrap-filename OBLIGATORY, p_qmat TYPE rlgrap-filename OBLIGATORY, p_test AS CHECKBOX DEFAULT 'X'. TYPES: BEGIN OF ty_marc_in, matnr TYPE marc-matnr, werks TYPE marc-werks, qmatv TYPE marc-qmatv, END OF ty_marc_in. TYPES: BEGIN OF ty_qmat_in, matnr TYPE qmat-matnr, werks TYPE qmat-werks, art TYPE qmat-art, aktiv TYPE qmat-aktiv, apa TYPE qmat-apa, END OF ty_qmat_in. TYPES: BEGIN OF ty_log, table_name TYPE char10, matnr TYPE matnr, werks TYPE werks_d, art TYPE qmat-art, status TYPE char10, message TYPE string, END OF ty_log. DATA: gt_marc TYPE STANDARD TABLE OF ty_marc_in, gt_qmat TYPE STANDARD TABLE OF ty_qmat_in, gt_log TYPE STANDARD TABLE OF ty_log. AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_marc. PERFORM f4_file CHANGING p_marc. AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_qmat. PERFORM f4_file CHANGING p_qmat. START-OF-SELECTION. PERFORM upload_marc. PERFORM upload_qmat. PERFORM update_marc. PERFORM update_qmat. IF p_test = abap_true. ROLLBACK WORK. ELSE. COMMIT WORK AND WAIT. ENDIF. PERFORM display_log. FORM f4_file CHANGING cv_file TYPE rlgrap-filename. DATA lv_file TYPE string. CALL FUNCTION 'F4_FILENAME' IMPORTING file_name = lv_file. cv_file = lv_file. ENDFORM. FORM upload_marc. DATA lt_lines TYPE STANDARD TABLE OF string. DATA lv_line TYPE string. DATA ls_marc TYPE ty_marc_in. cl_gui_frontend_services=>gui_upload( EXPORTING filename = CONV string( p_marc ) filetype = 'ASC' CHANGING data_tab = lt_lines ). LOOP AT lt_lines INTO lv_line FROM 2. CLEAR ls_marc. SPLIT lv_line AT ',' INTO ls_marc-matnr ls_marc-werks ls_marc-qmatv. CONDENSE ls_marc-matnr NO-GAPS. CONDENSE ls_marc-werks NO-GAPS. APPEND ls_marc TO gt_marc. ENDLOOP. ENDFORM. FORM upload_qmat. DATA lt_lines TYPE STANDARD TABLE OF string. DATA lv_line TYPE string. DATA ls_qmat TYPE ty_qmat_in. cl_gui_frontend_services=>gui_upload( EXPORTING filename = CONV string( p_qmat ) filetype = 'ASC' CHANGING data_tab = lt_lines ). LOOP AT lt_lines INTO lv_line FROM 2. CLEAR ls_qmat. SPLIT lv_line AT ',' INTO ls_qmat-matnr ls_qmat-werks ls_qmat-art ls_qmat-aktiv ls_qmat-apa. CONDENSE ls_qmat-matnr NO-GAPS. CONDENSE ls_qmat-werks NO-GAPS. CONDENSE ls_qmat-art NO-GAPS. APPEND ls_qmat TO gt_qmat. ENDLOOP. ENDFORM. FORM update_marc. LOOP AT gt_marc INTO DATA(ls_in). SELECT SINGLE matnr FROM marc WHERE matnr = @ls_in-matnr AND werks = @ls_in-werks INTO @DATA(lv_matnr). IF sy-subrc <> 0. APPEND VALUE #( table_name = 'MARC' matnr = ls_in-matnr werks = ls_in-werks status = 'ERROR' message = 'Plant material does not exist in MARC' ) TO gt_log. CONTINUE. ENDIF. IF p_test = abap_false. UPDATE marc SET qmatv = @ls_in-qmatv WHERE matnr = @ls_in-matnr AND werks = @ls_in-werks. ENDIF. APPEND VALUE #( table_name = 'MARC' matnr = ls_in-matnr werks = ls_in-werks status = COND #( WHEN p_test = abap_true THEN 'TEST' ELSE 'UPDATED' ) message = |MARC-QMATV -> { ls_in-qmatv }| ) TO gt_log. ENDLOOP. ENDFORM. FORM update_qmat. LOOP AT gt_qmat INTO DATA(ls_in). SELECT SINGLE matnr FROM qmat WHERE matnr = @ls_in-matnr AND werks = @ls_in-werks AND art = @ls_in-art INTO @DATA(lv_matnr). IF sy-subrc <> 0. APPEND VALUE #( table_name = 'QMAT' matnr = ls_in-matnr werks = ls_in-werks art = ls_in-art status = 'ERROR' message = 'Inspection setup does not exist in QMAT' ) TO gt_log. CONTINUE. ENDIF. IF p_test = abap_false. UPDATE qmat SET aktiv = @ls_in-aktiv, apa = @ls_in-apa WHERE matnr = @ls_in-matnr AND werks = @ls_in-werks AND art = @ls_in-art. ENDIF. APPEND VALUE #( table_name = 'QMAT' matnr = ls_in-matnr werks = ls_in-werks art = ls_in-art status = COND #( WHEN p_test = abap_true THEN 'TEST' ELSE 'UPDATED' ) message = |QMAT-AKTIV -> { ls_in-aktiv }, QMAT-APA -> { ls_in-apa }| ) TO gt_log. ENDLOOP. ENDFORM. FORM display_log. DATA lo_alv TYPE REF TO cl_salv_table. TRY. cl_salv_table=>factory( IMPORTING r_salv_table = lo_alv CHANGING t_table = gt_log ). lo_alv->get_columns( )->set_optimize( abap_true ). lo_alv->display( ). CATCH cx_salv_msg INTO DATA(lx_salv). MESSAGE lx_salv->get_text( ) TYPE 'I'. ENDTRY. ENDFORM. *---------------------------------------------------------------------* * CSV 입력 형식 * MARC : MATNR,WERKS,QMATV * QMAT : MATNR,WERKS,ART,AKTIV,APA * * Table-Field * MARC-MATNR / MARC-WERKS : Material + Plant Key * MARC-QMATV : QM Inspection Setup Indicator * QMAT-MATNR / WERKS / ART: Inspection Setup Key * QMAT-AKTIV : Active * QMAT-APA : Preferred Inspection Type *---------------------------------------------------------------------*