martes, 16 de abril de 2013

DYNPRO


ALV Objetos - Procesar PAI dynpro al ejecutar botón ALV
Al ejecutar algún botón estándard o Z de nuestro ALV puede ser que nos interese que proceso PAI del actual DYNPRO. Para esto es necesario informar el campo I_APPL_EVENTS = 'X' en la creación del objeto ALV.

 
CREATE OBJECT obj_alv_ges_adm
      EXPORTING
        i_parent      = obj_container_ges_adm
        i_appl_events = 'X'.

En caso contrario el programa ejecuta la función de ALV y NO continua con el PAI.
Dynpro - Ejemplos TextEdit

SAPTEXTEDIT_DEMO_1
SAPTEXTEDIT_DEMO_1_OLD
SAPTEXTEDIT_DEMO_2_OLD
SAPTEXTEDIT_DEMO_3
SAPTEXTEDIT_DEMO_3_OLD
SAPTEXTEDIT_DEMO_DRAGDROP
SAPTEXTEDIT_TEST_1
SAPTEXTEDIT_TEST_1_OLD
SAPTEXTEDIT_TEST_1_OLDF01
SAPTEXTEDIT_TEST_1_OLDI01
SAPTEXTEDIT_TEST_1_OLDO01
Dynpro - Tabstrip
Para trabajar con Tabstrip se debe realizar las siguientes paso (ejemplo DEMO_DYNPRO_TABSTRIP_SERVER):


1) Crear dynpro de control 0100 y los otros dynpros para subscreen 0110, 0120 y 0130.

2) Dentro del dynpro de control crear:
     - Control de Fichas (MYTABSTRIP). También definir variable globlal: CONTROLS mytabstrip TYPE TABSTRIP.
     - Tantos pulsadores como pestañas, a cada pulsador se le asigna un nombre (PUSH1) y un código (PUSH1).
     - Un Área Subscreen con un nombre (SUB).

3) En el PBO se hace la llamada para mostrar el tabstrip CALL SUBSCREEN SUB INCLUDING SY-REPID NUMBER. Antes de llamar al dynpro de control se informa que pestaña está activa:
mytabstrip-activetab = 'PUSH2'.
number = '0120'.

4) En el PAI se hace llamada CALL SUBSCREEN SUB y después dentro de Module USER_COMMAND capturar evento e informar la pestaña y el subscreen:
mytabstrip-activetab = save_ok.
CASE save_ok.
  WHEN 'PUSH1'.
    number = '0110'.
  WHEN 'PUSH2'.
    number = '0120'.
 
WHEN 'PUSH3'.
    number = '0130'.
ENDCASE.
Dynpro - Subscreens
Las subscreens son útiles para mostrar diferente información dependiendo criterios. Para trabajar con varios con subscreens en dynpros se realizan los siguientes pasos (ejemplo DEMO_DYNPRO_SUBSCREENS):

1) Crear dynpro Inicial 0100 (tipo normal).

2) Añadir dos subscreens al dynpro 0100 (Área subscreen con id 'AREA1' y subscreen con 'AREA2') y varios botones que permitirán mostrar un dynpro u otro. A cada botón se le asignará un código para posteriomente capturarlo en el Module USER_COMMAND (punto 6).


3) Crear varios dynpros (tipo subscreen): 0110, 0120, 0130, 0140.

4) En el PBO realizar la llamada por cada subscreen :
CALL SUBSCREEN AREA1 INCLUDING nombre_programa nombre_subscreen.
CALL SUBSCREEN AREA2 INCLUDING nombre_programa nombre_subscreen.
Tanto en el nombre_programa como nombre_subscreen se pueden utilizar variable :
data: call_prog   TYPE sycprog.
data: call_subscr TYPE sydynnr.
Normalmente siempre es el mismo programa por lo que se utiliza sy-repid mientras que el subscreen cambia.

5) En el PAI realizar la llamada por cada subscreen:
CALL SUBSCREEN AREA1.
CALL SUBSCREEN AREA2.

6) En el PAI realizar llamada al un MODULE USER_COMMAND. En este module se informa la variable nombre_subscreen que será que posteriormente se cargará en el PBO.
Creación textos SAP
Utilizar transacción SE75. Primero crear objeto y luego crear id_texto. Se genera orden de customizing. Posteriormente READ_TEXT y SAVE_TEXT.
DYNPRO - ocultar botones
Al trabajar con dynpro si queremos ocultar botones:

LOOP AT SCREEN
IF screen-name EQ 'Nombre_campo_ocultar'.
screen-output = 1.
screen-input = 0.
screen-invisible = 1.
modify screen.
ENDIF.
ENDLOOP.

Esta parte de código de pone en el PBO si el programa es de tipo PROGRAM o en el evento AT SELECTION-SCREEN OUTPUT si el programa es de tipo REPORT.
DYNPRO - pantallas
Para volver a la pantalla inicial:
- LEAVE TO SCREEN 0.
- SET SCREEN 0. "Puntero
LEAVE SCREEN.

Para terminar programa :
- LEAVE PROGRAM.

CALL SCREEN -> va guardando ciclo. Se llega a un tope.
DYNPRO - Textos
La primera idea que nos viene a la cabeza cuando queremos guardar texto es crear un campo de char255 en una tabla Z. Pero no se mantendría el formato (negrita, cursiva, salta de línea). Para resolver este problema se pueden utilizar los textos de sap.

Los diferentes id de textos se guardan en la tabla TTXID.

1) Configurar Texto nuevo Tx. SE75.

Si vamos a la sm30 hay un botón donde para buscar pasos en el Customizing que trabajen con esta tabla. Debemos buscar una descripción parecida a 'Definir ID de texto'. Aquí crearemos nuestros objetos y clases nuevas. Previamente hay que buscar un tipo de objeto al que queremos añadir los nuevos ID's.

2) Inicializar variables
IF NOT cc_org IS INITIAL.
CALL METHOD cc_org->free.
ENDIF.

IF NOT txtedit_nota IS INITIAL.
CALL METHOD txtedit_nota->free.
ENDIF.

3) Recuperar Texto.

Programa Control =>
DATA: cc_nota TYPE REF TO cl_gui_custom_container.
DATA: txtedit_nota TYPE REF TO cl_gui_textedit.
************************************************************************************
PBO
************************************************************************************
* Crear CUSTOM-CONTROL
IF cc_nota IS INITIAL.

CREATE OBJECT cc_nota
EXPORTING
container_name = 'CC_TEXTO' "Nombre del custom control del Dynpro
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5
others = 6.

ENDIF.

* Asignarle edición de texto
IF txtedit_nota IS INITIAL.

CREATE OBJECT txtedit_nota
EXPORTING
wordwrap_mode = 2
wordwrap_position = 72
parent = cc_nota
EXCEPTIONS
error_cntl_create = 1
error_cntl_init = 2
error_cntl_link = 3
error_dp_create = 4
gui_type_not_supported = 5
others = 6.

* Quitar botones
CALL METHOD txtedit_nota->set_toolbar_mode.
CALL METHOD txtedit_nota->set_statusbar_mode.
PERFORM llenar_texto.
ENDIF.

* Visualizar/Modificar
IF action EQ 'DISP'.
CALL METHOD txtedit_nota->set_readonly_mode
EXPORTING
readonly_mode = '1'.
ELSE.
CALL METHOD txtedit_nota->set_readonly_mode
EXPORTING
readonly_mode = '0'.
ENDIF.

****************************************************************************
Rutina=> PERFORM llenar_texto.
****************************************************************************
DATA: w_header TYPE thead,
t_tline TYPE TABLE OF tline,
w_tline TYPE tline,
t_texto TYPE TABLE OF char255.

w_header-tdobject = 'FORMMAT'.
w_header-tdname = zwf_mat_alta_dg-formnumber.
w_header-tdspras = sy-langu.

CALL FUNCTION 'READ_TEXT'
EXPORTING
id = w_header-tdid "Tipo de texto
language = w_header-tdspras "Idioma
name = w_header-tdname "Id del texto
object = w_header-tdobject "Nombre del objeto
TABLES
lines = t_tline
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.

*Copiar texto con formato a sólo texto
LOOP AT t_tline INTO w_tline.
APPEND w_tline-tdline TO t_texto.
ENDLOOP.

* Guardar texto en objeto
CALL METHOD txtedit_nota->set_text_as_r3table
EXPORTING
table = t_texto
EXCEPTIONS
error_dp = 1
error_dp_create = 2
OTHERS = 3.

3) Guardar texto.
DATA: w_header TYPE thead,
t_tline TYPE TABLE OF tline,
w_tline TYPE tline,
t_texto TYPE TABLE OF char255,
w_texto TYPE char255.

CLEAR w_header.
w_header-tdobject = 'FORMMAT'.
w_header-tdname = zwf_mat_alta_dg-formnumber.
w_header-tdspras = sy-langu.
w_header-tdid = 'DG'. " texto datos generales

* Eliminar texto anterior
CALL FUNCTION 'DELETE_TEXT'
EXPORTING
id = w_header-tdid
language = w_header-tdspras
name = w_header-tdname
object = w_header-tdobject
EXCEPTIONS
not_found = 1
OTHERS = 2.

* Recuperar texto de la pantalla
CALL METHOD txtedit_nota->get_text_as_r3table
IMPORTING
table = t_texto.

LOOP AT t_texto INTO w_texto.
w_tline-tdformat = '*'.
w_tline-tdline = w_texto.
APPEND w_tline TO t_tline .
ENDLOOP.

* Guardar texto nuevo
CALL FUNCTION 'SAVE_TEXT'
EXPORTING
header = w_header
TABLES
lines = t_tline
EXCEPTIONS
id = 1
language = 2
name = 3
object = 4
OTHERS = 5.

CALL FUNCTION 'COMMIT_TEXT'.

* Para deshabilitar el scroll horitzontal al realizar el CREATE OBJECT informar
        wordwrap_mode              = cl_gui_textedit=>wordwrap_off
Añadir botones en el Status de un Report
En un principio pensaba que para añadir botones a la barra se tenia que trabajar con DYNPROS y currartelo, pero acabo de darme cuenta que hay otra manera más rápida.
Creamos un elemento en nuestro SCREEN : SELECTION-SCREEN FUNCTION KEY 1.
Le debemos de asignar un numero de 1 al 5.

En evento de INITIALIZATION le ponemos un texto o un icono. MOVE 'My text' TO sscrfields-functxt_01.

Después captamos los captamos con el evento at selection-screen (los valores de sy-ucomm pueden ir de FC01 al FC05.

Comentario: debemos crear un work area para TABLES sscrfields (tienes los atributos).
Añadir parametros de selección en un MODUL-POOL
Cuando se trabaja con un programa del tipo report es muy fácil crearte una pantalla de selección con los comandos PARAMETERS y SELECT-OPTION. ¿Pero que pasa cuando trabajamos con DYNPROS?

Para ello tambien utilizamos comandos PARAMETERS y SELECT-OPTION. y lo asignamos a un nombre.
SELECTION-SCREEN BEGIN OF SCREEN nombre AS WINDOW TITLE text-460.

Después dentro del DYNPRO lo llamamos.
CALL SELECTION-SCREEN nombre STARTING AT 20 5.
Añadir botones estandard a nuestro STATUS
A la hora de crear un STATUS, nos puede interesar reutilizar algunos botones del estandard además de los nuestros propios, para ello deberemos seguir la siguiente ruta una vez que estemos en la TX del menu painter se41.

Detalles->Ajustar Modelo-> List Viewer ABAP
DYNPRO con AT EXIT-COMMAND
En la lógica de los DYNPROS, muchas veces nos puede interesar terminar la ejecución del programa al realizar una acción (como por ejemplo presionar un botón). Imaginad que tenemos un dynpro donde es obligatorio rellenar un campo. En el PAI tenemos una module que hace la comprobación. Probad a presionar el botón de cancelar de vuestro dynpro sin rellenar el campo obligatorio ¿Que pasa? Que a pesar que queremos salir del programa el PAI se ejecuta y se muestra un mensaje diciendo que es obligatorio informar el campo, pero lo que nos interesa a nosotros es salir del programa y no nos importar el valor de ningún campo. Para hacer que al apretar el botón cancele de todas formas se debe hacer dos pasos:

- Crear un module dentro del PAI que salga del programa (dentro del module hacemos LEAVE PROGRAM). En la llamada al module debemos añadir el siguiente texto AT EXIT-COMMAND.

-Asignar al botón un tipo de función 'Comando Exit'. Para esto vamos al status del dynpro y escogemos el tipo E en las características del botón.


Listbox
Para crear un listbox debemos insertar un campo del tipo desplegable 'Listbox' en nuestra DYNPRO. En el PBO ( o evento AT SELECTION-SCREEN OUTPUT), debemos utilizar el módulo de función VRM_SET_VALUES con la tabla que contiene los valores (ID y Texto) que se deberá haber rellenado antes. Tienes que declaro pool de tipos TYPE-POOLS: vrm. Además el campo PARAMETERS debe ser listbox y visible con una longitud ( as LISTBOX VISIBLE LENGTH 6 ).

También tenemos la función VRM_GET_VALUES para recuperar los valores o sino accediendo directamente al parámetro p_funint.


PARAMETERS: p_funint TYPE crmt_partner_fct AS LISTBOX VISIBLE LENGTH 30.
DATA: it_vrm TYPE vrm_values.
DATA: wa_vrm TYPE LINE OF vrm_values.
DATA: gv_name TYPE vrm_id VALUE 'P_FUNINT'.
*************************************************************************
AT SELECTION-SCREEN OUTPUT.
**************************************************************************
SELECT partner_fct AS key description AS text
FROM crmc_partner_ft
INTO CORRESPONDING FIELDS OF TABLE it_vrm
WHERE spras EQ sy-langu.

CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = gv_name
values = it_vrm.
Ocultar elementos dynpro según RADIOBUTTON
Al estar trabajando con dynpros nos puede interesar mostrar o ocultar algunos campos. En este caso queremos mostrar/esconder los campo dependiendo del valor del un RADIOBUTTON. Para ello primero asignamos todos los elementos que queramos mostrar/esconder a un grupo que después modificaremos recorriendo la tabla con los elemenos LOOP AT SCREEN.

Para que actualizar la pantalla sólo cambiando de radibutton (sin tener que ejecutar ENTER), debemos indicarselo de la siguiente manera:
PARAMETERS: p_rad RADIOBUTTON GROUP grupo_bloque USER-COMMAND grupo_enter.

NOTA: Si todos los elementos de un mismo bloque estan inactivos, no se muestra su recuadro.

No hay comentarios:

Publicar un comentario