*&--------------------------------------------------------------------* *& Form TEMPORAL_DELIMITATION * *&--------------------------------------------------------------------* * process temporal delimitation * *&--------------------------------------------------------------------* FORM temporal_delimitation. constants: highdate TYPE d VALUE '99991231'. DATA: entries_exist(1) TYPE c, enddate_safe TYPE d, act(1) TYPE c, act_txt(1) TYPE c, hf TYPE i, date_safe TYPE d, ok_code_safe LIKE ok_code, function_safe LIKE function, delim_entr_safe TYPE STANDARD TABLE OF vim_delim_entr_tl WITH DEFAULT KEY INITIAL SIZE 10, collapsed_mkeys_safe TYPE STANDARD TABLE OF vim_collapsed_mkeys_tl WITH DEFAULT KEY INITIAL SIZE 1, merged_entr_safe TYPE STANDARD TABLE "merged entries OF vim_merged_entr_tl WITH DEFAULT KEY INITIAL SIZE 1. CHECK x_header-delmdtflag NE space. * check if dates entered properly IF ( <vim_new_begdate> is initial OR <vim_enddate_mask> EQ vim_init_date ) AND status-mode EQ list_bild. "only on list screen MESSAGE e127(sv)."Bitte den Gültigkeitsbereich eingrenzen ENDIF. * process delimitation IF x_header-clidep NE space. MOVE sy-mandt TO <client>. ENDIF. IF <xact> NE leer AND neuer NE 'J' AND status-delete NE geloescht AND ( status-action NE kopieren AND vim_special_mode EQ space OR vim_special_mode EQ vim_delimit ). READ TABLE total WITH KEY <vim_xextract_key> BINARY SEARCH. CHECK sy-subrc EQ 0. ELSE. "entry is new (input, copy, undelete, reset, replace, upgrade) IF status-mode EQ list_bild. "only on list screen IF x_header-delmdtflag EQ 'E' AND "end date is key field <vim_new_begdate> GT <vim_enddate_mask>. MESSAGE e045(sv). "Bitte ein Beginn-Datum angeben, das vor dem ELSEIF x_header-delmdtflag EQ 'B' AND "begin date is key field <vim_new_begdate> LT <vim_enddate_mask>. MESSAGE e046(sv). "Bitte ein Ende-Datum angeben, das nach dem be ENDIF. ENDIF. LOOP AT total. CHECK <vim_tot_mkey_beforex> EQ <vim_f1_beforex> AND ( vim_mkey_after_exists EQ space OR <vim_tot_mkey_afterx> EQ <vim_f1_afterx> ). * CHECK <vim_tot_mkey_before> EQ <vim_f1_before> AND * ( vim_mkey_after_exists EQ space OR * <vim_tot_mkey_after> EQ <vim_f1_after> ). MOVE 'X' TO entries_exist. EXIT. ENDLOOP. CHECK entries_exist NE space. MOVE: <table2_x> TO <vim_xtotal>, <vim_enddate_mask> TO <vim_enddate>. IF x_header-delmdtflag EQ 'E'. MOVE highdate TO <vim_begdate>. ELSE. CLEAR <vim_begdate>. ENDIF. ENDIF. CHECK <vim_new_begdate> NE <vim_begdate>. * check allowed keyranges IF x_header-customauth CO sap_cust_ctrl_classes OR vim_ale_keyspec_check NE space. PERFORM check_allowed_keyranges. ENDIF. IF x_header-delmdtflag EQ 'E'. "end date is key field IF <vim_new_begdate> GT <vim_enddate>. MESSAGE e045(sv). "Bitte ein Beginn-Datum angeben, das vor dem End ELSEIF <vim_new_begdate> LT <vim_begdate>. PERFORM temp_delim_del_overld_entries USING <vim_new_begdate> <vim_enddate>. ELSE. <vim_enddate> = <vim_new_begdate> - 1. IF x_header-texttbexst NE space AND x_header-ptfrkyexst EQ space. PERFORM vim_temp_delim_texttab USING <vim_enddate_mask> <vim_xextract_key>. "SW Texttransl IF x_header-bastab NE space. MOVE: <vim_enddate> TO <vim_text_enddate>, neuer_eintrag TO <action_text>. ENDIF. ENDIF. READ TABLE total WITH KEY <vim_xtotal_key> BINARY SEARCH TRANSPORTING NO FIELDS. * READ TABLE total WITH KEY <vim_total_key> BINARY SEARCH * TRANSPORTING NO FIELDS. IF sy-subrc NE 0. <action> = neuer_eintrag. <mark> = nicht_markiert. "new entries are never marked INSERT total INDEX sy-tabix. ELSE. * entry MUST be a deleted one MESSAGE w121(sv). "Gelöschter Eintrag wird zurückgeholt und ggf. PERFORM temp_delim_determine_action USING sy-tabix act act_txt. <action> = act. IF x_header-bastab NE space AND x_header-texttbexst NE space. <action_text> = act_txt. ENDIF. MODIFY total INDEX sy-tabix. ENDIF. ENDIF. ELSE. "begin date is key field IF <vim_new_begdate> LT <vim_enddate>. MESSAGE e046(sv). "Bitte ein Ende-Datum angeben, das nach dem begi ELSEIF <vim_new_begdate> GT <vim_begdate>. PERFORM temp_delim_del_overld_entries USING <vim_new_begdate> <vim_enddate>. ELSE. <vim_begdate> = <vim_new_begdate>. IF x_header-bastab NE space AND x_header-texttbexst NE space AND x_header-ptfrkyexst EQ space. IF <action_text> EQ original. MOVE aendern TO <action_text>. ENDIF. ENDIF. IF <action> EQ original. <action> = aendern. ENDIF. MODIFY total INDEX sy-tabix. total = extract. <vim_enddate> = <vim_new_begdate> + 1. <action> = <xact> = neuer_eintrag. IF x_header-bastab NE space AND x_header-texttbexst NE space AND x_header-ptfrkyexst EQ space. MOVE: <vim_enddate> TO <vim_text_enddate>, neuer_eintrag TO <action_text>, neuer_eintrag TO <xact_text>. ENDIF. anz_pages = sy-tabix + 1. INSERT total INDEX anz_pages. ENDIF. ENDIF. "x_header-delmdtflag eq 'E' IF temporal_delimitation_happened EQ 'N'. CLEAR temporal_delimitation_happened. EXIT. ENDIF. IF temporal_delimitation_happened NE 'G'. MOVE sy-tabix TO anz_pages. LOOP AT vim_delim_entries WHERE index1 GE anz_pages. ADD 1 TO vim_delim_entries-index1. MODIFY vim_delim_entries. ENDLOOP. MOVE: anz_pages TO vim_delim_entries-index1, nextline TO vim_delim_entries-index2, space TO vim_delim_entries-index3. APPEND vim_delim_entries. MOVE 'X' TO temporal_delimitation_happened. ENDIF. IF <xact> NE leer AND neuer NE 'J' AND status-delete NE geloescht AND ( status-action NE kopieren AND vim_special_mode EQ space OR vim_special_mode EQ vim_delimit ). IF x_header-adrnbrflag NE space. * if entry contains address number: ask if new address is wanted CALL FUNCTION 'POPUP_TO_DECIDE' EXPORTING defaultoption = '1' titel = svim_text_037 textline1 = svim_text_038 textline2 = svim_text_039 textline3 = svim_text_040 text_option1 = svim_text_041 text_option2 = svim_text_042 IMPORTING answer = answer. CASE answer. WHEN 'A'. EXIT. WHEN '2'. "clear old address number CLEAR <address_number>. WHEN OTHERS. "copy old address * not yet possible ENDCASE. ENDIF. IF x_header-guidflag <> space. PERFORM vim_make_guid USING space. ENDIF. * if user exit for hidden fields exists: perform exit routine IF x_header-frm_h_flds NE space. PERFORM (x_header-frm_h_flds) IN PROGRAM. ENDIF. * if user exit for new entries exists: perform exit routine IF x_header-frm_on_new NE space. PERFORM (x_header-frm_on_new) IN PROGRAM. ENDIF. * if entry contains address number: call address maintain IF x_header-adrnbrflag NE space AND answer EQ '2'. PERFORM address_maintain. ENDIF. * if user exit after delimitation exists: perform exit routine IF x_header-frm_af_dlm NE space. delim_entr_safe = vim_delim_entries[]. collapsed_mkeys_safe = vim_collapsed_mainkeys[]. merged_entr_safe = vim_merged_entries[]. IF status-mode EQ detail_bild. ok_code_safe = ok_code. function_safe = function. ENDIF. PERFORM (x_header-frm_af_dlm) IN PROGRAM. MOVE delim_entr_safe TO vim_delim_entries[]. MOVE collapsed_mkeys_safe TO vim_collapsed_mainkeys[]. MOVE merged_entr_safe TO vim_merged_entries[]. IF status-mode EQ detail_bild. MOVE: ok_code_safe TO ok_code, function_safe TO function. ENDIF. ENDIF. ENDIF. ENDFORM. "temp_delimitation