2019-04-08 10:39:34
ABAP code for JAP.
First part: ORDERNETS.
As promised in previous post, I´m going to share the code of JAP. O here it is….
*&---------------------------------------------------------------------* *& Report ZJAP_GET_TABLES_2 *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* REPORT zjap_get_tables_2. DATA: wa_matnr TYPE matnr, wa_dat TYPE erdat, wa_vko TYPE bapi_rangesvkorg, wa_wrk TYPE werks-werks, wa_uart TYPE shp_auart_range, ls_zkndposition TYPE zkndposition. SELECT-OPTIONS: sel_mat FOR wa_matnr, sel_date FOR wa_dat, sel_vko FOR wa_vko, sel_wrk FOR wa_wrk, sel_art FOR wa_uart. PARAMETERS: p_vsf AS CHECKBOX , p_cross AS CHECKBOX , p_safest AS CHECKBOX DEFAULT 'X',"safety stock p_cap_pl AS CHECKBOX, "capacity planning p_dbset AS CHECKBOX DEFAULT 'X', " write itab into dbtab p_capchk AS CHECKBOX DEFAULT 'X', " data for capacity check p_days TYPE i DEFAULT 365. " how far in the future shall capa-plan go "! help class to test other classes as lcl_order CLASS lcl_main DEFINITION CREATE PRIVATE. PUBLIC SECTION. "! "! @parameter r_result | CLASS-METHODS create RETURNING VALUE(r_result) TYPE REF TO lcl_main. METHODS run. PROTECTED SECTION. PRIVATE SECTION. ENDCLASS. CLASS lcl_order_schedule DEFINITION DEFERRED. "! delivers all primary requirements (sales orders, cross plant deliveries, planned orders VSF CLASS lcl_order DEFINITION CREATE PRIVATE FRIENDS lcl_order_schedule. PUBLIC SECTION. TYPES: BEGIN OF t_zkndposition, delnr TYPE delnr, del12 TYPE del12, delps TYPE delps, delet TYPE delet, dat00 TYPE dat00, datpr TYPE dat00, ettyp TYPE ettyp, matnr TYPE matnr, mng01 TYPE mng01, werk TYPE werks_d, delkz TYPE delkz, END OF t_zkndposition. TYPES: BEGIN OF t_matnr_eval, matnr TYPE matnr, werks TYPE werks_d, END OF t_matnr_eval. CLASS-METHODS class_constructor. CLASS-METHODS get_tables IMPORTING i_matnr TYPE STANDARD TABLE i_interval TYPE STANDARD TABLE i_vkorg TYPE STANDARD TABLE i_werks TYPE STANDARD TABLE i_auart TYPE STANDARD TABLE i_vsf TYPE char1 OPTIONAL i_cross TYPE char1 OPTIONAL i_safe_st TYPE char1 OPTIONAL " safety stock i_capa_plan TYPE char1 OPTIONAL . CLASS-METHODS get_mother_position CHANGING chs_zcapavrglst TYPE zcapavrglst. CLASS-DATA: gt_zordernet TYPE TABLE OF zordernet, gt_zkndposition TYPE TABLE OF zkndposition. METHODS constructor IMPORTING is_zkndposition TYPE t_zkndposition. PROTECTED SECTION. CLASS-METHODS get_sd_orders. CLASS-DATA: vkorg_rt TYPE RANGE OF vkorg, matnr_rt TYPE RANGE OF matnr, auart_rt TYPE RANGE OF auart, werks_rt TYPE RANGE OF werks-werks, datab_rt TYPE RANGE OF date. CLASS-DATA: gt_orders TYPE TABLE OF svbmtv_trvog . CLASS-DATA: gt_schedules TYPE TABLE OF bapisdhedu . CLASS-DATA: gt_orders_schedules TYPE TABLE OF t_zkndposition. CLASS-DATA: gt_mat_eval TYPE TABLE OF t_matnr_eval, lt_mat_eval LIKE gt_mat_eval, gs_mat_eval TYPE t_matnr_eval, gt_emdps TYPE TABLE OF mdps. DATA: gs_zkndposition TYPE t_zkndposition. DATA: gt_ioel TYPE TABLE OF ioel. PRIVATE SECTION. CLASS-DATA safety_stock TYPE char1. CLASS-METHODS get_cross_plant. CLASS-METHODS get_vsf. CLASS-METHODS get_all_postions. CLASS-METHODS get_data_md04_for_all IMPORTING i_mdps TYPE STANDARD TABLE i_mdez TYPE STANDARD TABLE i_mdsu TYPE STANDARD TABLE i_mat_val TYPE t_matnr_eval. CLASS-METHODS get_nets. "! set start dates to planned and production orders CLASS-METHODS set_initial_dates. CLASS-METHODS date_dependences. CLASS-METHODS get_capa_plan. METHODS build_net. METHODS get_lt_ioel. METHODS get_net_for_schedule. METHODS get_lt_ioel_for_pp_u4 IMPORTING i_schedule TYPE lcl_order=>t_zkndposition. ENDCLASS. CLASS lcl_requirement DEFINITION DEFERRED. CLASS lcl_order_schedule DEFINITION CREATE PRIVATE. PUBLIC SECTION. TYPES: BEGIN OF t_plant_orders, delnr TYPE del12, delkz TYPE delkz, o_element TYPE REF TO lcl_requirement, END OF t_plant_orders. CLASS-METHODS create IMPORTING is_schedule TYPE lcl_order=>t_zkndposition io_order TYPE REF TO lcl_order RETURNING VALUE(r_result) TYPE REF TO lcl_order_schedule. CLASS-METHODS class_constructor. CLASS-METHODS get_baubar IMPORTING i_delnr TYPE zcapavrglst-delnr RETURNING VALUE(r_result) TYPE zcapavrglst-baubar. CLASS-DATA: * gt_zordernet_all TYPE TABLE OF zordernet, gt_zordernet_all TYPE HASHED TABLE OF zordernet WITH UNIQUE KEY delnr delps delet delnrpos adresnet, gt_plant_orders TYPE TABLE OF t_plant_orders. METHODS constructor IMPORTING is_schedule TYPE lcl_order=>t_zkndposition io_order TYPE REF TO lcl_order. METHODS set_primary_replenishement IMPORTING i_prim TYPE ioel. DATA: gt_zordernet TYPE TABLE OF zordernet. PROTECTED SECTION. PRIVATE SECTION. DATA: gs_schedule TYPE lcl_order=>t_zkndposition. DATA: gs_zordernet TYPE zordernet, go_order TYPE REF TO lcl_order. DATA: gv_level TYPE i VALUE 0, gv_adress TYPE int2 VALUE 1. CLASS-DATA rt_delkz TYPE RANGE OF delkz. METHODS set_second_replenishement IMPORTING i_ioel TYPE ioel. METHODS set_custom_order CHANGING c_gs_zordernet TYPE zordernet. ENDCLASS. "! CLASS lcl_requirement DEFINITION ABSTRACT . PUBLIC SECTION. METHODS: constructor IMPORTING i_requirement TYPE lcl_order_schedule=>t_plant_orders, get_real_dates_difference ABSTRACT RETURNING VALUE(r_difference) TYPE i, move_requirement ABSTRACT IMPORTING iv_diffenrence TYPE i, set_dat00_to_dat00_s ABSTRACT, get_dat01_s RETURNING VALUE(r_result) TYPE dat01, get_dat00_s RETURNING VALUE(r_result) TYPE dat00, get_dat01 RETURNING VALUE(r_result) TYPE dat01, get_dat00 RETURNING VALUE(r_result) TYPE dat00, set_diff IMPORTING i_element_vzg TYPE i, set_dates_for_capacity. PROTECTED SECTION. DATA: gs_requirement TYPE lcl_order_schedule=>t_plant_orders, gs_zordernet TYPE zordernet. ENDCLASS. CLASS lcl_delivery DEFINITION ABSTRACT INHERITING FROM lcl_requirement. PUBLIC SECTION. METHODS: constructor IMPORTING i_requirement TYPE lcl_order_schedule=>t_plant_orders. METHODS: move_requirement REDEFINITION, set_dat00_to_dat00_s REDEFINITION, get_real_dates_difference REDEFINITION. PROTECTED SECTION. DATA: gt_items2 TYPE STANDARD TABLE OF bapiekpo, gt_item_schedules TYPE TABLE OF bapieket. ENDCLASS. "! CLASS lcl_order_element DEFINITION ABSTRACT INHERITING FROM lcl_requirement. PUBLIC SECTION. CLASS-METHODS class_constructor. METHODS: constructor IMPORTING i_requirement TYPE lcl_order_schedule=>t_plant_orders, move_requirement REDEFINITION, set_dat00_to_dat00_s REDEFINITION, set_diff REDEFINITION. PROTECTED SECTION. CLASS-DATA: gv_real_start TYPE sy-datum . DATA: gs_coois_line TYPE ioheader. DATA gv_diff TYPE i. " difference due to date x is date ENDCLASS. CLASS lcl_qm_stock DEFINITION CREATE PRIVATE INHERITING FROM lcl_requirement FINAL. PUBLIC SECTION. CLASS-METHODS create IMPORTING i_requirement TYPE lcl_order_schedule=>t_plant_orders RETURNING VALUE(r_result) TYPE REF TO lcl_qm_stock. METHODS:get_real_dates_difference REDEFINITION, move_requirement REDEFINITION, set_dat00_to_dat00_s REDEFINITION. PROTECTED SECTION. PRIVATE SECTION. ENDCLASS. CLASS lcl_kapid DEFINITION DEFERRED. CLASS lcl_cap_requirement DEFINITION CREATE PRIVATE FINAL FRIENDS lcl_kapid. PUBLIC SECTION. TYPES: BEGIN OF t_cap_requirement. INCLUDE TYPE ioopcap. TYPES: start_point TYPE cx_point_in_time, end_point TYPE cx_point_in_time, start_point_w TYPE cx_point_in_time, "wish end_point_w TYPE cx_point_in_time, "wish duration TYPE cx_duration_sec, ma TYPE i, "pocet lidi na AG to se musi doplnit END OF t_cap_requirement. CLASS-METHODS create IMPORTING is_cap_req TYPE lcl_cap_requirement=>t_cap_requirement RETURNING VALUE(r_result) TYPE REF TO lcl_cap_requirement. METHODS constructor IMPORTING is_cap_req TYPE lcl_cap_requirement=>t_cap_requirement. METHODS schedule IMPORTING io_kapid TYPE REF TO lcl_kapid. METHODS get_duration RETURNING VALUE(r_duration) TYPE cx_duration_sec. METHODS get_ma RETURNING VALUE(r_ma) TYPE i. PROTECTED SECTION. PRIVATE SECTION. TYPES: BEGIN OF t_capacity, kapid TYPE kapid, point TYPE cx_point_in_time, load TYPE i, available TYPE i, END OF t_capacity. DATA gs_requirement TYPE lcl_cap_requirement=>t_cap_requirement. DATA gv_to_dispatch TYPE cx_duration_sec. DATA gv_wish_start TYPE cx_point_in_time. DATA gv_wish_end TYPE cx_point_in_time. DATA go_kapid TYPE REF TO lcl_kapid. DATA gv_real_start TYPE cx_point_in_time. DATA gs_startpoint TYPE t_capacity. DATA gs_endpoint TYPE t_capacity. DATA gv_real_end TYPE cx_point_in_time. METHODS get_start_point. METHODS get_end_point. METHODS alocate. METHODS move IMPORTING i_start TYPE cx_fsav OPTIONAL i_end TYPE cx_fsav OPTIONAL i_duration TYPE cx_duration_sec EXPORTING e_start TYPE cx_fsav e_end TYPE cx_fsav. METHODS alocate_in_window. ENDCLASS. CLASS lcl_kapid DEFINITION CREATE PRIVATE FRIENDS lcl_cap_requirement. PUBLIC SECTION. TYPES: BEGIN OF t_kapid, kapid TYPE kapid, ktext TYPE ktext, END OF t_kapid. TYPES: BEGIN OF t_capacity, kapid TYPE kapid, point TYPE cx_point_in_time, load TYPE i, available TYPE i, END OF t_capacity. CLASS-DATA: gt_zcapavrglst TYPE TABLE OF zcapavrglst. CLASS-METHODS create IMPORTING is_kapid TYPE t_kapid RETURNING VALUE(r_result) TYPE REF TO lcl_kapid. CLASS-METHODS plan_capa IMPORTING i_days TYPE i. METHODS constructor IMPORTING is_kapid TYPE t_kapid. PROTECTED SECTION. PRIVATE SECTION. CLASS-DATA: gt_kapid TYPE TABLE OF t_kapid, gv_days TYPE i, start_plan TYPE datum, end_plan TYPE datum. DATA: gs_kapid TYPE t_kapid, gt_avail_per TYPE STANDARD TABLE OF rc65k, gs_capacity TYPE t_capacity, gt_capacity TYPE TABLE OF t_capacity, gt_cap_requirements TYPE TABLE OF lcl_cap_requirement=>t_cap_requirement. METHODS plan_kapid. METHODS get_master_data. METHODS plan_shopfloor. METHODS build_db_tables. METHODS set_capa_available. METHODS set_requirements. ENDCLASS. CLASS lcl_qm_stock IMPLEMENTATION. METHOD create. r_result = NEW #( i_requirement ). ENDMETHOD. METHOD get_real_dates_difference. gs_zordernet-dat00_s = sy-datum. gs_zordernet-dat01_s = sy-datum. ENDMETHOD. METHOD move_requirement. ENDMETHOD. METHOD set_dat00_to_dat00_s. ENDMETHOD. ENDCLASS. CLASS lcl_prod_order DEFINITION CREATE PRIVATE INHERITING FROM lcl_order_element FINAL. PUBLIC SECTION. CLASS-METHODS create IMPORTING is_requirement TYPE lcl_order_schedule=>t_plant_orders RETURNING VALUE(r_result) TYPE REF TO lcl_prod_order. METHODS: get_real_dates_difference REDEFINITION, constructor IMPORTING i_requirement TYPE lcl_order_schedule=>t_plant_orders. METHODS: set_dates_for_capacity REDEFINITION. PROTECTED SECTION. PRIVATE SECTION. DATA: gt_confirmations TYPE ioopconf_tab, gt_routings TYPE iooper_tab. ENDCLASS. CLASS lcl_plan_order DEFINITION CREATE PRIVATE INHERITING FROM lcl_order_element FINAL. PUBLIC SECTION. CLASS-METHODS create IMPORTING is_requirement TYPE lcl_order_schedule=>t_plant_orders RETURNING VALUE(r_result) TYPE REF TO lcl_plan_order. METHODS: get_real_dates_difference REDEFINITION, set_dates_for_capacity REDEFINITION. PROTECTED SECTION. PRIVATE SECTION. ENDCLASS. "! CLASS lcl_bestellung DEFINITION CREATE PRIVATE INHERITING FROM lcl_delivery FINAL. PUBLIC SECTION. CLASS-METHODS create IMPORTING i_requirement TYPE lcl_order_schedule=>t_plant_orders RETURNING VALUE(r_result) TYPE REF TO lcl_bestellung. PROTECTED SECTION. PRIVATE SECTION. ENDCLASS. "! CLASS lcl_banf DEFINITION CREATE PRIVATE INHERITING FROM lcl_delivery FINAL. PUBLIC SECTION. CLASS-METHODS create IMPORTING i_requirement TYPE lcl_order_schedule=>t_plant_orders RETURNING VALUE(r_result) TYPE REF TO lcl_banf. METHODS: constructor IMPORTING i_requirement TYPE lcl_order_schedule=>t_plant_orders, get_real_dates_difference REDEFINITION, move_requirement REDEFINITION. PROTECTED SECTION. PRIVATE SECTION. DATA: gt_items TYPE TABLE OF bapieban, gv_banf TYPE banfn. ENDCLASS. CLASS lcl_liefer_einteilung DEFINITION CREATE PRIVATE INHERITING FROM lcl_delivery FINAL. PUBLIC SECTION. CLASS-METHODS create IMPORTING i_requirement TYPE lcl_order_schedule=>t_plant_orders RETURNING VALUE(r_result) TYPE REF TO lcl_liefer_einteilung. PROTECTED SECTION. PRIVATE SECTION. ENDCLASS. CLASS lcl_liefer_einteilung IMPLEMENTATION. METHOD create. r_result = NEW #( i_requirement ). ENDMETHOD. ENDCLASS. "! CLASS lcl_lieferavis DEFINITION CREATE PRIVATE INHERITING FROM lcl_delivery FINAL. PUBLIC SECTION. CLASS-METHODS create IMPORTING i_requirement TYPE lcl_order_schedule=>t_plant_orders RETURNING VALUE(r_result) TYPE REF TO lcl_lieferavis. PROTECTED SECTION. PRIVATE SECTION. ENDCLASS. CLASS lcl_services_zjap2 DEFINITION CREATE PRIVATE. PUBLIC SECTION. CLASS-DATA: gt_headtab TYPE HASHED TABLE OF ioheader WITH UNIQUE KEY aufnr, "ioheader_tab, gt_capreq TYPE HASHED TABLE OF ioopcap WITH UNIQUE KEY bedid bedzl canum, "ioopcap_tab, gt_confirm TYPE ioopconf_tab, gt_routings TYPE iooper_tab. CLASS-METHODS: class_constructor, "! "! @parameter i_first_date | "! @parameter i_second_date | "! @parameter r_days | "! returns differencee between two import parameters in days get_diff_days IMPORTING i_first_date TYPE datum i_second_date TYPE datum RETURNING VALUE(r_days) TYPE i, "! "! @parameter i_date | "! @parameter i_diff | "! @parameter i_direction | "! @parameter r_new_date | "! parameter differencee can be fed with positive or negative values. "! if positive but needed negative parameter i_dierection can be helpful move_date_with_diff IMPORTING i_date TYPE datum i_diff TYPE i i_direction TYPE char1 OPTIONAL RETURNING VALUE(r_new_date) TYPE datum, "! "! @parameter i_point | "! @parameter i_time | "! @parameter idate | "! @parameter e_point | "! @parameter e_time | "! @parameter e_date | convert_timepoint IMPORTING i_point TYPE cx_point_in_time OPTIONAL i_time TYPE sy-uzeit OPTIONAL i_date TYPE sy-datum OPTIONAL EXPORTING e_point TYPE cx_point_in_time e_time TYPE sy-uzeit e_date TYPE sy-datum, "! get data like in tx COOIS get_tx_coois, "! "! @parameter is_element_line | "! @parameter iv_delkz | "! @parameter lo_requirement | "! returns object of type from inherit classes according to delkz get_requirement_object IMPORTING is_element_line TYPE lcl_order_schedule=>t_plant_orders RETURNING VALUE(r_requirement) TYPE REF TO lcl_requirement, get_week IMPORTING i_dat TYPE d RETURNING VALUE(r_week) TYPE zcapavrglst-week. PROTECTED SECTION. PRIVATE SECTION. CLASS-DATA: gv_calendar TYPE scal-fcalid. ENDCLASS. CLASS lcl_main IMPLEMENTATION. METHOD create. CREATE OBJECT r_result. ENDMETHOD. METHOD run. lcl_order=>get_tables( i_matnr = sel_mat[] i_interval = sel_date[] i_auart = sel_art[] i_vkorg = sel_vko[] i_werks = sel_wrk[] i_capa_plan = p_cap_pl i_cross = p_cross i_vsf = p_vsf i_safe_st = p_safest ). IF p_cap_pl IS NOT INITIAL. lcl_kapid=>plan_capa( i_days = p_days ). ENDIF. IF p_dbset IS NOT INITIAL. SELECT * FROM zkndposition INTO TABLE @DATA(lt_zkndposition). LOOP AT lcl_order=>gt_zkndposition ASSIGNING FIELD-SYMBOL(<fs>). TRY. <fs>-pozn = lt_zkndposition[ delnr = <fs>-delnr delps = <fs>-delps delet = <fs>-delet ]-pozn. <fs>-username = lt_zkndposition[ delnr = <fs>-delnr delps = <fs>-delps delet = <fs>-delet ]-username. <fs>-change_date = lt_zkndposition[ delnr = <fs>-delnr delps = <fs>-delps delet = <fs>-delet ]-change_date. <fs>-zusage = lt_zkndposition[ delnr = <fs>-delnr delps = <fs>-delps delet = <fs>-delet ]-zusage. <fs>-zusage_ch_dat = lt_zkndposition[ delnr = <fs>-delnr delps = <fs>-delps delet = <fs>-delet ]-zusage_ch_dat. <fs>-zusage_date = lt_zkndposition[ delnr = <fs>-delnr delps = <fs>-delps delet = <fs>-delet ]-zusage_date. <fs>-zusage_usr = lt_zkndposition[ delnr = <fs>-delnr delps = <fs>-delps delet = <fs>-delet ]-zusage_usr. <fs>-zu_forecast = lt_zkndposition[ delnr = <fs>-delnr delps = <fs>-delps delet = <fs>-delet ]-zu_forecast. CATCH cx_sy_itab_line_not_found. CONTINUE. ENDTRY. ENDLOOP. DELETE FROM zkndposition. INSERT zkndposition FROM TABLE lcl_order=>gt_zkndposition. DELETE FROM zordernet. INSERT zordernet FROM TABLE lcl_order=>gt_zordernet. ENDIF. IF p_cap_pl IS NOT INITIAL. SORT lcl_kapid=>gt_zcapavrglst STABLE BY delnr vornr week kapid. DELETE ADJACENT DUPLICATES FROM lcl_kapid=>gt_zcapavrglst COMPARING delnr vornr week kapid. DELETE FROM zcapavrglst. INSERT zcapavrglst FROM TABLE lcl_kapid=>gt_zcapavrglst. ENDIF. ENDMETHOD. ENDCLASS. CLASS lcl_order IMPLEMENTATION. METHOD constructor. gs_zkndposition = is_zkndposition. gs_zkndposition-del12 = is_zkndposition-delnr. ENDMETHOD. METHOD class_constructor. ENDMETHOD. METHOD get_tables. matnr_rt = i_matnr. auart_rt = i_auart. datab_rt = i_interval. vkorg_rt = i_vkorg. werks_rt = i_werks. safety_stock = i_safe_st. get_sd_orders( ). IF i_cross IS NOT INITIAL. get_cross_plant( ). ENDIF. IF i_vsf IS NOT INITIAL. get_vsf( ). ENDIF. get_all_postions( ). get_nets( ). set_initial_dates( ). date_dependences( ). gt_zordernet = lcl_order_schedule=>gt_zordernet_all. gt_zkndposition = CORRESPONDING #( gt_orders_schedules ). "MAPPING matnr = material werks = plant ). IF i_capa_plan = 'X'. get_capa_plan( ). ENDIF. ENDMETHOD. METHOD get_sd_orders. DATA iv_trvog TYPE trvog VALUE '0'. DATA lt_vbmtv TYPE TABLE OF svbmtv_trvog. DATA lt_sales_key TYPE TABLE OF sales_key. DATA ls_view TYPE order_view. DATA lt_items TYPE TABLE OF bapisdit. DATA lt_items_status TYPE TABLE OF bapisditst. DATA lt_schedules TYPE TABLE OF bapisdhedu. DO 2 TIMES. CALL FUNCTION 'SD_SELECT_SALES_DOCUMENTS' EXPORTING iv_trvog = iv_trvog * IV_BSTKD = * IV_ZPAVW = iv_vboff = 'X' iv_vball = 'X' TABLES t_vbmtv = lt_vbmtv * LVBMTV = i_vkorg_rt = vkorg_rt * I_VTWEG_RT = * I_SPART_RT = i_matnr_rt = matnr_rt * I_KUNNR1_RT = * i_vkbur_rt = * I_VKGRP_RT = i_auart_rt = auart_rt * I_ERNAM_RT = * I_VBELN_RT = * I_AUDAT_RT = i_werks_rt = werks_rt * I_ZPERS_RT = i_datab_rt = datab_rt * I_ERDAT_RT = . gt_orders = VALUE #( BASE gt_orders ( LINES OF lt_vbmtv ) ). CLEAR lt_vbmtv. iv_trvog = '3'. ENDDO. lt_sales_key = CORRESPONDING #( gt_orders ). ls_view-item = 'X'. ls_view-status_i = 'X'. ls_view-sdschedule = 'X'. CALL FUNCTION 'BAPISDORDER_GETDETAILEDLIST' EXPORTING i_bapi_view = ls_view * I_MEMORY_READ = * I_WITH_HEADER_CONDITIONS = ' ' TABLES sales_documents = lt_sales_key * ORDER_HEADERS_OUT = order_items_out = lt_items order_schedules_out = lt_schedules * ORDER_BUSINESS_OUT = * ORDER_PARTNERS_OUT = * ORDER_ADDRESS_OUT = * ORDER_STATUSHEADERS_OUT = order_statusitems_out = lt_items_status * ORDER_CONDITIONS_OUT = * ORDER_COND_HEAD = * ORDER_COND_ITEM = * ORDER_COND_QTY_SCALE = * ORDER_COND_VAL_SCALE = * ORDER_CONTRACTS_OUT = * ORDER_TEXTHEADERS_OUT = * ORDER_TEXTLINES_OUT = * ORDER_FLOWS_OUT = * ORDER_CFGS_CUREFS_OUT = * ORDER_CFGS_CUCFGS_OUT = * ORDER_CFGS_CUINS_OUT = * ORDER_CFGS_CUPRTS_OUT = * ORDER_CFGS_CUVALS_OUT = * ORDER_CFGS_CUBLBS_OUT = * ORDER_CFGS_CUVKS_OUT = * ORDER_BILLINGPLANS_OUT = * ORDER_BILLINGDATES_OUT = * ORDER_CREDITCARDS_OUT = * EXTENSIONOUT = . * lt_mat_eval = CORRESPONDING #( lt_items MAPPING matnr = material werks = plant ). ** control because of statur in position. LOOP AT lt_items ASSIGNING FIELD-SYMBOL(<item>). TRY. DATA(ls_status) = lt_items_status[ sd_doc = <item>-doc_number itm_number = <item>-itm_number ]. CATCH cx_sy_itab_line_not_found. CONTINUE. ENDTRY. IF ls_status-deliv_stat = 'C'. CONTINUE. ELSE. lt_mat_eval = VALUE #( BASE lt_mat_eval ( CORRESPONDING #( <item> MAPPING matnr = material werks = plant ) ) ). ENDIF. ENDLOOP. APPEND LINES OF lt_mat_eval TO gt_mat_eval. APPEND LINES OF lt_schedules TO gt_schedules. CLEAR lt_mat_eval. ENDMETHOD. METHOD get_cross_plant. DATA: ls_dynsel TYPE rsds_type, lt_clauses TYPE rsds_twhere, lt_range TYPE rsds_trange. DATA: lt_ekko TYPE TABLE OF ekko, lt_ekpo TYPE TABLE OF ekpo, lt_eket TYPE TABLE OF eket. lt_clauses = VALUE #( BASE lt_clauses ( tablename = 'EKKO' where_tab = VALUE #( ( line = |(| & | | & |LIFNR| & | | & |EQ| & | | & |0000266441| & | | & |)| ) ) ) ). lt_range = VALUE #( BASE lt_range ( tablename = 'EKKO' frange_t = VALUE #( ( fieldname = 'LIFNR' selopt_t = VALUE #( ( sign = 'I' option = 'EQ' low = '0000266441' ) ) ) ) ) ). ls_dynsel-clauses = lt_clauses. ls_dynsel-trange = lt_range. CALL FUNCTION 'ME_READ_EKKO_MULTIPLE' EXPORTING i_dynsel = ls_dynsel * i_dynfie = * i_archiv = * i_rweit = * i_guldt = * i_name1 = i_selection_limit = 5000 i_ekpo_dummy = 'X' TABLES te_ekko = lt_ekko te_ekpo = lt_ekpo te_eket = lt_eket * te_ekbe = * te_ekkn = * te_ekbz = * te_ekab = * te_ekek = * te_ekeh = * te_ekes = * ti_imkeys = * ti_vornr_range = * ti_pspid_ext_range = * ti_selpa_range = * ti_requested_tables = * exceptions * wrong_vornr_nplnr = 1 * wrong_selpa = 2 * limit_ds = 3 * no_trange = 4 * nothing_selected = 5 * uncomplete_selected = 6 * others = 7 . IF sy-subrc <> 0. * iMPLEMENT SUITABLE ERROR HANDLING HERE ENDIF. LOOP AT lt_ekko ASSIGNING FIELD-SYMBOL(<ekko>) WHERE reswk = '013' AND bukrs = '015' AND loekz = ''. LOOP AT lt_eket ASSIGNING FIELD-SYMBOL(<eket>) WHERE ebeln = <ekko>-ebeln. TRY. DATA(ls_ekpo) = lt_ekpo[ ebeln = <eket>-ebeln ebelp = <eket>-ebelp loekz = '' elikz = '' ]. CATCH cx_sy_itab_line_not_found. CONTINUE. ENDTRY. IF <eket>-wemng < <eket>-menge. gs_mat_eval = CORRESPONDING #( ls_ekpo ). gs_mat_eval-werks = <ekko>-reswk. lt_mat_eval = VALUE #( BASE lt_mat_eval ( gs_mat_eval ) ). CLEAR: gs_mat_eval. ENDIF. ENDLOOP. ENDLOOP. APPEND LINES OF lt_mat_eval TO gt_mat_eval. CLEAR lt_mat_eval. ENDMETHOD. METHOD get_vsf. ** alternative. business object BUS3027 from TA SWO1 * CALL FUNCTION 'REQUIREMENTS_MAINTAIN' ** EXPORTING ** ECM60R = ' ' ** ECM60A = ' ' ** EPRASTA = * TABLES * epbpt = ** EPBET = ** EPBCH = ** IPROTO = ** ITEM_OUT = ** SCHEDULE_OUT = ** EXCEPTIONS ** ERROR = 1 ** OTHERS = 2 * . * IF sy-subrc <> 0. ** Implement suitable error handling here * ENDIF. DATA lt_mdpd TYPE TABLE OF mdpb. SELECT * FROM mdpb INTO TABLE lt_mdpd WHERE vervs = 'X' AND werks IN werks_rt AND plnmg > 0 AND ( bedae = 'VSF' OR bedae = 'VSEB') AND pdatu IN datab_rt. lt_mat_eval = CORRESPONDING #( lt_mdpd ). APPEND LINES OF lt_mat_eval TO gt_mat_eval. CLEAR lt_mat_eval. ENDMETHOD. METHOD get_all_postions. DATA: lt_mdps TYPE TABLE OF mdps, lt_mdez TYPE TABLE OF mdez, lt_mdsu TYPE TABLE OF mdsu. SORT gt_mat_eval STABLE BY matnr werks. DELETE ADJACENT DUPLICATES FROM gt_mat_eval COMPARING matnr werks. LOOP AT gt_mat_eval ASSIGNING FIELD-SYMBOL(<mat>). "fm md04 CALL FUNCTION 'MD_STOCK_REQUIREMENTS_LIST_API' EXPORTING * PLSCN = matnr = <mat>-matnr werks = <mat>-werks * BERID = * ERGBZ = * AFIBZ = * INPER = * DISPLAY_LIST_MDPSX = * DISPLAY_LIST_MDEZX = * DISPLAY_LIST_MDSUX = * NOBUF = * PLAUF = * I_VRFWE = * IS_SFILT = * IS_AFILT = * IMPORTING * E_MT61D = * E_MDKP = * E_CM61M = * E_MDSTA = * E_ERGBZ = TABLES mdpsx = lt_mdps mdezx = lt_mdez mdsux = lt_mdsu * EXCEPTIONS * MATERIAL_PLANT_NOT_FOUND = 1 * PLANT_NOT_FOUND = 2 * OTHERS = 3 . IF sy-subrc <> 0. * Implement suitable error handling here ENDIF. get_data_md04_for_all( i_mat_val = <mat> i_mdps = lt_mdps i_mdez = lt_mdez i_mdsu = lt_mdsu ). ENDLOOP. ENDMETHOD. METHOD get_data_md04_for_all. DATA lt_mdps TYPE TABLE OF mdps. DATA lt_mdez TYPE TABLE OF mdez. DATA ls_element TYPE t_zkndposition. DATA lv_counter TYPE i VALUE 1. DATA(lv_count) = lines( i_mdps ). IF lv_count <= 1. EXIT. ENDIF. lt_mdps = i_mdps. lt_mdez = i_mdez. "standard customer orders LOOP AT lt_mdps ASSIGNING FIELD-SYMBOL(<mdps>) WHERE plumi = '-' AND ( delkz = 'VC' OR delkz = 'VE' ) AND dat00 IN datab_rt. ls_element = CORRESPONDING #( <mdps> ). ls_element-matnr = i_mat_val-matnr. ls_element-werk = i_mat_val-werks. TRY. ls_element-ettyp = gt_schedules[ doc_number = ls_element-delnr itm_number = ls_element-delps sched_line = ls_element-delet ]-sched_type. ls_element-dat00 = gt_schedules[ doc_number = ls_element-delnr itm_number = ls_element-delps sched_line = ls_element-delet ]-req_date. ls_element-datpr = gt_schedules[ doc_number = ls_element-delnr itm_number = ls_element-delps sched_line = ls_element-delet ]-ms_date. CATCH cx_sy_itab_line_not_found. EXIT. ENDTRY. gt_orders_schedules = VALUE #( BASE gt_orders_schedules ( CORRESPONDING #( ls_element MAPPING matnr = matnr werk = werk ) ) ). ENDLOOP. *** cross plants and *** primary requirements LOOP AT lt_mdps ASSIGNING FIELD-SYMBOL(<mdpsu>) WHERE plumi = '-' AND ( delkz = 'U4' OR delkz = 'PP') AND mng01 > 0 AND dat00 IN datab_rt. ls_element = CORRESPONDING #( <mdpsu> ). ls_element-matnr = i_mat_val-matnr. ls_element-werk = i_mat_val-werks. ls_element-ettyp = 'CP'. ls_element-datpr = ls_element-dat00. IF ls_element-delps IS INITIAL. "vsf TRY. ls_element-delnr = lt_mdez[ delkz = 'PP' dat00 = ls_element-dat00 ]-extra. ls_element-delps = '00010'. ls_element-delet = lv_counter. lv_counter = lv_counter + 1. CATCH cx_sy_itab_line_not_found. EXIT. ENDTRY. ENDIF. gt_emdps = VALUE #( BASE gt_emdps ( <mdpsu> ) ). gt_orders_schedules = VALUE #( BASE gt_orders_schedules ( CORRESPONDING #( ls_element MAPPING matnr = matnr werk = werk ) ) ). ENDLOOP. CLEAR: lv_counter. ENDMETHOD. METHOD get_nets. DATA: lt_orders_schedules LIKE gt_orders_schedules, lo_order TYPE REF TO lcl_order. lt_orders_schedules = gt_orders_schedules. SORT lt_orders_schedules STABLE BY delnr delps matnr werk. DELETE ADJACENT DUPLICATES FROM lt_orders_schedules COMPARING delnr delps matnr werk. LOOP AT lt_orders_schedules ASSIGNING FIELD-SYMBOL(<order>). lo_order = NEW #( <order> ). lo_order->build_net( ). ENDLOOP. ENDMETHOD. METHOD build_net. get_lt_ioel( ). get_net_for_schedule( ). ENDMETHOD. METHOD get_lt_ioel. DATA: ls_emdps TYPE mdps. DATA: ls_zkndposition LIKE gs_zkndposition. ls_zkndposition = gs_zkndposition. IF gs_zkndposition-delkz = 'U4' OR gs_zkndposition-delkz = 'PP'. EXIT. ENDIF. CALL FUNCTION 'MD_SALES_ORDER_STATUS_REPORT' EXPORTING * EDELET = 0000 edelkz = ls_zkndposition-delkz edelnr = ls_zkndposition-del12 edelps = ls_zkndposition-delps * EPLSCN = 000 * AVAILABILITY_CHECK = ' ' no_savety_stock = safety_stock * DATA_IN_MEMORY = ' ' * MEMORY_ID = 'PLHS' ematnr = gs_zkndposition-matnr ewerks = gs_zkndposition-werk * EBERID = ' ' emdps = ls_emdps nodisp = 'X' i_ignore_mtold = 'X' * I_PROFID = ' ' * I_REP_REFRESH = ' ' * IS_PROFILE = * IT_VBEP_KEYS = no_commit_work = 'X' * IMPORTING * ET_MLDELAY = * ET_RTREE_SEL = TABLES iioelx = gt_ioel EXCEPTIONS error = 1 OTHERS = 2 . IF sy-subrc <> 0. * Implement suitable error handling here ENDIF. ENDMETHOD. METHOD get_net_for_schedule. DATA: lo_schedule TYPE REF TO lcl_order_schedule. LOOP AT gt_orders_schedules ASSIGNING FIELD-SYMBOL(<schedule>) WHERE delnr = gs_zkndposition-delnr AND delps = gs_zkndposition-delps. lo_schedule = lcl_order_schedule=>create( is_schedule = <schedule> io_order = me ). IF <schedule>-delkz NE 'PP' AND <schedule>-delkz NE 'U4'. LOOP AT gt_ioel ASSIGNING FIELD-SYMBOL(<prim>) WHERE rsnum = <schedule>-delnr AND rspos = <schedule>-delps AND etenr = <schedule>-delet AND sobes NE ' '. lo_schedule->set_primary_replenishement( <prim> ). ENDLOOP. ELSEIF <schedule>-delkz = 'PP'. get_lt_ioel_for_pp_u4( <schedule> ). LOOP AT gt_ioel ASSIGNING FIELD-SYMBOL(<prim_pp>) WHERE rsart+0(2) = <schedule>-delnr+0(2) AND dat00 = <schedule>-dat00 AND sobes NE ' '. lo_schedule->set_primary_replenishement( <prim_pp> ). ENDLOOP. ELSEIF <schedule>-delkz = 'U4'. get_lt_ioel_for_pp_u4( <schedule> ). LOOP AT gt_ioel ASSIGNING FIELD-SYMBOL(<prim_u4>) WHERE rsnum = <schedule>-delnr AND rspos = <schedule>-delps AND etenr = <schedule>-delet AND sobes NE ' '. lo_schedule->set_primary_replenishement( <prim_u4> ). ENDLOOP. ENDIF. lcl_order_schedule=>gt_zordernet_all = VALUE #( BASE lcl_order_schedule=>gt_zordernet_all ( LINES OF lo_schedule->gt_zordernet ) ). ENDLOOP. ENDMETHOD. METHOD get_lt_ioel_for_pp_u4. DATA: ls_emdps TYPE mdps, lt_mdps TYPE TABLE OF mdps, ls_schedule TYPE lcl_order=>t_zkndposition. ls_schedule = i_schedule. ls_schedule-del12 = i_schedule-delnr. IF i_schedule-delkz = 'PP'. CLEAR: ls_schedule. ENDIF. CALL FUNCTION 'MD_STOCK_REQUIREMENTS_LIST_API' EXPORTING * PLSCN = matnr = gs_zkndposition-matnr werks = gs_zkndposition-werk TABLES mdpsx = lt_mdps * EXCEPTIONS * MATERIAL_PLANT_NOT_FOUND = 1 * PLANT_NOT_FOUND = 2 * OTHERS = 3 . IF sy-subrc <> 0. * Implement suitable error handling here ENDIF. TRY. ls_emdps = lt_mdps[ dat00 = i_schedule-dat00 delkz = i_schedule-delkz ]. CATCH cx_sy_itab_line_not_found. EXIT. ENDTRY. ls_emdps-del12 = ls_emdps-delnr. CALL FUNCTION 'MD_SALES_ORDER_STATUS_REPORT' EXPORTING * EDELET = 0000 * edelkz = ls_schedule-delkz * edelnr = ls_schedule-del12 * edelps = ls_schedule-delps edelkz = ls_emdps-delkz edelnr = ls_emdps-del12 edelps = ls_emdps-delps * EPLSCN = 000 * AVAILABILITY_CHECK = ' ' no_savety_stock = safety_stock * DATA_IN_MEMORY = ' ' * MEMORY_ID = 'PLHS' ematnr = gs_zkndposition-matnr ewerks = gs_zkndposition-werk * EBERID = ' ' emdps = ls_emdps nodisp = 'X' i_ignore_mtold = 'X' * I_PROFID = ' ' * I_REP_REFRESH = ' ' * IS_PROFILE = * IT_VBEP_KEYS = no_commit_work = 'X' * IMPORTING * ET_MLDELAY = * ET_RTREE_SEL = TABLES iioelx = gt_ioel EXCEPTIONS error = 1 OTHERS = 2 . IF sy-subrc <> 0. * Implement suitable error handling here ENDIF. ENDMETHOD. METHOD set_initial_dates. lcl_services_zjap2=>get_tx_coois( ). "get all needed initial dates for planned and production orders LOOP AT lcl_order_schedule=>gt_plant_orders ASSIGNING FIELD-SYMBOL(<order>). " 1. set start dates in zordernet for plant orders. LOOP AT lcl_order_schedule=>gt_zordernet_all ASSIGNING FIELD-SYMBOL(<delnrpos>) WHERE delnrpos = <order>-delnr. IF <order>-delkz = 'PA' OR <order>-delkz = 'FE' . TRY. <delnrpos>-dat01 = lcl_services_zjap2=>gt_headtab[ aufnr = <order>-delnr ]-gstrp. CATCH cx_sy_itab_line_not_found. CONTINUE. ENDTRY. ELSEIF <order>-delkz = 'QM'. <delnrpos>-dat01 = <delnrpos>-dat00. ENDIF. ENDLOOP. " 2. set "real_dates" for all elements <order>-o_element = lcl_services_zjap2=>get_requirement_object( is_element_line = <order> ). IF <order>-o_element IS INITIAL. CONTINUE. ENDIF. DATA(lv_difference) = <order>-o_element->get_real_dates_difference( ). "!!!!!!! IF lv_difference > 0. <order>-o_element->move_requirement( lv_difference ). ELSE. <order>-o_element->set_dat00_to_dat00_s( ). ENDIF. " 3. set "dat01_s + dat00_s into zordernet LOOP AT lcl_order_schedule=>gt_zordernet_all ASSIGNING <delnrpos> WHERE delnrpos = <order>-delnr. * IF <order>-delkz = 'PA' OR <order>-delkz = 'FE' . <delnrpos>-dat01_s = <order>-o_element->get_dat01_s( ). <delnrpos>-dat00_s = <order>-o_element->get_dat00_s( ). <delnrpos>-dat01 = <order>-o_element->get_dat01( ). <delnrpos>-dat00 = <order>-o_element->get_dat00( ). ENDLOOP. ENDLOOP. ENDMETHOD. METHOD date_dependences. SORT lcl_order_schedule=>gt_zordernet_all STABLE BY stuffe DESCENDING delnrpos DESCENDING dat00_s ASCENDING. LOOP AT lcl_order_schedule=>gt_zordernet_all ASSIGNING FIELD-SYMBOL(<element>). TRY. ASSIGN lcl_order_schedule=>gt_zordernet_all[ nxtrs = <element>-rsnum delnr = <element>-delnr delps = <element>-delps delet = <element>-delet ] TO FIELD-SYMBOL(<nxtrs>). CATCH cx_sy_itab_line_not_found. CONTINUE. ENDTRY. *move IF <nxtrs>-dat01_s IS NOT INITIAL " deliveries no AND <nxtrs>-dat01_s < <element>-dat00_s. DATA(lv_diff) = lcl_services_zjap2=>get_diff_days( i_first_date = <element>-dat00_s i_second_date = <nxtrs>-dat01_s ). <nxtrs>-dat01_s = lcl_services_zjap2=>move_date_with_diff( i_date = <nxtrs>-dat01_s i_diff = lv_diff ). <nxtrs>-dat00_s = lcl_services_zjap2=>move_date_with_diff( i_date = <nxtrs>-dat00_s i_diff = lv_diff ). *********Deliveries ELSEIF <element>-dat01 IS INITIAL AND <element>-dat00_s > <nxtrs>-dat00_s. CLEAR: lv_diff. lv_diff = lcl_services_zjap2=>get_diff_days( i_first_date = <element>-dat00_s i_second_date = <element>-dat00 ). <nxtrs>-dat00_s = lcl_services_zjap2=>move_date_with_diff( i_date = <nxtrs>-dat00_s i_diff = lv_diff ). ENDIF. *********Deliveries MODIFY TABLE lcl_order_schedule=>gt_zordernet_all FROM <nxtrs>. CLEAR: lv_diff. ENDLOOP. *set delay LOOP AT lcl_order_schedule=>gt_zordernet_all ASSIGNING <element>. <element>-vzg = lcl_services_zjap2=>get_diff_days( i_first_date = <element>-dat00_s i_second_date = <element>-dat00 ). " set delay for capacity requirements TRY. ASSIGN lcl_order_schedule=>gt_plant_orders[ delnr = <element>-delnrpos ] TO FIELD-SYMBOL(<plant_order>). <plant_order>-o_element->set_diff( <element>-vzg ). CATCH cx_sy_itab_line_not_found. CONTINUE. ENDTRY. ENDLOOP. ENDMETHOD. METHOD get_capa_plan. "set_dates_capa_requirements, "! sets new dates for capacity requirements according to dates in order-net(zordernet) LOOP AT lcl_order_schedule=>gt_plant_orders ASSIGNING FIELD-SYMBOL(<order>). <order>-o_element->set_dates_for_capacity( ). ENDLOOP. ENDMETHOD. METHOD get_mother_position. DATA:lt_zkndposition TYPE TABLE OF zkndposition. LOOP AT gt_zordernet ASSIGNING FIELD-SYMBOL(<zordernet>) WHERE delnrpos = chs_zcapavrglst-delnr. TRY. ASSIGN gt_zkndposition[ delnr = <zordernet>-delnr delps = <zordernet>-delps delet = <zordernet>-delet ] TO FIELD-SYMBOL(<zkndpos>). lt_zkndposition = VALUE #( BASE lt_zkndposition ( <zkndpos> ) ). CATCH cx_sy_itab_line_not_found. CONTINUE. ENDTRY. ENDLOOP. " SORT lt_zkndposition ASCENDING BY datpr. " produktionstermin SORT lt_zkndposition ASCENDING BY dat00. " kundentermin ASSIGN lt_zkndposition[ 1 ] TO <zkndpos>. chs_zcapavrglst-datpr_end = <zkndpos>-datpr. chs_zcapavrglst-dat00_end = <zkndpos>-dat00. chs_zcapavrglst-matnr_end = <zkndpos>-matnr. ENDMETHOD. ENDCLASS. CLASS lcl_order_schedule IMPLEMENTATION. METHOD class_constructor. rt_delkz = VALUE #( ( option = 'EQ' sign = 'I' low = 'BA' ) ( option = 'EQ' sign = 'I' low = 'BE' ) ( option = 'EQ' sign = 'I' low = 'E1' ) ( option = 'EQ' sign = 'I' low = 'LA' ) ( option = 'EQ' sign = 'I' low = 'LE' ) ( option = 'EQ' sign = 'I' low = 'LL' ) ( option = 'EQ' sign = 'I' low = 'U4' ) ( option = 'EQ' sign = 'I' low = 'U1' ) ( option = 'EQ' sign = 'I' low = 'U2' ) ). ENDMETHOD. METHOD create. r_result = NEW #( is_schedule = is_schedule io_order = io_order ). ENDMETHOD. METHOD constructor. gs_schedule = is_schedule. go_order = io_order. ENDMETHOD. METHOD set_primary_replenishement. gs_zordernet = CORRESPONDING #( i_prim MAPPING delnrpos = delnr ). set_custom_order( CHANGING c_gs_zordernet = gs_zordernet ). gs_zordernet-stuffe = gv_level. gs_zordernet-adresnet = gv_adress. gv_adress = gv_adress + 1. gt_zordernet = VALUE #( BASE gt_zordernet ( gs_zordernet ) ). gt_plant_orders = VALUE #( BASE gt_plant_orders ( CORRESPONDING #( i_prim ) ) ). CLEAR gs_zordernet. set_second_replenishement( i_prim ). ENDMETHOD. METHOD set_second_replenishement. DATA: lv_nxtrs TYPE delnr. lv_nxtrs = i_ioel-nxtrs. CLEAR gs_zordernet. gv_level = gv_level + 1. LOOP AT go_order->gt_ioel ASSIGNING FIELD-SYMBOL(<ioel>) WHERE rsnum = lv_nxtrs AND sobes <> ' ' AND plumi = '+'. . gs_zordernet = CORRESPONDING #( <ioel> MAPPING delnrpos = delnr dat00 = rsdat ). IF <ioel>-delkz IN rt_delkz. gs_zordernet-dat00_s = <ioel>-dat00. ENDIF. set_custom_order( CHANGING c_gs_zordernet = gs_zordernet ). gs_zordernet-stuffe = gv_level. gs_zordernet-adresnet = gv_adress. gv_adress = gv_adress + 1. gt_zordernet = VALUE #( BASE gt_zordernet ( gs_zordernet ) ). gt_plant_orders = VALUE #( BASE gt_plant_orders ( CORRESPONDING #( <ioel> ) ) ). CLEAR gs_zordernet. IF <ioel>-nxtrs IS NOT INITIAL. set_second_replenishement( <ioel> ). ENDIF. ENDLOOP. gv_level = gv_level - 1. ENDMETHOD. METHOD set_custom_order. c_gs_zordernet-delnr = gs_schedule-delnr. c_gs_zordernet-delps = gs_schedule-delps. c_gs_zordernet-delet = gs_schedule-delet. ENDMETHOD. METHOD get_baubar. TRY. ASSIGN gt_zordernet_all[ delnrpos = i_delnr ] TO FIELD-SYMBOL(<zordernet>). IF <zordernet> IS NOT ASSIGNED. EXIT. ENDIF. IF <zordernet>-nxtrs IS INITIAL. r_result = 'X'. ELSE. TRY. DATA(ls_nxtrs) = gt_zordernet_all[ rsnum = <zordernet>-nxtrs ]. CATCH cx_sy_itab_line_not_found. r_result = 'X'. ENDTRY. ENDIF. CATCH cx_sy_itab_line_not_found. EXIT. ENDTRY. ENDMETHOD. ENDCLASS. CLASS lcl_requirement IMPLEMENTATION. METHOD constructor. me->gs_requirement = i_requirement. ENDMETHOD. METHOD get_dat01_s. r_result = gs_zordernet-dat01_s. ENDMETHOD. METHOD get_dat00_s. r_result = gs_zordernet-dat00_s. ENDMETHOD. METHOD set_diff. ENDMETHOD. METHOD set_dates_for_capacity. ENDMETHOD. METHOD get_dat01. r_result = gs_zordernet-dat01. ENDMETHOD. METHOD get_dat00. r_result = gs_zordernet-dat00. ENDMETHOD. ENDCLASS. CLASS lcl_order_element IMPLEMENTATION. METHOD class_constructor. gv_real_start = sy-datum + 1. ENDMETHOD. METHOD constructor. super->constructor( i_requirement ). TRY. gs_coois_line = lcl_services_zjap2=>gt_headtab[ aufnr = gs_requirement-delnr ]. CATCH cx_sy_itab_line_not_found. EXIT. ENDTRY. ENDMETHOD. METHOD move_requirement. gs_zordernet = CORRESPONDING #( gs_coois_line ). TRY. gs_zordernet-dat00 = lcl_services_zjap2=>gt_headtab[ aufnr = gs_requirement-delnr ]-gltrp. gs_zordernet-dat01 = lcl_services_zjap2=>gt_headtab[ aufnr = gs_requirement-delnr ]-gstrp. CATCH cx_sy_itab_line_not_found. EXIT. ENDTRY. IF gs_zordernet-dat00_s IS INITIAL. gs_zordernet-dat00_s = lcl_services_zjap2=>move_date_with_diff( i_date = gs_zordernet-dat00 i_diff = iv_diffenrence ) . gs_zordernet-dat01_s = sy-datum. ENDIF. ENDMETHOD. METHOD set_dat00_to_dat00_s. TRY. gs_zordernet-dat00 = lcl_services_zjap2=>gt_headtab[ aufnr = gs_requirement-delnr ]-gltrp. gs_zordernet-dat01 = lcl_services_zjap2=>gt_headtab[ aufnr = gs_requirement-delnr ]-gstrp. gs_zordernet-dat00_s = lcl_services_zjap2=>gt_headtab[ aufnr = gs_requirement-delnr ]-gltrp. gs_zordernet-dat01_s = lcl_services_zjap2=>gt_headtab[ aufnr = gs_requirement-delnr ]-gstrp. CATCH cx_sy_itab_line_not_found. EXIT. ENDTRY. ENDMETHOD. METHOD set_diff. gv_diff = i_element_vzg. ENDMETHOD. ENDCLASS. CLASS lcl_delivery IMPLEMENTATION. METHOD move_requirement. IF gs_zordernet-dat00_s IS INITIAL. gs_zordernet-dat00_s = sy-datum. ENDIF. gs_zordernet-dat01_s = gs_zordernet-dat00_s. ENDMETHOD. METHOD set_dat00_to_dat00_s. gs_zordernet-dat01_s = gs_zordernet-dat00_s. ENDMETHOD. METHOD get_real_dates_difference. IF gs_zordernet-dat00_s IS INITIAL. gs_zordernet-dat00_s = sy-datum. ENDIF. IF gs_zordernet-dat00_s < sy-datum. gs_zordernet-dat00_s = sy-datum. ENDIF. r_difference = lcl_services_zjap2=>get_diff_days( i_first_date = gs_zordernet-dat00_s i_second_date = gs_zordernet-dat00 ). ENDMETHOD. METHOD constructor. super->constructor( i_requirement ). TRY. gs_zordernet = lcl_order_schedule=>gt_zordernet_all[ delnrpos = gs_requirement-delnr ]. CATCH cx_sy_itab_line_not_found. EXIT. ENDTRY. IF gs_requirement-delkz NE 'BA'. * gv_bestellung = gs_requirement-delnr. *CALL FUNCTION 'BAPI_PO_GETDETAIL' * EXPORTING * purchaseorder = gv_bestellung * ITEMS = 'X' ** ACCOUNT_ASSIGNMENT = ' ' * SCHEDULES = 'X' ** HISTORY = ' ' ** ITEM_TEXTS = ' ' ** HEADER_TEXTS = ' ' ** SERVICES = ' ' ** CONFIRMATIONS = ' ' ** SERVICE_TEXTS = ' ' ** EXTENSIONS = ' ' ** IMPORTING ** PO_HEADER = ** PO_ADDRESS = * TABLES ** PO_HEADER_TEXTS = * PO_ITEMS = gt_items2 ** PO_ITEM_ACCOUNT_ASSIGNMENT = * po_item_schedules = gt_item_schedules ** PO_ITEM_CONFIRMATIONS = ** PO_ITEM_TEXTS = ** PO_ITEM_HISTORY = ** PO_ITEM_HISTORY_TOTALS = ** PO_ITEM_LIMITS = ** PO_ITEM_CONTRACT_LIMITS = ** PO_ITEM_SERVICES = ** PO_ITEM_SRV_ACCASS_VALUES = ** RETURN = ** PO_SERVICES_TEXTS = ** EXTENSIONOUT = * . * TRY. ** gs_zordernet-dat01 = gt_items2[ del_compl = ' ' material = gs_zordernet-matnr ]-rel_date. * CATCH cx_sy_itab_line_not_found. * EXIT. * ENDTRY. gs_zordernet-dat01 = gs_zordernet-dat00. " PO delivery date given. ENDIF. ENDMETHOD. ENDCLASS. CLASS lcl_prod_order IMPLEMENTATION. METHOD create. r_result = NEW #( is_requirement ). ENDMETHOD. METHOD get_real_dates_difference. " production order started? DATA(lv_count) = lines( gt_confirmations ). IF lv_count IS INITIAL. " production order not started IF gs_coois_line-gstrp <= sy-datum. r_difference = lcl_services_zjap2=>get_diff_days( i_first_date = sy-datum i_second_date = gs_coois_line-gstrp ). ENDIF. ELSE. * " if end-date today / in the future, hopping it will be done, else... * IF gs_coois_line-gltrp < sy-datum. SORT gt_confirmations STABLE BY vornr DESCENDING. TRY. DATA(ls_line) = gt_confirmations[ 1 ]. TRY. DATA(ls_route) = gt_routings[ vornr = ls_line-vornr ]. DATA(lv_next_index) = line_index( gt_routings[ vornr = ls_line-vornr ] ). lv_next_index = lv_next_index + 1. TRY. DATA(ls_next_route) = gt_routings[ lv_next_index ]. " due date for next route not done yet r_difference = lcl_services_zjap2=>get_diff_days( i_first_date = sy-datum i_second_date = ls_next_route-fssbd ). CATCH cx_sy_itab_line_not_found. "there is not any next route -> last route partly confirmed r_difference = lcl_services_zjap2=>get_diff_days( i_first_date = sy-datum i_second_date = ls_route-fssbd ). EXIT. ENDTRY. CATCH cx_sy_itab_line_not_found. EXIT. ENDTRY. CATCH cx_sy_itab_line_not_found. EXIT. ENDTRY. ENDIF. * ENDIF. ENDMETHOD. METHOD constructor. super->constructor( i_requirement ). LOOP AT lcl_services_zjap2=>gt_confirm ASSIGNING FIELD-SYMBOL(<confirm>) WHERE aufnr = gs_requirement-delnr. gt_confirmations = VALUE #( BASE gt_confirmations ( <confirm> ) ). ENDLOOP. LOOP AT lcl_services_zjap2=>gt_routings ASSIGNING FIELD-SYMBOL(<route>) WHERE aufnr = gs_requirement-delnr. gt_routings = VALUE #( BASE gt_routings ( <route> ) ). ENDLOOP. ENDMETHOD. METHOD set_dates_for_capacity. LOOP AT lcl_services_zjap2=>gt_capreq ASSIGNING FIELD-SYMBOL(<capa>) WHERE aufnr = gs_requirement-delnr AND kbearest > 0. <capa>-fstad = lcl_services_zjap2=>move_date_with_diff( i_date = <capa>-fstad i_diff = gv_diff ). <capa>-fssad = lcl_services_zjap2=>move_date_with_diff( i_date = <capa>-fssad i_diff = gv_diff ). ENDLOOP. ENDMETHOD. ENDCLASS. CLASS lcl_plan_order IMPLEMENTATION. METHOD create. r_result = NEW #( is_requirement ). ENDMETHOD. METHOD get_real_dates_difference. IF gs_coois_line-gstrp <= sy-datum. r_difference = lcl_services_zjap2=>get_diff_days( i_first_date = sy-datum i_second_date = gs_coois_line-gstrp ). ENDIF. ENDMETHOD. METHOD set_dates_for_capacity. LOOP AT lcl_services_zjap2=>gt_capreq ASSIGNING FIELD-SYMBOL(<capa>) WHERE plnum = gs_requirement-delnr AND kbearest > 0. <capa>-fstad = lcl_services_zjap2=>move_date_with_diff( i_date = <capa>-fstad i_diff = gv_diff ). <capa>-fssad = lcl_services_zjap2=>move_date_with_diff( i_date = <capa>-fssad i_diff = gv_diff ). ENDLOOP. ENDMETHOD. ENDCLASS. CLASS lcl_bestellung IMPLEMENTATION. METHOD create. r_result = NEW #( i_requirement ). ENDMETHOD. ENDCLASS. CLASS lcl_banf IMPLEMENTATION. METHOD create. r_result = NEW #( i_requirement ). ENDMETHOD. METHOD constructor. super->constructor( i_requirement ). gv_banf = gs_requirement-delnr. CALL FUNCTION 'BAPI_REQUISITION_GETDETAIL' EXPORTING number = gv_banf * ACCOUNT_ASSIGNMENT = ' ' * ITEM_TEXTS = ' ' * SERVICES = ' ' * SERVICE_TEXTS = ' ' TABLES requisition_items = gt_items * REQUISITION_ACCOUNT_ASSIGNMENT = * REQUISITION_TEXT = * REQUISITION_LIMITS = * REQUISITION_CONTRACT_LIMITS = * REQUISITION_SERVICES = * REQUISITION_SERVICES_TEXTS = * REQUISITION_SRV_ACCASS_VALUES = * RETURN = . TRY. gs_zordernet-dat01 = gt_items[ material = gs_zordernet-matnr preq_no = gs_zordernet-delnrpos ]-rel_date. CATCH cx_sy_itab_line_not_found. EXIT. ENDTRY. ENDMETHOD. METHOD get_real_dates_difference. r_difference = lcl_services_zjap2=>get_diff_days( i_first_date = sy-datum i_second_date = gs_zordernet-dat01 ). ENDMETHOD. METHOD move_requirement. gs_zordernet-dat00_s = lcl_services_zjap2=>move_date_with_diff( i_date = gs_zordernet-dat00 i_diff = iv_diffenrence ) . gs_zordernet-dat01_s = lcl_services_zjap2=>move_date_with_diff( i_date = gs_zordernet-dat01 i_diff = iv_diffenrence ) . ENDMETHOD. ENDCLASS. CLASS lcl_lieferavis IMPLEMENTATION. METHOD create. r_result = NEW #( i_requirement ). ENDMETHOD. ENDCLASS. CLASS lcl_services_zjap2 IMPLEMENTATION. METHOD class_constructor. gv_calendar = 'Z3'. ENDMETHOD. METHOD get_diff_days. DATA: lv_first TYPE scal-facdate, lv_second TYPE scal-facdate. CALL FUNCTION 'DATE_CONVERT_TO_FACTORYDATE' EXPORTING * CORRECT_OPTION = '+' date = i_first_date factory_calendar_id = gv_calendar IMPORTING * DATE = factorydate = lv_first * WORKINGDAY_INDICATOR = EXCEPTIONS calendar_buffer_not_loadable = 1 correct_option_invalid = 2 date_after_range = 3 date_before_range = 4 date_invalid = 5 factory_calendar_not_found = 6 OTHERS = 7. IF sy-subrc <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. EXIT. ENDIF. CALL FUNCTION 'DATE_CONVERT_TO_FACTORYDATE' EXPORTING * CORRECT_OPTION = '+' date = i_second_date factory_calendar_id = gv_calendar IMPORTING * DATE = factorydate = lv_second * WORKINGDAY_INDICATOR = EXCEPTIONS calendar_buffer_not_loadable = 1 correct_option_invalid = 2 date_after_range = 3 date_before_range = 4 date_invalid = 5 factory_calendar_not_found = 6 OTHERS = 7. IF sy-subrc <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. EXIT. ENDIF. r_days = lv_first - lv_second. ENDMETHOD. METHOD move_date_with_diff. DATA: lv_old_date TYPE scal-facdate, lv_new_date TYPE scal-facdate. CLEAR: lv_old_date, lv_new_date. CALL FUNCTION 'DATE_CONVERT_TO_FACTORYDATE' EXPORTING * CORRECT_OPTION = '+' date = i_date factory_calendar_id = gv_calendar IMPORTING * DATE = factorydate = lv_old_date * WORKINGDAY_INDICATOR = EXCEPTIONS calendar_buffer_not_loadable = 1 correct_option_invalid = 2 date_after_range = 3 date_before_range = 4 date_invalid = 5 factory_calendar_not_found = 6 OTHERS = 7. IF sy-subrc <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. EXIT. ENDIF. IF i_direction IS INITIAL. lv_new_date = lv_old_date + i_diff . ELSEIF i_direction = '+'. lv_new_date = lv_old_date + i_diff . ELSEIF i_direction = '-'. lv_new_date = lv_old_date + ( -1 * i_diff ). ENDIF. CALL FUNCTION 'FACTORYDATE_CONVERT_TO_DATE' EXPORTING factorydate = lv_new_date factory_calendar_id = gv_calendar IMPORTING date = r_new_date EXCEPTIONS calendar_buffer_not_loadable = 1 factorydate_after_range = 2 factorydate_before_range = 3 factorydate_invalid = 4 factory_calendar_id_missing = 5 factory_calendar_not_found = 6 OTHERS = 7. IF sy-subrc <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. EXIT. ENDIF. ENDMETHOD. METHOD convert_timepoint. DATA: lv_max TYPE sy-datum, lv_convert TYPE sy-datum. lv_max = sy-datum + 4855. IF i_date > lv_max. lv_convert = lv_max - 1. ELSE. lv_convert = i_date. ENDIF. IF i_point IS NOT INITIAL. CALL FUNCTION 'POINT_IN_TIME_CONVERT' EXPORTING * KZ_ENDTERMIN = ' ' point_in_time = i_point IMPORTING date = e_date time = e_time. ELSEIF i_date IS NOT INITIAL. CALL FUNCTION 'DATE_TIME_CONVERT' EXPORTING date = lv_convert time = i_time IMPORTING point_in_time = e_point * EXCEPTIONS * DATE_BEFORE_REL_DATE = 1 * DATE_TO_BIG = 2 * OTHERS = 3 . IF sy-subrc <> 0. * Implement suitable error handling here ENDIF. ENDIF. ENDMETHOD. METHOD get_tx_coois. DATA: lt_seltab TYPE TABLE OF rsparams, ls_tcoa TYPE tcoa, lt_headtab TYPE ioheader_tab, gt_itemtab TYPE ioitem_tab, lt_capreq TYPE ioopcap_tab, lv_selname TYPE string, lt_kbed_plnum TYPE TABLE OF kbedd, lv_plnum TYPE plnum. CALL FUNCTION 'RS_REFRESH_FROM_SELECTOPTIONS' EXPORTING curr_report = 'SAPLCOISOUTPUT'"l_repid TABLES selection_table = lt_seltab EXCEPTIONS not_found = 1 no_report = 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. RETURN. ENDIF. lt_seltab = VALUE #( BASE lt_seltab ( selname = 'P_SYST1' kind = 'P' low = 'RÜCK' ) ). "only done orders lt_seltab = VALUE #( BASE lt_seltab ( selname = 'P_SYSH1' kind = 'P' low = 'I0009' ) ). "only done orders lt_seltab = VALUE #( BASE lt_seltab ( selname = 'P_KZ_E1' kind = 'P' low = 'X' ) ). "only done orders lt_seltab = VALUE #( BASE lt_seltab ( selname = 'P_AUTYP' kind = 'P' low = '10' ) ). "only production orders lt_seltab = VALUE #( BASE lt_seltab ( selname = 'S_WERKS' kind = 'S' sign = 'I' option = 'EQ' low = '013' ) ). lt_seltab = VALUE #( BASE lt_seltab ( selname = 'S_WERKS' kind = 'S' sign = 'I' option = 'EQ' low = '015' ) ). ***** prepare_plant_orders SORT lcl_order_schedule=>gt_plant_orders STABLE BY delnr. DELETE ADJACENT DUPLICATES FROM lcl_order_schedule=>gt_plant_orders COMPARING delnr. LOOP AT lcl_order_schedule=>gt_plant_orders ASSIGNING FIELD-SYMBOL(<order>) WHERE ( delkz = 'FE' OR delkz = 'PA' ). IF <order>-delkz = 'FE'. lv_selname = 'S_AUFNR'. ELSEIF <order>-delkz = 'PA'. lv_selname = 'S_PLNUM'. ELSE. CONTINUE. ENDIF. lt_seltab = VALUE #( BASE lt_seltab ( selname = lv_selname kind = 'S' sign = 'I' option = 'EQ' low = <order>-delnr ) ). CLEAR: lv_selname. ENDLOOP. ***** prepare_plant_orders ls_tcoa-header_sel = 'X'. ls_tcoa-item_sel = 'Y'. ls_tcoa-oper_sel = 'X'. ls_tcoa-opcap_sel = 'X'. ls_tcoa-opconf_sel = 'X'. ls_tcoa-layoutid_aa = '000000000001'. CALL FUNCTION 'COIS_SELECT_PARAMETERS_SET' EXPORTING it_parameter = lt_seltab is_tcoa = ls_tcoa. CLEAR: gt_headtab, gt_itemtab, gt_routings, gt_confirm. CALL FUNCTION 'COIS_SELECT_ORDERS_READ' CHANGING ct_ioheader = lt_headtab ct_ioitem = gt_itemtab ct_iooper = gt_routings ct_ioopcap = lt_capreq ct_ioopconf = gt_confirm. IF NOT lt_headtab IS INITIAL. gt_headtab = VALUE #( BASE gt_headtab ( LINES OF lt_headtab ) ). CLEAR lt_headtab. ENDIF. gt_capreq = VALUE #( BASE gt_capreq ( LINES OF lt_capreq ) ). CLEAR: lt_headtab, lt_capreq. * add planned orders to the table of CALL FUNCTION 'COIS_SELECT_PL_ORDERS_READ' EXPORTING iv_read_components = ls_tcoa-opcomp_sel * ir_planned_order_type = lr_paart CHANGING ct_ioheader = lt_headtab. * ct_ioopcomp = lt_ioopcomp. IF NOT lt_headtab IS INITIAL. gt_headtab = VALUE #( BASE gt_headtab ( LINES OF lt_headtab ) ). CLEAR lt_headtab. ENDIF. LOOP AT lcl_order_schedule=>gt_plant_orders ASSIGNING FIELD-SYMBOL(<pl_order>) WHERE delkz = 'PA' . lv_plnum = <pl_order>-delnr. CALL FUNCTION 'MD_PLDORD_GETDETAIL_BAPI' EXPORTING plannedorder_number = lv_plnum * ECM61O = * IMPORTING * HEADER_DATA = * IKBKO1 = * IKBKO2 = * IKBKO3 = TABLES * COMPONENTS_DATA = capacity_data1 = lt_kbed_plnum * CAPACITY_DATA2 = * CAPACITY_DATA3 = * RF61Q = * EXCEPTIONS * NO_AUTHORITY = 1 * OTHERS = 2 . IF sy-subrc <> 0. CONTINUE. ENDIF. lt_capreq = CORRESPONDING #( lt_kbed_plnum ). gt_capreq = VALUE #( BASE gt_capreq ( LINES OF lt_capreq ) ). CLEAR: lt_capreq. ENDLOOP. ENDMETHOD. METHOD get_requirement_object. r_requirement = SWITCH #( is_element_line-delkz WHEN 'PA' THEN lcl_plan_order=>create( is_element_line ) WHEN 'FE' THEN lcl_prod_order=>create( is_element_line ) WHEN 'BA' THEN lcl_banf=>create( is_element_line ) WHEN 'BE' THEN lcl_bestellung=>create( is_element_line ) WHEN 'LA' THEN lcl_lieferavis=>create( is_element_line ) WHEN 'LE' THEN lcl_liefer_einteilung=>create( is_element_line ) WHEN 'QM' THEN lcl_qm_stock=>create( is_element_line ) ) . ENDMETHOD. METHOD get_week. CALL FUNCTION 'GET_WEEK_INFO_BASED_ON_DATE' EXPORTING date = i_dat IMPORTING week = r_week * MONDAY = * SUNDAY = . ENDMETHOD. ENDCLASS. CLASS lcl_kapid IMPLEMENTATION. METHOD create. r_result = NEW #( is_kapid ). ENDMETHOD. METHOD constructor. gs_kapid = is_kapid. ENDMETHOD. METHOD plan_capa. gv_days = i_days. start_plan = sy-datum. end_plan = sy-datum + i_days. *** remove unnecessary capacity requirements from the main table DELETE lcl_services_zjap2=>gt_capreq WHERE fstad < sy-datum. **************************************************************** gt_kapid = CORRESPONDING #( lcl_services_zjap2=>gt_capreq ). SORT gt_kapid STABLE BY kapid. DELETE ADJACENT DUPLICATES FROM gt_kapid COMPARING kapid. LOOP AT gt_kapid ASSIGNING FIELD-SYMBOL(<kapid>). DATA(lo_kapid) = create( is_kapid = <kapid> ). lo_kapid->plan_kapid( ). ENDLOOP. ENDMETHOD. METHOD plan_kapid. get_master_data( ). set_requirements( ). plan_shopfloor( ). build_db_tables( ). ENDMETHOD. METHOD get_master_data. * Create period for each day (shifts can be different by day): CALL FUNCTION 'CR_CAPACITY_PERIODS' EXPORTING datub = end_plan datuv = start_plan * KAPEL = ' ' kapid = gs_kapid-kapid * MRPCAL = ' ' * PEANZ = '000' peart = 'A' "day * PEBEG = ' ' * PEDAU = '000' * VERSN = * ZRAST = ' ' TABLES t_per = gt_avail_per. * Get available capacity for each day by shift: CALL FUNCTION 'CR_CAPACITY_AVAILABLE_PERIODS' EXPORTING exact_breaks = 'X' shifts = 'X' unit_si = 'X' "in seconds TABLES t_avail = gt_avail_per EXCEPTIONS hierarchy_not_found = 1 object_not_in_hierarchy = 2 version_without_hierarchy = 3 parameter_not_with_time = 4 OTHERS = 5. ENDMETHOD. METHOD plan_shopfloor. set_capa_available( ). LOOP AT gt_cap_requirements ASSIGNING FIELD-SYMBOL(<req>). DATA(lo_requirement) = lcl_cap_requirement=>create( <req> ). <req>-duration = lo_requirement->get_duration( ). <req>-ma = lo_requirement->get_ma( ). lo_requirement->schedule( me ). <req>-start_point = lo_requirement->gv_real_start. <req>-end_point = lo_requirement->gv_real_end. <req>-start_point_w = lo_requirement->gv_wish_start. <req>-end_point_w = lo_requirement->gv_wish_end. CLEAR:lo_requirement->gv_real_end, lo_requirement->gv_real_start, lo_requirement->gv_wish_end, lo_requirement->gv_wish_start. ENDLOOP. ENDMETHOD. METHOD build_db_tables. DATA: ls_zcapavrglst TYPE zcapavrglst. LOOP AT gt_cap_requirements ASSIGNING FIELD-SYMBOL(<req>) WHERE start_point > 0 AND end_point > 0. **************************************************************************************************************** lcl_services_zjap2=>convert_timepoint( EXPORTING i_point = <req>-start_point IMPORTING e_date = <req>-fstad e_time = <req>-fstau ). lcl_services_zjap2=>convert_timepoint( EXPORTING i_point = <req>-end_point IMPORTING e_date = <req>-fssad e_time = <req>-fssaz ). lcl_services_zjap2=>convert_timepoint( EXPORTING i_point = <req>-start_point_w IMPORTING e_date = <req>-sstad e_time = <req>-sstau ). lcl_services_zjap2=>convert_timepoint( EXPORTING i_point = <req>-end_point_w IMPORTING e_date = <req>-sendd e_time = <req>-sendu ). **** duration in sec transform to min <req>-duration = <req>-duration / 60. ls_zcapavrglst = CORRESPONDING #( <req> MAPPING dat00_s = fssad time00_s = fssaz dat01_s = fstad time01_s = fstau mazahl = ma delnr = plnum dat00 = sendd time00 = sendu dat01 = sstad time01 = sstau ). IF ls_zcapavrglst-delnr IS INITIAL. ls_zcapavrglst-delnr = <req>-aufnr. ENDIF. ls_zcapavrglst-capa_demand = ls_zcapavrglst-duration. TRY. ls_zcapavrglst-matnr = lcl_services_zjap2=>gt_headtab[ aufnr = ls_zcapavrglst-delnr ]-matnr. ls_zcapavrglst-maktx = lcl_services_zjap2=>gt_headtab[ aufnr = ls_zcapavrglst-delnr ]-matxt. ls_zcapavrglst-mng01 = lcl_services_zjap2=>gt_headtab[ aufnr = ls_zcapavrglst-delnr ]-gamng. CATCH cx_sy_itab_line_not_found. ENDTRY. ls_zcapavrglst-vzg = lcl_services_zjap2=>get_diff_days( i_first_date = ls_zcapavrglst-dat00_s i_second_date = ls_zcapavrglst-dat00 ). ls_zcapavrglst-week = lcl_services_zjap2=>get_week( ls_zcapavrglst-dat01_s ). ls_zcapavrglst-baubar = lcl_order_schedule=>get_baubar( ls_zcapavrglst-delnr ). lcl_order=>get_mother_position( CHANGING chs_zcapavrglst = ls_zcapavrglst ). ***************************************************************************************************************** gt_zcapavrglst = VALUE #( BASE gt_zcapavrglst ( ls_zcapavrglst ) ). CLEAR: ls_zcapavrglst. ENDLOOP. ENDMETHOD. METHOD set_capa_available. LOOP AT gt_avail_per ASSIGNING FIELD-SYMBOL(<avail>). **** start of the day**** lcl_services_zjap2=>convert_timepoint( EXPORTING i_date = <avail>-datuv i_time = <avail>-zeitv IMPORTING e_point = gs_capacity-point ). gs_capacity-kapid = gs_kapid-kapid. gs_capacity-load = 0. gs_capacity-available = <avail>-angeb / <avail>-einzt. gt_capacity = VALUE #( BASE gt_capacity ( gs_capacity ) ). CLEAR gs_capacity. ENDLOOP. SORT gt_capacity STABLE ASCENDING BY point. ENDMETHOD. METHOD set_requirements. DATA: ls_cap_requirements LIKE LINE OF gt_cap_requirements. LOOP AT lcl_services_zjap2=>gt_capreq ASSIGNING FIELD-SYMBOL(<cap_reqrm>) WHERE kapid = gs_kapid-kapid. ls_cap_requirements = CORRESPONDING #( <cap_reqrm> ). lcl_services_zjap2=>convert_timepoint( EXPORTING i_date = <cap_reqrm>-fstad i_time = <cap_reqrm>-fstau IMPORTING e_point = ls_cap_requirements-start_point ). lcl_services_zjap2=>convert_timepoint( EXPORTING i_date = <cap_reqrm>-fssad i_time = <cap_reqrm>-fssaz IMPORTING e_point = ls_cap_requirements-end_point ). gt_cap_requirements = VALUE #( BASE gt_cap_requirements ( ls_cap_requirements ) ). CLEAR: ls_cap_requirements. ENDLOOP. SORT gt_cap_requirements STABLE BY start_point aufnr plnum. ENDMETHOD. ENDCLASS. CLASS lcl_cap_requirement IMPLEMENTATION. METHOD create. r_result = NEW #( is_cap_req ). ENDMETHOD. METHOD constructor. gs_requirement = is_cap_req. ENDMETHOD. METHOD schedule. go_kapid = io_kapid. gv_to_dispatch = gs_requirement-duration. gv_wish_start = gs_requirement-start_point. gv_wish_end = gs_requirement-end_point. WHILE gv_to_dispatch > 0. get_start_point( ). get_end_point( ). alocate( ). ENDWHILE. ENDMETHOD. METHOD get_start_point. SORT go_kapid->gt_capacity STABLE BY point DESCENDING. LOOP AT go_kapid->gt_capacity INTO gs_startpoint WHERE point <= gs_requirement-start_point. EXIT. ENDLOOP. SORT go_kapid->gt_capacity STABLE BY point ASCENDING. IF gs_startpoint-available < gs_requirement-ma. "soupni LOOP AT go_kapid->gt_capacity INTO gs_startpoint WHERE point > gs_requirement-start_point AND available >= gs_requirement-ma. CLEAR: gs_requirement-start_point, gs_requirement-end_point. gs_requirement-start_point = gs_startpoint-point. move( EXPORTING i_start = gs_requirement-start_point i_duration = gs_requirement-duration IMPORTING e_end = gs_requirement-end_point ). EXIT. ENDLOOP. ENDIF. IF gv_real_start IS INITIAL. gv_real_start = gs_requirement-start_point.ENDIF. ENDMETHOD. METHOD get_end_point. LOOP AT go_kapid->gt_capacity INTO gs_endpoint WHERE point > gs_requirement-start_point AND available < gs_requirement-ma. EXIT. ENDLOOP. IF sy-subrc <> 0. LOOP AT go_kapid->gt_capacity INTO gs_endpoint WHERE point >= gs_requirement-end_point AND available >= gs_requirement-ma. EXIT. ENDLOOP. ENDIF. ENDMETHOD. METHOD alocate. DATA: lv_alocated TYPE cx_duration_sec, lv_end TYPE cx_point_in_time. IF gs_endpoint-point < gs_requirement-end_point. lv_end = gs_endpoint-point. ELSE. lv_end = gs_requirement-end_point. gv_real_end = gs_requirement-end_point. ENDIF. IF lv_end IS NOT INITIAL. CALL FUNCTION 'CR_SCHED_VIA_OPERATING_TIME' EXPORTING arbid = gs_requirement-arbid flg_capacity_scheduling = 'X' * flg_compute_beg_end_prod = 'X' * flg_exact_breaks = 'X' point_in_time_start_in = gs_requirement-start_point point_in_time_end_in = lv_end kapid = gs_requirement-kapid IMPORTING duration_out = lv_alocated. gv_to_dispatch = gv_to_dispatch - lv_alocated. CLEAR: gs_requirement-end_point. gs_requirement-end_point = lv_end. IF lv_alocated = 0. gv_to_dispatch = 0. ENDIF. ******************************************* IF lv_alocated > 0. alocate_in_window( ). ENDIF. ******************************************* IF gv_to_dispatch > 0 AND lv_alocated > 0. **** posun gs_requirement-start_point = lv_end. CLEAR: gs_requirement-end_point. CALL FUNCTION 'CR_SCHED_VIA_OPERATING_TIME' EXPORTING arbid = gs_requirement-arbid flg_capacity_scheduling = 'X' * flg_compute_beg_end_prod = 'X' * flg_exact_breaks = 'X' duration_in = gv_to_dispatch point_in_time_start_in = gs_requirement-start_point kapid = gs_requirement-kapid IMPORTING point_in_time_end_out = gs_requirement-end_point. ENDIF. CLEAR: lv_alocated, lv_end. ELSEIF lv_alocated = 0 OR gv_to_dispatch < 0. gv_real_end = 0. gv_real_start = 0. gv_to_dispatch = 0. DELETE lcl_services_zjap2=>gt_capreq WHERE bedid = gs_requirement-bedid AND bedzl = gs_requirement-bedzl AND canum = gs_requirement-canum. ENDIF. ENDMETHOD. METHOD move. IF i_start IS NOT INITIAL. CALL FUNCTION 'CR_SCHED_VIA_OPERATING_TIME' EXPORTING arbid = gs_requirement-arbid duration_in = i_duration flg_capacity_scheduling = 'X' * flg_compute_beg_end_prod = 'X' * flg_exact_breaks = 'X' point_in_time_start_in = i_start kapid = gs_requirement-kapid IMPORTING point_in_time_end_out = e_end. ELSEIF i_end IS NOT INITIAL. CALL FUNCTION 'CR_SCHED_VIA_OPERATING_TIME' EXPORTING arbid = gs_requirement-arbid duration_in = i_duration flg_capacity_scheduling = 'X' * flg_compute_beg_end_prod = 'X' * flg_exact_breaks = 'X' point_in_time_end_in = i_end kapid = gs_requirement-kapid IMPORTING point_in_time_start_out = e_start. ENDIF. ENDMETHOD. METHOD alocate_in_window. DATA: ls_capacity LIKE LINE OF go_kapid->gt_capacity, ls_predposledni LIKE LINE OF go_kapid->gt_capacity. IF gv_real_start = gs_requirement-start_point. TRY. DATA(ls_wa) = go_kapid->gt_capacity[ point = gv_real_start ]. CLEAR: ls_wa. CATCH cx_sy_itab_line_not_found. ls_capacity-kapid = gs_requirement-kapid. ls_capacity-point = gv_real_start. ls_capacity-load = gs_startpoint-load. ls_capacity-available = gs_startpoint-available. go_kapid->gt_capacity = VALUE #( BASE go_kapid->gt_capacity ( ls_capacity ) ). CLEAR ls_capacity. ENDTRY. ENDIF. LOOP AT go_kapid->gt_capacity ASSIGNING FIELD-SYMBOL(<capa>) WHERE point >= gs_requirement-start_point AND point < gs_requirement-end_point. IF ( <capa>-load + gs_requirement-ma ) < 0 OR ( <capa>-available - gs_requirement-ma ) < 0. gv_to_dispatch = -1. EXIT. ELSE. <capa>-load = <capa>-load + gs_requirement-ma. <capa>-available = <capa>-available - gs_requirement-ma. ENDIF. CLEAR ls_predposledni. ls_predposledni = <capa>. ENDLOOP. IF gv_to_dispatch = 0. TRY. ls_wa = go_kapid->gt_capacity[ point = gs_requirement-end_point ]. CLEAR: ls_wa. CATCH cx_sy_itab_line_not_found. ls_capacity-kapid = gs_requirement-kapid. ls_capacity-point = gv_real_end. ls_capacity-load = ls_predposledni-load - gs_requirement-ma. ls_capacity-available = ls_predposledni-available + gs_requirement-ma. IF ls_capacity-load < 0 OR ls_capacity-available < 0. gv_to_dispatch = -1. EXIT. ENDIF. go_kapid->gt_capacity = VALUE #( BASE go_kapid->gt_capacity ( ls_capacity ) ). SORT go_kapid->gt_capacity STABLE ASCENDING BY point. CLEAR ls_capacity. CLEAR ls_capacity. ENDTRY. ENDIF. gv_real_end = gs_requirement-end_point. ENDMETHOD. METHOD get_duration. DATA ls_prevod TYPE kbedd. ls_prevod = CORRESPONDING #( gs_requirement ). CALL FUNCTION 'CY_AMOUNT_KBED_COMPUTE' EXPORTING in_kbed = ls_prevod * IN_OPR = * IN_DURATION_SEC = * IN_EXAKT_BREAKS = * IN_DURATION_OPR_UNIT = * IN_UNIT = * IN_FLG_UNIT_OPR_GE_DAY = IMPORTING * ex_amount_kbed = neco ex_requirement_sec = r_duration EXCEPTIONS duration_initial = 1 unit_conversion_error = 2 schedule_error = 3 OTHERS = 4 . IF sy-subrc <> 0. * Implement suitable error handling here. r_duration = 1. ENDIF. gs_requirement-duration = r_duration. ENDMETHOD. METHOD get_ma. DATA: lv_worker TYPE cy_kbeares, lv_machine TYPE cy_kbeares. IF gs_requirement-kapar = '001'. r_ma = 1. ELSEIF gs_requirement-kapar = '002'. LOOP AT lcl_services_zjap2=>gt_capreq ASSIGNING FIELD-SYMBOL(<second>) WHERE bedid = gs_requirement-bedid AND bedzl = gs_requirement-bedzl AND canum <> gs_requirement-canum. EXIT. ENDLOOP. IF sy-subrc NE 0. EXIT. ENDIF. IF gs_requirement-keinh = 'MIN'. lv_worker = gs_requirement-kbearest * 60. ELSEIF gs_requirement-keinh = 'H'. lv_worker = gs_requirement-kbearest * 3600. ELSEIF gs_requirement-keinh = 'STD'. lv_worker = gs_requirement-kbearest * 3600. ELSEIF gs_requirement-keinh = 'TAG'. lv_worker = gs_requirement-kbearest * 86400. ENDIF. IF <second>-keinh = 'MIN'. lv_machine = <second>-kbearest * 60. ELSEIF <second>-keinh = 'H'. lv_machine = <second>-kbearest * 3600. ELSEIF <second>-keinh = 'STD'. lv_machine = <second>-kbearest * 3600. ELSEIF <second>-keinh = 'TAG'. lv_machine = <second>-kbearest * 86400. ENDIF. r_ma = lv_worker / lv_machine. IF r_ma < 1. r_ma = 1. ELSEIF r_ma > 5. r_ma = 1. ENDIF. ENDIF. gs_requirement-ma = 1. ENDMETHOD. ENDCLASS. START-OF-SELECTION. lcl_main=>create( )->run( ).