【ABAP】-TSV_TNEW_PAGE_ALLOC_FAILED因ADRV底表数据过多,导致BP维护视图超资源瓶颈
问题呈现和原因:
BP维护采购视图时,程序DOWN了,因为超资源瓶颈了
因ADRV底表数据过多,导致BP维护视图超资源瓶颈
想了解这个问题,需要知道以下几个内容:
关于ADRV这张表的存储内容
ADRV是一个地址存储表,员工地址/BP地址/订单中的地址都会存储到这个表里面;
采购订单的地址为何会存储到ADRV这个表里面
当EKPO-ADRN2有值时,采购订单的里面的地址也会存储到ADRV这个表里面;
FM: ADDR_REFERENCE_GET
当BP维护视图时,不论时采购视图/销售视图/公司代码视图,函数ADDR_REFERENCE_GET都会读取BP里面涉及到的组织/公司的所有地址信息
一般公司不会出现这个问题,我们公司为什么会出现这个问题?
一般公司的采购订单中EKPO-ADRN2是不填信息的,所以一般公司不会涉及到很多值的情况;
我们公司的EKPO-ADRN2地址中填了信息,所以存储到了ADRV这个表里面(但是原厂没有说明,为什么ADRV这个表里面一个采购订单会存在多行记录,有些超5000行记录,初步估计是原厂BUG,没有找到原因)
处理此问题的解决方式:
增加资源SMEMORY(一般BASIS不会建议这么做,资源限制可以防止用户大资源操作导致服务器DOWN) T-CODE:SMEMORY,一般超资源瓶颈,如果比较着急的话,可以跟BASIS商议在一个规定的时间内,暂时使用此方案查看一下
原厂给的解决方式1(见NOTE,510820)方案无效
就是新增三个程序,Z_OSSNOTE_510820, Z_OSSNOTE_510820_2,Z_OSSNOTE_510820_VBUK,这三个程序的目的是删除ADRV中的多余数据,但是采购订单中的数据存储到ADRV中,对系统来说并非多余的数据,所以此方案并不能删除ADRV中的采购订单地址信息(代码是三个程序的,自己要测试的记得分一下)
*$*$----------------------------------------------------------------$*$*
*$ Correction Inst. 0120061532 0000390437 $*
*$--------------------------------------------------------------------$*
*$ Valid for : $*
*$ Software Component SAP_BASIS SAP Basis component $*
*$ Release 610 All Support Package Levels $*
*$ Release 46C All Support Package Levels $*
*$ Release 46B All Support Package Levels $*
*$ Release 46A To SAPKB46A34 $*
*$ Release 46D All Support Package Levels $*
*$ Release 620 All Support Package Levels $*
*$ Release 640 w/o Support Packages $*
*$ Release 700 SAPKB70004 - SAPKB70022 $*
*$ Release 701 To SAPKB70107 $*
*$ Release 702 Fm SAPKB70201 $*
*$ Release 740 All Support Package Levels $*
*$--------------------------------------------------------------------$*
*$ Changes/Objects Not Contained in Standard SAP System $*
*$*$----------------------------------------------------------------$*$*
*&--------------------------------------------------------------------*
*& Object REPS Z_OSSNOTE_510820
*& Object Header PROG Z_OSSNOTE_510820
*&--------------------------------------------------------------------*
*& REPORT Z_OSSNOTE_510820
*&--------------------------------------------------------------------*
*>>>> START OF INSERTION <<<<
*&---------------------------------------------------------------------*
*& Report Z_OSSNOTE_510820 *
*& *
*&---------------------------------------------------------------------*
*& *
*& *
*&---------------------------------------------------------------------*REPORT z_ossnote_510820.
* Original in BCE, Version for 4.0 in U4B
* report Z_OSSNOTE_510820_VBUK in U6B
* Version 3
* 16.3.2005* Version 2: Reduzed package size to 500
* to avoid RANGEs that are too large* Version 3: Delete routine will automatically adapt
* to maximum range size.CONSTANTS: c_max_range_size TYPE i VALUE 500.PARAMETERS : tabname LIKE tsadrv-ddic_table,fldname LIKE tsadrv-ddic_field,testrun AS CHECKBOX DEFAULT 'X'.START-OF-SELECTION.IF tabname = 'VBUK'AND fldname = 'VBELN'.WRITE: / 'The report is not suited for this combination',/ 'of tablename and fieldname.',/ ' ',/ 'Please use report Z_OSSNOTE_510820_VBUK instead.'.EXIT.ELSEIF tabname = 'ADRC'.WRITE: / 'This report is not suited for this application table'.EXIT.ENDIF.PERFORM z_ossnote_510820USING tabnamefldnametestrun.
*&---------------------------------------------------------------------*
*& Form z_ossnote_510820
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_TABNAME text
* -->P_FLDNAME text
* -->P_TESTRUN text
*----------------------------------------------------------------------*
FORM z_ossnote_510820USING value(iv_tablename) LIKE tsadrv-ddic_tablevalue(iv_fieldname) LIKE tsadrv-ddic_fieldvalue(iv_testrun) TYPE c.DATA: lv_tsadrv LIKE tsadrv,lv_psize TYPE i VALUE '1000',BEGIN OF lt_addrnumber OCCURS 0,addrnumber LIKE adrc-addrnumber,END OF lt_addrnumber,lt_adrv LIKE adrv OCCURS 0 WITH HEADER LINE,lt_adrv_2 LIKE adrv OCCURS 0 WITH HEADER LINE,lt_adrv_d LIKE adrv OCCURS 0 WITH HEADER LINE,lv_tab_count TYPE i,BEGIN OF lt_sel_field OCCURS 0,line(100) TYPE c,END OF lt_sel_field,BEGIN OF lt_sel_cond OCCURS 0,line(100) TYPE c,END OF lt_sel_cond,lv_cursor TYPE cursor,lv_addrnumber_low LIKE adrc-addrnumber,lv_addrnumber_high LIKE adrc-addrnumber.RANGES: lr_addrnumber_del FOR adrc-addrnumber.* Logischen Tabellennamen und Feldnamen ermitteln.SELECT SINGLE * FROM tsadrvINTO lv_tsadrvWHERE ddic_table = iv_tablenameAND ddic_field = iv_fieldname.IF sy-subrc <> 0.WRITE: / 'Please enter a correct table and field name.'.EXIT.ENDIF.OPEN CURSOR WITH HOLD lv_cursorFOR SELECT * FROM adrvWHERE appl_table = lv_tsadrv-tablenameAND appl_field = lv_tsadrv-fieldname.DO.* Zunächst Tabelle ADRV lesen.FETCH NEXT CURSOR lv_cursorINTO TABLE lt_adrvPACKAGE SIZE lv_psize.IF sy-subrc <> 0.CLOSE CURSOR lv_cursor.EXIT.ENDIF.CLEAR lt_adrv_d.REFRESH lt_adrv_d.CLEAR lr_addrnumber_del.REFRESH lr_addrnumber_del.DESCRIBE TABLE lt_adrv LINES lv_tab_count.IF lv_tab_count > 0.* Jetzt aus der Anwendungstabelle ermitteln, welche Adreßnummern der
* ADRV wirklich noch da sind.READ TABLE lt_adrv INDEX 1.lv_addrnumber_low = lt_adrv-addrnumber.lv_addrnumber_high = lt_adrv-addrnumber.LOOP AT lt_adrv.IF lt_adrv-addrnumber < lv_addrnumber_low.lv_addrnumber_low = lt_adrv-addrnumber.ELSEIF lt_adrv-addrnumber > lv_addrnumber_high.lv_addrnumber_high = lt_adrv-addrnumber.ENDIF.ENDLOOP.CLEAR lt_sel_cond.REFRESH lt_sel_cond.CONCATENATE iv_fieldname ' <> '' '' AND' INTO lt_sel_cond-line.APPEND lt_sel_cond.CONCATENATE iv_fieldname ' >= ''' lv_addrnumber_low ''' AND 'INTO lt_sel_cond-line.APPEND lt_sel_cond.CONCATENATE iv_fieldname ' <= ''' lv_addrnumber_high ''''INTO lt_sel_cond-line.APPEND lt_sel_cond.REFRESH lt_sel_field.lt_sel_field-line = iv_fieldname.APPEND lt_sel_field.SELECT (lt_sel_field) FROM (iv_tablename)INTO TABLE lt_addrnumberWHERE (lt_sel_cond).SORT lt_addrnumber.DELETE ADJACENT DUPLICATES FROM lt_addrnumber.* Jetzt kommt der Abgleich ADRV <-> Anwendungstabelle.LOOP AT lt_adrv.READ TABLE lt_addrnumberWITH KEY addrnumber = lt_adrv-addrnumberTRANSPORTING NO FIELDSBINARY SEARCH.IF sy-subrc = 0.
* Adreßnummer existiert, keine weitere Bearbeitung nötig.DELETE lt_adrv.ENDIF.ENDLOOP.* Zu den verbleibenden Adreßnummern können noch andere Referenzen
* existieren. Das wird überprüft.DESCRIBE TABLE lt_adrv LINES lv_tab_count.IF lv_tab_count > 0.SELECT * FROM adrvINTO TABLE lt_adrv_2FOR ALL ENTRIES IN lt_adrvWHERE addrnumber = lt_adrv-addrnumber.DELETE lt_adrv_2WHERE appl_table = lv_tsadrv-tablenameAND appl_field = lv_tsadrv-fieldname.SORT lt_adrv_2.LOOP AT lt_adrv.READ TABLE lt_adrv_2WITH KEY addrnumber = lt_adrv-addrnumberTRANSPORTING NO FIELDSBINARY SEARCH.IF sy-subrc = 0.
* Andere Referenz existiert.lt_adrv_d = lt_adrv.APPEND lt_adrv_d.WRITE: / 'Invalid Reference deleted:',lt_adrv-addrnumber,lt_adrv-appl_table,lt_adrv-appl_field,lt_adrv-appl_key.ELSE.
* Für die Adresse existiert keine gültige Referenz mehr. Adresse
* wird gelöscht.CLEAR lr_addrnumber_del.lr_addrnumber_del-sign = 'I'.lr_addrnumber_del-option = 'EQ'.lr_addrnumber_del-low = lt_adrv-addrnumber.APPEND lr_addrnumber_del.WRITE: / 'Address (only invalid references) deleted:',lt_adrv-addrnumber,lt_adrv-appl_table,lt_adrv-appl_field,lt_adrv-appl_key.ENDIF.ENDLOOP.SORT lr_addrnumber_del.DELETE ADJACENT DUPLICATES FROM lr_addrnumber_del.ENDIF.ENDIF.IF iv_testrun IS INITIAL.DELETE adrv FROM TABLE lt_adrv_d.PERFORM delete_addressTABLES lr_addrnumber_delUSING iv_testrun.CALL FUNCTION 'DB_COMMIT'.WRITE: / 'Database has been updated.'.ENDIF.ENDDO.ENDFORM. " z_ossnote_510820
*&--------------------------------------------------------------------*
*& Form delete_address
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
* -->IR_ADDRNUMBtextEL
* -->VALUE(IV_TEtextN)
*---------------------------------------------------------------------*
FORM delete_addressTABLES ir_addrnumber_delUSING value(iv_testrun) TYPE c.DATA: lv_tab_count TYPE i.RANGES: lr_addrnumber_del FOR adrc-addrnumber.DESCRIBE TABLE ir_addrnumber_del LINES lv_tab_count.IF lv_tab_count <= c_max_range_size.PERFORM delete_address_internalTABLES ir_addrnumber_delUSING iv_testrun.ELSE.WHILE lv_tab_count > c_max_range_size.DO c_max_range_size TIMES.REFRESH lr_addrnumber_del.READ TABLE ir_addrnumber_del INDEX 1.APPEND ir_addrnumber_del TO lr_addrnumber_del.DELETE ir_addrnumber_del INDEX 1.ENDDO.PERFORM delete_address_internalTABLES lr_addrnumber_delUSING iv_testrun.DESCRIBE TABLE ir_addrnumber_del LINES lv_tab_count.ENDWHILE.ENDIF.ENDFORM. "delete_address
*&---------------------------------------------------------------------*
*& Form delete_address_interal
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_LR_ADDRNUMBER_DEL text
* -->P_IV_TESTRUN text
*----------------------------------------------------------------------*
FORM delete_address_internalTABLES ir_addrnumber_delUSING value(iv_testrun) TYPE c.DATA: BEGIN OF lt_adcp OCCURS 0,addrnumber LIKE adcp-addrnumber,END OF lt_adcp,lv_tab_count TYPE i.RANGES: lr_addrnumber_del FOR adrc-addrnumber.lr_addrnumber_del[] = ir_addrnumber_del[].DESCRIBE TABLE lr_addrnumber_del LINES lv_tab_count.IF lv_tab_count = 0.EXIT.ENDIF.SELECT addrnumber FROM adcpINTO TABLE lt_adcpWHERE addrnumber IN lr_addrnumber_del.SORT lt_adcp.DELETE ADJACENT DUPLICATES FROM lt_adcp.LOOP AT lt_adcp.
* Display all the non-deleteable addresses.WRITE: / 'Address number has personal','address or contact partner:',lt_adcp-addrnumber.ENDLOOP.IF sy-subrc = 0.
* There were adresses that could not be deleted. Notify the caller
* and abort.SKIP.WRITE: / 'Not all addresses can be deleted by this report.',/ 'Therefore the report will not delete any addresses.'.ELSEIF testrun IS INITIAL.
* All address numbers are only for type 1. If we are not in testrun
* go ahead and delete.DELETE FROM adrc WHERE addrnumber IN lr_addrnumber_del.DELETE FROM adrct WHERE addrnumber IN lr_addrnumber_del.DELETE FROM adrg WHERE addrnumber IN lr_addrnumber_del.DELETE FROM adrv WHERE addrnumber IN lr_addrnumber_del.DELETE FROM adr2 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adr3 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adr4 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adr5 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adr6 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adr7 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adr8 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adr9 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adr10 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adr11 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adr12 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adr13 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adrt WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adrcomc WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.ENDIF.ENDFORM. " delete_address
*>>>> END OF INSERTION <<<<<<
...
*&--------------------------------------------------------------------*
*&--------------------------------------------------------------------*
*& Object REPS Z_OSSNOTE_510820_2
*& Object Header PROG Z_OSSNOTE_510820_2
*&--------------------------------------------------------------------*
*& REPORT Z_OSSNOTE_510820_2
*&--------------------------------------------------------------------*
*>>>> START OF INSERTION <<<<
*&---------------------------------------------------------------------*
*& Report Z_OSSNOTE_510820 *
*& *
*&---------------------------------------------------------------------*
*& *
*& *
*&---------------------------------------------------------------------*REPORT z_ossnote_510820_2.
* Original in BCE, Version for 4.0 in U4B
* Report Z_OSSNOTE_510820_VBUK in U6B.
* Version 3
* 16.3.2005* Version 2: Reduzed package size to 500
* to avoid RANGEs that are too large
*
* Version 3: Enhanced the check functionality:
* the ADRV-entries now also evaluate APPL_KEY
*
* Duplicate ADRV-entries will be automatically
* deleted
*
* Delete routine automatically adjusts range size,
* which allows for larger package sizes.TABLES adrc..PARAMETERS : tabname LIKE tsadrv-ddic_table DEFAULT 'USCOMPANY',fldname LIKE tsadrv-ddic_field DEFAULT 'ADDRNUMBER'.SELECT-OPTIONS: addrnum FOR adrc-addrnumber.PARAMETERS: testrun AS CHECKBOX DEFAULT 'X'.CONSTANTS: c_package_size TYPE i VALUE 1000.
CONSTANTS: c_max_range_size TYPE i VALUE 500.DATA: BEGIN OF gt_source OCCURS 0,line(72) TYPE c,END OF gt_source.START-OF-SELECTION.IF tabname = 'VBUK'AND fldname = 'VBELN'.WRITE: / 'The report is not suited for this combination',/ 'of tablename and fieldname.',/ ' ',/ 'Please use report Z_OSSNOTE_510820_VBUK instead.'.EXIT.ELSEIF tabname = 'ADRC'.WRITE: / 'This report is not suited for this application table'.EXIT.ENDIF.PERFORM z_ossnote_510820_del_surplusTABLES addrnumUSING tabnamefldname'X'testrun.*&---------------------------------------------------------------------*
*& Form z_ossnote_510820
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_TABNAME text
* -->P_FLDNAME text
* -->P_TESTRUN text
*----------------------------------------------------------------------*
FORM z_ossnote_510820_del_surplusTABLES ia_addrnumUSING value(iv_tablename) LIKE tsadrv-ddic_tablevalue(iv_fieldname) LIKE tsadrv-ddic_fieldvalue(iv_deladdr)value(iv_testrun) TYPE c.DATA: lt_source LIKE gt_source OCCURS 0 WITH HEADER LINE,lv_error_occurred(1) TYPE c.DATA: lv_program(8) TYPE c,lv_subroutine(30) TYPE c,lv_message(100) TYPE c,lv_line(10) TYPE c,lv_offset(10) TYPE c.* We need generic coding dependent on the table.
* Therefore we need to generate the source first.PERFORM subroutine_2_createTABLES lt_sourceUSING iv_tablenameiv_fieldnameiv_testrunCHANGING lv_error_occurred.IF NOT lv_error_occurred IS INITIAL.EXIT.ENDIF.GENERATE SUBROUTINE POOL lt_sourceNAME lv_programMESSAGE lv_messageLINE lv_lineOFFSET lv_offset.IF sy-subrc = 0.PERFORM z_ossnote_510820IN PROGRAM (lv_program)TABLES ia_addrnumUSING iv_testrun.ELSE.WRITE: / 'Internal error in the report.',/ 'Execution not possible.'.ENDIF.ENDFORM. " z_ossnote_510820
*&--------------------------------------------------------------------*
*& Form subroutine_create
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
* -->ET_SOURCE text
* -->IV_TABLENAMtext
* -->IV_FIELDNAMtext
*---------------------------------------------------------------------*
FORM subroutine_2_createTABLES lt_source STRUCTURE gt_sourceUSING iv_tnam LIKE tsadrv-ddic_tableiv_fnam LIKE tsadrv-ddic_fieldiv_deladdrCHANGING ev_error_occurred.DATA: lt_dfies LIKE dfies OCCURS 0 WITH HEADER LINE,ls_tsadrv LIKE tsadrv,lv_ddobjname TYPE ddobjname,lv_keylength TYPE i,lv_keyl_n(3) TYPE c,lv_psize_c(10) TYPE c,lv_prog LIKE sy-repid,lv_first(1) TYPE c.CLEAR ev_error_occurred.lv_prog = sy-repid.lv_psize_c = c_package_size.* We need to check whether this really is a registered
* tables. This will us also give APPL_TABLE and APPL_FIELD.SELECT SINGLE * FROM tsadrv INTO ls_tsadrvWHERE ddic_table = iv_tnamAND ddic_field = iv_fnam.IF sy-subrc <> 0.
* An application may leave the fields TSADRV-DDIC_TABLE and
* TSADRV-DDIC_FIELD empty if logical and real table and
* field names coincide.SELECT SINGLE * FROM tsadrv INTO ls_tsadrvWHERE tablename = iv_tnamAND fieldname = iv_fnam.IF sy-subrc = 0AND ls_tsadrv-ddic_table IS INITIALAND ls_tsadrv-ddic_field IS INITIAL.ls_tsadrv-ddic_table = ls_tsadrv-tablename.ls_tsadrv-ddic_field = ls_tsadrv-fieldname.ELSE.WRITE: / 'Please enter a valid combination','of Tablename and Fieldname'.ev_error_occurred = 'X'.EXIT.ENDIF.ENDIF.* We need to know the keyfields of the application
* table.lv_ddobjname = iv_tnam.CALL FUNCTION 'DDIF_FIELDINFO_GET'EXPORTINGtabname = lv_ddobjnameTABLESdfies_tab = lt_dfiesEXCEPTIONSnot_found = 1internal_error = 2OTHERS = 3.IF sy-subrc <> 0.MESSAGE ID sy-msgid TYPE 'X' NUMBER sy-msgnoWITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.ENDIF.DELETE lt_dfiesWHERE keyflag IS INITIAL.DELETE lt_dfies WHERE datatype = 'CLNT'.SORT lt_dfies BY position.PERFORM determine_keylengthTABLES lt_dfiesCHANGING lv_keylength.lv_keyl_n = lv_keylength.* Some makros to make writing the source easier.DEFINE a1.lt_source-line = &1.append lt_source.END-OF-DEFINITION.DEFINE a2.lt_source-line = &1.replace 'EINS' with &2 into lt_source-line.append lt_source.END-OF-DEFINITION.DEFINE a2_c.lt_source-line = &1.replace 'EINS' with &2 into lt_source-line.condense lt_source-line no-gaps.append lt_source.END-OF-DEFINITION.DEFINE a3.lt_source-line = &1.replace 'EINS' with &2 into lt_source-line.replace 'ZWEI' with &3 into lt_source-line.append lt_source.END-OF-DEFINITION.DEFINE a3_c.lt_source-line = &1.replace 'EINS' with &2 into lt_source-line.replace 'ZWEI' with &3 into lt_source-line.condense lt_source-line no-gaps.append lt_source.END-OF-DEFINITION.DEFINE a4.lt_source-line = &1.replace 'EINS' with &2 into lt_source-line.replace 'ZWEI' with &3 into lt_source-line.replace 'DREI' with &4 into lt_source-line.append lt_source.END-OF-DEFINITION.a1 'REPORT Z_OSSNOTE_510820_SUBROUTINES.'.a1 ' '.a1 'FORM z_ossnote_510820'.a1 ' tables ia_addrnum'.a1 ' USING value(iv_testrun) TYPE c.'.a1 ' '.a2 'DATA: lt_EINS' iv_tnam.a2 ' like EINS' iv_tnam.a1 ' OCCURS 0 WITH HEADER LINE.'.a2 'DATA: ls_EINS' iv_tnam.a2 ' like EINS' iv_tnam.a1 ' .'.a1 'DATA: lt_adrv LIKE adrv OCCURS 0 WITH HEADER LINE.'.a1 'DATA: lt_adrv_2 LIKE adrv OCCURS 0 WITH HEADER LINE.'.a1 'DATA: lt_adrv_d LIKE adrv OCCURS 0 WITH HEADER LINE.'.a1 'DATA: lt_adrv_u LIKE adrv OCCURS 0 WITH HEADER LINE.'.a1 'DATA: ls_adrv_old LIKE adrv.'.a1 'DATA: lv_addrnumber_low LIKE adrc-addrnumber,'.a1 ' lv_addrnumber_high LIKE adrc-addrnumber.'.a1 'data: lv_keyl type i.'.a1 'data: lv_tab_count type i.'.a1 'data: BEGIN OF lt_addrnumber OCCURS 0,'.a1 ' addrnumber LIKE adrc-addrnumber,'.a1 ' END OF lt_addrnumber.'.a1 ' '.a1 'RANGES: lr_addrnumber_del FOR adrc-addrnumber.'.a1 ' '.a1 'lv_addrnumber_low = ''0000000000''.'.a2 'lv_keyl = EINS.' lv_keyl_n.a1 ' '.a1 'DO.'.a1 ' '.a1 'refresh lt_adrv_d.'.a1 'refresh lt_adrv_u.'.a1 ' '.a1 'if ia_addrnum[] is initial.'.a1 ' SELECT * FROM adrv'.a1 ' INTO TABLE lt_adrv'.a2 ' UP TO EINS ROWS' lv_psize_c.a2 ' where appl_table = ''EINS''' ls_tsadrv-tablename.a2 ' and appl_field = ''EINS''' ls_tsadrv-fieldname.a1 ' and addrnumber > lv_addrnumber_low'.a1 ' ORDER BY addrnumber.'.a1 'else.'.a1 ' SELECT * FROM adrv'.a1 ' INTO TABLE lt_adrv'.a2 ' UP TO EINS ROWS' lv_psize_c.a2 ' where appl_table = ''EINS''' ls_tsadrv-tablename.a2 ' and appl_field = ''EINS''' ls_tsadrv-fieldname.a1 ' and addrnumber > lv_addrnumber_low'.a1 ' and addrnumber in ia_addrnum'.a1 ' ORDER BY addrnumber.'.a1 'endif.'.a1 'IF sy-subrc <> 0.'.a1 ' EXIT.'.a1 'ENDIF.'.a1 ' '.a1 'READ TABLE lt_adrv INDEX sy-dbcnt.'.a1 'lv_addrnumber_high = lt_adrv-addrnumber.'.a1 'SELECT * FROM adrv'.a1 ' appending TABLE lt_adrv'.a2 ' where appl_table = ''EINS''' ls_tsadrv-tablename.a2 ' and appl_field = ''EINS''' ls_tsadrv-fieldname.a1 ' and addrnumber = lv_addrnumber_high.'.a1 'SORT lt_adrv.'.a1 'delete adjacent duplicates from lt_adrv.'.a1 'SORT lt_adrv by addrnumber appl_table appl_field appl_key.'.a1 ' '.a1 '* First we need to delete real duplicates.'.a1 'clear ls_adrv_old.'.a1 'loop at lt_adrv'.a2 ' where appl_table = ''EINS''' ls_tsadrv-tablename.a2 ' and appl_field = ''EINS''.' ls_tsadrv-fieldname.a1 ' if lt_adrv-addrnumber <> ls_adrv_old-addrnumber'.a1 ' or lt_adrv-appl_key <> ls_adrv_old-appl_key.'.a1 ' ls_adrv_old = lt_adrv.'.a1 ' else.'.a1 ' lt_adrv_d = lt_adrv.'.a1 ' append lt_adrv_d.'.a1 ' delete lt_adrv.'.a1 ' write: ''Duplicate reference deleted:'','.a1 ' lt_adrv_d-addrnumber,'.a1 ' lt_adrv_d-appl_key+0(30).'.a1 ' endif.'.a1 'endloop.'.a1 ' '.a1 '*Now we check which references point to real entries.'.a2 'refresh lt_EINS.' iv_tnam.a1 'loop at lt_adrv.'.a2 ' clear lt_EINS.' iv_tnam.a2_c ' lt_EINS+0(lv_keyl)' iv_tnam.a1 ' = lt_adrv-appl_key.'.a2 ' append lt_EINS.' iv_tnam.a1 'endloop.'.a1 ' '.a1 '*We try to select the corresponding entries from'.a1 '*the application table'.a2 'select * from EINS' iv_tnam.a2 ' into table lt_EINS' iv_tnam.a2 ' for all entries in lt_EINS' iv_tnam.CLEAR lv_first.LOOP AT lt_dfies.IF lv_first IS INITIAL.a2 ' where EINS =' lt_dfies-fieldname.a3_c 'lt_EINS-ZWEI' iv_tnam lt_dfies-fieldname.lv_first = 'X'.ELSE.a2 ' and EINS =' lt_dfies-fieldname.a3_c 'lt_EINS-ZWEI' iv_tnam lt_dfies-fieldname.ENDIF.ENDLOOP.a1 '.'.a2 'sort lt_EINS.' iv_tnam.a1 ' '.a1 '*Now we check the references.'.a1 'loop at lt_adrv.'.a1 ' '.a2_c ' ls_EINS+0(lv_keyl)' iv_tnam.a1 ' = lt_adrv-appl_key.'.a2 ' read table lt_EINS' iv_tnam.a1 ' with key'.LOOP AT lt_dfies.a2 ' EINS =' lt_dfies-fieldname.a3_c 'ls_EINS-ZWEI' iv_tnam lt_dfies-fieldname.ENDLOOP.a1 ' binary search.'.a1 ' if sy-subrc = 0.'.a1 '*owner object exists. Check the addres number'.a1 ' if'.a3_c 'lt_EINS-ZWEI' iv_tnam iv_fnam.a1 ' = lt_adrv-addrnumber.'.a1 '*Everything o.k., no need to check this one any longer.'.a1 ' delete lt_adrv.'.a1 ' else.'.a1 ' lt_adrv_d = lt_adrv.'.a1 ' append lt_adrv_d.'.a1 ' write : / ''Reference with wrong addrnumber deleted:'','.a1 ' lt_adrv_d-addrnumber,'.a1 ' lt_adrv_d-appl_key+0(30).'.a1 ' endif.'.a1 ' else.'.a1 '*The owner for this reference no longer exists'.a1 ' lt_adrv_d = lt_adrv.'.a1 ' append lt_adrv_d.'.a1 ' write : / ''Reference without owner deleted:'','.a1 ' lt_adrv_d-addrnumber,'.a1 ' lt_adrv_d-appl_key+0(30).'.a1 ' endif.'.a1 ' '.a1 'endloop.'.a1 ' '.IF NOT iv_deladdr IS INITIAL.a1 '*Now we need to check if some address lost all references'.a1 '*So we first determine the still existing references'.a1 '*for all affected addrnumbers.'.a1 'refresh lt_adrv_2.'.a1 'DESCRIBE TABLE lt_adrv_d LINES lv_tab_count.'.a1 'IF lv_tab_count > 0.'.a1 ' refresh lt_addrnumber.'.a1 ' loop at lt_adrv_d.'.a1 ' lt_addrnumber-addrnumber = lt_adrv_d-addrnumber.'.a1 ' append lt_addrnumber.'.a1 ' endloop.'.a1 ' sort lt_addrnumber.'.a1 ' delete adjacent duplicates from lt_addrnumber.'.a1 ' SELECT * FROM adrv'.a1 ' INTO TABLE lt_adrv_2'.a1 ' FOR ALL ENTRIES IN lt_addrnumber'.a1 ' WHERE addrnumber = lt_addrnumber-addrnumber.'.a1 'endif.'.a1 'sort lt_adrv_d by addrnumber consnumber.'.a1 'loop at lt_adrv_2.'.a1 ' read table lt_adrv_d'.a1 ' with key addrnumber = lt_adrv_2-addrnumber'.a1 ' consnumber = lt_adrv_2-consnumber'.a1 ' binary search transporting no fields.'.a1 ' if sy-subrc = 0.'.a1 ' delete lt_adrv_2.'.a1 ' endif.'.a1 'endloop.'.a1 'sort lt_adrv_2 by addrnumber.'.a1 ' '.a1 '*Now we can check if to an affected address a reference'.a1 '*exists.'.a1 'loop at lt_adrv_d.'.a1 ' read table lt_adrv_2'.a1 ' with key addrnumber = lt_adrv_d-addrnumber'.a1 ' binary search transporting no fields.'.a1 ' if sy-subrc <> 0.'.a1 '* No further references exist, delete the address'.a1 ' CLEAR lr_addrnumber_del.'.a1 ' lr_addrnumber_del-sign = ''I''.'.a1 ' lr_addrnumber_del-option = ''EQ''.'.a1 ' lr_addrnumber_del-low = lt_adrv_d-addrnumber.'.a1 ' APPEND lr_addrnumber_del.'.a1 ' WRITE: / ''Address (only invalid references) deleted:'','.a1 ' lt_adrv_d-addrnumber,'.a1 ' lt_adrv_d-appl_table,'.a1 ' lt_adrv_d-appl_field,'.a1 ' lt_adrv_d-appl_key+0(30).'.a1 ' endif.'.a1 'endloop.'.ENDIF.a1 ' '.a1 '*Now we update the database'.a1 'if iv_testrun is initial.'.a1 ' delete adrv from table lt_adrv_d.'.IF NOT iv_deladdr IS INITIAL.a1 ' perform delete_address'.a2 ' in program EINS' lv_prog.a1 ' TABLES lr_addrnumber_del'.a1 ' USING iv_testrun.'.ENDIF.a1 'endif.'.a1 ' '.a1 'lv_addrnumber_low = lv_addrnumber_high.'.a1 'enddo.'.a1 ' '.a1 'endform.'.ENDFORM. "subroutine_create*&--------------------------------------------------------------------*
*& Form determine_keylength
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
* -->IT_DFIES text
* -->EV_KEYLENGTtext
*---------------------------------------------------------------------*
FORM determine_keylengthTABLES it_dfies STRUCTURE dfiesCHANGING ev_keylength TYPE i.ev_keylength = 0.LOOP AT it_dfiesWHERE NOT keyflag IS INITIAL.ev_keylength = ev_keylength + it_dfies-leng.ENDLOOP.ENDFORM. " determine_keylength*&--------------------------------------------------------------------*
*& Form delete_address
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
* -->IR_ADDRNUMBtextEL
* -->VALUE(IV_TEtextN)
*---------------------------------------------------------------------*
FORM delete_addressTABLES ir_addrnumber_delUSING value(iv_testrun) TYPE c.DATA: lv_tab_count TYPE i.RANGES: lr_addrnumber_del FOR adrc-addrnumber.DESCRIBE TABLE ir_addrnumber_del LINES lv_tab_count.IF lv_tab_count <= c_max_range_size.PERFORM delete_address_internalTABLES ir_addrnumber_delUSING iv_testrun.ELSE.WHILE lv_tab_count > c_max_range_size.DO c_max_range_size TIMES.REFRESH lr_addrnumber_del.READ TABLE ir_addrnumber_del INDEX 1.APPEND ir_addrnumber_del TO lr_addrnumber_del.DELETE ir_addrnumber_del INDEX 1.ENDDO.PERFORM delete_address_internalTABLES lr_addrnumber_delUSING iv_testrun.DESCRIBE TABLE ir_addrnumber_del LINES lv_tab_count.ENDWHILE.ENDIF.ENDFORM. "delete_address
*&---------------------------------------------------------------------*
*& Form delete_address_interal
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_LR_ADDRNUMBER_DEL text
* -->P_IV_TESTRUN text
*----------------------------------------------------------------------*
FORM delete_address_internalTABLES ir_addrnumber_delUSING value(iv_testrun) TYPE c.DATA: BEGIN OF lt_adcp OCCURS 0,addrnumber LIKE adcp-addrnumber,END OF lt_adcp,lv_tab_count TYPE i.RANGES: lr_addrnumber_del FOR adrc-addrnumber.lr_addrnumber_del[] = ir_addrnumber_del[].DESCRIBE TABLE lr_addrnumber_del LINES lv_tab_count.IF lv_tab_count = 0.EXIT.ENDIF.SELECT addrnumber FROM adcpINTO TABLE lt_adcpWHERE addrnumber IN lr_addrnumber_del.SORT lt_adcp.DELETE ADJACENT DUPLICATES FROM lt_adcp.LOOP AT lt_adcp.
* Display all the non-deleteable addresses.WRITE: / 'Address number has personal','address or contact partner:',lt_adcp-addrnumber.ENDLOOP.IF sy-subrc = 0.
* There were adresses that could not be deleted. Notify the caller
* and abort.SKIP.WRITE: / 'Not all addresses can be deleted by this report.',/ 'Therefore the report will not delete any addresses.'.ELSEIF testrun IS INITIAL.
* All address numbers are only for type 1. If we are not in testrun
* go ahead and delete.DELETE FROM adrc WHERE addrnumber IN lr_addrnumber_del.DELETE FROM adrct WHERE addrnumber IN lr_addrnumber_del.DELETE FROM adrg WHERE addrnumber IN lr_addrnumber_del.DELETE FROM adrv WHERE addrnumber IN lr_addrnumber_del.DELETE FROM adr2 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adr3 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adr4 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adr5 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adr6 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adr7 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adr8 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adr9 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adr10 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adr11 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adr12 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adr13 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adrt WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adrcomc WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.ENDIF.ENDFORM. " delete_address_internal
*>>>> END OF INSERTION <<<<<<
...
*&--------------------------------------------------------------------*
*&--------------------------------------------------------------------*
*& Object REPS Z_OSSNOTE_510820_VBUK
*& Object Header PROG Z_OSSNOTE_510820_VBUK
*&--------------------------------------------------------------------*
*& REPORT Z_OSSNOTE_510820_VBUK
*&--------------------------------------------------------------------*
*>>>> START OF INSERTION <<<<
REPORT z_ossnote_510820_vbuk.* Original in U6B,
* Version 5
* 17.5.2005* This is a special version of report Z_OSSNOTE_510820
* for table VBUK and the associated tables* VAKPA sales order index, fields adrnr_ag and adrnr
* VLKPA delivery index, fields are adrnr and adrnr_we
* VRKPA invoice index, fields are adrnr and adrnr_rg
* VBPA sales document partner table, field adrnr
* VTPA transport document partner table, field ADRNR
* VBPA2 additional partner table for sales documents, field ADRNR* Here the logic of report Z_OSSNOTE_510820 breaks down
* as all these tables use the same logical tablename and
* fieldname.* Version 4: Added ORDER BY ADDRNUMBER to the SELECT
* statements for table ADRV* Version 5: According to Jürgen Faas every address number that
* occurs in the tables VAKPA, VLKPA or VRKPA
* also occurs in table VBPA.
* Also the tables VAKPA, VLKPA and VRKPA do not write
* their own ADRV-entries.
* This means these tables do not neet to be checked,
* which is fortunate as for them VBELN has no index.* Selection Screen : ---------------------------
TABLES adrc.SELECT-OPTIONS: addrnum FOR adrc-addrnumber.PARAMETERS: testrun AS CHECKBOX DEFAULT 'X'.
* ----------------------------------------------CONSTANTS: c_package_size TYPE i VALUE 1000.
CONSTANTS: c_max_range_size TYPE i VALUE 500.START-OF-SELECTION.DATA: lt_adrv LIKE adrv OCCURS 0 WITH HEADER LINE,lt_adrv_d LIKE adrv OCCURS 0 WITH HEADER LINE,ls_adrv_old LIKE adrv,* lt_vakpa LIKE vakpa OCCURS 0 WITH HEADER LINE,
* lt_vlkpa LIKE vlkpa OCCURS 0 WITH HEADER LINE,
* lt_vrkpa LIKE vrkpa OCCURS 0 WITH HEADER LINE,
* lt_vakpa_ag LIKE vakpa OCCURS 0 WITH HEADER LINE,
* lt_vlkpa_we LIKE vlkpa OCCURS 0 WITH HEADER LINE,
* lt_vrkpa_rg LIKE vrkpa OCCURS 0 WITH HEADER LINE,lt_vbpa LIKE vbpa OCCURS 0 WITH HEADER LINE,lt_vtpa LIKE vtpa OCCURS 0 WITH HEADER LINE,lt_vbpa2 LIKE vbpa2 OCCURS 0 WITH HEADER LINE,BEGIN OF lt_vbeln OCCURS 0,vbeln LIKE vbuk-vbeln,END OF lt_vbeln,BEGIN OF lt_addrnumber OCCURS 0,addrnumber LIKE adrc-addrnumber,END OF lt_addrnumber,lv_addrnumber_low LIKE adrc-addrnumber.RANGES: lr_addrnumber_del FOR adrc-addrnumber.WRITE: / 'Checking the ADRV-References VBUR VBELN.'.SKIP.lv_addrnumber_low = '0000000000'.DO.REFRESH lt_adrv_d.REFRESH lt_adrv.REFRESH lr_addrnumber_del.* First we read the relevant ADRV-data.IF addrnum[] IS INITIAL.SELECT * FROM adrvUP TO c_package_size ROWSINTO TABLE lt_adrvWHERE appl_table = 'VBUK'AND appl_field = 'VBELN'AND addrnumber > lv_addrnumber_lowORDER BY addrnumber.ELSE.SELECT * FROM adrvUP TO c_package_size ROWSINTO TABLE lt_adrvWHERE appl_table = 'VBUK'AND appl_field = 'VBELN'AND addrnumber > lv_addrnumber_lowAND addrnumber IN addrnumORDER BY addrnumber.ENDIF.IF sy-subrc <> 0.EXIT.ENDIF.READ TABLE lt_adrv INDEX sy-dbcnt.lv_addrnumber_low = lt_adrv-addrnumber.SELECT * FROM adrvAPPENDING TABLE lt_adrvWHERE appl_table = 'VBUK'AND appl_field = 'VBELN'AND addrnumber = lv_addrnumber_low.SORT lt_adrv.DELETE ADJACENT DUPLICATES FROM lt_adrv.* Now we delete identical copies from LT_ADRVSORT lt_adrv BY addrnumber appl_table appl_field appl_key.CLEAR ls_adrv_old.LOOP AT lt_adrv.IF ls_adrv_old-addrnumber = lt_adrv-addrnumberAND ls_adrv_old-appl_key = lt_adrv-appl_key.
* We have found an identical duplicate.lt_adrv_d = lt_adrv.APPEND lt_adrv_d.DELETE lt_adrv.WRITE: / 'Identical duplicate deleted:',lt_adrv_d-addrnumber,lt_adrv_d-appl_key+0(30).ELSE.ls_adrv_old = lt_adrv.ENDIF.ENDLOOP.* For the remaining references we have to check if an
* owner-object exists.REFRESH lt_vbeln.LOOP AT lt_adrv.lt_vbeln-vbeln = lt_adrv-appl_key+3(10).APPEND lt_vbeln.ENDLOOP.SORT lt_vbeln.DELETE ADJACENT DUPLICATES FROM lt_vbeln.* First we need to read the potential corresponding
* application entries.IF NOT lt_vbeln[] IS INITIAL.DEFINE sel_tab.if addrnum[] is initial.select * from &1into table lt_&1for all entries in lt_vbelnwhere vbeln = lt_vbeln-vbelnand adrnr <> space.else.select * from &1into table lt_&1for all entries in lt_vbelnwhere vbeln = lt_vbeln-vbelnand adrnr in addrnum.endif.sort lt_&1 by adrnr vbeln.END-OF-DEFINITION.DEFINE sel_tab_2.select * from &1into table lt_&1for all entries in lt_vbelnwhere vbeln = lt_vbeln-vbelnand ( adrnr <> spaceor adrnr_&2 <> space ).lt_&1_&2[] = lt_&1[].delete lt_&1 where adrnr = space.delete lt_&1_&2 where adrnr_&2 = space.sort lt_&1 by adrnr vbeln.sort lt_&1_&2 by adrnr_&2 vbeln.END-OF-DEFINITION.* sel_tab_2 vakpa ag.
* sel_tab_2 vlkpa we.
* sel_tab_2 vrkpa rg.sel_tab vbpa.sel_tab vtpa.sel_tab vbpa2.ENDIF.* Now we can check the references themselves.LOOP AT lt_adrv.
* We have to check each tabel if a corresponding
* entry exists.DEFINE check_in_tab.read table lt_&1with key &2 = lt_adrv-addrnumbervbeln = lt_adrv-appl_key+3(10)binary searchtransporting no fields.if sy-subrc = 0.
* This reference is correct, next one please.continue.endif.END-OF-DEFINITION.* check_in_tab vakpa adrnr.
* check_in_tab vakpa_ag adrnr_ag.
* check_in_tab vlkpa adrnr.
* check_in_tab vlkpa_we adrnr_we.
* check_in_tab vrkpa adrnr.
* check_in_tab vrkpa_rg adrnr_rg.READ TABLE lt_vbpaWITH KEY adrnr = lt_adrv-addrnumbervbeln = lt_adrv-appl_key+3(10)BINARY SEARCHTRANSPORTING NO FIELDS.IF sy-subrc = 0.
* This reference is correct, next one please.CONTINUE.ENDIF.
* check_in_tab vbpa adrnr.check_in_tab vtpa adrnr.check_in_tab vbpa2 adrnr.* If we get here the reference has no
* corresponding application object. Delete it.lt_adrv_d = lt_adrv.APPEND lt_adrv_d.DELETE lt_adrv.WRITE: / 'Reference has no owner:',lt_adrv_d-addrnumber,lt_adrv_d-appl_key+0(30).ENDLOOP.* Now we know which references to delete.
* But maybe we also have to delete the corresponding
* addresses.REFRESH lt_addrnumber.LOOP AT lt_adrv_d.lt_addrnumber-addrnumber = lt_adrv_d-addrnumber.APPEND lt_addrnumber.ENDLOOP.SORT lt_addrnumber.DELETE ADJACENT DUPLICATES FROM lt_addrnumber.* First we have read potentil other references
* of the deleted addresses.IF NOT lt_addrnumber[] IS INITIAL.SELECT * FROM adrvAPPENDING TABLE lt_adrvFOR ALL ENTRIES IN lt_addrnumberWHERE addrnumber = lt_addrnumber-addrnumberAND ( appl_table <> 'VBUK'OR appl_field <> 'VBELN' ).ENDIF.SORT lt_adrv BY addrnumber.* Now we can check for existing references.LOOP AT lt_addrnumber.READ TABLE lt_adrvWITH KEY addrnumber = lt_addrnumber-addrnumberBINARY SEARCHTRANSPORTING NO FIELDS.IF sy-subrc = 0.
* The address has at least one intact reference,
* do nothing.CONTINUE.ELSE.
* The address has no valid reference. Delete it.lr_addrnumber_del-sign = 'I'.lr_addrnumber_del-option = 'EQ'.lr_addrnumber_del-low = lt_addrnumber-addrnumber.APPEND lr_addrnumber_del.WRITE: / 'Delete Address with no references left:',lt_addrnumber-addrnumber.ENDIF.ENDLOOP.* now we can do the database upgrade.IF testrun IS INITIAL.DELETE adrv FROM TABLE lt_adrv_d.IF NOT lr_addrnumber_del[] IS INITIAL.PERFORM delete_addressTABLES lr_addrnumber_delUSING testrun.ENDIF.ENDIF.
* Always call commit work to prevent time-out.COMMIT WORK.ENDDO.*&--------------------------------------------------------------------*
*& Form delete_address
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
* -->IR_ADDRNUMBtextEL
* -->VALUE(IV_TEtextN)
*---------------------------------------------------------------------*
FORM delete_addressTABLES ir_addrnumber_delUSING value(iv_testrun) TYPE c.DATA: lv_tab_count TYPE i.RANGES: lr_addrnumber_del FOR adrc-addrnumber.DESCRIBE TABLE ir_addrnumber_del LINES lv_tab_count.IF lv_tab_count <= c_max_range_size.PERFORM delete_address_internalTABLES ir_addrnumber_delUSING iv_testrun.ELSE.WHILE lv_tab_count > c_max_range_size.DO c_max_range_size TIMES.REFRESH lr_addrnumber_del.READ TABLE ir_addrnumber_del INDEX 1.APPEND ir_addrnumber_del TO lr_addrnumber_del.DELETE ir_addrnumber_del INDEX 1.ENDDO.PERFORM delete_address_internalTABLES lr_addrnumber_delUSING iv_testrun.DESCRIBE TABLE ir_addrnumber_del LINES lv_tab_count.ENDWHILE.ENDIF.ENDFORM. "delete_address
*&---------------------------------------------------------------------*
*& Form delete_address_interal
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_LR_ADDRNUMBER_DEL text
* -->P_IV_TESTRUN text
*----------------------------------------------------------------------*
FORM delete_address_internalTABLES ir_addrnumber_delUSING value(iv_testrun) TYPE c.DATA: BEGIN OF lt_adcp OCCURS 0,addrnumber LIKE adcp-addrnumber,END OF lt_adcp,lv_tab_count TYPE i.RANGES: lr_addrnumber_del FOR adrc-addrnumber.lr_addrnumber_del[] = ir_addrnumber_del[].DESCRIBE TABLE lr_addrnumber_del LINES lv_tab_count.IF lv_tab_count = 0.EXIT.ENDIF.SELECT addrnumber FROM adcpINTO TABLE lt_adcpWHERE addrnumber IN lr_addrnumber_del.SORT lt_adcp.DELETE ADJACENT DUPLICATES FROM lt_adcp.LOOP AT lt_adcp.
* Display all the non-deleteable addresses.WRITE: / 'Address number has personal','address or contact partner:',lt_adcp-addrnumber.ENDLOOP.IF sy-subrc = 0.
* There were adresses that could not be deleted. Notify the caller
* and abort.SKIP.WRITE: / 'Not all addresses can be deleted by this report.',/ 'Therefore the report will not delete any addresses.'.ELSEIF testrun IS INITIAL.
* All address numbers are only for type 1. If we are not in testrun
* go ahead and delete.DELETE FROM adrc WHERE addrnumber IN lr_addrnumber_del.DELETE FROM adrct WHERE addrnumber IN lr_addrnumber_del.DELETE FROM adrg WHERE addrnumber IN lr_addrnumber_del.DELETE FROM adrv WHERE addrnumber IN lr_addrnumber_del.DELETE FROM adr2 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adr3 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adr4 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adr5 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adr6 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adr7 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adr8 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adr9 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adr10 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adr11 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adr12 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adr13 WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adrt WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.DELETE FROM adrcomc WHERE addrnumber IN lr_addrnumber_delAND persnumber = space.ENDIF.ENDFORM. " delete_address_internal
*>>>> END OF INSERTION <<<<<<
...
*&--------------------------------------------------------------------*
原厂工程师写了一个程序,ZDELETE_DUP_ADRV,方案有效
这个程序的本意:删除ADRV中,地址信息超过1行的地址信息,这样多余的数据就被删除了
需要注意的是,最好填写对应的地址编码(就是遇到具体问题了再使用此程序对ADRV底表的多余数据进行删除)
*&---------------------------------------------------------------------*
*& Report ZDELETE_DUP_ADRV
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zdelete_dup_adrv.*Report to delete duplicate entries in ADRV.
*Find duplicate records and delete duplicated records.
*Do not delete the minimum consnumber or if it is owner entry.
TYPES: BEGIN OF ty_adrv_d,addrnumber TYPE ad_addrnum,min_cons TYPE ad_refnum,appl_table TYPE ad_appltab,appl_field TYPE ad_applfld,appl_key TYPE ad_applkey,count TYPE i,END OF ty_adrv_d.DATA: wa_adrv_d TYPE ty_adrv_d,lt_adrv_d TYPE TABLE OF ty_adrv_d,lv_total TYPE i,lv_count TYPE i.SELECT-OPTIONS: appl_tab FOR wa_adrv_d-appl_table NO-EXTENSION NO INTERVALS,appl_fld FOR wa_adrv_d-appl_table NO-EXTENSION NO INTERVALS,addr_num FOR wa_adrv_d-appl_table NO-EXTENSION NO INTERVALS.
PARAMETERS: test TYPE bu_test_run AS CHECKBOX DEFAULT 'X'.SELECT addrnumber MIN( consnumber ) appl_table appl_field appl_key COUNT(*)FROM adrv INTO TABLE lt_adrv_dWHERE appl_table IN appl_tabAND appl_field IN appl_fldAND addrnumber IN addr_numGROUP BY addrnumber appl_table appl_field appl_keyHAVING COUNT(*) > 1.DESCRIBE TABLE lt_adrv_d LINES lv_total.
IF lv_total < 1.WRITE: / 'No entries found'.EXIT.
ELSE.WRITE: / 'Total no. of entries: ', lv_total.WRITE: / 'Addr.No min.consnumber App.Table Appl.Field Appl.Key no.of entries'.
ENDIF.CLEAR lv_total.LOOP AT lt_adrv_d INTO wa_adrv_d.WRITE:/ wa_adrv_d-addrnumber, wa_adrv_d-min_cons, ' ', wa_adrv_d-appl_table, wa_adrv_d-appl_field, wa_adrv_d-appl_key(30), wa_adrv_d-count.IF test <> 'X'.DELETE FROM adrvWHERE addrnumber = wa_adrv_d-addrnumberAND appl_table = wa_adrv_d-appl_tableAND appl_field = wa_adrv_d-appl_fieldAND appl_key = wa_adrv_d-appl_keyAND consnumber > wa_adrv_d-min_consAND owner <> 'X'.lv_total = lv_total + sy-dbcnt .ELSE.SELECT COUNT(*) FROM adrv INTO lv_countWHERE addrnumber = wa_adrv_d-addrnumberAND appl_table = wa_adrv_d-appl_tableAND appl_field = wa_adrv_d-appl_fieldAND appl_key = wa_adrv_d-appl_keyAND consnumber > wa_adrv_d-min_consAND owner <> 'X'.lv_total = lv_total + lv_count.ENDIF.
ENDLOOP.
IF test <> 'X'.WRITE : / 'Total duplicated records deleted: ', lv_total.
ELSE.WRITE : / 'Total duplicated records to be deleted: ', lv_total.
ENDIF.
【ABAP】-TSV_TNEW_PAGE_ALLOC_FAILED因ADRV底表数据过多,导致BP维护视图超资源瓶颈相关推荐
- Echarts 问题解决 —— 图表数据过多导致浏览器卡顿、y轴数据添加单位、带圆角及柱状背景的柱状图、legned 图例超出部分显示省略号、柱状图 / 拓扑图(气泡图)渐变色效果
目录 1.图表数据过多导致浏览器卡顿 2.Y轴数据添加单位 3.带圆角及柱状背景的柱状图 4.legned 图例超出部分显示省略号 5.柱状图 / 拓扑图(气泡图)渐变色效果 1.图表数据过多导致浏览 ...
- 解决ECharts 因X轴数据过多导致重叠显示不全的问题
X轴 加滚动条 通过配置合适的起始位置和结束位置可以做到数据过多不重叠,数据太少也不至于很丑,定位合适的位置后还可以通过手动拉伸滚动条的长度动态的显示不同条目数,对于动态的条目数滚动条要比倾斜数据灵活 ...
- echarts的legend显示不全_Echarts【1、数据过多导致显示不全分页,2、数据展示探讨分析】...
var len=; var dataZoom_end=null; //为空默认100%所以默认显示5个是能显示下的 if(len >5 ){ var dataZoom_end = (5/len) ...
- 【MySQL】表数据的增删查改(DML)
文章目录 一. 插入语句 --- insert 1. 指定 or 全字段插入 2. 多行数据插入 3. key不冲突直接插入,冲突的话就修改 4. 替换 ---- replace 二. 查询语句 -- ...
- 【转】ABAP内表数据和JSON格式互转
本程序演示ABAP内表数据如何转为JSON格式, 以及JSON数据如何放入内表. REPORT ZTEST005. DATA : JSON_SER TYPE REF TO CL_TREX_JSON_S ...
- ABAP内表数据和JSON格式互转
本程序演示ABAP内表数据如何转为JSON格式,以及JSON数据如何放入内表. 注:json字符串格式如:jsonstr = '[ {flag: "0",message: &quo ...
- ABAP ALV检查单元格更新数据
ABAP ALV检查单元格更新数据 将ALV单元格设置为可输入后,通常我们需要对单元格输入的值做一个检查,一般来说用循环内表的方法可以实现上述操作,不过如果ALV中有大量数据,而我们只更新了少量的单元 ...
- ABAP 动态的实现任意表的ALV显示
程序没有什么实用性,就是把一个表的内容全部显示出来了,仅用于看看数据都是什么样子的,但是其中的动态的方法还是值得研究学习的.这些方法是从我的前辈身上学到的,我小小的实践了一下,本来认为在编写程序的可以 ...
- 3.表数据的CRUD
数据的CRUD操作 新增数据 修改数据 删除数据 查询数据 MySQL数据的命令不区分大小写 添加数据 INSERT INTO 方式一 (不推荐) insert into <tableName& ...
最新文章
- Altium designer中导入CAD文件
- Spring Boot Lombok配置
- mysql中的explain_mysql中的explain分析
- Android应用视觉效果设计技巧
- 【SPL标准库专题(3)】 Classes
- 汇总|实时性语义分割算法(共24篇)
- 荒唐可笑的文言文编程语言
- Atitit 查找轮廓 findContours
- c 语言与试验系统,Turbo C/C++软件学习下载
- 系统动力学建模代做,vensim建模代做,流图建模,不确定分析。
- 2022蓝牙耳机哪款更值得买?最受欢迎的十大蓝牙耳机排行榜
- Android配置启动页
- 基于Opencv的图像卡通化
- Kali Linux 2020.1安装教程
- 手机病毒“僵尸网络”进入高发期
- TREC的ad hoc、routing、filtering、topic等术语的解释
- 爬取猫眼上近期上映的电影及评分信息
- webstorm快捷键问题,求大神赐教
- 杭漂十年!我从「租客」到「房东」
- Firebird数据库表结构及数据导出