noviembre 06, 2004

Grabar variante de visualizacion en un ALV

Guardar y recuperar variantes del layout de un ALV.

Hay que poner este codigo, agregar un boton al STATUS GUI y un par de parametros a la funcion de ALV.

En los parametros de seleccion:

SELECTION-SCREEN BEGIN OF BLOCK header2 WITH FRAME TITLE text-002.
PARAMETERS: p_layout LIKE disvariant-variant.
SELECTION-SCREEN END OF BLOCK header2.


Variables:

DATA: gx_variant LIKE disvariant.
DATA: g_variant LIKE disvariant.
DATA: g_variant_save VALUE 'U'.
DATA: g_variant_flag.


Codigo:
 
AT SELECTION-SCREEN OUTPUT.
CLEAR g_variant.
g_variant-report = sy-repid.
g_variant-username = sy-uname.

IF p_layout IS INITIAL AND
g_variant_flag IS INITIAL.
PERFORM get_default_variant_f14 USING p_layout.
g_variant_flag = 'X'.
ENDIF.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_layout.
PERFORM variant_inputhelp_f14 USING p_layout.

*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*&---------------------------------------------------------------------*
*& Form variant_inputhelp_f14
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_P_LAYOUT text
*----------------------------------------------------------------------*
FORM variant_inputhelp_f14 USING p_variant LIKE g_variant-variant.

* Esta rutina funciona como un search help recuperando los layouts
* creados por el usuario


DATA h_exit.

CLEAR gx_variant.

CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
EXPORTING
is_variant = g_variant
i_save = g_variant_save
IMPORTING
e_exit = h_exit
es_variant = gx_variant
EXCEPTIONS
not_found = 1
program_error = 2
OTHERS = 3.

IF sy-subrc IS INITIAL AND h_exit IS INITIAL.
g_variant-variant = gx_variant-variant.
p_variant = gx_variant-variant.
ELSE.
MESSAGE ID sy-msgid TYPE 'S'
NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDFORM. "variant_inputhelp_f14


*&---------------------------------------------------------------------*
*& Form get_default_variant_f14
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_VARIANT text
*----------------------------------------------------------------------*

FORM get_default_variant_f14 USING p_variant LIKE g_variant-variant.

* Recupera datos para luego poder recuperar los diferentes layouts....
gx_variant = g_variant.
CLEAR gx_variant-variant.
CLEAR gx_variant-text.

IF NOT p_variant IS INITIAL.
gx_variant-variant = p_variant.
ENDIF.

CALL FUNCTION 'REUSE_ALV_VARIANT_DEFAULT_GET'
EXPORTING
i_save = g_variant_save
CHANGING
cs_variant = gx_variant
EXCEPTIONS
wrong_input = 1
not_found = 2
program_error = 3
OTHERS = 4.

CASE sy-subrc.
WHEN 0.
p_variant = gx_variant-variant.
WHEN 2.
CLEAR p_variant.
ENDCASE.

ENDFORM. "get_default_variant_f14


Para que determinados campos no se muestren en la salida del ALV, pero que esten disponibles para poder agregarlos a la visualizacion , cuando se arma el fieldcat, a esos campos hay que setearles lo siguiente:

ln_catlg_campos-no_out = 'X'.


Y en el "STATUS GUI" (se edita por medio de la SE80) tiene que haber un boton que haga referencia al codigo de funcion &OL0

En la funcion de ALV hay que pasar los sig parametros:

*&---------------------------------------------------------------------*
*& Form llamar_alv
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*

FORM llamar_alv .

g_user_command = 'USER_COMM'.


CLEAR g_variant.
g_variant-variant = p_layout.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
i_callback_pf_status_set = 'PF_STATUS_SET'
i_callback_user_command = g_user_command
i_structure_name = 'T_SALIDA'
is_layout = g_layout
it_fieldcat = gt_catlg_campos
i_save = 'U'
is_variant = g_variant
TABLES
t_outtab = t_salida
EXCEPTIONS
program_error = 1
OTHERS = 2.

IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDFORM. " llamar_alv

SQL Dinamico (en los campos de seleccion de un select)

Tambien se puede usar SQL dinamico para armar el grupo de campos a recuperar en una sentencia SELECT. Puede ser util para no recuperar campos que no vamos a usar (que pueden variar por alguna condicion del programa o parametro de seleccion).

En este caso, segun el rango de periodo que me pasaran por parametro tenia que recuperar determinado grupo de campos que iban numerados de 01 a 16.

* Definimos una tabla donde vamos a guardar los nombres de campos

DATA: i_campos_sel(80) OCCURS 10 WITH HEADER LINE.

* Llamo a una rutina para llenar la tabla con los campos antes del select.

PERFORM f_det_campos_a_rec.

SELECT (i_campos_sel)
INTO CORRESPONDING FIELDS OF TABLE i_totales
FROM zecmclocalt
WHERE rldnr IN s_ledger AND
ryear IN s_ejer AND
rbukrs IN s_soci AND
racct IN s_cuenta.



*&---------------------------------------------------------------------*
*& Form f_det_campos_a_rec
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*

FORM f_det_campos_a_rec .

DATA: v_per_desde LIKE zecmclocalt-rpmax,
v_per_hasta LIKE zecmclocalt-rpmax,
v_conta(2) TYPE i,
v_conta_c(2) TYPE c,
v_campo(15) TYPE c.


MOVE s_per-low TO v_per_desde.
IF NOT s_per-high IS INITIAL.
MOVE s_per-high TO v_per_hasta.
ELSE.
MOVE s_per-low TO v_per_hasta.
ENDIF.

MOVE v_per_desde TO v_conta.

MOVE 'RACCT' TO i_campos_sel.
APPEND i_campos_sel.

DO.
UNPACK v_conta TO v_conta_c.
CONCATENATE 'TSL' v_conta_c INTO i_campos_sel.
CONCATENATE i_campos_sel '#' 'HSL' v_conta_c INTO i_campos_sel.
CONCATENATE i_campos_sel '#' 'KSL' v_conta_c INTO i_campos_sel.
CONCATENATE i_campos_sel '#' 'MSL' v_conta_c INTO i_campos_sel.
CONCATENATE i_campos_sel '#' 'ASL' v_conta_c INTO i_campos_sel.
TRANSLATE i_campos_sel USING '# '.
APPEND i_campos_sel.

ADD 1 TO v_conta.

IF v_conta GT v_per_hasta OR v_conta GT 16.
EXIT.
ENDIF.

ENDDO.

ENDFORM. " f_det_campos_a_rec

Sumar / restar dias / meses a una fecha

La funcion "RP_CALC_DATE_IN_INTERVAL" te permite sumar o restar dias/meses a una fecha determinada.