Application Development 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: 

DYNAMIC TABLE FUNCTION

Former Member
0 Kudos

Hi Expert

I want to build a function that receive a dynamic table , how i do it and how i call this function

thanks and regardes

1 ACCEPTED SOLUTION

Former Member
0 Kudos

hi,

check this:

REPORT zmodtab NO STANDARD PAGE HEADING.

TYPE-POOLS: rsds.

DATA: is_x030l TYPE x030l,

it_dfies TYPE TABLE OF dfies,

is_dfies TYPE dfies,

it_fdiff TYPE TABLE OF field_dif,

is_fdiff TYPE field_dif.

DATA: w_selid TYPE rsdynsel-selid,

it_tables TYPE TABLE OF rsdstabs,

is_tables TYPE rsdstabs,

it_fields TYPE TABLE OF rsdsfields,

it_expr TYPE rsds_texpr,

it_ranges TYPE rsds_trange,

it_where TYPE rsds_twhere,

is_where TYPE rsds_where,

w_active TYPE i.

DATA: it_content TYPE REF TO data,

it_modif TYPE REF TO data,

it_fcat TYPE lvc_t_fcat.

DATA: w_okcode TYPE sy-ucomm.

FIELD-SYMBOLS: <itab> TYPE STANDARD TABLE,

<ntab> TYPE STANDARD TABLE.

  • Macros

DEFINE table_error.

message e398(00) with 'Table' p_table &1.

END-OF-DEFINITION.

DEFINE fixed_val.

is_fdiff-fieldname = is_dfies-fieldname.

is_fdiff-fixed_val = &1.

is_fdiff-no_input = 'X'.

append is_fdiff to it_fdiff.

END-OF-DEFINITION.

  • Selection screen

SELECTION-SCREEN: BEGIN OF BLOCK b01 WITH FRAME.

PARAMETERS: p_table TYPE tabname OBLIGATORY "table

MEMORY ID dtb

MATCHCODE OBJECT dd_dbtb_16.

SELECTION-SCREEN: BEGIN OF LINE,

PUSHBUTTON 33(20) selopt USER-COMMAND sel,

COMMENT 55(15) selcnt,

END OF LINE.

SELECTION-SCREEN: SKIP.

PARAMETERS: p_rows TYPE i. "rows

SELECTION-SCREEN: END OF BLOCK b01,

SKIP,

BEGIN OF BLOCK b02 WITH FRAME.

PARAMETERS: p_displ TYPE c AS CHECKBOX. "display

SELECTION-SCREEN: END OF BLOCK b02.

  • Initialization

INITIALIZATION.

MOVE '@4G@ Filter records' TO selopt.

  • PBO

AT SELECTION-SCREEN OUTPUT.

IF w_active IS INITIAL.

CLEAR: selcnt.

ELSE.

WRITE w_active TO selcnt LEFT-JUSTIFIED.

ENDIF.

  • PAI

AT SELECTION-SCREEN.

IF p_table NE is_x030l-tabname.

CALL FUNCTION 'DDIF_NAMETAB_GET'

EXPORTING

tabname = p_table

IMPORTING

x030l_wa = is_x030l

TABLES

dfies_tab = it_dfies

EXCEPTIONS

OTHERS = 1.

IF is_x030l IS INITIAL.

table_error 'does not exist or is not active'.

ELSEIF is_x030l-tabtype NE 'T'.

table_error 'is not selectable'.

ELSEIF is_x030l-align NE 0.

table_error 'has alignment - cannot continue'.

ENDIF.

  • Default values for system fields

REFRESH: it_fdiff.

is_fdiff-tabname = p_table.

LOOP AT it_dfies INTO is_dfies.

IF is_dfies-datatype = 'CLNT'.

fixed_val sy-mandt.

ELSEIF is_dfies-rollname = 'ERDAT'

OR is_dfies-rollname = 'ERSDA'

OR is_dfies-rollname = 'AEDAT'

OR is_dfies-rollname = 'LAEDA'.

fixed_val sy-datum.

ELSEIF is_dfies-rollname = 'ERTIM'

OR is_dfies-rollname = 'AETIM'.

fixed_val sy-uzeit.

ELSEIF is_dfies-rollname = 'ERNAM'

OR is_dfies-rollname = 'AENAM'.

fixed_val sy-uname.

ENDIF.

ENDLOOP.

  • Prepare free selection on table

REFRESH it_tables.

is_tables-prim_tab = p_table.

APPEND is_tables TO it_tables.

CLEAR: w_selid.

ENDIF.

IF sy-ucomm = 'SEL'.

IF w_selid IS INITIAL.

  • Init free selection dialog

CALL FUNCTION 'FREE_SELECTIONS_INIT'

EXPORTING

expressions = it_expr

IMPORTING

selection_id = w_selid

expressions = it_expr

TABLES

tables_tab = it_tables

EXCEPTIONS

OTHERS = 1.

ENDIF.

  • Display free selection dialog

CALL FUNCTION 'FREE_SELECTIONS_DIALOG'

EXPORTING

selection_id = w_selid

title = 'Selection'

status = 1

as_window = 'X'

IMPORTING

expressions = it_expr

field_ranges = it_ranges

number_of_active_fields = w_active

TABLES

fields_tab = it_fields

EXCEPTIONS

OTHERS = 1.

ENDIF.

  • Start of processing

START-OF-SELECTION.

PERFORM f_create_table USING p_table.

PERFORM f_select_table.

PERFORM f_display_table.

----


  • FORM f_create_table *

----


FORM f_create_table USING in_tabname.

FIELD-SYMBOLS: <fcat> TYPE lvc_s_fcat.

CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'

EXPORTING

i_structure_name = in_tabname

CHANGING

ct_fieldcat = it_fcat

EXCEPTIONS

OTHERS = 1.

IF sy-subrc = 0.

  • Complete field catalog

LOOP AT it_fcat ASSIGNING <fcat>.

<fcat>-tabname = in_tabname.

ENDLOOP.

CALL FUNCTION 'LVC_FIELDCAT_COMPLETE'

CHANGING

ct_fieldcat = it_fcat

EXCEPTIONS

OTHERS = 1.

ELSE.

WRITE: 'Error building field catalog'.

STOP.

ENDIF.

  • Create dynamic table for data

CALL METHOD cl_alv_table_create=>create_dynamic_table

EXPORTING

it_fieldcatalog = it_fcat

IMPORTING

ep_table = it_content.

IF sy-subrc = 0.

ASSIGN it_content->* TO <itab>.

ELSE.

WRITE: 'Error creating internal table'.

STOP.

ENDIF.

  • Create dynamic table for modif

CALL METHOD cl_alv_table_create=>create_dynamic_table

EXPORTING

it_fieldcatalog = it_fcat

IMPORTING

ep_table = it_modif.

IF sy-subrc = 0.

ASSIGN it_modif->* TO <ntab>.

ELSE.

WRITE: 'Error creating internal table'.

STOP.

ENDIF.

ENDFORM.

----


  • FORM f_select_table *

----


FORM f_select_table.

IF w_active = 0.

SELECT * FROM (p_table)

INTO CORRESPONDING FIELDS OF TABLE <itab>

UP TO p_rows ROWS.

ELSE.

  • Selection with parameters

CALL FUNCTION 'FREE_SELECTIONS_RANGE_2_WHERE'

EXPORTING

field_ranges = it_ranges

IMPORTING

where_clauses = it_where.

READ TABLE it_where INTO is_where WITH KEY tablename = p_table.

SELECT * FROM (p_table)

INTO CORRESPONDING FIELDS OF TABLE <itab>

UP TO p_rows ROWS

WHERE (is_where-where_tab).

ENDIF.

IF sy-dbcnt = 0.

WRITE: 'No record selected'.

STOP.

ENDIF.

ENDFORM.

----


  • FORM f_display_table *

----


FORM f_display_table.

DATA: l_answer TYPE c,

l_eflag TYPE c.

CLEAR: w_okcode.

REFRESH: <ntab>.

  • Display table contents

CALL FUNCTION 'STC1_FULLSCREEN_TABLE_CONTROL'

EXPORTING

header = p_table

tabname = p_table

display_only = p_displ

endless = 'X'

no_button = space

IMPORTING

okcode = w_okcode

TABLES

nametab = it_dfies

table = <itab>

fielddif = it_fdiff

modif_table = <ntab>

EXCEPTIONS

OTHERS = 1.

IF sy-subrc = 0.

IF p_displ IS INITIAL AND w_okcode = 'SAVE'.

  • Confirm update

CALL FUNCTION 'POPUP_TO_CONFIRM'

EXPORTING

titlebar = p_table

text_question = 'Do you want to update table ?'

default_button = '2'

display_cancel_button = ' '

IMPORTING

answer = l_answer

EXCEPTIONS

OTHERS = 1.

IF l_answer = '1'.

  • Apply modifications

IF NOT <ntab>[] IS INITIAL.

PERFORM f_add_system USING space.

MODIFY (p_table) FROM TABLE <ntab>.

IF sy-subrc NE 0.

l_eflag = 'X'.

ENDIF.

ENDIF.

  • Apply deletions

IF l_eflag IS INITIAL.

REFRESH: <ntab>.

CALL FUNCTION 'STC1_GET_DATA'

TABLES

deleted_data = <ntab>

EXCEPTIONS

OTHERS = 1.

IF NOT <ntab>[] IS INITIAL.

DELETE (p_table) FROM TABLE <ntab>.

IF sy-subrc NE 0.

ROLLBACK WORK.

l_eflag = 'X'.

ENDIF.

ENDIF.

ENDIF.

  • Apply creations

IF l_eflag IS INITIAL.

REFRESH: <ntab>.

CALL FUNCTION 'STC1_GET_DATA'

TABLES

new_data = <ntab>

EXCEPTIONS

OTHERS = 1.

IF NOT <ntab>[] IS INITIAL.

PERFORM f_add_system USING 'X'.

INSERT (p_table) FROM TABLE <ntab>.

IF sy-subrc NE 0.

ROLLBACK WORK.

l_eflag = 'X'.

ENDIF.

ENDIF.

ENDIF.

IF l_eflag IS INITIAL.

COMMIT WORK.

MESSAGE s261(53).

ELSE.

MESSAGE s075(3i).

PERFORM f_select_table.

ENDIF.

ENDIF.

  • Display table again

PERFORM f_display_table.

ENDIF.

ENDIF.

ENDFORM.

----


  • FORM f_add_system *

----


FORM f_add_system USING new TYPE c.

FIELD-SYMBOLS: <irec> TYPE ANY,

<upd> TYPE ANY.

LOOP AT it_fdiff INTO is_fdiff.

READ TABLE it_dfies INTO is_dfies

WITH KEY fieldname = is_fdiff-fieldname.

LOOP AT <ntab> ASSIGNING <irec>.

ASSIGN COMPONENT is_fdiff-fieldname OF STRUCTURE <irec> TO <upd>.

IF is_dfies-datatype = 'CLNT'.

<upd> = sy-mandt.

ELSE.

CASE is_dfies-rollname.

WHEN 'AENAM'.

<upd> = sy-uname.

WHEN 'AEDAT' OR 'LAEDA'.

<upd> = sy-datum.

WHEN 'AETIM'.

<upd> = sy-uzeit.

WHEN OTHERS.

ENDCASE.

ENDIF.

ENDLOOP.

ENDLOOP.

ENDFORM.

this link will also help:

http://www.sap-img.com/ab030.htm

Edited by: AD on Dec 2, 2008 12:26 PM

5 REPLIES 5

Former Member
0 Kudos

hi,

check this:

REPORT zmodtab NO STANDARD PAGE HEADING.

TYPE-POOLS: rsds.

DATA: is_x030l TYPE x030l,

it_dfies TYPE TABLE OF dfies,

is_dfies TYPE dfies,

it_fdiff TYPE TABLE OF field_dif,

is_fdiff TYPE field_dif.

DATA: w_selid TYPE rsdynsel-selid,

it_tables TYPE TABLE OF rsdstabs,

is_tables TYPE rsdstabs,

it_fields TYPE TABLE OF rsdsfields,

it_expr TYPE rsds_texpr,

it_ranges TYPE rsds_trange,

it_where TYPE rsds_twhere,

is_where TYPE rsds_where,

w_active TYPE i.

DATA: it_content TYPE REF TO data,

it_modif TYPE REF TO data,

it_fcat TYPE lvc_t_fcat.

DATA: w_okcode TYPE sy-ucomm.

FIELD-SYMBOLS: <itab> TYPE STANDARD TABLE,

<ntab> TYPE STANDARD TABLE.

  • Macros

DEFINE table_error.

message e398(00) with 'Table' p_table &1.

END-OF-DEFINITION.

DEFINE fixed_val.

is_fdiff-fieldname = is_dfies-fieldname.

is_fdiff-fixed_val = &1.

is_fdiff-no_input = 'X'.

append is_fdiff to it_fdiff.

END-OF-DEFINITION.

  • Selection screen

SELECTION-SCREEN: BEGIN OF BLOCK b01 WITH FRAME.

PARAMETERS: p_table TYPE tabname OBLIGATORY "table

MEMORY ID dtb

MATCHCODE OBJECT dd_dbtb_16.

SELECTION-SCREEN: BEGIN OF LINE,

PUSHBUTTON 33(20) selopt USER-COMMAND sel,

COMMENT 55(15) selcnt,

END OF LINE.

SELECTION-SCREEN: SKIP.

PARAMETERS: p_rows TYPE i. "rows

SELECTION-SCREEN: END OF BLOCK b01,

SKIP,

BEGIN OF BLOCK b02 WITH FRAME.

PARAMETERS: p_displ TYPE c AS CHECKBOX. "display

SELECTION-SCREEN: END OF BLOCK b02.

  • Initialization

INITIALIZATION.

MOVE '@4G@ Filter records' TO selopt.

  • PBO

AT SELECTION-SCREEN OUTPUT.

IF w_active IS INITIAL.

CLEAR: selcnt.

ELSE.

WRITE w_active TO selcnt LEFT-JUSTIFIED.

ENDIF.

  • PAI

AT SELECTION-SCREEN.

IF p_table NE is_x030l-tabname.

CALL FUNCTION 'DDIF_NAMETAB_GET'

EXPORTING

tabname = p_table

IMPORTING

x030l_wa = is_x030l

TABLES

dfies_tab = it_dfies

EXCEPTIONS

OTHERS = 1.

IF is_x030l IS INITIAL.

table_error 'does not exist or is not active'.

ELSEIF is_x030l-tabtype NE 'T'.

table_error 'is not selectable'.

ELSEIF is_x030l-align NE 0.

table_error 'has alignment - cannot continue'.

ENDIF.

  • Default values for system fields

REFRESH: it_fdiff.

is_fdiff-tabname = p_table.

LOOP AT it_dfies INTO is_dfies.

IF is_dfies-datatype = 'CLNT'.

fixed_val sy-mandt.

ELSEIF is_dfies-rollname = 'ERDAT'

OR is_dfies-rollname = 'ERSDA'

OR is_dfies-rollname = 'AEDAT'

OR is_dfies-rollname = 'LAEDA'.

fixed_val sy-datum.

ELSEIF is_dfies-rollname = 'ERTIM'

OR is_dfies-rollname = 'AETIM'.

fixed_val sy-uzeit.

ELSEIF is_dfies-rollname = 'ERNAM'

OR is_dfies-rollname = 'AENAM'.

fixed_val sy-uname.

ENDIF.

ENDLOOP.

  • Prepare free selection on table

REFRESH it_tables.

is_tables-prim_tab = p_table.

APPEND is_tables TO it_tables.

CLEAR: w_selid.

ENDIF.

IF sy-ucomm = 'SEL'.

IF w_selid IS INITIAL.

  • Init free selection dialog

CALL FUNCTION 'FREE_SELECTIONS_INIT'

EXPORTING

expressions = it_expr

IMPORTING

selection_id = w_selid

expressions = it_expr

TABLES

tables_tab = it_tables

EXCEPTIONS

OTHERS = 1.

ENDIF.

  • Display free selection dialog

CALL FUNCTION 'FREE_SELECTIONS_DIALOG'

EXPORTING

selection_id = w_selid

title = 'Selection'

status = 1

as_window = 'X'

IMPORTING

expressions = it_expr

field_ranges = it_ranges

number_of_active_fields = w_active

TABLES

fields_tab = it_fields

EXCEPTIONS

OTHERS = 1.

ENDIF.

  • Start of processing

START-OF-SELECTION.

PERFORM f_create_table USING p_table.

PERFORM f_select_table.

PERFORM f_display_table.

----


  • FORM f_create_table *

----


FORM f_create_table USING in_tabname.

FIELD-SYMBOLS: <fcat> TYPE lvc_s_fcat.

CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'

EXPORTING

i_structure_name = in_tabname

CHANGING

ct_fieldcat = it_fcat

EXCEPTIONS

OTHERS = 1.

IF sy-subrc = 0.

  • Complete field catalog

LOOP AT it_fcat ASSIGNING <fcat>.

<fcat>-tabname = in_tabname.

ENDLOOP.

CALL FUNCTION 'LVC_FIELDCAT_COMPLETE'

CHANGING

ct_fieldcat = it_fcat

EXCEPTIONS

OTHERS = 1.

ELSE.

WRITE: 'Error building field catalog'.

STOP.

ENDIF.

  • Create dynamic table for data

CALL METHOD cl_alv_table_create=>create_dynamic_table

EXPORTING

it_fieldcatalog = it_fcat

IMPORTING

ep_table = it_content.

IF sy-subrc = 0.

ASSIGN it_content->* TO <itab>.

ELSE.

WRITE: 'Error creating internal table'.

STOP.

ENDIF.

  • Create dynamic table for modif

CALL METHOD cl_alv_table_create=>create_dynamic_table

EXPORTING

it_fieldcatalog = it_fcat

IMPORTING

ep_table = it_modif.

IF sy-subrc = 0.

ASSIGN it_modif->* TO <ntab>.

ELSE.

WRITE: 'Error creating internal table'.

STOP.

ENDIF.

ENDFORM.

----


  • FORM f_select_table *

----


FORM f_select_table.

IF w_active = 0.

SELECT * FROM (p_table)

INTO CORRESPONDING FIELDS OF TABLE <itab>

UP TO p_rows ROWS.

ELSE.

  • Selection with parameters

CALL FUNCTION 'FREE_SELECTIONS_RANGE_2_WHERE'

EXPORTING

field_ranges = it_ranges

IMPORTING

where_clauses = it_where.

READ TABLE it_where INTO is_where WITH KEY tablename = p_table.

SELECT * FROM (p_table)

INTO CORRESPONDING FIELDS OF TABLE <itab>

UP TO p_rows ROWS

WHERE (is_where-where_tab).

ENDIF.

IF sy-dbcnt = 0.

WRITE: 'No record selected'.

STOP.

ENDIF.

ENDFORM.

----


  • FORM f_display_table *

----


FORM f_display_table.

DATA: l_answer TYPE c,

l_eflag TYPE c.

CLEAR: w_okcode.

REFRESH: <ntab>.

  • Display table contents

CALL FUNCTION 'STC1_FULLSCREEN_TABLE_CONTROL'

EXPORTING

header = p_table

tabname = p_table

display_only = p_displ

endless = 'X'

no_button = space

IMPORTING

okcode = w_okcode

TABLES

nametab = it_dfies

table = <itab>

fielddif = it_fdiff

modif_table = <ntab>

EXCEPTIONS

OTHERS = 1.

IF sy-subrc = 0.

IF p_displ IS INITIAL AND w_okcode = 'SAVE'.

  • Confirm update

CALL FUNCTION 'POPUP_TO_CONFIRM'

EXPORTING

titlebar = p_table

text_question = 'Do you want to update table ?'

default_button = '2'

display_cancel_button = ' '

IMPORTING

answer = l_answer

EXCEPTIONS

OTHERS = 1.

IF l_answer = '1'.

  • Apply modifications

IF NOT <ntab>[] IS INITIAL.

PERFORM f_add_system USING space.

MODIFY (p_table) FROM TABLE <ntab>.

IF sy-subrc NE 0.

l_eflag = 'X'.

ENDIF.

ENDIF.

  • Apply deletions

IF l_eflag IS INITIAL.

REFRESH: <ntab>.

CALL FUNCTION 'STC1_GET_DATA'

TABLES

deleted_data = <ntab>

EXCEPTIONS

OTHERS = 1.

IF NOT <ntab>[] IS INITIAL.

DELETE (p_table) FROM TABLE <ntab>.

IF sy-subrc NE 0.

ROLLBACK WORK.

l_eflag = 'X'.

ENDIF.

ENDIF.

ENDIF.

  • Apply creations

IF l_eflag IS INITIAL.

REFRESH: <ntab>.

CALL FUNCTION 'STC1_GET_DATA'

TABLES

new_data = <ntab>

EXCEPTIONS

OTHERS = 1.

IF NOT <ntab>[] IS INITIAL.

PERFORM f_add_system USING 'X'.

INSERT (p_table) FROM TABLE <ntab>.

IF sy-subrc NE 0.

ROLLBACK WORK.

l_eflag = 'X'.

ENDIF.

ENDIF.

ENDIF.

IF l_eflag IS INITIAL.

COMMIT WORK.

MESSAGE s261(53).

ELSE.

MESSAGE s075(3i).

PERFORM f_select_table.

ENDIF.

ENDIF.

  • Display table again

PERFORM f_display_table.

ENDIF.

ENDIF.

ENDFORM.

----


  • FORM f_add_system *

----


FORM f_add_system USING new TYPE c.

FIELD-SYMBOLS: <irec> TYPE ANY,

<upd> TYPE ANY.

LOOP AT it_fdiff INTO is_fdiff.

READ TABLE it_dfies INTO is_dfies

WITH KEY fieldname = is_fdiff-fieldname.

LOOP AT <ntab> ASSIGNING <irec>.

ASSIGN COMPONENT is_fdiff-fieldname OF STRUCTURE <irec> TO <upd>.

IF is_dfies-datatype = 'CLNT'.

<upd> = sy-mandt.

ELSE.

CASE is_dfies-rollname.

WHEN 'AENAM'.

<upd> = sy-uname.

WHEN 'AEDAT' OR 'LAEDA'.

<upd> = sy-datum.

WHEN 'AETIM'.

<upd> = sy-uzeit.

WHEN OTHERS.

ENDCASE.

ENDIF.

ENDLOOP.

ENDLOOP.

ENDFORM.

this link will also help:

http://www.sap-img.com/ab030.htm

Edited by: AD on Dec 2, 2008 12:26 PM

0 Kudos

how i define the table in the function module

0 Kudos

Create it like that for example (you may also use STANDARD TABLE, SORTED TABLE, etc., you may also use CHANGING instead of IMPORTING)

FUNCTION Z_DEMO.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     REFERENCE(FF) TYPE  ANY TABLE
*"----------------------------------------------------------------------
field-symbols <gg> type any.
loop at ff assigning <gg>.
endloop.
ENDFUNCTION.

Call it like that :

CALL FUNCTION 'Z_DEMO'
    EXPORTING
      ff = lt_any_table.

You may also use it in TABLES, but only STANDARD TABLE allowed.

Former Member
0 Kudos

< use field symbols>

Former Member
0 Kudos

Hi,


DATA: dy_table  TYPE REF TO data,
      dy_table1 TYPE REF TO data.

FIELD-SYMBOLS:  <dyn_table1>   TYPE  STANDARD TABLE.

* Getting Dynamic Internal Table
    PERFORM dyn_table_2 USING w_fcat.
*Calling the method CREATE_DYNAMIC_TABLE
  CALL METHOD cl_alv_table_create=>create_dynamic_table
       EXPORTING
         it_fieldcatalog = p_fcat1
       IMPORTING
         ep_table = dy_table1
       EXCEPTIONS
         generate_subpool_dir_full = 1
         OTHERS = 2
  		.
* POPULATE Dynamic Internal Table
    PERFORM populate_dyn_table2 USING w_fcat.
FORM populate_dyn_table2 USING p_fcat TYPE lvc_t_fcat .
  DATA: ls_fcat1 TYPE lvc_s_fcat.
  DATA: l_fieldname(30) TYPE c.
  FIELD-SYMBOLS:<l_fs_dyn> TYPE ANY,
                <l_fs_bom> TYPE ANY.

  ASSIGN dy_table1->* TO <dyn_table1>.
  CREATE DATA dy_line LIKE LINE OF <dyn_table1>.
  ASSIGN dy_line->* TO <dyn_wa>.

Thanks & Regards,

Krishna...