Application Development and Automation Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

Making processing on an internal table generic

Former Member
0 Likes
812

Hi,

I'm trying to make more generic a processing on an internal table.

Here's the idea :

"DELETE FROM TABLE T_VBAP every lines that do not exist IN table T_VBAK USING column VBELN for comparison"

You can see below the (not generic) version of this function.

I'd like to make it more generic.

It would be called this way :

PERFORM reduire USING t_vbak t_vbap 'VBELN' 'vbak-vbeln'.

with the following code.

Here is my question :

How can I make the last statement generic too ?

DELETE <table_travail> WHERE (column) NOT IN <fs_tab> won't work...

Thanks a lot !

Jessie

Non-generic version :

FORM reduire.
  DATA : liste_vbeln type range of vbak-vbeln,
               line_vbeln TYPE LINE OF liste_vbeln,
               lt_vbak TYPE TABLE OF ts_vbak,
               lt_vbap TYPE ts_vbak.

  lt_vbak = t_vbak.
  SORT lt_vbak BY vbeln.
  DELETE ADJACENT DUPLICATES FROM lt_vbak COMPARGIN vbeln.

  line_vbeln-sign = 'I'.
  line_vbeln-option = 'EQ'.

  LOOP AT lt_vbak INTO ls_vbak.
    line_vbeln-low = ls_vbak-vbeln.
    APPEND line_vbeln TO liste_vbeln.
  ENDLOOP.

  IF liste_vbeln IS INITIAL.
	CLEAR t_vbap.
  ELSE.
    DELETE t_vbap WHERE vbeln NOT IN liste_vbeln.
  ENDIF.
ENDFORM.

Generic version :

FORM reduire USING  p_reference STANDARD TABLE
                    p_travail TYPE STANDARD TABLE
 					column TYPE lvc_name
					column_type TYPE string.

	FIELD-SYMBOLS <table_reference> TYPE STANDARD TABLE.
	FIELD-SYMBOLS <table_reference_copy> TYPE STANDARD TABLE.
	ASSIGN p_reference to <table_reference>.
	FIELD-SYMBOLS <table_travail> TYPE STANDARD TABLE.
	ASSIGN p_travail to <table_travail>.

	FIELD-SYMBOLS <table_reference_fields> TYPE ANY.
	DATA gs_fldname TYPE REF TO DATA.
	CREATE DATA gs_fldname LIKE LINE OF <table_reference>.
	ASSIGN gs_fldname->* TO <table_reference_fields>.

	DATA position TYPE i.
	DATA dyn_table TYPE REF TO DATA.
	DATA wa_fieldcat TYPE lvc_s_fcat.
	DATA it_fieldcat TYPE lvc_t_fcat.
	DATA table_reference_copy_pre TYPE REF TO DATA.

	DATA l_descr_ref TYPE REF TO cl_abap_structdescr.
	FIELD-SYMBOLS <ls_tab> TYPE ANY.
	FIELD-SYMBOLS <field> TYPE ANY.
	FIELD-SYMBOLS <lfs_comp_wa> TYPE abap_compdescr.

	l_descr_ref ?= cl_abap_typedescr=>describe_by_data( <table_reference_fields> ).

	LOOP AT l_descr_ref->components[] ASSIGNING <lfs_comp_wa>.
		IF <lfs_comp_wa>-name = column.
			position = sy-tabix.
		ENDIF.
		CLEAR wa_fieldcat.
		wa_fieldcat-fieldname = <lfs_comp_wa>-name.
		wa_fieldcat-datatype  = <lfs_comp_wa>-type_kind.
		wa_fieldcat-inttype   = <lfs_comp_wa>-type_kind.
		wa_fieldcat-intlen    = <lfs_comp_wa>-length / 2.
		wa_fieldcat-decimals  = <lfs_comp_wa>-decimals.
		APPEND wa_fieldcat TO it_fieldcat.
	ENDLOOP.

	CALL METHOD cl_alv_table_create=>create_dynamic_table
		EXPORTING
			it_fieldcatalog = it_fieldcat
		IMPORTING
			ep_table = table_reference_copy_pre.

	ASSIGN table_reference_copy_pre->* TO <table_reference_copy>.
	<table_reference_copy> = p_reference.

	SORT <table_reference_copy> BY (column).
	DELETE ADJACENT DUPLICATES FROM <table_reference> COMPARING (column).

	DATA :
		gr_structdescr TYPE REF TO cl_abap_structdescr,
		gr_tabledescr TYPE REF TO cl_abap_tabledescr,
		gr_datadescr TYPE REF TO cl_abap_datadescr,
		gr_typedescr TYPE REF TO cl_abap_typedescr,
		gt_components TYPE abap_component_tab,
		gw_component TYPE LINE OF abap_component_tab,
		gr_wa TYPE REF TO DATA,
		gr_tab TYPE REF TO DATA.

	FIELD-SYMBOLS :
		<fs_wa> TYPE ANY,
		<fs_tab> TYPE TABLE.

	MOVE 'SIGN' to gw_component-name.
	gw_component-type ?= cl_abap_elemdescr=>get_c( p_length = 1 ).
	INSERT gw_component INTO TABLE gt_components.

	MOVE 'OPTION' to gw_component-name.
	gw_component-type ?= cl_abap_elemdescr=>get_c( p_length = 2 ).
	INSERT gw_component INTO TABLE gt_components.

	MOVE 'LOW' to gw_component-name.
	gw_component-type ?= cl_abap_elemdescr=>describe_by_name( column_type ).
	INSERT gw_component INTO TABLE gt_components.

	MOVE 'HIGH' to gw_component-name.
	gw_component-type ?= cl_abap_elemdescr=>describe_by_name( column_type ).
	INSERT gw_component INTO TABLE gt_components.

	gr_structdescr ?= cl_abap_structdescr=>create( gt_components ).

	CREATE DATA gr_wa TYPE HANDLE gr_structdescr.
	ASSIGN gr_wa->* to <fs_wa>.

	gr_datadescr ?= gr_structdescr.
	gr_tabledescr ?= cl_abap_tabledescr=>create( gr_datadescr ).

	CREATE DATA gr_tab TYPE HANDLE gr_datadescr.
	ASSIGN gr_tab->* TO <fs_tab>.

	LOOP AT <table_reference> ASSIGNING <ls_tab>.
		ASSIGN COMPONENT position OF STRUCTURE <ls_tab> to <field>.
		CONCATENATE 'IEQ' <field> INTO <fs_wa>.
		APPEND <fs_wa> TO <fs_tab>.
	ENDLOOP.

	DELETE t_vbap WHERE vbeln NOT IN <fs_tab>.
ENDFORM.

1 ACCEPTED SOLUTION
Read only

SuhaSaha
Product and Topic Expert
Product and Topic Expert
0 Likes
562

Hello Jessie,

Which ABAP Release are you working on? Dynamic WHERE conditions for LOOP AT itab, MODIFY itab, and DELETE itab statements are possible from Release 702.

Even if you're on 702, the statement DELETE <table_travail> WHERE (column) NOT IN <fs_tab> won't work! You need to change your coding to:

DATA lv_dyn_cond TYPE string.

CONCATENATE column `NOT IN` `<FS_TAB>` INTO lv_dyn_cond SEPARATED BY space.
DELETE <table_travail> WHERE (lv_dyn_cond).

BR,

Suhas

3 REPLIES 3
Read only

custodio_deoliveira
Active Contributor
0 Likes
562

For both the generic and not generic version, if you want to delete what is not in the range you can use sign = 'E', thenDELETE <table> WHERE <filed> IN <range>

Read only

SuhaSaha
Product and Topic Expert
Product and Topic Expert
0 Likes
563

Hello Jessie,

Which ABAP Release are you working on? Dynamic WHERE conditions for LOOP AT itab, MODIFY itab, and DELETE itab statements are possible from Release 702.

Even if you're on 702, the statement DELETE <table_travail> WHERE (column) NOT IN <fs_tab> won't work! You need to change your coding to:

DATA lv_dyn_cond TYPE string.

CONCATENATE column `NOT IN` `<FS_TAB>` INTO lv_dyn_cond SEPARATED BY space.
DELETE <table_travail> WHERE (lv_dyn_cond).

BR,

Suhas

Read only

Former Member
0 Likes
562

I know its a little late, but for every one trying to do something like this, you can use the "FOR ALL ENTRIES IN" statement

Delete from i_tab 1

for all entries in itab2

where columnA = itab2-columnA

and     columnB = itab2-columnC

and     columnC = 'A Static Value'

Kind regards, Daniel