|
Código fuente -
Ejemplos ALV
|
|
Martes, 22 de Julio de 2003 17:46 |
Ejemplo de un listado ALV con control de salto de línea
REPORT ZGLC_0001 .
TYPE-POOLS: SLIS.
TABLES: VBAK.
DATA: D_VKORG LIKE VBAK-VKORG.
SELECT-OPTIONS: S_VKORG FOR VBAK-VKORG,
S_VBELN FOR VBAK-VBELN.
* Nombre del form que controlará el evento ANTES DE escribir una linea
CONSTANTS: FORM_LINEA TYPE SLIS_FORMNAME VALUE 'ANTES_ESCRIBIR_LINEA'.
* Presentaremos la organización de ventas y el número de pedido.
* Al cambiar de VKORG, haremos un salto de página
DATA: BEGIN OF I1 OCCURS 0,
VKORG LIKE VBAK-VKORG,
VBELN LIKE VBAK-VBELN,
END OF I1.
* Variantes de las ALV
DATA: FIELDTAB TYPE SLIS_T_FIELDCAT_ALV,
LAYOUT TYPE SLIS_LAYOUT_ALV,
EVENTS TYPE SLIS_T_EVENT,
REPNAME LIKE SY-REPID,
F2CODE LIKE SY-UCOMM VALUE '&ETA'.
INITIALIZATION.
REPNAME = SY-REPID.
PERFORM INITIALIZE_FIELDCAT USING FIELDTAB[].
PERFORM BUILD_EVENTTAB USING EVENTS[].
* PERFORM build_comment USING heading[].
* PERFORM initialize_variant.
START-OF-SELECTION.
PERFORM OBTENER_VBAK.
END-OF-SELECTION.
READ TABLE I1 INDEX 1.
D_VKORG = I1-VKORG.
PERFORM BUILD_LAYOUT USING LAYOUT.
PERFORM WRITE_OUTPUT.
* Este es el importante
FORM ANTES_ESCRIBIR_LINEA USING P_C TYPE SLIS_LINEINFO.
* Comprobamos que lo que se ha escrito es un campo de la tabla interna
CHECK P_C-TABNAME = 'I1'.
READ TABLE I1 INDEX P_C-TABINDEX.
CHECK SY-SUBRC EQ 0.
* Hemos leído la tabla interna para ver si la VKORG ha cambiado
IF I1-VKORG <> D_VKORG AND P_C-TABINDEX NE 1.
D_VKORG = I1-VKORG.
NEW-PAGE.
ENDIF.
ENDFORM.
FORM INITIALIZE_FIELDCAT USING P_FIELDTAB[].
* en principio no ponemos nada, aunque aquí configuraríamos la tabla int
ENDFORM. " INITIALIZE_FIELDCAT
FORM BUILD_EVENTTAB USING P_EVENTS TYPE SLIS_T_EVENT.
DATA: LS_EVENT TYPE SLIS_ALV_EVENT.
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
I_LIST_TYPE = 0
IMPORTING
ET_EVENTS = P_EVENTS.
* El type que controla el evento ANTES escribir una linea es
* slis_ev_before_line_output
READ TABLE P_EVENTS WITH KEY NAME = SLIS_EV_BEFORE_LINE_OUTPUT
INTO LS_EVENT.
IF SY-SUBRC = 0.
* Asignamos el nombre de nuestro form al nombre del evento
MOVE FORM_LINEA TO LS_EVENT-FORM.
APPEND LS_EVENT TO P_EVENTS.
ENDIF.
ENDFORM. " BUILD_EVENTTAB
*
FORM OBTENER_VBAK.
SELECT VBELN VKORG FROM VBAK
INTO CORRESPONDING FIELDS OF TABLE I1
WHERE VKORG IN S_VKORG
AND VBELN IN S_VBELN.
SORT I1 BY VKORG VBELN.
ENDFORM. " OBTENER_VBAK
*&---------------------------------------------------------------------*
*& Form BUILD_LAYOUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_LAYOUT text *
*----------------------------------------------------------------------*
FORM BUILD_LAYOUT USING P_LAYOUT TYPE SLIS_LAYOUT_ALV.
P_LAYOUT-F2CODE = F2CODE.
P_LAYOUT-ZEBRA = 'X'.
P_LAYOUT-DETAIL_POPUP = 'X'.
ENDFORM. " BUILD_LAYOUT
*&---------------------------------------------------------------------*
*& Form WRITE_OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM WRITE_OUTPUT.
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
I_PROGRAM_NAME = REPNAME
I_INTERNAL_TABNAME = 'I1'
I_INCLNAME = REPNAME
CHANGING
CT_FIELDCAT = FIELDTAB.
IF SY-SUBRC <> 0.
WRITE: 'SY-SUBRC: ', SY-SUBRC, 'REUSE_ALV_FIELDCATALOG_MERGE'.
ENDIF.
CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
EXPORTING
I_CALLBACK_PROGRAM = REPNAME
I_STRUCTURE_NAME = 'I1'
IS_LAYOUT = LAYOUT
IT_FIELDCAT = FIELDTAB
I_DEFAULT = 'A'
* i_save = g_save
* is_variant = g_variant
IT_EVENTS = EVENTS[]
TABLES
T_OUTTAB = I1.
IF SY-SUBRC <> 0.
WRITE: 'SY-SUBRC: ', SY-SUBRC, 'REUSE_ALV_LIST_DISPLAY'.
ENDIF.
ENDFORM. " WRITE_OUTPUT
|