‎2007 Apr 04 11:41 AM
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
‎2007 Apr 04 11:52 AM
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á
‎2007 Apr 04 12:55 PM
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
‎2007 Apr 04 1:57 PM
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.
‎2007 Apr 04 4:28 PM
Solve it by my own.
i make itab_tmp like itab
and fill itab_pmt.
Now it works.
Regards, Dieter