Tuesday, May 22, 2007

Grabar una variante de un Dynpro


Alguna vez han querido grabar una variante de un Dynpro? Aquí les dejo un pequeño ejemplo -:)

REPORT Z_VARIANTS.

*-----------------------------------------------------------------*
* TABLES *
*-----------------------------------------------------------------*
TABLES: SPFLI.

*-----------------------------------------------------------------*
* TYPE-POOLS *
*-----------------------------------------------------------------*
TYPE-POOLS: SLIS.

*-----------------------------------------------------------------*
* INTERNAL TABLES *
*-----------------------------------------------------------------*
DATA: T_RKEY TYPE STANDARD TABLE OF RSVARKEY WITH HEADER LINE,
T_SELCTAB TYPE STANDARD TABLE OF RSSCR WITH HEADER LINE,
T_VARI TYPE STANDARD TABLE OF RVARI WITH HEADER LINE,
IT_EXTAB TYPE SLIS_T_EXTAB,
WA_EXTAB LIKE LINE OF IT_EXTAB.

*-----------------------------------------------------------------*
* VARIABLES *
*-----------------------------------------------------------------*
DATA: OK_CODE TYPE SY-UCOMM,
W_VARIANT TYPE RSVAR-VARIANT,
W_USER_VARI TYPE RSVAR-VARIANT,
W_VARI_REPORT TYPE RSVAR-REPORT,
SEL_VARIANT TYPE RSVAR-VARIANT,
SEL_VARIANT_TEXT TYPE RSVAR-VTEXT,
W_REPORT TYPE RSVAR-REPORT,
VARIANT_EXISTS TYPE C.

*-----------------------------------------------------------------*
* SELECTION-SCREEN *
*-----------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF SCREEN 101 AS SUBSCREEN.
SELECT-OPTIONS: S_CARRID FOR SPFLI-CARRID,
S_CONNID FOR SPFLI-CONNID.
SELECTION-SCREEN END OF SCREEN 101.

*-----------------------------------------------------------------*
* INITIALIZATION *
*-----------------------------------------------------------------*
INITIALIZATION.

W_REPORT = SY-REPID.

PERFORM VARIANT_EXISTS.

*-----------------------------------------------------------------*
* START-OF-SELECTION *
*-----------------------------------------------------------------*
START-OF-SELECTION.

CALL SCREEN 0100.

*&----------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT *
*&----------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.

SET PF-STATUS '100' EXCLUDING IT_EXTAB.

ENDMODULE. " STATUS_0100 OUTPUT

*&----------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT *
*&----------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.

OK_CODE = SY-UCOMM.
CASE OK_CODE.
WHEN 'SAVE'.
PERFORM SAVE_VARIANT.
PERFORM VARIANT_EXISTS.
WHEN 'BACK'.
LEAVE TO SCREEN 0.
WHEN 'GET_VAR'.
PERFORM LOAD_VARIANT.
WHEN 'DEL_VAR'.
PERFORM DELETE_VARIANT.
PERFORM VARIANT_EXISTS.
ENDCASE.

ENDMODULE. " USER_COMMAND_0100 INPUT

*&----------------------------------------------------------------*
*& Form SAVE_VARIANT *
*&----------------------------------------------------------------*
FORM SAVE_VARIANT.

T_RKEY-REPORT = SY-REPID.
APPEND T_RKEY.

CALL FUNCTION 'RS_VARIANT_SAVE_FROM_SELSCREEN'
EXPORTING
CURR_REPORT = SY-REPID
VARI_REPORT = SY-REPID
IMPORTING
VARIANT = W_VARIANT
TABLES
P_SSCR = T_SELCTAB
P_VARI = T_VARI
EXCEPTIONS
ILLEGAL_VARIANT_NAME = 1
NOT_AUTHORIZED = 2
NO_REPORT = 3
REPORT_NOT_EXISTENT = 4
REPORT_NOT_SUPPLIED = 5
OTHERS = 6.

T_RKEY-VARIANT = W_VARIANT.
MODIFY T_RKEY INDEX 1.

CALL FUNCTION 'RS_RWSET_SAVE_VARIANT'
EXPORTING
RKEY = T_RKEY
TABLES
SELCTAB = T_SELCTAB.

ENDFORM. " SAVE_VARIANT

*&----------------------------------------------------------------*
*& Form LOAD_VARIANT *
*&----------------------------------------------------------------*
FORM LOAD_VARIANT.

PERFORM CHOOSE_VARIANT CHANGING SEL_VARIANT.

IF SEL_VARIANT NE SPACE.

CALL FUNCTION 'RS_SUPPORT_SELECTIONS'
EXPORTING
REPORT = W_REPORT
VARIANT = SEL_VARIANT
EXCEPTIONS
VARIANT_NOT_EXISTENT = 1
VARIANT_OBSOLETE = 2
OTHERS = 3.

ENDIF.

ENDFORM. " LOAD_VARIANT

*&----------------------------------------------------------------*
*& Form DELETE_VARIANT *
*&----------------------------------------------------------------*
FORM DELETE_VARIANT.

PERFORM CHOOSE_VARIANT CHANGING SEL_VARIANT.

IF SEL_VARIANT NE SPACE.

CALL FUNCTION 'RS_VARIANT_DELETE'
EXPORTING
REPORT = W_REPORT
VARIANT = SEL_VARIANT
FLAG_CONFIRMSCREEN = 'X'
FLAG_DELALLCLIENT = 'X'
EXCEPTIONS
NOT_AUTHORIZED = 1
NOT_EXECUTED = 2
NO_REPORT = 3
REPORT_NOT_EXISTENT = 4
REPORT_NOT_SUPPLIED = 5
VARIANT_LOCKED = 6
VARIANT_NOT_EXISTENT = 7
NO_CORR_INSERT = 8
VARIANT_PROTECTED = 9
OTHERS = 10.

ENDIF.

ENDFORM. " DELETE_VARIANT

*-----------------------------------------------------------------*
* FORM CHOOSE_VARIANT *
*-----------------------------------------------------------------*
FORM CHOOSE_VARIANT CHANGING L_SEL_VARIANT.

CALL FUNCTION 'RS_VARIANT_CATALOG'
EXPORTING
REPORT = W_REPORT
MASKED = 'X'
IMPORTING
SEL_VARIANT = L_SEL_VARIANT
SEL_VARIANT_TEXT = SEL_VARIANT_TEXT
EXCEPTIONS
NO_REPORT = 1
REPORT_NOT_EXISTENT = 2
REPORT_NOT_SUPPLIED = 3
NO_VARIANTS = 4
NO_VARIANT_SELECTED = 5
VARIANT_NOT_EXISTENT = 6
OTHERS = 7.

ENDFORM.

*&----------------------------------------------------------------*
*& Form VARIANT_EXISTS *
*&----------------------------------------------------------------*
FORM VARIANT_EXISTS.

CALL FUNCTION 'RS_VARIANT_FOR_ONE_SCREEN'
EXPORTING
PROGRAM = W_REPORT
DYNNR = '0101'
IMPORTING
VARIANT_EXISTS = VARIANT_EXISTS.

IF VARIANT_EXISTS EQ 'X'.
CLEAR: WA_EXTAB, IT_EXTAB.
REFRESH IT_EXTAB.
ELSE.
CLEAR: WA_EXTAB, IT_EXTAB.
REFRESH IT_EXTAB.
WA_EXTAB-FCODE = 'GET_VAR'.
APPEND WA_EXTAB TO IT_EXTAB.
ENDIF.

ENDFORM. " VARIANT_EXISTS


Y unas cuantas imagenes -;)






Saludos,

Blag.

Saturday, May 19, 2007

ALV Tree Orientado a Objetos


Seguramente muchos de ustedes no saben como crear un ALV Tree y quizás menos sepan crearlo utilizando ABAP Orientado a Objetos...Yo hasta hace un par de semanas, tampoco sabía como hacerlo -:) Simplemente porque nunca me lo habían pedido...Así que aquí les dejo un ejemplo simple y funcional.


Lo único que necesitamos es un Dynpro 100, con un Custom Contro llamado TREE_CONTROL.


REPORT Z_ALV_TREE.

*------------------------------------------------------------------*
* DECLARACION DE TYPES *
*------------------------------------------------------------------*
TYPES: BEGIN OF TY_SPFLI,
CARRID TYPE SPFLI-CARRID,
CONNID TYPE SPFLI-CONNID,
COUNTRYFR TYPE SPFLI-COUNTRYFR,
CITYFROM TYPE SPFLI-CITYFROM,
AIRPFROM TYPE SPFLI-AIRPFROM,
COUNTRYTO TYPE SPFLI-COUNTRYTO,
CITYTO TYPE SPFLI-CITYTO,
END OF TY_SPFLI.

TYPES: BEGIN OF TY_HEADER,
CARRID TYPE SPFLI-CARRID,
END OF TY_HEADER.

*-----------------------------------------------------------------*
* DECLARACION DE TABLAS INTERNAS *
*-----------------------------------------------------------------*
DATA: T_SPFLI TYPE STANDARD TABLE OF TY_SPFLI
WITH HEADER LINE,
TAB_TREE TYPE STANDARD TABLE OF TY_SPFLI
WITH HEADER LINE,
T_TREE TYPE STANDARD TABLE OF TY_SPFLI
WITH HEADER LINE,
T_HEADER TYPE STANDARD TABLE OF TY_HEADER
WITH HEADER LINE.

*-----------------------------------------------------------------*
* DECLARACION DE VARIABLES *
*-----------------------------------------------------------------*
DATA: G_ALV_TREE TYPE REF TO CL_GUI_ALV_TREE,
L_HIERARCHY_HEADER TYPE TREEV_HHDR,
GS_FIELDCAT TYPE LVC_S_FCAT,
GT_FIELDCAT_TREE TYPE LVC_T_FCAT,
G_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER.

*-----------------------------------------------------------------*
* DECLARACION DE FIELD-SYMBOLS *
*-----------------------------------------------------------------*
FIELD-SYMBOLS: <HEADER> LIKE LINE OF T_HEADER,
<SPFLI> LIKE LINE OF T_SPFLI.

*-----------------------------------------------------------------*
* SELECTION-SCREEN *
*-----------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF SCREEN 1001.
SELECTION-SCREEN END OF SCREEN 1001.

*-----------------------------------------------------------------*
* START-OF-SELECTION *
*-----------------------------------------------------------------*
START-OF-SELECTION.

PERFORM OBTENER_DATOS.

IF G_ALV_TREE IS INITIAL.
PERFORM INIT_TREE.

CALL METHOD CL_GUI_CFW=>FLUSH
EXCEPTIONS CNTL_SYSTEM_ERROR = 1
CNTL_ERROR = 2.
ENDIF.

CALL SCREEN 100.

*-----------------------------------------------------------------*
* FORM init_tree *
*-----------------------------------------------------------------*
FORM INIT_TREE.

DATA: L_TREE_CONTAINER_NAME(30) TYPE C.

L_TREE_CONTAINER_NAME = 'TREE_CONTROL'.

CREATE OBJECT G_CUSTOM_CONTAINER
EXPORTING
CONTAINER_NAME = L_TREE_CONTAINER_NAME
EXCEPTIONS
CNTL_ERROR = 1
CNTL_SYSTEM_ERROR = 2
CREATE_ERROR = 3
LIFETIME_ERROR = 4
LIFETIME_DYNPRO_DYNPRO_LINK = 5.

CREATE OBJECT G_ALV_TREE
EXPORTING
PARENT = G_CUSTOM_CONTAINER
NODE_SELECTION_MODE = CL_GUI_COLUMN_TREE=>NODE_SEL_MODE_SINGLE
ITEM_SELECTION = ''
NO_HTML_HEADER = 'X'
NO_TOOLBAR = ''
EXCEPTIONS
CNTL_ERROR = 1
CNTL_SYSTEM_ERROR = 2
CREATE_ERROR = 3
LIFETIME_ERROR = 4
ILLEGAL_NODE_SELECTION_MODE = 5
FAILED = 6
ILLEGAL_COLUMN_NAME = 7.

PERFORM FILL_CATALOG_TREE.
PERFORM BUILD_HIERARCHY_HEADER CHANGING L_HIERARCHY_HEADER.

CALL METHOD G_ALV_TREE->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
IS_HIERARCHY_HEADER = L_HIERARCHY_HEADER
CHANGING
IT_OUTTAB = T_TREE[]
IT_FIELDCATALOG = GT_FIELDCAT_TREE.

PERFORM CREATE_HIERARCHY.

ENDFORM.

*-----------------------------------------------------------------*
* FORM FILL_CATALOG_TREE *
*-----------------------------------------------------------------*
FORM FILL_CATALOG_TREE.

DATA: GS_FIELDCAT_ADD TYPE LVC_S_FCAT.

CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 1.
GS_FIELDCAT-REPTEXT = 'Flight'.
GS_FIELDCAT-SCRTEXT_S = 'Flight'.
GS_FIELDCAT-FIELDNAME = 'CONNID'.
GS_FIELDCAT-TABNAME = 'T_SPFLI'.
APPEND GS_FIELDCAT TO GT_FIELDCAT_TREE.

CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 2.
GS_FIELDCAT-REPTEXT = 'Country'.
GS_FIELDCAT-SCRTEXT_S = 'Country'.
GS_FIELDCAT-FIELDNAME = 'COUNTRYFR'.
GS_FIELDCAT-TABNAME = 'T_SPFLI'.
APPEND GS_FIELDCAT TO GT_FIELDCAT_TREE.

CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 3.
GS_FIELDCAT-REPTEXT = 'Dep.City'.
GS_FIELDCAT-SCRTEXT_S = 'Dep.City'.
GS_FIELDCAT-FIELDNAME = 'CITYFROM'.
GS_FIELDCAT-TABNAME = 'T_SPFLI'.
GS_FIELDCAT-OUTPUTLEN = '15'.
APPEND GS_FIELDCAT TO GT_FIELDCAT_TREE.

CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 4.
GS_FIELDCAT-REPTEXT = 'Dep.Airp'.
GS_FIELDCAT-SCRTEXT_S = 'Dep.Airp'.
GS_FIELDCAT-FIELDNAME = 'AIRPFROM'.
GS_FIELDCAT-TABNAME = 'T_SPFLI'.
GS_FIELDCAT-OUTPUTLEN = '20'.
APPEND GS_FIELDCAT TO GT_FIELDCAT_TREE.

CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 5.
GS_FIELDCAT-REPTEXT = 'Country'.
GS_FIELDCAT-SCRTEXT_S = 'Country'.
GS_FIELDCAT-FIELDNAME = 'COUNTRYTO'.
GS_FIELDCAT-TABNAME = 'T_SPFLI'.
GS_FIELDCAT-OUTPUTLEN = '15'.
APPEND GS_FIELDCAT TO GT_FIELDCAT_TREE.

CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 6.
GS_FIELDCAT-REPTEXT = 'Arr.City'.
GS_FIELDCAT-SCRTEXT_S = 'Arr.City'.
GS_FIELDCAT-FIELDNAME = 'CITYTO'.
GS_FIELDCAT-TABNAME = 'T_SPFLI'.
GS_FIELDCAT-OUTPUTLEN = '20'.
APPEND GS_FIELDCAT TO GT_FIELDCAT_TREE.

ENDFORM.

*---------------------------------------------------------------------*
* FORM build_hierarchy_header *
*---------------------------------------------------------------------*
FORM BUILD_HIERARCHY_HEADER CHANGING
P_HIERARCHY_HEADER TYPE TREEV_HHDR.

CLEAR P_HIERARCHY_HEADER.
P_HIERARCHY_HEADER-HEADING = 'Airline carrier'(300).
P_HIERARCHY_HEADER-WIDTH = 18.
P_HIERARCHY_HEADER-WIDTH_PIX = ' '.

ENDFORM.

*---------------------------------------------------------------------*
* FORM create_hierarchy *
*---------------------------------------------------------------------*
FORM CREATE_HIERARCHY.

DATA: L_ROOT_KEY TYPE LVC_NKEY,
L_NEXT_KEY TYPE LVC_NKEY,
L_LAST_KEY TYPE LVC_NKEY,
HEADER TYPE STRING,
W_MENGE_TEXT(13) TYPE C.

CLEAR L_ROOT_KEY.

LOOP AT T_HEADER ASSIGNING <HEADER>.
CLEAR L_ROOT_KEY.
CLEAR L_NEXT_KEY.
PERFORM ADD_NODE USING <HEADER>-CARRID L_ROOT_KEY
CHANGING L_NEXT_KEY.
LOOP AT T_SPFLI ASSIGNING <SPFLI>
WHERE CARRID EQ <HEADER>-CARRID.

MOVE-CORRESPONDING <SPFLI> TO TAB_TREE.

PERFORM ADD_LEAF USING TAB_TREE L_NEXT_KEY
CHANGING L_LAST_KEY.
ENDLOOP.
ENDLOOP.

CALL METHOD G_ALV_TREE->FRONTEND_UPDATE.

ENDFORM.

*---------------------------------------------------------------------*
* FORM ADD_NODE *
*---------------------------------------------------------------------*
FORM ADD_NODE USING L_NAME L_ROOT_KEY
CHANGING L_NEXT_KEY.

DATA: L_NODE_TEXT TYPE LVC_VALUE,
LS_TREE TYPE TY_SPFLI.

L_NODE_TEXT = L_NAME.
CALL METHOD G_ALV_TREE->ADD_NODE
EXPORTING
I_RELAT_NODE_KEY = L_ROOT_KEY
I_RELATIONSHIP = CL_GUI_COLUMN_TREE=>RELAT_LAST_CHILD
I_NODE_TEXT = L_NODE_TEXT
IS_OUTTAB_LINE = LS_TREE
IMPORTING
E_NEW_NODE_KEY = L_NEXT_KEY.

ENDFORM.

*---------------------------------------------------------------------*
* FORM ADD_LEAF *
*---------------------------------------------------------------------*
FORM ADD_LEAF USING L_TREE TYPE TY_SPFLI
L_NEXT_KEY
CHANGING L_LAST_KEY.

CALL METHOD G_ALV_TREE->ADD_NODE
EXPORTING
I_RELAT_NODE_KEY = L_NEXT_KEY
I_RELATIONSHIP = CL_GUI_COLUMN_TREE=>RELAT_LAST_CHILD
IS_OUTTAB_LINE = TAB_TREE
IMPORTING
E_NEW_NODE_KEY = L_LAST_KEY.

ENDFORM.

*---------------------------------------------------------------------*
* FORM OBTENER_DATOS *
*---------------------------------------------------------------------*
FORM OBTENER_DATOS.

SELECT CARRID CONNID COUNTRYFR CITYFROM
AIRPFROM COUNTRYTO CITYTO
INTO TABLE T_SPFLI
FROM SPFLI.

IF SY-SUBRC EQ 0.
LOOP AT T_SPFLI ASSIGNING <SPFLI>.
MOVE <SPFLI>-CARRID TO T_HEADER-CARRID.
APPEND T_HEADER.
ENDLOOP.

SORT T_HEADER.
DELETE ADJACENT DUPLICATES FROM T_HEADER.

ENDIF.

ENDFORM.

Saludos,

Blag.


Technorati tags: