*&--------------------------------------------------------------------* *& Form EDIT_VIEW_ENTRY * *&--------------------------------------------------------------------* * edit entry in TOTAL/EXTRACT due to foreign request * *---------------------------------------------------------------------* * ENTRY ---> entry to edit * * ACTION ---> action: UPD - add/update, DEL - delete, UDL - undelete * * IGN - mark entry as to ignore, MRK - mark/unmark entry * * SY_SUBRC -> return code: 0 - all right, others: failure * * EXT ---> table containing selected view entries * * TOT ---> table containing all view entries * * HEADER ---> table containing header information of current view * * NAMTAB ---> table containing information about current viewfields * * SELLIST --> table containing select options * *---------------------------------------------------------------------* FORM edit_view_entry TABLES ext tot header STRUCTURE vimdesc namtab STRUCTURE vimnamtab sellist STRUCTURE vimsellist USING value(entry) value(action). DATA: state_vect_name(37) TYPE c, rc LIKE sy-subrc, pos LIKE sy-fdpos, texttablename(31) TYPE c VALUE '* ', mmark(1) TYPE c, tab_rc LIKE sy-subrc, tab_ix LIKE sy-tabix, dummy_tab LIKE vimexclfun OCCURS 1, name(20) TYPE c. FIELD-SYMBOLS: TYPE x, TYPE x, TYPE x, TYPE x, TYPE c, TYPE c, TYPE c, TYPE c, TYPE c, TYPE ANY, TYPE ANY, TYPE x, TYPE x, TYPE x, TYPE ANY, TYPE ANY. READ TABLE header INDEX 1. pos = header-after_tabc. * MOVE HEADER-TABLEN TO POS. ASSIGN: tot TO CASTING, ext TO CASTING, entry TO CASTING, TO CASTING TYPE (header-maintview), TO CASTING TYPE (header-maintview). IF header-bastab NE space AND header-texttbexst NE space. * tab+txttb ADD header-aft_txttbc TO pos. MOVE header-texttab TO texttablename+1. ASSIGN: +header-after_tabc(header-texttablen) TO , +header-after_tabc(header-texttablen) TO , TO CASTING TYPE (header-texttab), (texttablename) TO . * ASSIGN: TOT+HEADER-TABLEN(HEADER-TEXTTABLEN) TO , * ENTRY+HEADER-TABLEN(HEADER-TEXTTABLEN) TO , * (TEXTTABLENAME) TO . ENDIF. ASSIGN: (header-keylen) TO , +pos(cl_abap_char_utilities=>charsize) TO CASTING, +pos(cl_abap_char_utilities=>charsize) TO CASTING. ADD cl_abap_char_utilities=>charsize TO pos. ASSIGN: +pos(cl_abap_char_utilities=>charsize) TO CASTING, +pos(cl_abap_char_utilities=>charsize) TO CASTING. IF header-bastab NE space AND header-texttbexst NE space."tab+txttb ADD cl_abap_char_utilities=>charsize TO pos. ASSIGN +pos(cl_abap_char_utilities=>charsize) TO CASTING. ENDIF. * ASSIGN: ENTRY(HEADER-KEYLEN) TO , * TOT+POS(1) TO . * ADD 1 TO POS. * ASSIGN TOT+POS(1) TO . * IF HEADER-BASTAB NE SPACE AND HEADER-TEXTTBEXST NE SPACE."tab+txttb * ADD 1 TO POS. * ASSIGN TOT+POS(1) TO . * SUBTRACT 1 FROM POS. * ENDIF. IF header-viewname NE last_ext_modif_view. MOVE state_vect_prefix TO state_vect_name. WRITE header-maintview TO state_vect_name+state_vect_prefix_length. ASSIGN (state_vect_name) TO . MOVE header-viewname TO last_ext_modif_view. ENDIF. READ TABLE tot WITH KEY BINARY SEARCH. tab_rc = sy-subrc. tab_ix = sy-tabix. IF sy-subrc EQ 0. " entry found in TOT CASE action. WHEN 'DEL'. CASE . WHEN neuer_eintrag. = neuer_geloescht. WHEN original. = geloescht. WHEN aendern. = update_geloescht. ENDCASE. IF header-bastab NE space AND header-texttbexst NE space. CASE . WHEN neuer_eintrag. = neuer_geloescht. WHEN original. IF NE . = geloescht. ENDIF. WHEN aendern. = update_geloescht. ENDCASE. ENDIF. mmark = . IF EQ markiert. = nicht_markiert. SUBTRACT 1 FROM -mk_to. ENDIF. MODIFY tot INDEX sy-tabix. READ TABLE ext WITH KEY . IF sy-subrc EQ 0. IF mmark EQ markiert. SUBTRACT 1 FROM -mk_xt. ENDIF. DELETE ext INDEX sy-tabix. SUBTRACT 1 FROM -maxlines. ENDIF. WHEN 'UPD'. IF header-bastab NE space AND header-texttbexst NE space. IF NE . IF EQ . = neuer_eintrag. ELSE. IF EQ original. = aendern. ENDIF. ENDIF. MOVE TO . ENDIF. ENDIF. MOVE TO . IF EQ original. = aendern. ENDIF. MODIFY tot INDEX sy-tabix. READ TABLE ext WITH KEY . IF sy-subrc EQ 0. MOVE tot TO ext. MODIFY ext INDEX sy-tabix. ENDIF. WHEN 'UDL'. CASE . WHEN neuer_geloescht. = neuer_eintrag. WHEN geloescht. = original. WHEN update_geloescht. = aendern. WHEN OTHERS. rc = 8. ENDCASE. IF rc EQ 0. IF header-bastab NE space AND header-texttbexst NE space. CASE . WHEN neuer_geloescht. = neuer_eintrag. WHEN geloescht. = original. WHEN update_geloescht. = aendern. ENDCASE. ENDIF. MODIFY tot INDEX sy-tabix. READ TABLE ext WITH KEY . IF sy-subrc EQ 0. IF -selected EQ geloescht. DELETE ext INDEX sy-tabix. ELSE. = . = . MODIFY ext INDEX sy-tabix. ENDIF. ENDIF. ENDIF. WHEN 'IGN'. IF EQ markiert. MOVE uebergehen TO . MODIFY tot INDEX sy-tabix. READ TABLE ext WITH KEY . IF sy-subrc EQ 0. = . MODIFY ext INDEX sy-tabix. ENDIF. ENDIF. rc = 1. WHEN 'MRK'. IF EQ markiert. MOVE nicht_markiert TO . ELSE. MOVE markiert TO . ENDIF. MODIFY tot INDEX sy-tabix. IF EQ markiert. ADD 1 TO -mk_to. ELSE. SUBTRACT 1 FROM -mk_to. ENDIF. READ TABLE ext WITH KEY . IF sy-subrc EQ 0. = . MODIFY ext INDEX sy-tabix. IF EQ markiert. ADD 1 TO -mk_xt. ELSE. SUBTRACT 1 FROM -mk_xt. ENDIF. ENDIF. rc = 1. ENDCASE. ELSE. "entry NOT found in TOT CLEAR sy-subrc. IF action NE 'UPD'. rc = 8. ELSE. IF header-selection NE space. IF header-bastab <> space AND header-texttbexst <> space. ASSIGN TO . ELSE. ASSIGN TO . ENDIF. CALL FUNCTION 'TABLE_RANGE_CHECK' EXPORTING tabname = header-maintview entry = entry entry_text = ddic = 'J' key = 'J' ignore_blank_subsetfields = 'N' TABLES x_namtab = namtab x_header = header sellist = sellist EXCEPTIONS entry_not_fits = 8. ENDIF. IF sy-subrc EQ 0. MOVE TO . = neuer_eintrag. = nicht_markiert. IF header-bastab NE space AND header-texttbexst NE space. = . IF NE . = neuer_eintrag. ELSE. = original. ENDIF. ENDIF. CASE tab_rc. WHEN 4. INSERT tot INDEX tab_ix. WHEN 8. APPEND tot. ENDCASE. ELSE. rc = sy-subrc. ENDIF. ENDIF. ENDIF. IF rc EQ 0. MOVE 'X' TO -upd_flag. ENDIF. sy-subrc = ( rc DIV 8 ) * 8. ENDFORM. " EDIT_VIEW_ENTRY