*&---------------------------------------------------------------------* *& Report ZGIB_DCV_REORG_DATA *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* REPORT zgib_dcv_reorg_data. TABLES: /gib/dcvt012, /gib/dcvt112, /gib/dcvt003, /gib/dcvt103_s, /gib/dcv_objtrn. SELECTION-SCREEN: BEGIN OF BLOCK bl1 WITH FRAME TITLE text-001. PARAMETERS: pa_vmi RADIOBUTTON GROUP vi USER-COMMAND setmode MODIF ID slm, pa_imv RADIOBUTTON GROUP vi MODIF ID slm. SELECT-OPTIONS: so_abnmr FOR /gib/dcvt012-abnmr MODIF ID vmi, so_lifnr FOR /gib/dcvt012-lifnr MODIF ID vmi, so_slabv FOR /gib/dcvt003-sc_label MODIF ID vmi, so_kunnr FOR /gib/dcvt112-kunnr MODIF ID imv, so_abnmi FOR /gib/dcvt112-abnmr MODIF ID imv, so_suppl FOR /gib/dcvt112-suppl MODIF ID imv, so_slabi FOR /gib/dcvt103_s-sc_label MODIF ID imv, so_matnr FOR /gib/dcvt012-matnr MODIF ID vmi, so_matni FOR /gib/dcvt112-matnr MODIF ID imv. SELECT-OPTIONS: so_objid FOR /gib/dcv_objtrn-objectid. SELECTION-SCREEN SKIP 1. SELECTION-SCREEN: END OF BLOCK bl1. SELECTION-SCREEN: BEGIN OF BLOCK bl2 WITH FRAME TITLE text-003. SELECTION-SCREEN: BEGIN OF BLOCK bl3 WITH FRAME. PARAMETERS: pa_avis AS CHECKBOX USER-COMMAND dummy MODIF ID vmi. PARAMETERS: pa_areo TYPE /gib/dcvt000-avis_reorg MODIF ID are. PARAMETERS: pa_mhist AS CHECKBOX USER-COMMAND dummy. PARAMETERS: pa_mreo TYPE /gib/dcvt000-datah_reorg MODIF ID mre. PARAMETERS: pa_limit AS CHECKBOX USER-COMMAND dummy. PARAMETERS: pa_lreo TYPE /gib/dcvt000-limits_reorg MODIF ID lre. SELECTION-SCREEN: END OF BLOCK bl3. PARAMETERS: pa_delxx AS CHECKBOX. PARAMETERS: pa_trans AS CHECKBOX MODIF ID npr. SELECTION-SCREEN: END OF BLOCK bl2. SELECTION-SCREEN BEGIN OF BLOCK bl99 WITH FRAME TITLE text-096 NO INTERVALS. SELECTION-SCREEN PUSHBUTTON /2(4) pinfo USER-COMMAND pinf MODIF ID noc. SELECTION-SCREEN COMMENT 7(54) gib_name. SELECTION-SCREEN COMMENT /7(54) gib_addr. SELECTION-SCREEN END OF BLOCK bl99. CLASS lcl_dprov DEFINITION ABSTRACT. PUBLIC SECTION. METHODS check_material ABSTRACT IMPORTING if_objid TYPE /gib/dcv_objid RAISING /gib/cx_dcv. ENDCLASS. CLASS lcl_dprov_vmi DEFINITION INHERITING FROM lcl_dprov. PUBLIC SECTION. METHODS: check_material REDEFINITION. ENDCLASS. CLASS lcl_dprov_imv DEFINITION INHERITING FROM lcl_dprov. PUBLIC SECTION. METHODS: check_material REDEFINITION. ENDCLASS. CLASS lcl_reorg DEFINITION ABSTRACT. PUBLIC SECTION. METHODS: constructor. METHODS: read_data ABSTRACT, process_data, * create_items ABSTRACT, * delete_data, delete_item IMPORTING ir_data TYPE REF TO /gib/cl_dcv_single_data, delete_invalid_data ABSTRACT, get_msg RETURNING VALUE(er_msg) TYPE REF TO /gib/if_msg_queue. PROTECTED SECTION. DATA: mr_msg TYPE REF TO /gib/if_msg_queue, mf_count TYPE i, mf_commit_count TYPE i. METHODS: transfer_data IMPORTING ir_data TYPE REF TO /gib/cl_dcv_single_data RAISING /gib/cx_dcv, get_label ABSTRACT RETURNING VALUE(ef_label) TYPE ddtext. ENDCLASS. CLASS lcl_flow DEFINITION. PUBLIC SECTION. CLASS-METHODS: at_initialization, at_pbo, at_pai, start_of_selection, get_dprov RETURNING VALUE(er_dprov) TYPE REF TO lcl_dprov, set_mode. PRIVATE SECTION. CLASS-DATA: gr_dprov TYPE REF TO lcl_dprov. CLASS-METHODS: reorg IMPORTING ir_reorg TYPE REF TO lcl_reorg. ENDCLASS. CLASS lcl_reorg_avis DEFINITION INHERITING FROM lcl_reorg. PUBLIC SECTION. METHODS: read_data REDEFINITION, process_data REDEFINITION, delete_invalid_data REDEFINITION, constructor IMPORTING if_horizon TYPE /gib/dcvt000-avis_reorg. TYPES: BEGIN OF ts_del, delid TYPE /gib/dcv_indel-delid, abnmr TYPE /gib/dcv_indel-abnmr, lifnr TYPE /gib/dcv_indel-lifnr, matnr TYPE /gib/dcv_indel-matnr, datum TYPE /gib/dcv_indel-datum, END OF ts_del. PROTECTED SECTION. METHODS get_label REDEFINITION. PRIVATE SECTION. DATA: mf_horizon TYPE /gib/dcvt000-avis_reorg, mt_avis TYPE TABLE OF ts_del, mt_invalid TYPE TABLE OF ts_del. ENDCLASS. CLASS lcl_reorg_limits DEFINITION INHERITING FROM lcl_reorg. PUBLIC SECTION. METHODS: read_data REDEFINITION, process_data REDEFINITION, delete_invalid_data REDEFINITION, constructor IMPORTING if_horizon TYPE /gib/dcvt000-limits_reorg. PROTECTED SECTION. METHODS: get_label REDEFINITION. PRIVATE SECTION. DATA: mf_horizon TYPE /gib/dcvt000-limits_reorg, mt_limit TYPE TABLE OF /gib/cl_dcv_mat_stock_limits=>ts_key, mt_invalid TYPE TABLE OF /gib/cl_dcv_mat_stock_limits=>ts_key. METHODS: check_limit_obsolete IMPORTING is_limit TYPE /gib/cl_dcv_mat_stock_limits=>ts_key RAISING /gib/cx_root. ENDCLASS. CLASS lcl_reorg_mathist DEFINITION INHERITING FROM lcl_reorg. PUBLIC SECTION. METHODS: read_data REDEFINITION, process_data REDEFINITION, delete_invalid_data REDEFINITION, constructor IMPORTING if_horizon TYPE /gib/dcvt000-datah_reorg. PROTECTED SECTION. METHODS: get_label REDEFINITION. PRIVATE SECTION. DATA: mf_horizon TYPE /gib/dcvt000-datah_reorg, mt_mhist TYPE SORTED TABLE OF /gib/cl_dcv_material_data_hist=>ts_key WITH UNIQUE KEY objectid_scmat erdat, mt_invalid TYPE TABLE OF /gib/cl_dcv_material_data_hist=>ts_key. ENDCLASS. CLASS lcl_flow IMPLEMENTATION. METHOD at_initialization. DATA(lf_repid) = sy-repid. TRY. * /gib/cl_dc_tools=>check_report_authority( lf_repid ). /gib/cl_dcv_authority_check=>authority_check( if_auth_object = 'TE' if_activity = '02' ). CATCH /gib/cx_dcv INTO DATA(lr_error). MESSAGE lr_error TYPE 'E'. LEAVE PROGRAM. ENDTRY. DATA(ls_inst) = /gib/cl_dcv_installation=>get_instance( )->get_data( ). pa_areo = ls_inst-avis_reorg. IF pa_areo IS INITIAL. pa_areo = 365. ENDIF. pa_lreo = ls_inst-limits_reorg. IF pa_lreo IS INITIAL. pa_lreo = 365. ENDIF. pa_mreo = ls_inst-datah_reorg. IF pa_mreo IS INITIAL. pa_mreo = 365. ENDIF. DATA(lr_inst) = /gib/cl_dcv_installation=>get_instance( ). IF pa_vmi = abap_false AND pa_imv = abap_false. IF lr_inst->is_vmi_active( ) <> lr_inst->is_imv_active( ). pa_vmi = lr_inst->is_vmi_active( ). pa_imv = lr_inst->is_imv_active( ). ELSE. pa_vmi = abap_true. pa_imv = abap_false. ENDIF. ENDIF. pa_avis = abap_true. pa_limit = abap_true. pa_mhist = abap_true. pa_delxx = abap_true. gib_name = /gib/cl_legal_notice=>get_copyright_notice( ). gib_addr = /gib/cl_legal_notice=>get_address_line( ). pinfo = icon_information. ENDMETHOD. METHOD at_pbo. DATA(lr_inst) = /gib/cl_dcv_installation=>get_instance( ). LOOP AT SCREEN. CASE screen-group1. WHEN 'ARE'. IF pa_avis = abap_false OR pa_vmi = abap_false. screen-active = 0. ENDIF. WHEN 'LRE'. IF pa_limit = abap_false. screen-active = 0. ENDIF. WHEN 'MRE'. IF pa_mhist = abap_false. screen-active = 0. ENDIF. WHEN 'SLM'. IF lr_inst->is_vmi_active( ) <> lr_inst->is_imv_active( ). screen-active = 0. ENDIF. WHEN 'VMI'. IF pa_vmi = abap_false. screen-active = 0. ENDIF. WHEN 'IMV'. IF pa_imv = abap_false. screen-active = 0. ENDIF. ENDCASE. MODIFY SCREEN. ENDLOOP. ENDMETHOD. METHOD at_pai. CASE sy-ucomm. WHEN 'SETMODE'. lcl_flow=>set_mode( ). WHEN 'PINF'. CALL FUNCTION '/GIB/DC_SHOW_INFO_WINDOW'. ENDCASE. ENDMETHOD. METHOD start_of_selection. DATA: lr_reorg TYPE REF TO lcl_reorg. DATA(lr_msg) = NEW /gib/cl_msg_queue( ). IF pa_avis = abap_true AND pa_vmi = abap_true. lr_reorg = NEW lcl_reorg_avis( pa_areo ). reorg( lr_reorg ). lr_msg->add_msg_queue( lr_reorg->get_msg( ) ). ENDIF. IF pa_mhist = abap_true. lr_reorg = NEW lcl_reorg_mathist( pa_mreo ). reorg( lr_reorg ). lr_msg->add_msg_queue( lr_reorg->get_msg( ) ). ENDIF. IF pa_limit = abap_true. lr_reorg = NEW lcl_reorg_limits( pa_lreo ). reorg( lr_reorg ). lr_msg->add_msg_queue( lr_reorg->get_msg( ) ). ENDIF. lr_msg->show( if_batch_list_type = /gib/if_msg_queue=>co_batch_list_type_spool ). ENDMETHOD. METHOD get_dprov. IF gr_dprov IS INITIAL. set_mode( ). ENDIF. er_dprov = gr_dprov. ENDMETHOD. METHOD set_mode. IF pa_vmi IS INITIAL AND pa_imv IS INITIAL. pa_vmi = abap_true. ENDIF. CASE abap_true. WHEN pa_vmi. gr_dprov = NEW lcl_dprov_vmi( ). WHEN pa_imv. gr_dprov = NEW lcl_dprov_imv( ). ENDCASE. ENDMETHOD. METHOD reorg. ir_reorg->read_data( ). ir_reorg->process_data( ). IF pa_delxx = abap_true. ir_reorg->delete_invalid_data( ). ENDIF. ENDMETHOD. ENDCLASS. CLASS lcl_reorg IMPLEMENTATION. METHOD constructor. mr_msg = NEW /gib/cl_msg_queue( ). ENDMETHOD. METHOD process_data. DATA: lf_dummy TYPE c. COMMIT WORK. DATA(lf_label) = get_label( ). MESSAGE s406(/gib/dcv) WITH lf_label mf_count INTO lf_dummy. mr_msg->add_symsg( ). ENDMETHOD. METHOD delete_item. CHECK ir_data IS BOUND. TRY. ir_data->set_updkz( EXPORTING if_updkz = /gib/cl_dcv_single_data=>co_updkz_delete EXCEPTIONS OTHERS = 1 ). IF sy-subrc <> 0. mr_msg->add_symsg( ). RETURN. ENDIF. ir_data->save_data( ). mf_count = mf_count + 1. mf_commit_count = mf_commit_count + 1. IF pa_trans = abap_true. transfer_data( ir_data ). ENDIF. CATCH /gib/cx_root INTO DATA(lr_error). mr_msg->add_exception_msg( lr_error ). ENDTRY. ir_data->set_updkz( EXPORTING if_updkz = /gib/cl_dcv_single_data=>co_updkz_no_update EXCEPTIONS OTHERS = 0 ). IF mf_commit_count > 1000. COMMIT WORK. CLEAR: mf_commit_count. ENDIF. ir_data->free( ). ENDMETHOD. METHOD get_msg. er_msg = mr_msg. ENDMETHOD. METHOD transfer_data. DATA: lt_data TYPE /gib/dcv_instance_t, lf_filename TYPE /gib/dcv_fname. lf_filename = ir_data->get_io_name( ). APPEND INITIAL LINE TO lt_data ASSIGNING FIELD-SYMBOL(). -data_r = ir_data. -keyval = ir_data->get_key_val( ). -objectid = ir_data->get_object_id( ). /gib/cl_dcv_tools=>upload_items( it_data = lt_data if_filename = lf_filename ). ENDMETHOD. ENDCLASS. CLASS lcl_reorg_avis IMPLEMENTATION. METHOD constructor. super->constructor( ). mf_horizon = if_horizon. ENDMETHOD. METHOD read_data. DATA: lf_datum TYPE sy-datum, lf_dummy TYPE c, lr_sc_mat TYPE REF TO /gib/cl_dcv_sc_material. lf_datum = sy-datum - mf_horizon. DATA(lf_label) = get_label( ). SELECT abnmr lifnr matnr delid datum FROM /gib/dcv_indel INTO CORRESPONDING FIELDS OF TABLE mt_avis WHERE delid IN so_objid AND abnmr IN so_abnmr AND lifnr IN so_lifnr AND matnr IN so_matnr AND datum < lf_datum AND ( delivery_stat = /gib/cl_dcv_delivery=>co_status_delivered OR delivery_stat = /gib/cl_dcv_delivery=>co_status_delivery_rejected OR delivery_stat = /gib/cl_dcv_delivery=>co_status_receipt_rejected ). DATA(lf_total) = sy-dbcnt. MESSAGE s407(/gib/dcv) WITH lf_label lf_total INTO lf_dummy. mr_msg->add_symsg( ). IF so_slabv[] IS NOT INITIAL. LOOP AT mt_avis ASSIGNING FIELD-SYMBOL(). lr_sc_mat ?= /gib/cl_dcv_sc_material=>get_instance( if_abnmr = -abnmr if_lifnr = -lifnr if_matnr = -matnr ). IF lr_sc_mat IS NOT BOUND. APPEND TO mt_invalid. DELETE mt_avis. CONTINUE. ENDIF. TRY. lcl_flow=>get_dprov( )->check_material( lr_sc_mat->get_object_id( ) ). CATCH /gib/cx_dcv. DELETE mt_avis. ENDTRY. ENDLOOP. ENDIF. DATA(lf_del) = lines( mt_avis ). MESSAGE s408(/gib/dcv) WITH lf_label lf_del lf_total INTO lf_dummy. mr_msg->add_symsg( ). ENDMETHOD. METHOD process_data. LOOP AT mt_avis ASSIGNING FIELD-SYMBOL(). DATA(lr_data) = /gib/cl_dcv_delivery=>get_instance( if_delid = -delid ). delete_item( lr_data ). ENDLOOP. super->process_data( ). ENDMETHOD. METHOD delete_invalid_data. DATA: lf_count TYPE i, lf_dummy TYPE c. LOOP AT mt_invalid ASSIGNING FIELD-SYMBOL(). DELETE FROM /gib/dcv_indel WHERE delid = -delid. IF sy-subrc = 0. lf_count = lf_count + 1. ENDIF. ENDLOOP. DATA(lf_label) = get_label( ). lf_label = lf_label && | (| && 'ungültige'(002) && ')'. MESSAGE s406(/gib/dcv) WITH lf_label lf_count INTO lf_dummy. mr_msg->add_symsg( ). ENDMETHOD. METHOD get_label. SELECT SINGLE descript FROM seoclasstx INTO ef_label "#EC CI_SUBRC WHERE clsname = '/GIB/CL_DCV_DELIVERY' AND langu = sy-langu. ENDMETHOD. ENDCLASS. CLASS lcl_reorg_limits IMPLEMENTATION. METHOD constructor. super->constructor( ). mf_horizon = if_horizon. ENDMETHOD. METHOD read_data. DATA: lf_datum TYPE sy-datum, lf_dummy TYPE c. lf_datum = sy-datum - mf_horizon. DATA(lf_label) = get_label( ). SELECT objectid_scmat erdat lfdnr FROM /gib/dcv_stklmt INTO CORRESPONDING FIELDS OF TABLE mt_limit WHERE objectid_scmat IN so_objid AND erdat < lf_datum. DATA(lf_total) = sy-dbcnt. MESSAGE s407(/gib/dcv) WITH lf_label lf_total INTO lf_dummy. mr_msg->add_symsg( ). SORT mt_limit BY objectid_scmat erdat ASCENDING. LOOP AT mt_limit ASSIGNING FIELD-SYMBOL(). TRY. lcl_flow=>get_dprov( )->check_material( -objectid_scmat ). check_limit_obsolete( ). CATCH /gib/cx_dcv_not_found. APPEND TO mt_invalid. DELETE mt_limit. CATCH /gib/cx_root. DELETE mt_limit. ENDTRY. ENDLOOP. DATA(lf_del) = lines( mt_limit ). MESSAGE s408(/gib/dcv) WITH lf_label lf_del lf_total INTO lf_dummy. mr_msg->add_symsg( ). ENDMETHOD. METHOD process_data. LOOP AT mt_limit ASSIGNING FIELD-SYMBOL(). DATA(lr_data) = /gib/cl_dcv_mat_stock_limits=>get_instance( if_objectid_scmat = -objectid_scmat if_erdat = -erdat if_lfdnr = -lfdnr ). delete_item( lr_data ). ENDLOOP. super->process_data( ). ENDMETHOD. METHOD check_limit_obsolete. DATA: lt_mhist TYPE TABLE OF /gib/cl_dcv_material_data_hist=>ts_key. DATA: lt_limit TYPE TABLE OF /gib/dcv_stklmt. SELECT * FROM /gib/dcv_stklmt INTO TABLE lt_limit. SELECT SINGLE COUNT(*) FROM /gib/dcv_stklmt WHERE objectid_scmat = is_limit-objectid_scmat AND erdat > is_limit-erdat. IF sy-subrc <> 0. RAISE EXCEPTION TYPE /gib/cx_dcv. ENDIF. SELECT objectid_scmat erdat FROM /gib/dcv_mhist INTO TABLE lt_mhist WHERE objectid_scmat = is_limit-objectid_scmat AND erdat >= is_limit-erdat. IF sy-subrc = 0. SORT lt_mhist BY erdat ASCENDING. READ TABLE lt_mhist ASSIGNING FIELD-SYMBOL() INDEX 1. SELECT SINGLE COUNT(*) FROM /gib/dcv_stklmt WHERE objectid_scmat = is_limit-objectid_scmat AND erdat > is_limit-erdat AND erdat <= -erdat. IF sy-subrc <> 0. RAISE EXCEPTION TYPE /gib/cx_dcv. ENDIF. ENDIF. ENDMETHOD. METHOD delete_invalid_data. DATA: lf_count TYPE i, lf_dummy TYPE c. LOOP AT mt_invalid ASSIGNING FIELD-SYMBOL(). DELETE FROM /gib/dcv_stklmt WHERE objectid_scmat = -objectid_scmat AND erdat = -erdat AND lfdnr = -lfdnr. IF sy-subrc = 0. lf_count = lf_count + 1. ENDIF. ENDLOOP. DATA(lf_label) = get_label( ). lf_label = lf_label && | (| && 'ungültige'(002) && ')'. MESSAGE s406(/gib/dcv) WITH lf_label lf_count INTO lf_dummy. mr_msg->add_symsg( ). ENDMETHOD. METHOD get_label. SELECT SINGLE descript FROM seoclasstx INTO ef_label "#EC CI_SUBRC WHERE clsname = '/GIB/CL_DCV_MAT_STOCK_LIMITS' AND langu = sy-langu. ENDMETHOD. ENDCLASS. CLASS lcl_reorg_mathist IMPLEMENTATION. METHOD constructor. super->constructor( ). mf_horizon = if_horizon. ENDMETHOD. METHOD read_data. DATA: lf_datum TYPE sy-datum, lf_dummy TYPE c. lf_datum = sy-datum - mf_horizon. DATA(lf_label) = get_label( ). SELECT objectid_scmat erdat FROM /gib/dcv_mhist INTO CORRESPONDING FIELDS OF TABLE mt_mhist WHERE objectid_scmat IN so_objid AND erdat < lf_datum. DATA(lf_total) = sy-dbcnt. MESSAGE s407(/gib/dcv) WITH lf_label lf_total INTO lf_dummy. mr_msg->add_symsg( ). LOOP AT mt_mhist ASSIGNING FIELD-SYMBOL(). TRY. lcl_flow=>get_dprov( )->check_material( -objectid_scmat ). LOOP AT mt_mhist TRANSPORTING NO FIELDS WHERE objectid_scmat = -objectid_scmat AND erdat > -erdat. EXIT. ENDLOOP. IF sy-subrc <> 0. SELECT SINGLE COUNT(*) FROM /gib/dcv_mhist WHERE objectid_scmat = -objectid_scmat AND erdat > -erdat. ENDIF. IF sy-subrc <> 0. "caused by loop or select DELETE mt_mhist. "still needed ENDIF. CATCH /gib/cx_dcv_not_found. APPEND TO mt_invalid. DELETE mt_mhist. CATCH /gib/cx_dcv. DELETE mt_mhist. "not selected ENDTRY. ENDLOOP. DATA(lf_del) = lines( mt_mhist ). MESSAGE s408(/gib/dcv) WITH lf_label lf_del lf_total INTO lf_dummy. mr_msg->add_symsg( ). ENDMETHOD. METHOD process_data. LOOP AT mt_mhist ASSIGNING FIELD-SYMBOL(). DATA(lr_data) = /gib/cl_dcv_material_data_hist=>get_instance( if_objectid_scmat = -objectid_scmat if_erdat = -erdat ). delete_item( lr_data ). ENDLOOP. super->process_data( ). ENDMETHOD. METHOD delete_invalid_data. DATA: lf_count TYPE i, lf_dummy TYPE c. LOOP AT mt_invalid ASSIGNING FIELD-SYMBOL(). DELETE FROM /gib/dcv_mhist WHERE objectid_scmat = -objectid_scmat AND erdat = -erdat. IF sy-subrc = 0. lf_count = lf_count + 1. ENDIF. ENDLOOP. DATA(lf_label) = get_label( ). lf_label = lf_label && | (| && 'ungültige'(002) && ')'. MESSAGE s406(/gib/dcv) WITH lf_label lf_count INTO lf_dummy. mr_msg->add_symsg( ). ENDMETHOD. METHOD get_label. SELECT SINGLE descript FROM seoclasstx INTO ef_label "#EC CI_SUBRC WHERE clsname = '/GIB/CL_DCV_MATERIAL_DATA_HIST' AND langu = sy-langu. ENDMETHOD. ENDCLASS. CLASS lcl_dprov IMPLEMENTATION. ENDCLASS. CLASS lcl_dprov_vmi IMPLEMENTATION. METHOD check_material. DATA: lr_sc_mat TYPE REF TO /gib/cl_dcv_sc_material, lr_sc TYPE REF TO /gib/cl_dcv_supply_chain. TRY. lr_sc_mat ?= /gib/cl_dcv_single_data=>get_instance_by_objectid_cx( if_objid ). CHECK lr_sc_mat IS BOUND. DATA(ls_mat) = lr_sc_mat->get_data( ). IF ls_mat-abnmr NOT IN so_abnmr OR ls_mat-lifnr NOT IN so_lifnr OR ls_mat-matnr NOT IN so_matnr. RAISE EXCEPTION TYPE /gib/cx_dcv. ENDIF. lr_sc ?= lr_sc_mat->get_supply_chain( ). IF lr_sc->get_label( ) NOT IN so_slabv. RAISE EXCEPTION TYPE /gib/cx_dcv. ENDIF. CATCH cx_sy_move_cast_error. RAISE EXCEPTION TYPE /gib/cx_dcv. "not what we ar looking for ENDTRY. ENDMETHOD. ENDCLASS. CLASS lcl_dprov_imv IMPLEMENTATION. METHOD check_material. DATA: lr_sc_mat TYPE REF TO /gib/cl_dcv_sc_material_imv, lr_sc TYPE REF TO /gib/cl_dcv_supply_chain_imv. TRY. lr_sc_mat ?= /gib/cl_dcv_single_data=>get_instance_by_objectid_cx( if_objid ). CHECK lr_sc_mat IS BOUND. DATA(ls_mat) = lr_sc_mat->get_data( ). IF ls_mat-abnmr NOT IN so_abnmi OR ls_mat-suppl NOT IN so_suppl OR ls_mat-kunnr NOT IN so_kunnr OR ls_mat-matnr NOT IN so_matni. RAISE EXCEPTION TYPE /gib/cx_dcv. ENDIF. lr_sc ?= lr_sc_mat->get_supply_chain( ). IF lr_sc->get_label( ) NOT IN so_slabi. RAISE EXCEPTION TYPE /gib/cx_dcv. ENDIF. CATCH cx_sy_move_cast_error. RAISE EXCEPTION TYPE /gib/cx_dcv. "not what we ar looking for ENDTRY. ENDMETHOD. ENDCLASS. INITIALIZATION. lcl_flow=>at_initialization( ). AT SELECTION-SCREEN OUTPUT. lcl_flow=>at_pbo( ). AT SELECTION-SCREEN. lcl_flow=>at_pai( ). START-OF-SELECTION. lcl_flow=>start_of_selection( ).