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

Problems with ALV-TREE

Former Member
0 Likes
994

Hi,

i have copied SALV_DEMO_TREE_SIMPLE into an own report.

i use an simple itab and try to get an output, but i have an endless-loop.

Has anyone an idea which error i do?

Here my Report:

REPORT ZGRO_ABAP_OBJ_TREE.

************************************************************************

CONSTANTS: GC_TRUE TYPE SAP_BOOL VALUE 'X'.

*

TYPE-POOLS: ICON.

*

TYPES: BEGIN OF TREE_ITAB,

MATNR LIKE MARA-MATNR,

WERKS LIKE MARC-WERKS,

MENGE LIKE MSEG-MENGE,

END OF TREE_ITAB.

*

DATA: ITAB TYPE TABLE OF TREE_ITAB.

DATA: WA_ITAB TYPE TREE_ITAB.

*

DATA: GR_TREE TYPE REF TO CL_SALV_TREE.

*

DATA: REPID type syrepid.

*

DATA: GR_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER.

DATA: OK_CODE TYPE SYUCOMM.

************************************************************************

START-OF-SELECTION.

*

REPID = SY-REPID.

*

END-OF-SELECTION.

*

PERFORM DISPLAY_TREE.

*

************************************************************************

FORM EINLESEN_DATEN.

*

WA_ITAB-MATNR = '16186'. WA_ITAB-WERKS = '1000'. WA_ITAB-MENGE = 10. APPEND WA_ITAB TO ITAB.

WA_ITAB-MATNR = '16186'. WA_ITAB-WERKS = '2000'. WA_ITAB-MENGE = 11. APPEND WA_ITAB TO ITAB.

WA_ITAB-MATNR = '16185'. WA_ITAB-WERKS = '2000'. WA_ITAB-MENGE = 12. APPEND WA_ITAB TO ITAB.

WA_ITAB-MATNR = '16184'. WA_ITAB-WERKS = '3000'. WA_ITAB-MENGE = 13. APPEND WA_ITAB TO ITAB.

*

PERFORM HIERARCHIE_AUFBAUEN.

ENDFORM.

************************************************************************

FORM DISPLAY_FULLSCREEN .

*

TRY.

CL_SALV_TREE=>FACTORY(

IMPORTING

R_SALV_TREE = GR_TREE

CHANGING

T_TABLE = ITAB ).

CATCH CX_SALV_NO_NEW_DATA_ALLOWED CX_SALV_ERROR.

EXIT.

ENDTRY.

PERFORM CREATE_TREE.

*

GR_TREE->SET_SCREEN_STATUS(

PFSTATUS = 'SALV_STANDARD'

REPORT = REPID

SET_FUNCTIONS = GR_TREE->C_FUNCTIONS_ALL ).

*

DATA: LR_COLUMNS TYPE REF TO CL_SALV_COLUMNS_TREE.

LR_COLUMNS = GR_TREE->GET_COLUMNS( ).

LR_COLUMNS->SET_OPTIMIZE( GC_TRUE ).

*

PERFORM SET_COLUMNS_TECHNICAL.

*

GR_TREE->DISPLAY( ).

*

ENDFORM.

************************************************************************

FORM DISPLAY_TREE.

CALL SCREEN 100.

ENDFORM.

************************************************************************

MODULE PBO OUTPUT.

PERFORM PBO.

ENDMODULE.

************************************************************************

MODULE PAI INPUT.

PERFORM PAI.

ENDMODULE.

************************************************************************

FORM PBO .

*

SET PF-STATUS 'MAIN100'.

*

IF GR_CONTAINER IS NOT BOUND.

IF CL_SALV_TREE=>IS_OFFLINE( ) EQ IF_SALV_C_BOOL_SAP=>FALSE.

CREATE OBJECT GR_CONTAINER

EXPORTING

CONTAINER_NAME = 'BOX'.

ENDIF.

*

TRY.

CL_SALV_TREE=>FACTORY(

EXPORTING

R_CONTAINER = GR_CONTAINER

IMPORTING

R_SALV_TREE = GR_TREE

CHANGING

T_TABLE = ITAB ).

CATCH CX_SALV_NO_NEW_DATA_ALLOWED CX_SALV_ERROR.

EXIT.

ENDTRY.

*

PERFORM CREATE_TREE.

*

DATA: LR_FUNCTIONS TYPE REF TO CL_SALV_FUNCTIONS_TREE.

LR_FUNCTIONS = GR_TREE->GET_FUNCTIONS( ).

LR_FUNCTIONS->SET_ALL( GC_TRUE ).

*

DATA: LR_COLUMNS TYPE REF TO CL_SALV_COLUMNS_TREE.

*

LR_COLUMNS = GR_TREE->GET_COLUMNS( ).

LR_COLUMNS->SET_OPTIMIZE( GC_TRUE ).

*

PERFORM SET_COLUMNS_TECHNICAL.

*

GR_TREE->DISPLAY( ).

*

ENDIF.

*

ENDFORM.

************************************************************************

FORM PAI .

*

CASE OK_CODE.

WHEN 'BACK' OR 'EXIT' OR 'QUIT'.

CLEAR OK_CODE.

SET SCREEN 0.

LEAVE SCREEN.

ENDCASE.

*

ENDFORM.

************************************************************************

FORM SET_COLUMNS_TECHNICAL.

*

DATA: LR_COLUMNS TYPE REF TO CL_SALV_COLUMNS,

LR_COLUMN TYPE REF TO CL_SALV_COLUMN.

*

LR_COLUMNS = GR_TREE->GET_COLUMNS( ).

*

LR_COLUMNS->SET_OPTIMIZE( ABAP_TRUE ).

*

TRY.

*

LR_COLUMN ?= LR_COLUMNS->GET_COLUMN( 'MATNR' ).

LR_COLUMN->SET_VISIBLE( ABAP_FALSE ).

LR_COLUMN ?= LR_COLUMNS->GET_COLUMN( 'WERKS' ).

LR_COLUMN->SET_VISIBLE( ABAP_FALSE ).

LR_COLUMN ?= LR_COLUMNS->GET_COLUMN( 'MENGE' ).

LR_COLUMN->SET_TOOLTIP( 'Einsatzmenge' ).

*

CATCH CX_SALV_NOT_FOUND.

*

ENDTRY.

ENDFORM.

************************************************************************

FORM CREATE_TREE .

*

PERFORM TREE_HEADER.

*

PERFORM EINLESEN_DATEN.

*

ENDFORM.

************************************************************************

FORM TREE_HEADER.

*

DATA: SETTINGS TYPE REF TO CL_SALV_TREE_SETTINGS.

*

SETTINGS = GR_TREE->GET_TREE_SETTINGS( ).

SETTINGS->SET_HIERARCHY_HEADER( 'MaterialNr' ).

SETTINGS->SET_HIERARCHY_TOOLTIP( 'Materialnummer' ).

SETTINGS->SET_HIERARCHY_SIZE( 30 ).

*

DATA: TITLE TYPE SALV_DE_TREE_TEXT.

TITLE = SY-TITLE.

SETTINGS->SET_HEADER( TITLE ).

*

ENDFORM.

************************************************************************

FORM HIERARCHIE_AUFBAUEN.

*

DATA: MATNR_KEY TYPE LVC_NKEY,

WERKS_KEY TYPE LVC_NKEY,

LAST_KEY TYPE LVC_NKEY.

*

LOOP AT ITAB INTO WA_ITAB.

*

ON CHANGE OF WA_ITAB-MATNR.

PERFORM ADD_MATNR_LINE USING WA_ITAB

''

CHANGING MATNR_KEY.

ENDON.

ON CHANGE OF WA_ITAB-WERKS.

PERFORM ADD_WERKS_LINE USING WA_ITAB

MATNR_KEY

CHANGING WERKS_KEY.

ENDON.

PERFORM ADD_LINE USING WA_ITAB

WERKS_KEY

CHANGING LAST_KEY.

*

ENDLOOP.

*

ENDFORM.

************************************************************************

FORM ADD_MATNR_LINE USING P_LS_DATA TYPE TREE_ITAB

P_KEY

CHANGING P_L_CARRID_KEY.

*

DATA: NODES TYPE REF TO CL_SALV_NODES,

NODE TYPE REF TO CL_SALV_NODE,

ITEM TYPE REF TO CL_SALV_ITEM,

TEXT TYPE LVC_VALUE.

NODES = GR_TREE->GET_NODES( ).

*

TEXT = P_LS_DATA-MATNR.

TRY.

NODE = NODES->ADD_NODE( RELATED_NODE = P_KEY

DATA_ROW = P_LS_DATA

TEXT = TEXT

RELATIONSHIP = CL_GUI_COLUMN_TREE=>RELAT_LAST_CHILD ).

*

P_L_CARRID_KEY = NODE->GET_KEY( ).

CATCH CX_SALV_MSG.

ENDTRY.

*

ENDFORM.

************************************************************************

FORM ADD_WERKS_LINE USING P_LS_DATA TYPE TREE_ITAB

P_L_CARRID_KEY

CHANGING P_L_CONNID_KEY.

*

DATA: NODES TYPE REF TO CL_SALV_NODES,

NODE TYPE REF TO CL_SALV_NODE,

TEXT TYPE LVC_VALUE.

NODES = GR_TREE->GET_NODES( ).

*

TEXT = P_LS_DATA-WERKS.

*

TRY.

NODE = NODES->ADD_NODE( RELATED_NODE = P_L_CARRID_KEY

DATA_ROW = P_LS_DATA

RELATIONSHIP = CL_GUI_COLUMN_TREE=>RELAT_LAST_CHILD

TEXT = TEXT ).

P_L_CONNID_KEY = NODE->GET_KEY( ).

CATCH CX_SALV_MSG.

ENDTRY.

*

ENDFORM.

************************************************************************

FORM ADD_LINE USING P_LS_DATA TYPE TREE_ITAB

P_L_CONNID_KEY

CHANGING P_L_LAST_KEY.

*

DATA: NODES TYPE REF TO CL_SALV_NODES,

NODE TYPE REF TO CL_SALV_NODE.

*

NODES = GR_TREE->GET_NODES( ).

*

TRY.

NODE = NODES->ADD_NODE( RELATED_NODE = P_L_CONNID_KEY

DATA_ROW = P_LS_DATA

RELATIONSHIP = CL_GUI_COLUMN_TREE=>RELAT_LAST_CHILD ).

*

P_L_LAST_KEY = NODE->GET_KEY( ).

CATCH CX_SALV_MSG.

ENDTRY.

*

ENDFORM.

In the routines ADD_MATNR_LINE, ADD_WERKS_LINE and ADD_LINE

are new records inserted in my itab, therefore i get an endless-lopp.

I don't know, why these insertations are made.

Has anyone an idea????

Thanks for help.

Regards, Dieter

4 REPLIES 4
Read only

Former Member
0 Likes
759

Hi!

You can have an endless loop only in one condition: when you are appending/inserting rows into the looped table WITHIN the loop. In this case, your internal table will grow continously, and will never reach the end.

Comment these inserts out "*" and see what happens...

Regards

Tamá

Read only

0 Likes
759

Hi Tamas,

i fill the itab very simple, but not in a loop (see apove).

The problem is that in the routine with i call in a loop, there must be an append

but i don't know why and i cannot see tzhe append.

FORM HIERARCHIE_AUFBAUEN.

*

DATA: MATNR_KEY TYPE LVC_NKEY,

WERKS_KEY TYPE LVC_NKEY,

LAST_KEY TYPE LVC_NKEY.

*

LOOP AT ITAB INTO WA_ITAB.

*

<b>ON CHANGE OF WA_ITAB-MATNR.

PERFORM ADD_MATNR_LINE USING WA_ITAB

''

CHANGING MATNR_KEY.

ENDON.</b>

ON CHANGE OF WA_ITAB-WERKS.

PERFORM ADD_WERKS_LINE USING WA_ITAB

MATNR_KEY

CHANGING WERKS_KEY.

ENDON.

PERFORM ADD_LINE USING WA_ITAB

WERKS_KEY

CHANGING LAST_KEY.

*

ENDLOOP.

*

ENDFORM.

************************************************************************

FORM ADD_MATNR_LINE USING P_LS_DATA TYPE TREE_ITAB

P_KEY

CHANGING P_L_CARRID_KEY.

*

DATA: NODES TYPE REF TO CL_SALV_NODES,

NODE TYPE REF TO CL_SALV_NODE,

ITEM TYPE REF TO CL_SALV_ITEM,

TEXT TYPE LVC_VALUE.

NODES = GR_TREE->GET_NODES( ).

*

TEXT = P_LS_DATA-MATNR.

TRY.

<b>NODE = NODES->ADD_NODE( RELATED_NODE = P_KEY

DATA_ROW = P_LS_DATA

TEXT = TEXT

RELATIONSHIP = CL_GUI_COLUMN_TREE=>RELAT_LAST_CHILD ).</b>

*

P_L_CARRID_KEY = NODE->GET_KEY( ).

CATCH CX_SALV_MSG.

ENDTRY.

*

ENDFORM.

************************************************************************

i the bold marked statements there is an appen, but i don't know why and where.

Regards, Dieter

Read only

0 Likes
759

Hi Dieter,

Is there somewhere in your code a call to following method


* create empty tree-control
  refresh : it_prkop_dum.
  call method tree->set_table_for_first_display
     exporting
               is_hierarchy_header  = l_hierarchy_header
*               it_list_commentary   = lt_list_commentary
*               i_logo               = l_logo
*               i_background_id      = 'ALV_BACKGROUND'
               i_save               = 'A'
               is_variant            = ls_variant
     changing
               it_outtab            = it_prkop_dum
               it_fieldcatalog      = it_fieldcatalog.

I ask this because i had a simular problem.

My internal table also got filled until i called the above method wit an empty dummy table who is a copy of the table i want to display.

Try it out.

Regards.

Dirk.

Read only

Former Member
0 Likes
759

Solve it by my own.

i make itab_tmp like itab

and fill itab_pmt.

Now it works.

Regards, Dieter