Sunteți pe pagina 1din 98

Crear Dynpros para crear, modificar y visualizar datos en

una base de datos.


martes, diciembre 10, 2013 No comments

Datos previos:

Base de datos ZBIBLIO_SOCIOS (Ver aqu)


Objetivo:

Una Dynpro 9000 con tres botones (Crear, Modificar y Visualizar).

Una Dynpro 9001 para aadir datos a la base de datos.

Una Dynpro 9002 como ventana de dilogo modal, para introducir el


cdigo de socio.

Una Dynpro 9003, como ventana de dilogo modal, para Modificar o


Visualizar un socio de la base de datos.
Esquema de las cuatro dynpros:

Esquema de los dynpros.

El primer paso es crear un Module Pool en la SE38:

Crear un Module Pool en la SE38

Aadir una Dynpro (Screen) al Module Pool creado pulsando el botn derecho:

Aadir una Dynpro al Module Pool creado.

Indicar el nmero de pantalla (se recomienda a partir de 9000).

Crear el elemento tipo OK de la pantalla 9000.

Descomentar los mdulos PBO y PAI, y crear ambos objetos pinchando dos veces en el nombre.

En nuestro programa principal se nos habrn creado los objetos PBO y PAI en el
cdigo del programa.

Objetos PBO y PAI en el programa.

Como se puede apreciar, en el PBO se aade un Status y un Ttulo, y en el PAI la


salida del programa cuando el usuario pulsa el botn Cancel.
Para crear el STATUS y el ttulo se pincha dos veces en el nombre:

Descripcin del Status

Activacin del botn Cancel cmo mnimo para salir del programa.

Descripcin del ttulo del programa.

Pinchamos dos veces al Dynpro 9000 y vamos al Layout para editar la pantalla. Se
introducirn los botones de crear, modificar y visualizar:

Ir al Layout para editar la pantalla.

Escribir el cdigo de funcin del botn.

Botones creados en el Dynpro 9000.

Para poder ejecutar la pantalla creada, es necesario crear una transaccin. Hay
dos formas:
1.

En la SE93

2.

Directamente en el programa

Crear la transaccin en la SE93.

Crear la transaccin directamente en el programa.

Se indicar la descripcin, el nombre del Module Pool y la pantalla.

Descripcin de la transaccin.

Module Pool y Dynpro para que la transaccin lo ejecute.

Creamos la Dynpro (Screen) 9001 tal y como creamos la 9000. Las nicas
diferencias son:
1.

Aadimos el botn BACK para volver al screen 9000 en el


STATUS_9001.

2.

El campo de entrada/salida se nombra con el nombre de la tabla


ZBIBLIO_SOCIOS para referenciar sus caractersticas.

Aadimos el botn Back.

Nombras el campo de entrada/salida con el mismo nombre para referenciar.

Dynpro 9001 resultante.

Se necesita comprobar que el nuevo cdigo de socio no existe en la base de


datos. Para ello recurrimos al Process After Input (PAI) para comprobar si el valor
introducido existe en la base de datos. Se indica el campo con un CHAIN y el
mdulo correspondiente a ejecutar (ver cdigo resultante al final).
PROCESS BEFORE OUTPUT.
MODULE status_9001.
*
PROCESS AFTER INPUT.
CHAIN.
FIELD zbiblio_socios-cod_socio.
MODULE existe_socio.
ENDCHAIN.
MODULE user_command_9001.

A continuacin creamos la Dynpro 9002 con sus correspondientes campos como


ventana de dilogo modal. En este caso, el Status tiene que ser del mismo tipo:

Status 9002 como dilogo modal.

Aadimos el cdigo para cuando el usuario pulsa X para salir.

En este caso, dependiendo del botn pulsado en la Dynpro 9000, el botn tendr
como texto Modificar o Visualizarse, por tanto es necesario indicar el botn como
campo de salida.

Botn como campo output en el Dynpro 9002.

Finalmente creamos la Dynpro 9003 como ventana de dilogo modal.

Dynpro 9003 como ventana de dilogo modal.

Esta misma Dynpro se va a utilizar para la accin de modificar o visualizar. Las


diferencias con respecto a la 9001 son:
1.

El campo del cdigo de socio es solo output (El usuario ya ha sido


introducido en la Dynpro 9002).

2.

Todos los campos de entrada/salida, salvo el primero, tendrn un


identificador de Grupo1 llamado ID1.

Si se da al botn de visualizar, ningn campo es editable, por lo


tanto identificamos con ID1 los campos a modificar esa opcin.

3.

El botn ser un campo de salida, tal y como en el Dynpro 9002.

El campo input del cdigo de socio es solo output.

Identificador de grupo ID1 en todos los campos de entrada/salida salvo en cdigo de socio.

Botn como campo de salida.

Los cdigos son los siguientes:

Dynpro 9000
PROCESS BEFORE OUTPUT.
MODULE STATUS_9000.
*
PROCESS AFTER INPUT.
MODULE USER_COMMAND_9000.

Dynpro 9001
PROCESS BEFORE OUTPUT.
MODULE status_9001.
*
PROCESS AFTER INPUT.
CHAIN.
FIELD zbiblio_socios-cod_socio.
MODULE existe_socio.
ENDCHAIN.
MODULE user_command_9001.

Dynpro 9002
PROCESS BEFORE OUTPUT.
MODULE status_9002.
MODULE inicial_9002.
*
PROCESS AFTER INPUT.
CHAIN.
FIELD zbiblio_socios-cod_socio.
MODULE existe_socio.
ENDCHAIN.
MODULE user_command_9002.

Dynpro 9003
PROCESS BEFORE OUTPUT.
MODULE status_9003.
MODULE inicial_9003.
*
PROCESS AFTER INPUT.
MODULE user_command_9003.

Module Pool
*&---------------------------------------------------------------------*
*& Module Pool
ZBIBLIO_CREAR_MODIF_VISUAL

*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
PROGRAM zbiblio_crear_modif_visual.
TABLES: zbiblio_socios.
DATA: g_st_socios TYPE zbiblio_socios.
DATA: ok_code_9000 TYPE sy-ucomm,
ok_code_9001 TYPE sy-ucomm,
ok_code_9002 TYPE sy-ucomm,
ok_code_9003 TYPE sy-ucomm.
DATA: b_9002_boton(20) TYPE c, "Texto de los botones output
b_9003_boton(20) TYPE c.
DATA: g_wa_existe_socio TYPE c, "Bsqueda en dynpro 9002
g_wa_vuelta TYPE i. "Al iniciar PBO del dynpro 9003
*&---------------------------------------------------------------------*
*&
Module STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
MODULE status_9000 OUTPUT.
SET PF-STATUS 'STATUS_9000'.
SET TITLEBAR 'TITLE_9000'.
ENDMODULE.
" STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
*&
Module USER_COMMAND_9000 INPUT
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.
CASE ok_code_9000.
WHEN 'CANCEL'.
LEAVE PROGRAM.
WHEN 'CREAR'.
CALL SCREEN 9001.
WHEN 'MODIFICAR'.
CALL SCREEN 9002 STARTING AT 10 10.
WHEN 'VISUALIZAR'.
CALL SCREEN 9002 STARTING AT 10 10.
ENDCASE.
ENDMODULE.

" USER_COMMAND_9000 INPUT

*&---------------------------------------------------------------------*
*&
Module STATUS_9001 OUTPUT
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
MODULE status_9001 OUTPUT.
SET PF-STATUS 'STATUS_9001'.
SET TITLEBAR 'TITLE_9001'.
ENDMODULE.
" STATUS_9001 OUTPUT
*&---------------------------------------------------------------------*
*&
Module USER_COMMAND_9001 INPUT
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
MODULE user_command_9001 INPUT.
CASE ok_code_9001.
WHEN 'BACK'.
CALL SCREEN 9000.
WHEN 'CANCEL'.
LEAVE PROGRAM.
WHEN 'CREAR'.
INSERT zbiblio_socios.
MESSAGE 'Usuario creado' type 'I'.
ENDCASE.
ENDMODULE.
" USER_COMMAND_9001 INPUT
*&---------------------------------------------------------------------*
*&
Module STATUS_9002 OUTPUT
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
MODULE status_9002 OUTPUT.
SET PF-STATUS 'STATUS_9002'.
SET TITLEBAR 'TITLE_9002'.
ENDMODULE.
" STATUS_9002 OUTPUT
*&---------------------------------------------------------------------*
*&
Module MODIFICAR_VISUALIZAR OUTPUT
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
MODULE inicial_9002 OUTPUT.
PERFORM f_inicial.
ENDMODULE.
" MODIFICAR_VISUALIZAR OUTPUT
*&---------------------------------------------------------------------*
*&
Module VALIDA_SOCIO INPUT
*&---------------------------------------------------------------------*

*
text
*----------------------------------------------------------------------*
MODULE existe_socio INPUT.
PERFORM f_existe_socio.
IF ok_code_9000 = 'CREAR' AND g_wa_existe_socio = 'X'.
MESSAGE 'El usuario ya existe' TYPE 'E'.
ELSEIF ( ok_code_9000 = 'MODIFICAR' OR
ok_code_9000 = 'VISUALIZAR' ) AND
g_wa_existe_socio <> 'X'.
MESSAGE 'El usuario no existe' TYPE 'E'.
ENDIF.
ENDMODULE.
" EXISTE_SOCIO INPUT
*&---------------------------------------------------------------------*
*&
Module USER_COMMAND_9002 INPUT
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
MODULE user_command_9002 INPUT.
CASE ok_code_9002.
WHEN 'BACK'.
CALL SCREEN 9000.
WHEN 'CANCEL'.
LEAVE PROGRAM.
CLEAR: g_st_socios, g_wa_existe_socio.
WHEN 'ACCION'.
IF g_wa_existe_socio = 'X'.
g_wa_vuelta = 1.
CALL SCREEN 9003 STARTING AT 10 10.
ENDIF.
ENDCASE.
ENDMODULE.
" USER_COMMAND_9002 INPUT
*&---------------------------------------------------------------------*
*&
Module USER_COMMAND_9003 INPUT
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
MODULE user_command_9003 INPUT.
CASE ok_code_9003.
WHEN 'BACK'.
CALL SCREEN 9000.
WHEN 'CANCEL'.
LEAVE PROGRAM.
WHEN 'ACCION'.
IF ok_code_9000 = 'MODIFICAR'.
PERFORM f_modificar.
ENDIF.
ENDCASE.

ENDMODULE.
" USER_COMMAND_9003 INPUT
*&---------------------------------------------------------------------*
*&
Module STATUS_9003 OUTPUT
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
MODULE status_9003 OUTPUT.
SET PF-STATUS 'STATUS_9003'.
IF ok_code_9000 = 'MODIFICAR'.
SET TITLEBAR 'TITLE_9003_1'.
ELSEIF ok_code_9000 = 'VISUALIZAR'.
SET TITLEBAR 'TITLE_9003_2'.
ENDIF.
ENDMODULE.
" STATUS_9002 OUTPUT
*&---------------------------------------------------------------------*
*&
Module INICIAL_9003 OUTPUT
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
MODULE inicial_9003 OUTPUT.
PERFORM f_inicial.
IF g_wa_vuelta = 1.
PERFORM f_ver_socio.
g_wa_vuelta = g_wa_vuelta + 1.
ENDIF.
ENDMODULE.
" INICIAL_9003 OUTPUT
*&---------------------------------------------------------------------*
*&
Form F_INICIAL
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
* --> p1
text
* <-- p2
text
*----------------------------------------------------------------------*
FORM f_inicial.
* Cambiar el texto del botn
IF ok_code_9000 = 'MODIFICAR'.
b_9002_boton = 'Modificar'.
b_9003_boton = 'Modificar'.
ELSEIF ok_code_9000 = 'VISUALIZAR'.
b_9002_boton = 'Visualizar'.
b_9003_boton = 'Visualizar'.
* No editable cuando es visualizacin
LOOP AT SCREEN.

IF screen-group1 = 'ID1'.
screen-input = 0.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
ENDIF.
ENDFORM.
" F_INICIAL
*&---------------------------------------------------------------------*
*&
Form F_EXISTE_SOCIO
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
FORM f_existe_socio .
DATA: l_st_socios TYPE zbiblio_socios.
IF zbiblio_socios-cod_socio IS NOT INITIAL.
SELECT SINGLE * FROM zbiblio_socios
INTO l_st_socios
WHERE cod_socio = zbiblio_socios-cod_socio.
IF sy-subrc = 0.
g_wa_existe_socio = 'X'.
ELSEIF sy-subrc <> 0.
CLEAR g_wa_existe_socio.
ENDIF.
ENDIF.
ENDFORM.
" F_EXISTE_SOCIO
*&---------------------------------------------------------------------*
*&
Form F_MODIFICAR_9002
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
* --> p1
text
* <-- p2
text
*----------------------------------------------------------------------*
FORM f_modificar.
* Los datos del input se actualizan a la base datos (mismo nombre)
UPDATE zbiblio_socios.
MESSAGE 'Usuario modificado' TYPE 'I'.
ENDFORM.
" F_MODIFICAR
*&---------------------------------------------------------------------*
*&
Form F_VER_SOCIO
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
* --> p1
text
* <-- p2
text
*----------------------------------------------------------------------*

FORM f_ver_socio .
DATA l_st_socio TYPE zbiblio_socios.
SELECT SINGLE * FROM zbiblio_socios
INTO l_st_socio
WHERE cod_socio = zbiblio_socios-cod_socio.
zbiblio_socios = l_st_socio.
ENDFORM.

" F_VER_SOCIO

Aadir un botn en un ALV Report


jueves, noviembre 21, 2013 No comments
En la transaccin SE80, visualizamos el programa SAPLKKBL.

Visualizamos el programa SAPLKKBL.

Navegamos en el rbol hasta la pestaa GUI Status>STANDARD. Pinchamos con el botn derecho
y lo copiamos a nuestro programa.

Copiamos STANDARD en la pestaa Status GUI.

Aadimos el nombre de nuestro programa.

Volvemos a nuestro programa principal, y comprobamos que tenemos el STANDARD en la pestaa


GUI Status.

Comprobamos que tenemos GUI Status>Standard en nuestro programa.

Pinchamos dos veces en STANDARD y veremos los botones disponibles. En esta nueva ventana
aadimos un nuevo botn, asignndole un nombre, un icono y un atajo del teclado (No asignar el
atajo F4, ya que el botn no funcionara).

Aadimos un botn con el nombre &BT1.

Asignamos un icono.

Asignamos un atajo del teclado.

Ya tenemos el GUI Status listo para incorporar. Se va a mostrar un cdigo en el que se muestran
los cuatro primeros campos de la tabla SFLIGHT con un nuevo botn en el men. Cuando se pulsa
el botn, saldr un mensaje de notificacin.
El cdigo es el siguiente:

REPORT z_test.
* Cargar la tabla SFLIGHT de la base de datos
TABLES: sflight.
* Cargamos los datos tipo slis
TYPES: slis.
* Definicin de variables
DATA: g_it_sflight TYPE TABLE OF sflight,
g_st_sflight TYPE sflight.
DATA: g_it_fieldcat TYPE slis_t_fieldcat_alv,

g_st_fieldcat TYPE slis_fieldcat_alv.


DATA: g_repid TYPE sy-repid.
* SQL para copiar la tabla sflight a la tabla interna
SELECT * FROM sflight INTO TABLE g_it_sflight.
* Variable con el nombre del programa
g_repid = sy-repid.
* Datos del fieldcat para el ALV
g_st_fieldcat-fieldname = 'CARRID'.
g_st_fieldcat-seltext_s = 'Comp.'.
APPEND g_st_fieldcat TO g_it_fieldcat.
g_st_fieldcat-fieldname = 'CONNID'.
g_st_fieldcat-seltext_s = 'Vuelo'.
APPEND g_st_fieldcat TO g_it_fieldcat.
g_st_fieldcat-fieldname = 'FLDATE'.
g_st_fieldcat-seltext_s = 'Fecha'.
APPEND g_st_fieldcat TO g_it_fieldcat.
g_st_fieldcat-fieldname = 'PRICE'.
g_st_fieldcat-seltext_s = 'Tarifa'.
APPEND g_st_fieldcat TO g_it_fieldcat.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program
= g_repid
i_callback_pf_status_set = 'MI_STANDARD'
i_callback_user_command = 'MI_USER_COMMAND'
it_fieldcat
= g_it_fieldcat[]
TABLES
t_outtab
= g_it_sflight[]
EXCEPTIONS
program_error
=1
OTHERS
= 2.
*&---------------------------------------------------------------------*
*&
Form mi_user_command
*&---------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
FORM mi_user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
CASE r_ucomm.
WHEN '&BT1'. "Se ha hecho click en el botn
MESSAGE 'Has pulsado el botn creado' TYPE 'I'.
ENDCASE.
ENDFORM.
"mi_user_command
*&---------------------------------------------------------------------*

*&
Form mi_standard
*&---------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
FORM mi_standard USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'STANDARD'. "Nombre del Status GUI
ENDFORM.
"mi_standard

Nuestro botn y el mensaje monstrado.

Ejemplo de Batch Input


martes, diciembre 17, 2013 No comments
Objetivos:
1.

Crear un Tabstrip, y en una pestaa mostrar los socios en una tabla de control

2.

Seleccionar los socios a modificar con un checkbox

3.

Ejecutar con un Batch Input la modificacin de cada uno de los socios seleccionados a
travs de un Module Pool creado anteriormente.

Objetivo del REPORT

Datos:
1.

Base de datos ZBIBLIO_SOCIOS (Ver aqu).

2.

Module Pool ZBIBLIO_CREAR_MODIF_VISUAL con la transaccin ZBIBLIO_01 (Ver


aqu)
Creamos un nuevo Report en la SE38.

Crear un nuevo Report con la SE38

Aadimos una Dynpro 9000 con su correspondiente Status para salir del programa.

Aadimos una Dynpro.

Accin de salir para poder cerrar el Dynpro.

Dentro de la Dynpro 9000 creamos un Tapstrip usando el asistente donde se indicar:


1.

Nombre del Tapstrip: TS_9000.

2.

Las secciones del Tapstrip.

3.

Cdigo de funcin al pinchar en las secciones.

4.

Si se desea introducir los modulos en includes.

Proceso para crear las pestaas en una Dynpro.

Al haber indicado tres secciones en el Tabstrip, automticamente se nos habr generado tres
Dynpros subscreen y la siguiente programacin de dilogo con sus correspondientes mdulos en el
Report:
PROCESS BEFORE OUTPUT.
*&SPWIZARD: PBO FLOW LOGIC FOR TABSTRIP 'TS_9000'
MODULE TS_9000_ACTIVE_TAB_SET.
CALL SUBSCREEN TS_9000_SCA
INCLUDING G_TS_9000-PROG G_TS_9000-SUBSCREEN.
MODULE STATUS_9000.
*
PROCESS AFTER INPUT.
*&SPWIZARD: PAI FLOW LOGIC FOR TABSTRIP 'TS_9000'
CALL SUBSCREEN TS_9000_SCA.
MODULE TS_9000_ACTIVE_TAB_GET.
MODULE USER_COMMAND_9000.
Para editar la pestaa de Socios, tendremos que ir al subscreen 9001.
Introducimos una tabla de control y un botn.

Aadiendo los campos Input/output referenciando con la base de datos.

Tabla de control y botn resultante en el dynpro 9001.

A continuacin nos interesa saber cul es la secuencia del Batch Input para ejecutar cada una de
las modificaciones seleccionadas.
Para ello vamos a la transacci SM35 y creamos una nueva grabacin:

Nueva grabacin en la transaccin SM35.

Nueva grabacin para iniciar el proceso

Asignar el nombre de la grabacin y la transaccin.

Se habr ejecutado la transaccin indicada anteriormente. A partir de este paso, hay que realizar la
modificacin de solo un usuario sin hacer un paso de mas, ya que se grabara. Cuando hayamos
acabado, cerramos la transaccin y aparecer una tabla BDCDATA de la grabacin:

Tabla BDCDATA generada con la grabacin.

Con esta tabla, hay que identificar los cambios a realizar y generarla en nuestro programa para
modificar todos los usuarios que hayamos seleccionado con el Checkbox.
Los cdigos son los siguientes.

Dynpro 9000

PROCESS BEFORE OUTPUT.


*&SPWIZARD: PBO FLOW LOGIC FOR TABSTRIP 'TS_9000'
MODULE TS_9000_ACTIVE_TAB_SET.
CALL SUBSCREEN TS_9000_SCA
INCLUDING G_TS_9000-PROG G_TS_9000-SUBSCREEN.
MODULE STATUS_9000.
*
PROCESS AFTER INPUT.
*&SPWIZARD: PAI FLOW LOGIC FOR TABSTRIP 'TS_9000'
CALL SUBSCREEN TS_9000_SCA.
MODULE TS_9000_ACTIVE_TAB_GET.
MODULE USER_COMMAND_9000.

Dynpro 9001 (Subscreen)


PROCESS BEFORE OUTPUT.
* MODULE STATUS_0110.
* Copiamos la tabla socios a g_it_socios_aux (una vez)
MODULE load_socios.
* Cargamos la tabla de control linea a linea.
LOOP AT g_it_socios_aux WITH CONTROL ct_9001_socios
CURSOR ct_9001_socios-current_line.
MODULE load_ct_9001.
ENDLOOP.
*
PROCESS AFTER INPUT.
* MODULE USER_COMMAND_0110.
* Cada vez que se hace un input, se actualiza la tabla de control
LOOP AT g_it_socios_aux.
MODULE update_ct_9001.
ENDLOOP.

Report
*&---------------------------------------------------------------------*
*& Report ZBIBLIO_MODIF_VARIOS
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zbiblio_modif_varios.
CONTROLS: ct_9001_socios TYPE TABLEVIEW USING SCREEN 9001.

TABLES: zbiblio_socios.
* Aadimos un campo string (Checkbox) a la tabla interna de socios.
DATA: BEGIN OF g_it_socios_aux OCCURS 0,
flag(1) TYPE c.
INCLUDE STRUCTURE zbiblio_socios.
DATA: END OF g_it_socios_aux.
* Tabla para el Batch Input
DATA: BEGIN OF g_it_bdcdata OCCURS 0.
INCLUDE STRUCTURE bdcdata.
DATA: END OF g_it_bdcdata.
DATA: cb_9001_flag TYPE c.
DATA: g_wa_vuelta TYPE i VALUE 1.
* Llamada a la Dynpro
CALL SCREEN 9000.
*&---------------------------------------------------------------------*
*&
Module STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
MODULE status_9000 OUTPUT.
SET PF-STATUS 'STATUS_9000'.
SET TITLEBAR 'TITLE_9000'.
ENDMODULE.

" STATUS_9000 OUTPUT

*&SPWIZARD: FUNCTION CODES FOR TABSTRIP 'TS_9000'


CONSTANTS: BEGIN OF c_ts_9000,
tab1 LIKE sy-ucomm VALUE 'TS_9000_FC1',
tab2 LIKE sy-ucomm VALUE 'TS_9000_FC2',
tab3 LIKE sy-ucomm VALUE 'TS_9000_FC3',
END OF c_ts_9000.
*&SPWIZARD: DATA FOR TABSTRIP 'TS_9000'
CONTROLS: ts_9000 TYPE TABSTRIP.
DATA:
BEGIN OF g_ts_9000,
subscreen LIKE sy-dynnr,
prog
LIKE sy-repid VALUE 'ZBIBLIO_MODIF_VARIOS',
pressed_tab LIKE sy-ucomm VALUE c_ts_9000-tab1,
END OF g_ts_9000.
DATA:
ok_code_9000 LIKE sy-ucomm.
*&SPWIZARD: OUTPUT MODULE FOR TS 'TS_9000'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: SETS ACTIVE TAB
MODULE ts_9000_active_tab_set OUTPUT.
ts_9000-activetab = g_ts_9000-pressed_tab.
CASE g_ts_9000-pressed_tab.
WHEN c_ts_9000-tab1.

g_ts_9000-subscreen = '9001'.
WHEN c_ts_9000-tab2.
g_ts_9000-subscreen = '9002'.
WHEN c_ts_9000-tab3.
g_ts_9000-subscreen = '9003'.
WHEN OTHERS.
*&SPWIZARD:
DO NOTHING
ENDCASE.
ENDMODULE.
"TS_9000_ACTIVE_TAB_SET OUTPUT
*&SPWIZARD: INPUT MODULE FOR TS 'TS_9000'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: GETS ACTIVE TAB
MODULE ts_9000_active_tab_get INPUT.
ok_code_9000 = sy-ucomm.
CASE ok_code_9000.
WHEN c_ts_9000-tab1.
g_ts_9000-pressed_tab = c_ts_9000-tab1.
WHEN c_ts_9000-tab2.
g_ts_9000-pressed_tab = c_ts_9000-tab2.
WHEN c_ts_9000-tab3.
g_ts_9000-pressed_tab = c_ts_9000-tab3.
WHEN OTHERS.
*&SPWIZARD:
DO NOTHING
ENDCASE.
ENDMODULE.
"TS_9000_ACTIVE_TAB_GET INPUT
*&---------------------------------------------------------------------*
*&
Module USER_COMMAND_9000 INPUT
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.
CASE ok_code_9000.
WHEN 'CANCEL'.
LEAVE PROGRAM.
WHEN 'MODIFICAR'.
PERFORM f_modificar_socios.
ENDCASE.
ENDMODULE.
" USER_COMMAND_9000 INPUT
*&---------------------------------------------------------------------*
*&
Module LOAD_SOCIOS OUTPUT
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
MODULE load_socios OUTPUT.
IF g_wa_vuelta = 1.
SELECT * FROM zbiblio_socios
INTO CORRESPONDING FIELDS OF TABLE g_it_socios_aux.
g_wa_vuelta = g_wa_vuelta + 1.
ENDIF.
ENDMODULE.
" LOAD_SOCIOS OUTPUT
*&---------------------------------------------------------------------*
*&
Module LOAD_CT_9001 OUTPUT
*&---------------------------------------------------------------------*

*
text
*----------------------------------------------------------------------*
MODULE load_ct_9001 OUTPUT.
cb_9001_flag = g_it_socios_aux-flag.
MOVE-CORRESPONDING g_it_socios_aux TO zbiblio_socios.
ENDMODULE.
" LOAD_CT_9001 OUTPUT
*&---------------------------------------------------------------------*
*&
Module UPDATE_CT_9001 INPUT
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
MODULE update_ct_9001 INPUT.
g_it_socios_aux-flag = cb_9001_flag.
MOVE-CORRESPONDING zbiblio_socios TO g_it_socios_aux.
MODIFY g_it_socios_aux INDEX ct_9001_socios-current_line.
ENDMODULE.
" UPDATE_CT_9001 INPUT
*&---------------------------------------------------------------------*
*&
Form F_MODIFICAR_SOCIOS
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
* --> p1
text
* <-- p2
text
*----------------------------------------------------------------------*
FORM f_modificar_socios .
LOOP AT g_it_socios_aux.
IF g_it_socios_aux-flag = 'X'.
*
*

Generamos la tabla BDCDATA


PERFORM f_gen_bdcdata USING g_it_socios_aux.
Ejecutamos el programa con la tabla BDCDATA.
CALL TRANSACTION 'ZBIBLIO_01' USING g_it_bdcdata.
ENDIF.
ENDLOOP.

ENDFORM.
" F_MODIFICAR_SOCIOS
*&---------------------------------------------------------------------*
*&
Form F_GEN_BDCDATA
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
*
-->P_IT_SOCIOS_AUX text
*----------------------------------------------------------------------*
FORM f_gen_bdcdata USING p_it_socios_aux LIKE LINE OF g_it_socios_aux.
FREE g_it_bdcdata.

* Dynpro 9000
g_it_bdcdata-program = 'ZBIBLIO_CREAR_MODIF_VISUAL'.
g_it_bdcdata-dynpro = 9000.
g_it_bdcdata-dynbegin = 'X'.
APPEND g_it_bdcdata.
clear g_it_bdcdata.
g_it_bdcdata-fnam = 'BDC_OKCODE'.
g_it_bdcdata-fval = '=MODIFICAR'.
APPEND g_it_bdcdata.
* Dynpro 9002
clear g_it_bdcdata.
g_it_bdcdata-program = 'ZBIBLIO_CREAR_MODIF_VISUAL'.
g_it_bdcdata-dynpro = 9002.
g_it_bdcdata-dynbegin = 'X'.
APPEND g_it_bdcdata.
clear g_it_bdcdata.
g_it_bdcdata-fnam = 'BDC_CURSOR'.
g_it_bdcdata-fval = 'ZBIBLIO_SOCIOS-COD_SOCIO'.
APPEND g_it_bdcdata.
clear g_it_bdcdata.
g_it_bdcdata-fnam = 'BDC_OKCODE'.
g_it_bdcdata-fval = '=ACCION'.
APPEND g_it_bdcdata.
clear g_it_bdcdata.
g_it_bdcdata-fnam = 'ZBIBLIO_SOCIOS-COD_SOCIO'.
g_it_bdcdata-fval = p_it_socios_aux-cod_socio.
APPEND g_it_bdcdata.
* Dynpro 9003
clear g_it_bdcdata.
g_it_bdcdata-program = 'ZBIBLIO_CREAR_MODIF_VISUAL'.
g_it_bdcdata-dynpro = 9003.
g_it_bdcdata-dynbegin = 'X'.
APPEND g_it_bdcdata.
clear g_it_bdcdata.
g_it_bdcdata-fnam = 'BDC_CURSOR'.
g_it_bdcdata-fval = 'ZBIBLIO_SOCIOS-COD_SOCIO'.
APPEND g_it_bdcdata.
clear g_it_bdcdata.
g_it_bdcdata-fnam = 'BDC_OKCODE'.
g_it_bdcdata-fval = '=ACCION'.
APPEND g_it_bdcdata.
clear g_it_bdcdata.
g_it_bdcdata-fnam = 'ZBIBLIO_SOCIOS-DNI'.

g_it_bdcdata-fval = p_it_socios_aux-dni.
APPEND g_it_bdcdata.
clear g_it_bdcdata.
g_it_bdcdata-fnam = 'ZBIBLIO_SOCIOS-NOMBRE'.
g_it_bdcdata-fval = p_it_socios_aux-nombre.
APPEND g_it_bdcdata.
clear g_it_bdcdata.
g_it_bdcdata-fnam = 'ZBIBLIO_SOCIOS-APELLIDO'.
g_it_bdcdata-fval = p_it_socios_aux-apellido.
APPEND g_it_bdcdata.
clear g_it_bdcdata.
g_it_bdcdata-fnam = 'ZBIBLIO_SOCIOS-TELEFONO'.
g_it_bdcdata-fval = p_it_socios_aux-telefono.
APPEND g_it_bdcdata.
clear g_it_bdcdata.
g_it_bdcdata-fnam = 'ZBIBLIO_SOCIOS-DIR1'.
g_it_bdcdata-fval = p_it_socios_aux-dir1.
APPEND g_it_bdcdata.
clear g_it_bdcdata.
g_it_bdcdata-program = 'ZBIBLIO_CREAR_MODIF_VISUAL'.
g_it_bdcdata-dynpro = 9003.
g_it_bdcdata-dynbegin = 'X'.
APPEND g_it_bdcdata.
g_it_bdcdata-fnam = 'BDC_OKCODE'.
g_it_bdcdata-fval = '=CANCEL'.
APPEND g_it_bdcdata.
ENDFORM.
" F_GEN_BDCDATA
Enviar por correo electrnico Escribe un blog Compartir con Twitter Compartir con Facebook

ALV Report de una tabla interna


mircoles, noviembre 20, 2013 2 comments
Para poder mostrar un ALV Report de una tabla interna se necesitar como mnimo una tabla
interna llamada it_fieldcat. En dicha tabla interna. se indicarn los nombres de los campos de
nuestra tabla interna y una descripcin del campo para mostrar en el ttulo de la columna.
En este ejemplo se van a mostrar los cuatro primeros campos de la tabla SFLIGHT:
REPORT z_sflight.
* Cargar la tabla SFLIGHT de la base de datos
TABLES: sflight.
* Cargamos los datos tipo slis
TYPES: slis.
* Definicin de variables
DATA: g_it_sflight TYPE TABLE OF sflight,
g_st_sflight TYPE sflight.
DATA: g_it_fieldcat TYPE slis_t_fieldcat_alv,
g_st_fieldcat TYPE slis_fieldcat_alv.
* SQL para copiar la tabla sflight a la tabla interna
SELECT * FROM sflight INTO TABLE g_it_sflight.
* Datos del fieldcat para el ALV
g_st_fieldcat-fieldname = 'CARRID'. "Nombre del campo de la tabla
g_st_fieldcat-seltext_m = 'Compaa'. "Descripcin media
g_st_fieldcat-seltext_s = 'Comp.'. "Descripcin corta
APPEND g_st_fieldcat TO g_it_fieldcat.
g_st_fieldcat-fieldname = 'CONNID'.
g_st_fieldcat-seltext_m = 'N vuelo'.
g_st_fieldcat-seltext_s = 'Vuelo'.
APPEND g_st_fieldcat TO g_it_fieldcat.
g_st_fieldcat-fieldname = 'FLDATE'.
g_st_fieldcat-seltext_m = 'Fecha de vuelo'.
g_st_fieldcat-seltext_s = 'Fecha'.
APPEND g_st_fieldcat TO g_it_fieldcat.
g_st_fieldcat-fieldname = 'PRICE'.
g_st_fieldcat-seltext_m = 'Tarifa de vuelo'.
g_st_fieldcat-seltext_s = 'Tarifa'.
APPEND g_st_fieldcat TO g_it_fieldcat.

* Funcin ALV
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
it_fieldcat = g_it_fieldcat[]
TABLES
t_outtab
= g_it_sflight[]
EXCEPTIONS
program_error = 1
OTHERS
= 2.

ALV Report de los cuatro primeros campos de la tabla SFLIGHT.

En este ejemplo, se ha introducido una descripcin mediana y corta. Si se cambia el tamao de la


columna del ALV, tambin lo har el nombre de la columna.

Cmo crear un Smartform con una tabla y un cdigo de


barras
martes, enero 28, 2014 1 comment
Objetivo:

Imprimir un Smartform en un Report.

La variable CARRID ser un parmetro de entrada del Smartform.

Se mostrar el cdigo de barras correspondiente al CARRID y toda la informacin


relacionada con la tabla SFLIGHT
Diseo del Smartform:

Diseo del Smartform: Texto, cdigo de barras y tabla

1.

Crear un cdigo de barras en la transaccin SE73 (ZBARCODE).

Seleccionar System Bar Codes y Change.

Crear el nuevo cdigo de barras con Code128 y rotacin normal.

Transaccin SE73 para crear un Cdigo de Barras.

Dar a nuevo y seleccionar las propiedades deseadas.

2.

Crear un estilo de Smartform en la transaccin SMARTFORMS.


Crear un nodo de Paragraph Format (P0).

Mrgenes por defecto y centrado

Helve 10pt

Crear otro nodo de Paragraph Format (P1).

Mrgenes por defecto y centrado.

Helve 22pt y negrita.

Asignar a Header Format el formato P0.

Aadir un nodo Character Format (BC)

Asignar el Cdigo de Barras creado anteriormente en la SE73.

Crear un nuevo estilo en la transaccin SMARTFORMS.

Aadir un nodo en Paragrapgh Format.

Indicar las propiedades a P0.

Asignar el formato P0 a Header Format.

Aadir un nodo a Character Format para el cdigo de barras.

Asignar el cdigo de barras creado en la SE73.

3.

Crear el Smartform en la transaccin SMARTFORMS.

Pulsar Form Painter para ver/ocultar el diseo del formulario.

Indicar el estilo creado anteriormente en la pestaa Output Options.

Aadir los parmetros necesarios en Form Interface:

Parmetro de entrada Carrid en la pestaa Import.

Tabla interna it_sflight en la pestaa Tables.

Aadir una estructura global SFLIGHT en Global Definitions (necesario para


hacer un loop a la tabla it_sflight)

Crear las ventanas TITULO y BARCODE situndolas con sus tamaos y


posiciones correspondientes.

Introducir un texto en las ventanas TITULO y BARCODE referenciando las


variables necesarias pulsando Insert Field y las variables entre el smbolo & (ver imgenes).
Adems seleccionar el estilo en la pestaa Output Options.

Introducir una tabla en la ventana MAIN.

Crear dos tipos de linea en Table Details (Header y MAIN). Uno


es para el encabezado de la tabla, y el otro para el contenido de la tabla. Se indicarn
cinco columnas y su ancho.

Introducir la tabla interna it_sflight y la estructura st_sflight en la


pestaa Data.

Seleccionar el estilo creado en la pestaa Output.

Crear el formulario en la transaccin SMARTFORMS.

Asignar el estilo creado.

Aadir parmetro import CARRID.

Aadir la tabla it_sflight en la que se almacenar la informacin de la aerolnea.

Definir una estructura global necesaria para el loop de la tabla.

Crear las ventanas necesarias.

Renombrar las ventanas y posicionarlas correctamente.

Aadir texto a las ventanas TITULO y BARCODE.

Introducir el parmetro CARRID entre & (Escribir &carrid& en la ventana, no directamente en el texto).

Aadir una tabla a la ventana Main.

Aadir dos tipos de linea (HEADER y MAIN) e indicar la separacin de las columnas.

Indicar la tabla interna it_sflight y la estrucutra st_sflight en la pestaa Data.

Seleccin del estilo Output de la tabla.

Aadir a cada celda su elemento de texto correspondiente. El nombre de la columna en HEADER, y el valor de la tabla en MAIN.

Ejemplo de introducir el valor de connid de la tabla en la lnea MAIN.

1.

Crear un Report en la transaccin SE38:


REPORT zsmartform_prueba.
TABLES: sflight.
DATA: g_it_sflight TYPE TABLE OF sflight,
g_st_sflight TYPE sflight.
PARAMETERS: p_carrid TYPE sflight-carrid.
START-OF-SELECTION.
SELECT * FROM sflight INTO TABLE g_it_sflight WHERE carrid = p_carrid.
PERFORM imprime_smartform.
*&---------------------------------------------------------------------*
*&
Form IMPRIME_SMARTFORM
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
* --> p1
text
* <-- p2
text

*----------------------------------------------------------------------*
FORM imprime_smartform .
DATA: fm_name TYPE rs38l_fnam,
l_st_control_parameters TYPE ssfctrlop,
l_st_output_options TYPE ssfcompop.
DATA: l_wa_pa_form LIKE ssfscreen-fname .
l_st_output_options-tdnewid = 'X'.
l_st_output_options-tdimmed = 'X'.
l_st_output_options-tddelete = 'X'.
l_st_control_parameters-no_dialog = ' '.
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
formname
= 'ZSMARTFORM'
IMPORTING
fm_name
= fm_name
EXCEPTIONS
no_form
=1
no_function_module = 2
OTHERS
= 3.
CALL FUNCTION fm_name
EXPORTING
carrid
= p_carrid
TABLES
it_sflight = g_it_sflight.
ENDFORM.

" IMPRIME_SMARTFORM

Introduccin del parmetro CARRID.

Visualizacin del Smartform.

Ver el listado de cdigos de iconos


sbado, enero 04, 2014 No comments
Para ver el listado de iconos SAP con sus cdigos, ir a la SE38 y buscar el programa ADITES26.
Ejecutarlo y se mostrar el listado.

Buscar el programa ADITES26 en la SE38 y dar el botn de ejecutar (F8)

Listado de iconos SAP.

Deshabilitar el INPUT a un campo de SELECTIONOPTIONS


martes, noviembre 19, 2013 No comments
En algunos casos, se exige que unos determinados usuarios no puedan utilizar unos campos
especficos en la pantalla de seleccin. En este ejemplo se mostrar como deshabilitar el input de
un campo LOW y HIGH de un SELECTION-OPTIONS.
Para empezar, tendremos los cuatro primeros campos del SELECTION-OPTIONS de la tabla
SFLIGHT (carrid, connid, fldate y price).

Los cuatro SELECTION-OPTIONS para la tabla SFLIGHT.

A continuacin, se recorre un LOOP AT SCREEN y almacenamos los datos en una tabla auxiliar
para ver los datos iniciales:
LOOP AT SCREEN.
APPEND screen TO g_it_screen.
ENDLOOP.

Valores de la tabla interna screen sin modificaciones.

Una vez conocido los datos de la tabla interna, cambiaremos las propiedades de los campos
INPUT en el primer SELECTION-OPTIONS con un IF.

El cdigo es el siguiente:
REPORT z_sflight.
* Cargar la tabla SFLIGHT de la base de datos
TABLES: sflight.
* Definicin de variables
DATA: g_it_sflight TYPE TABLE OF sflight,
g_st_sflight TYPE sflight.
DATA: g_it_screen TYPE TABLE OF screen.
* Pantalla de seleccin
SELECTION-SCREEN: BEGIN OF BLOCK b01 WITH FRAME.
SELECT-OPTIONS: p01 FOR sflight-carrid,
p02 FOR sflight-connid,
p03 FOR sflight-fldate.
SELECTION-SCREEN SKIP 1.
SELECT-OPTIONS: p04 FOR sflight-price.
SELECTION-SCREEN: END OF BLOCK b01.
INITIALIZATION.
* Deshabilitar un campo
LOOP AT SCREEN.
IF screen-name = 'P01-LOW'.
screen-input = 0.
ELSEIF screen-name = 'P01-HIGH'.
screen-input = 0.
ENDIF.
MODIFY SCREEN.
APPEND screen TO g_it_screen.
ENDLOOP.
START-OF-SELECTION.
BREAK-POINT.
Se observa que ahora los campos input del primer parmetro se han desactivado.

Campos input del SELECTION-OPTIONS desactivados.

Pantalla de seleccin dinmica


martes, noviembre 19, 2013 No comments
En este ejercicio va a existir un RADIOBUTTON en el que si indica bsqueda bsica, se mostrarn
los tres primeros campos de bsqueda del SELECT-OPTIONS de la tabla SFLIGHT, mientras que
si indica bsqueda avanzada, se mostrarn los 6 primeros:

Bsqueda bsica de SFLIGHT.

Bsqueda avanzada de SFLIGHT.

El truco est en utilizar el evento AT SELECTION SCREEN OUTPUT y modificar las propiedades
de la tabla interna SCREEN. En este caso, se utilizar un identificador en el campo SCREENGROUP1 y se desactivar los campos correspondientes del SELECT-OPTIONS segn el tipo de
bsqueda seleccionado.

Valores de la variable interna SCREEN.

REPORT z_sflight.
* Cargar la tabla SFLIGHT de la base de datos
TABLES: sflight.
* Definicin de variables
DATA: g_it_sflight TYPE TABLE OF sflight,
g_st_sflight TYPE sflight.
DATA: g_it_screen TYPE TABLE OF screen.
* Pantalla de seleccin
PARAMETERS: p01 RADIOBUTTON GROUP rb1 USER-COMMAND uc DEFAULT 'X' .
SELECT-OPTIONS: so1 FOR sflight-carrid MODIF ID MD1,
so2 FOR sflight-connid MODIF ID MD1,
so3 FOR sflight-fldate MODIF ID MD1.
SELECTION-SCREEN SKIP 1.
PARAMETERS: p02 RADIOBUTTON GROUP rb1.
SELECT-OPTIONS: so4 FOR sflight-carrid MODIF ID MD2,
so5 FOR sflight-connid MODIF ID MD2,
so6 FOR sflight-fldate MODIF ID MD2.
SELECTION-SCREEN SKIP 1.
SELECT-OPTIONS: so7 FOR sflight-price MODIF ID MD2,
so8 FOR sflight-currency MODIF ID MD2,
so9 FOR sflight-planetype MODIF ID MD2.
AT SELECTION-SCREEN OUTPUT.
IF p01 = 'X'.
LOOP AT SCREEN.
IF screen-group1 = 'MD2'.
screen-active = 0.
MODIFY SCREEN.
ENDIF.
ENDLOOP.

ELSE.
LOOP AT SCREEN.
IF screen-group1 = 'MD1'.
screen-active = 0.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
ENDIF.
APPEND screen TO g_it_screen.
START-OF-SELECTION.
BREAK-POINT.
Que diferencias hay entre los eventos AT SELECTION SCREEN y AT SELECTION SCREEN
OUTPUT? En el primero, el evento se ejecuta cuando se ha dado al botn de ejecutar, mientras
que en el segundo se ejecuta cada vez que se ha hecho un cambio en la pantalla de seleccin.

Crear bases de datos


domingo, diciembre 08, 2013 1 comment
Crear las siguientes tablas:
1. Tabla: ZBIBLIO_SOCIOS

Campo

Tipo

Cdigo de socio

NUMC-4

DNI

CHAR-9

Nombre

CHAR-30

Apellido

CHAR-30

Telfono

CHAR-15

Direccin 1

CHAR-75

Direccin 2

CHAR-75

Direccin 3

CHAR-75

Direccin 4

CHAR-75

2. Tabla: ZBIBLIO_LIBROS

Campo

Tipo

Cdigo de libro

NUMC-8

Autor

CHAR-75

Ttulo

CHAR-125

Ejemplares disponibles

INT-4

Ejemplares totales

INT-4

3. Tabla: ZBIBLIO_PRESTAM

Campo

Tipo

Cdigo de prstamo

NUMC-12

Cdigo de socio

(Clave externa con tabla de


socios)

Cdigo de libro

(Clave externa con tabla de


socios)

Fecha inicio prstamo

DAT

Fecha estimada devolucin

DAT

Fecha real devolucin

DAT

El primer paso es crear todos los dominios en la SE11. Habr tantos dominios como tipo de
variables, es decir, un dominio para CHAR-9, otro para CHAR-15 y as sucesivamente con cada
uno de los tipos de las tres tablas.

Creacin de un dominio.

Caractersticas de un dominio.

Finalmente se habrn creado los siguientes dominios:

Lista de dominios creados.

A continuacin, se crean los tipos de datos. Por tanto, volvemos a la SE11 para crear los tipos de
datos.

Creacin del tipo de datos.

En este ejemplo, tendremos que crear todos los tipos de datos de las tres tablas y asignarle el
dominio correspondiente. Este dominio se puede repetir, como es el caso de los campos Nombre y
Apellido en la tabla Z_BIBLIO_SOCIOS, ya que su tipo es un CHAR-30. La nica diferencia entre
los tipos de datos Nombre y Apellido es las descripciones.

Asignando un dominio creado al tipo de datos.

Se aconseja rellenar las descripciones del campo, ya que ayudar a la visualizacin cuando se
utilicen ALVs.

Creando etiquetas de descripcin para mostrar en ALVs.

Una vez con todos los tipos de datos creados, pasamos a crear la base de datos en la SE11.
Seleccionamos la clase e introducimos los campos de la tabla.

Creamos una base de datos.

Asignamos la clase y navegacin de datos.

Todo tabla debe de comenzar por el mandante, con lo que asignamos el elemento MANDT al
primer campo.

Aadimos el mandante y los campos (asignando los tipos creados previamente).

Pulsamos el botn de ajustes tcnicos de la tabla para asignar la clase APPL0 y un tamao de
registro categora 0 (780 registros).

Asignar clase de datos y el nmero de registros que tendr la tabla.

A continuacin, seleccionamos la categora de ampliacin de la tabla en Detalles:

Categora de ampliacin en Detalles.

Seleccionamos ampliable de cualquier manera.

Y finalmente, vamos al generador de actualizador de tabla en Utilidades:

Ir al generador de mantenimiento de tabla en utilidades.

Seleccionamos el grupo de autorizacin y el grupo de funciones. Se recomienda que para cada


tabla tenga su propio grupo de funciones. En este caso, la llamamos igual que el nombre de la
tabla. Adems, asignamos la imagen resumen con un 9000 (Se recomienda que se empiece a
contar a partir de ese nmero).

Seleccionamos categora de actualizacin, el grupo de funciones y la imagen resumen.

Pinchamos en crear, grabamos y activamos la tabla.


Se repite cada uno de los pasos con las otras dos tablas.
Las claves externas se explican en esta entrada.
Para introducir datos en la tabla de forma manual, iremos a la transaccin SM30

Crear un Tree dentro de un Docking y mostrar un ALV


lunes, enero 06, 2014 No comments
Objetivo:

Crear un Docking con un Tree.

El Tree contendr la lista de CARRID y PLANETYPE de la tabla SFLIGHT.


Pulsar un elemento del Tree y mostrar un ALV con los datos de la SFLIGHT que
contengan dicho elemento.
La mayor parte del cdigo no ha sido creado directamente, sino que copiado y adaptado de los
ejemplos disponibles en el sistema SAP.
En la transaccin SE83 tendremos todos los ejemplos disponibles que se han usado en este
ejercicio.

Objeto Docking de la SE83.

Objeto Tree de la SE83.

Objeto ALV de la SE83.

Empezamos creando los elementos necesarios del Screen:

Un input/output que solo mostrar el texto del elemento pulsado del Tree.

Un Custom Control que contendr nuestro objeto ALV.

Elementos input/output y Custom Control de la pantalla Screen.

No ser necesario crear un Custom Control para el Docking ni para el Tree, ya que el Docking se
incorporar a la izquierda de la pantalla, y el contenedor del Tree es el propio Docking.
*&---------------------------------------------------------------------*
*& Report Z_FLIGHT_OBJETOS
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT z_flight_objetos MESSAGE-ID tree_control_msg.
TABLES sflight.
DATA: g_it_sflight TYPE TABLE OF sflight,

g_st_sflight TYPE sflight.


* Docking Container
DATA g_ob_docking TYPE REF TO cl_gui_docking_container.
* Simple Tree
CLASS lcl_application DEFINITION DEFERRED.
TYPES: g_tt_node_table_type LIKE STANDARD TABLE OF mtreesnode
WITH DEFAULT KEY.
DATA g_wa_node.
DATA: g_ob_application TYPE REF TO lcl_application,
g_ob_tree TYPE REF TO cl_gui_simple_tree.
CONSTANTS: BEGIN OF g_c_nodekey,
root TYPE tv_nodekey VALUE 'Root',
carrid TYPE tv_nodekey VALUE 'Carrid',
planetype TYPE tv_nodekey VALUE 'Planetype',
END OF g_c_nodekey.
* ALV
DATA: g_ob_container TYPE scrfname VALUE 'ALV_9000',
g_ob_alv TYPE REF TO cl_gui_alv_grid,
g_ob_custom_container TYPE REF TO cl_gui_custom_container.
DATA: ok_code_9000 TYPE sy-ucomm,
g_wa_init,
g_wa_repid TYPE sy-repid,
g_wa_dynnr TYPE sy-dynnr,
io_9000_click(42) TYPE c.
*----------------------------------------------------------------------*
*
CLASS LCL_APPLICATION DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_application DEFINITION.
PUBLIC SECTION.
METHODS:
handle_node_double_click
FOR EVENT node_double_click
OF cl_gui_simple_tree
IMPORTING node_key,
handle_expand_no_children
FOR EVENT expand_no_children
OF cl_gui_simple_tree
IMPORTING node_key.
ENDCLASS.

"LCL_APPLICATION DEFINITION

*----------------------------------------------------------------------*
*
CLASS LCL_APPLICATION IMPLEMENTATION

*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_application IMPLEMENTATION.
METHOD handle_node_double_click.
" this method handles the node double click event of the tree
" control instance
io_9000_click = node_key.
FREE g_it_sflight.
SELECT * FROM sflight INTO TABLE g_it_sflight
WHERE carrid = node_key
OR planetype = node_key.
CALL METHOD g_ob_alv->set_table_for_first_display
EXPORTING
i_structure_name = 'SFLIGHT'
CHANGING
it_outtab
= g_it_sflight.
ENDMETHOD.

"HANDLE_NODE_DOUBLE_CLICK

METHOD handle_expand_no_children.
" this method handles the expand no children event of the tree
" control instance
IF node_key = g_c_nodekey-carrid.
g_wa_node = 1.
PERFORM f_expandir_nodo USING g_wa_node.
ELSEIF node_key = g_c_nodekey-planetype.
g_wa_node = 2.
PERFORM f_expandir_nodo USING g_wa_node.
ENDIF.
ENDMETHOD.
ENDCLASS.

"HANDLE_EXPAND_NO_CHILDREN
"LCL_APPLICATION IMPLEMENTATION

START-OF-SELECTION.
CREATE OBJECT g_ob_application.
CALL SCREEN 9000.
*&---------------------------------------------------------------------*
*&
Module STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
MODULE status_9000 OUTPUT.

SET PF-STATUS 'STATUS_9000'.


SET TITLEBAR 'TITLE_9000'.
IF g_wa_init IS INITIAL.
g_wa_repid = sy-repid.
g_wa_dynnr = sy-dynnr.
g_wa_init = 'X'.
* create the docking container
CREATE OBJECT g_ob_docking
EXPORTING
repid
= g_wa_repid
dynnr
= g_wa_dynnr
side
= g_ob_docking->dock_at_left
extension = 180.
IF g_ob_tree IS INITIAL.
" The Tree Control has not been created yet.
" Create a Tree Control and insert nodes into it.
PERFORM f_create_and_init_tree.
ENDIF.
IF g_ob_custom_container IS INITIAL.
CREATE OBJECT g_ob_custom_container
EXPORTING
container_name = g_ob_container.
CREATE OBJECT g_ob_alv
EXPORTING
i_parent = g_ob_custom_container.
ENDIF.
ENDIF.
ENDMODULE.
" STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
*&
Module USER_COMMAND_9000 INPUT
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.
CASE ok_code_9000.
WHEN 'CANCEL'.
CALL METHOD g_ob_docking->free.
LEAVE PROGRAM.
ENDCASE.
ENDMODULE.
" USER_COMMAND_9000 INPUT
*&---------------------------------------------------------------------*
*&
Form CREATE_AND_INIT_TREE
*&---------------------------------------------------------------------*
*
text

*----------------------------------------------------------------------*
* --> p1
text
* <-- p2
text
*----------------------------------------------------------------------*
FORM f_create_and_init_tree .
DATA: l_it_node_table TYPE g_tt_node_table_type,
l_it_events TYPE cntl_simple_events,
l_st_event TYPE cntl_simple_event.
* create a tree control in the docking
CREATE OBJECT g_ob_tree
EXPORTING
parent
= g_ob_docking
node_selection_mode
= cl_gui_simple_tree=>node_sel_mode_single
EXCEPTIONS
lifetime_error
=1
cntl_system_error
=2
create_error
=3
failed
=4
illegal_node_selection_mode = 5.
IF sy-subrc <> 0.
MESSAGE a000.
ENDIF.
* define the events which will be passed to the backend
" node double click
l_st_event-eventid = cl_gui_simple_tree=>eventid_node_double_click.
l_st_event-appl_event = 'X'. " process PAI if event occurs
APPEND l_st_event TO l_it_events.
" expand no children
l_st_event-eventid = cl_gui_simple_tree=>eventid_expand_no_children.
l_st_event-appl_event = 'X'.
APPEND l_st_event TO l_it_events.
CALL METHOD g_ob_tree->set_registered_events
EXPORTING
events
= l_it_events
EXCEPTIONS
cntl_error
=1
cntl_system_error
=2
illegal_event_combination = 3.
IF sy-subrc <> 0.
MESSAGE a000.
ENDIF.
* assign event handlers in the application class to each desired event
SET HANDLER g_ob_application->handle_node_double_click FOR g_ob_tree.
SET HANDLER g_ob_application->handle_expand_no_children FOR g_ob_tree.
PERFORM f_build_node_table USING l_it_node_table.

*
*
*
*

node_table_structure_name
= 'MTREESNODE'
A programmer using the tree control must create a structure in the
dictionary. This structure must include the structure TREEV_NODE
and must contain a character field with the name 'TEXT'.
CALL METHOD g_ob_tree->add_nodes
EXPORTING
table_structure_name
= 'MTREESNODE'
node_table
= l_it_node_table
EXCEPTIONS
failed
=1
error_in_node_table
=2
dp_error
=3
table_structure_name_not_found = 4
OTHERS
= 5.
IF sy-subrc <> 0.
MESSAGE a000.
ENDIF.

ENDFORM.
" CREATE_AND_INIT_TREE
*&---------------------------------------------------------------------*
*&
Form F_BUILD_NODE_TABLE
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
*
-->P_IT_NODE_TABLE text
*----------------------------------------------------------------------*
FORM f_build_node_table USING p_it_node_table TYPE g_tt_node_table_type.
DATA: l_st_node LIKE mtreesnode.
* Node with key 'Root'
l_st_node-node_key = g_c_nodekey-root.
" Key of the node
CLEAR l_st_node-relatkey.
" A root node has no parent node
CLEAR l_st_node-relatship.
l_st_node-hidden = ' '.
" The node is visible,
l_st_node-disabled = ' '.
" selectable,
l_st_node-isfolder = 'X'.
" a folder.
CLEAR l_st_node-n_image.
" use default.
CLEAR l_st_node-exp_image.
" use default
CLEAR l_st_node-expander.
" see below.
l_st_node-text = 'Root'(roo).
APPEND l_st_node TO p_it_node_table.
* Node with key 'Carrid'
l_st_node-node_key = g_c_nodekey-carrid.
" Key of the node
" Node is inserted as child of the node with key 'Root'.
l_st_node-relatkey = g_c_nodekey-root.

l_st_node-relatship = cl_gui_simple_tree=>relat_last_child.
l_st_node-hidden = ' '.
l_st_node-disabled = ' '.
l_st_node-isfolder = 'X'.
CLEAR l_st_node-n_image.
CLEAR l_st_node-exp_image.
l_st_node-expander = 'X'.
l_st_node-text = 'Carrid'(ch1).
l_st_node-style = cl_gui_simple_tree=>style_emphasized_positive.
APPEND l_st_node TO p_it_node_table.
* Node with key 'Planetype'
l_st_node-node_key = g_c_nodekey-planetype.
" Key of the node
" Node is inserted as child of the node with key 'Root'.
l_st_node-relatkey = g_c_nodekey-root.
l_st_node-relatship = cl_gui_simple_tree=>relat_last_child.
l_st_node-hidden = ' '.
l_st_node-disabled = ' '.
l_st_node-isfolder = 'X'.
CLEAR l_st_node-n_image.
CLEAR l_st_node-exp_image.
l_st_node-expander = 'X'.
l_st_node-text = 'Plane type'(ch2).
l_st_node-style = cl_gui_simple_tree=>style_emphasized_positive.
APPEND l_st_node TO p_it_node_table.
ENDFORM.
" BUILD_NODE_TABLE
*&---------------------------------------------------------------------*
*&
Form F_EXPANDIR_NODO
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
* --> p1
text
* <-- p2
text
*----------------------------------------------------------------------*
FORM f_expandir_nodo USING p_wa_node TYPE c.
DATA: l_it_node_table TYPE g_tt_node_table_type,
l_st_node TYPE mtreesnode.
DATA: l_it_sflight TYPE TABLE OF sflight WITH HEADER LINE.
IF p_wa_node = 1.
SELECT carrid FROM sflight
INTO CORRESPONDING FIELDS OF TABLE l_it_sflight.
SORT l_it_sflight BY carrid.
DELETE ADJACENT DUPLICATES FROM l_it_sflight COMPARING carrid.

LOOP AT l_it_sflight.
* Node with key 'Carrid'
CLEAR l_st_node.
l_st_node-node_key = l_it_sflight-carrid.
l_st_node-relatkey = g_c_nodekey-carrid.
l_st_node-relatship = cl_gui_simple_tree=>relat_last_child.
l_st_node-isfolder = ' '.
l_st_node-text = l_it_sflight-carrid.
APPEND l_st_node TO l_it_node_table.
ENDLOOP.
ELSEIF p_wa_node = 2.
SELECT planetype FROM sflight
INTO CORRESPONDING FIELDS OF TABLE l_it_sflight.
SORT l_it_sflight BY planetype.
DELETE ADJACENT DUPLICATES FROM l_it_sflight COMPARING planetype.
LOOP AT l_it_sflight.
* Node with key 'Planetype'
CLEAR l_st_node.
l_st_node-node_key = l_it_sflight-planetype.
l_st_node-relatkey = g_c_nodekey-planetype.
l_st_node-relatship = cl_gui_simple_tree=>relat_last_child.
l_st_node-isfolder = ' '.
l_st_node-text = l_it_sflight-planetype.
APPEND l_st_node TO l_it_node_table.
ENDLOOP.
ENDIF.
CALL METHOD g_ob_tree->add_nodes
EXPORTING
table_structure_name
= 'MTREESNODE'
node_table
= l_it_node_table
EXCEPTIONS
failed
=1
error_in_node_table
=2
dp_error
=3
table_structure_name_not_found = 4
OTHERS
= 5.
IF sy-subrc <> 0.
MESSAGE a000.
ENDIF.
ENDFORM.

" F_EXPANDIR_NODO

Resultado final del ejercicio.

Clave externa en bases de datos


domingo, diciembre 08, 2013 No comments
Introducir la clave externa en los siguientes campos de la tabla 3 (Crear tablas):

Cdigo Socio

Cdigo Libro
1. Tabla: ZBIBLIO_SOCIOS

Campo

Tipo

Cdigo de socio

NUMC-4

DNI

CHAR-9

Nombre

CHAR-30

Apellido

CHAR-30

Telfono

CHAR-15

Direccin 1

CHAR-75

Direccin 2

CHAR-75

Direccin 3

CHAR-75

Direccin 4

CHAR-75

2. Tabla: ZBIBLIO_LIBROS

Campo

Tipo

Cdigo de libro

NUMC-8

Autor

CHAR-75

Ttulo

CHAR-125

Ejemplares disponibles

INT-4

Ejemplares totales

INT-4

3. Tabla: ZBIBLIO_PRESTAM

Campo

Tipo

Cdigo de prstamo

NUMC-12

Cdigo de socio

(Clave externa con tabla de socios)

Cdigo de libro

(Clave externa con tabla de socios)

Fecha inicio prstamo

DAT

Fecha estimada devolucin

DAT

Fecha real devolucin

DAT

En la tabla 3, seleccionamos el campo para indicar como clave externa y pinchamos en el botn de
la llave:

Campo socio seleccionado y pinchar en el botn de clave externa.

Introducir la tabla donde est definido el campo y pinchar en el botn de generar propuesta.

Comprobacin de las claves externas:

Comprobacin de la clave externa en la tabla.

Enviar por correo electrnico Escribe un blog Compartir con Twitter Compartir con Facebook

ALV Report de una base de datos (I_STRUCTURE_NAME)


jueves, noviembre 28, 2013 No comments
Cuando consultamos una base de datos, es posible que las descripciones de los campos hayan
sido aadidas en los elementos de datos de cada campo, por tanto no ser necesario rellenar el
FIELDCAT como en el primer ejemplo ALV. Slo hay que indicar el nombre de la estructura y la
tabla interna.
En este ejemplo se va a mostrar la SFLIGHT.
REPORT z_sflight.
* Cargar la tabla SFLIGHT de la base de datos
TABLES: sflight.
* Definicin de variables
DATA: g_it_sflight TYPE TABLE OF sflight.
* Copiado de los datos a la tabla con los filtros
SELECT * FROM sflight INTO TABLE g_it_sflight.
* ALV
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_structure_name = 'SFLIGHT'
TABLES
t_outtab
= g_it_sflight.

ALV Report de una base de datos

Aadir un botn en un ALV Report


jueves, noviembre 21, 2013 No comments
En la transaccin SE80, visualizamos el programa SAPLKKBL.

Visualizamos el programa SAPLKKBL.

Navegamos en el rbol hasta la pestaa GUI Status>STANDARD. Pinchamos con el botn derecho
y lo copiamos a nuestro programa.

Copiamos STANDARD en la pestaa Status GUI.

Aadimos el nombre de nuestro programa.

Volvemos a nuestro programa principal, y comprobamos que tenemos el STANDARD en la pestaa


GUI Status.

Comprobamos que tenemos GUI Status>Standard en nuestro programa.

Pinchamos dos veces en STANDARD y veremos los botones disponibles. En esta nueva ventana
aadimos un nuevo botn, asignndole un nombre, un icono y un atajo del teclado (No asignar el
atajo F4, ya que el botn no funcionara).

Aadimos un botn con el nombre &BT1.

Asignamos un icono.

Asignamos un atajo del teclado.

Ya tenemos el GUI Status listo para incorporar. Se va a mostrar un cdigo en el que se muestran
los cuatro primeros campos de la tabla SFLIGHT con un nuevo botn en el men. Cuando se pulsa
el botn, saldr un mensaje de notificacin.
El cdigo es el siguiente:

REPORT z_test.
* Cargar la tabla SFLIGHT de la base de datos
TABLES: sflight.
* Cargamos los datos tipo slis
TYPES: slis.
* Definicin de variables
DATA: g_it_sflight TYPE TABLE OF sflight,
g_st_sflight TYPE sflight.
DATA: g_it_fieldcat TYPE slis_t_fieldcat_alv,

g_st_fieldcat TYPE slis_fieldcat_alv.


DATA: g_repid TYPE sy-repid.
* SQL para copiar la tabla sflight a la tabla interna
SELECT * FROM sflight INTO TABLE g_it_sflight.
* Variable con el nombre del programa
g_repid = sy-repid.
* Datos del fieldcat para el ALV
g_st_fieldcat-fieldname = 'CARRID'.
g_st_fieldcat-seltext_s = 'Comp.'.
APPEND g_st_fieldcat TO g_it_fieldcat.
g_st_fieldcat-fieldname = 'CONNID'.
g_st_fieldcat-seltext_s = 'Vuelo'.
APPEND g_st_fieldcat TO g_it_fieldcat.
g_st_fieldcat-fieldname = 'FLDATE'.
g_st_fieldcat-seltext_s = 'Fecha'.
APPEND g_st_fieldcat TO g_it_fieldcat.
g_st_fieldcat-fieldname = 'PRICE'.
g_st_fieldcat-seltext_s = 'Tarifa'.
APPEND g_st_fieldcat TO g_it_fieldcat.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program
= g_repid
i_callback_pf_status_set = 'MI_STANDARD'
i_callback_user_command = 'MI_USER_COMMAND'
it_fieldcat
= g_it_fieldcat[]
TABLES
t_outtab
= g_it_sflight[]
EXCEPTIONS
program_error
=1
OTHERS
= 2.
*&---------------------------------------------------------------------*
*&
Form mi_user_command
*&---------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
FORM mi_user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
CASE r_ucomm.
WHEN '&BT1'. "Se ha hecho click en el botn
MESSAGE 'Has pulsado el botn creado' TYPE 'I'.
ENDCASE.
ENDFORM.
"mi_user_command
*&---------------------------------------------------------------------*

*&
Form mi_standard
*&---------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
FORM mi_standard USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'STANDARD'. "Nombre del Status GUI
ENDFORM.
"mi_standard

Nuestro botn y el mensaje monstrado.

Top of page en un ALV Report con imagen


jueves, noviembre 21, 2013 No comments
Para crear un encabezado a nuestro ALV Report con REUSE_ALV_GRID_DISPLAY, se necesitar
crear unFORM y nombrarle en i_callback_top_of_page. Dentro del FORM, se incluir la
funcin REUSE_ALV_COMMENTARY_WRITE para mostrar el texto del encabezado. Adems,
ser necesario indicar el nombre del programa en i_callback_program.
En el encabezado podremos distinguir tres reas:
1.

Header: Se muestra el texto con un tamao de fuente grande.

2.

Selection: Podremos mostrar el par de valores clave y valor.

3.

Action: Se muestra el texto en cursiva.

El cdigo es el siguiente:

REPORT z_sflight.
* Cargar la tabla SFLIGHT de la base de datos
TABLES: sflight.
* Cargamos los datos tipo slis
TYPES: slis.
* Definicin de variables
DATA: g_it_sflight TYPE TABLE OF sflight,
g_st_sflight TYPE sflight.
DATA: g_it_fieldcat TYPE slis_t_fieldcat_alv,
g_st_fieldcat TYPE slis_fieldcat_alv.
DATA: g_repid TYPE sy-repid.
* SQL para copiar la tabla sflight a la tabla interna
SELECT * FROM sflight INTO TABLE g_it_sflight.
* Variable con el nombre del programa
g_repid = sy-repid.
* Datos del fieldcat para el ALV
g_st_fieldcat-fieldname = 'CARRID'.
g_st_fieldcat-seltext_s = 'Comp.'.
APPEND g_st_fieldcat TO g_it_fieldcat.

g_st_fieldcat-fieldname = 'CONNID'.
g_st_fieldcat-seltext_s = 'Vuelo'.
APPEND g_st_fieldcat TO g_it_fieldcat.
g_st_fieldcat-fieldname = 'FLDATE'.
g_st_fieldcat-seltext_s = 'Fecha'.
APPEND g_st_fieldcat TO g_it_fieldcat.
g_st_fieldcat-fieldname = 'PRICE'.
g_st_fieldcat-seltext_s = 'Tarifa'.
APPEND g_st_fieldcat TO g_it_fieldcat.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program
= g_repid
i_callback_top_of_page = 'MI_TOP_OF_PAGE'
it_fieldcat
= g_it_fieldcat[]
TABLES
t_outtab
= g_it_sflight[]
EXCEPTIONS
program_error
=1
OTHERS
= 2.
*&---------------------------------------------------------------------*
*&
Form mi_top_of_page
*&---------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
FORM mi_top_of_page.
*ALV Header declarations
DATA: l_it_header TYPE slis_t_listheader,
l_st_header TYPE slis_listheader,
l_it_line LIKE l_st_header-info,
ld_lines TYPE i,
ld_linesc(10) TYPE c.
* Tipo H para escribir con la fuente grande
l_st_header-typ = 'H'.
l_st_header-info = 'SFLIGHT DATA'.
APPEND l_st_header TO l_it_header.
CLEAR l_st_header.
* Tipo S para indicar parmetro clave y su valor (fecha)
l_st_header-typ = 'S'. "Selection
l_st_header-key = 'Date: '.
CONCATENATE sy-datum+6(2) '.'
sy-datum+4(2) '.'
sy-datum(4) INTO l_st_header-info. "Fecha de hoy
APPEND l_st_header TO l_it_header.
CLEAR: l_st_header.
* Tipo A para escribir en cursiva
l_st_header-typ = 'A'. "Action

l_st_header-info = 'ALV Report'.


APPEND l_st_header TO l_it_header.
CLEAR: l_st_header.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
it_list_commentary = l_it_header[]
i_logo
= 'ENJOYSAP_LOGO'.
ENDFORM.

"mi_top_of_page

Top of page con imagen en un ALV Report.

Aadir patrn de rayas y tamao de columna optimizado en


un ALV Report (IS_LAYOUT)
mircoles, noviembre 20, 2013 No comments
Si se desea mostrar el patrn rayado y tener el ancho de columna optimizado, se tiene que recurrir
a la variable IS_LAYOUT del ALV. En este caso para activar dichas opciones, slo hay que cambiar
el valor de dos variables con una X.

En este ejemplo se muestran los cuatro primeros campos de la tabla SFLIGHT.

REPORT z_sflight.
* Cargar la tabla SFLIGHT de la base de datos
TABLES: sflight.
* Cargamos los datos tipo slis
TYPES: slis.
* Definicin de variables
DATA: g_it_sflight TYPE TABLE OF sflight,
g_st_sflight TYPE sflight.
DATA: g_it_fieldcat TYPE slis_t_fieldcat_alv,
g_st_fieldcat TYPE slis_fieldcat_alv.
Data: g_st_layout type slis_layout_alv.
* SQL para copiar la tabla sflight a la tabla interna
SELECT * FROM sflight INTO TABLE g_it_sflight.
* Datos del is_layout para el ALV
g_st_layout-zebra = 'X'.
g_st_layout-colwidth_optimize = 'X'.
* Datos del fieldcat para el ALV
g_st_fieldcat-fieldname = 'CARRID'.
g_st_fieldcat-seltext_s = 'Comp.'.
APPEND g_st_fieldcat TO g_it_fieldcat.
g_st_fieldcat-fieldname = 'CONNID'.
g_st_fieldcat-seltext_s = 'Vuelo'.
APPEND g_st_fieldcat TO g_it_fieldcat.
g_st_fieldcat-fieldname = 'FLDATE'.

g_st_fieldcat-seltext_s = 'Fecha'.
APPEND g_st_fieldcat TO g_it_fieldcat.
g_st_fieldcat-fieldname = 'PRICE'.
g_st_fieldcat-seltext_s = 'Tarifa'.
APPEND g_st_fieldcat TO g_it_fieldcat.
* Funcin ALV
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
is_layout
= g_st_layout
it_fieldcat = g_it_fieldcat[]
TABLES
t_outtab
= g_it_sflight[]
EXCEPTIONS
program_error = 1
OTHERS
= 2.

Patrn rayado y ancho de co

Asignar valores iniciales al filtrado de SELECT-OPTIONS


en la pantalla de seleccin
martes, noviembre 19, 2013 No comments
Si se desea que los campos de SELECT-OPTIONS tengan por defecto un valor, ser necesario
modificar los
Por ejemplo, si se desean seleccionar los datos de la tabla SFLIGHT con las compaas AA y DL,
tendremos que recurrir al evento INITIALIZATION para asignarle los valores de la bsqueda. De
este modo, el usuario no tendr que dar al botn de bsqueda avanzada, ya que los parmetros ya
habrn sido introducidos.

REPORT z_sflight.
* Cargar la tabla SFLIGHT de la base de datos
TABLES: sflight.
* Definicin de variables
DATA: g_it_sflight TYPE TABLE OF sflight,
g_st_sflight TYPE sflight.
* Pantalla de seleccin
SELECTION-SCREEN: BEGIN OF BLOCK b01 WITH FRAME.
SELECT-OPTIONS: p01 FOR sflight-carrid,
p02 FOR sflight-connid,
p03 FOR sflight-fldate.
SELECTION-SCREEN SKIP 1.
SELECT-OPTIONS: p04 FOR sflight-price.
SELECTION-SCREEN: END OF BLOCK b01.
INITIALIZATION.
p01-sign = 'I'. "Incluir
p01-option = 'EQ'. "=
p01-low = 'AA'.
APPEND p01.
p01-sign = 'I'.
p01-option = 'EQ'.
p01-low = 'DL'.
APPEND p01.
START-OF-SELECTION.
* Copiado de los datos a la tabla con los filtros
SELECT * FROM sflight INTO TABLE g_it_sflight

WHERE carrid IN p01


AND connid IN p02
AND fldate IN p03
AND price IN p04.
* Ver en el Debugging los valores de la tabla g_it_sflight
BREAK-POINT.
En este ejemplo, la variable p01 es una tabla interna cuyos campos son:
1.

p01-SIGN: Para incluir ('I') o excluir un dato ('E').

2.

p01-OPTION: Operacin lgica ('EQ', 'BT', 'NE', etc).

3.

p01-LOW: Lmite inferior.

4.

p01-HIGH: Lmite superior.


Por tanto, se han aadido los datos a la tabla interna en el evento INITIALIZATION.

Filtrar datos de una base de datos con SELECT-OPTIONS


y SQL
martes, noviembre 19, 2013 No comments
Quieres filtrar los datos de una base de datos? En esta entrada se explicar como copiar la base
de datos a una tabla interna con una sentencia SQL.
Es fundamental tener conocimiento de las sentencias SELECT-OPTIONS y SELECTION-SCREEN
en este ejercicio para la pantalla de seleccin, y de la sentencia SQL para copiar los datos filtrados
a la tabla.
REPORT z_sflight.
* Cargar la tabla SFLIGHT de la base de datos
TABLES: sflight.
* Definicin de variables
DATA: g_it_sflight TYPE TABLE OF sflight,
g_st_sflight TYPE sflight.
* Pantalla de seleccin
SELECTION-SCREEN: BEGIN OF BLOCK b01 WITH FRAME TITLE text-001.
SELECT-OPTIONS: p01 FOR sflight-carrid,
p02 FOR sflight-connid,
p03 FOR sflight-fldate.
SELECTION-SCREEN SKIP 1.
SELECT-OPTIONS: p04 FOR sflight-price.
SELECTION-SCREEN: END OF BLOCK b01.
* Copiado de los datos a la tabla con los filtros
SELECT * FROM sflight INTO TABLE g_it_sflight
WHERE carrid IN p01
AND connid IN p02
AND fldate IN p03
AND price IN p04.
* Ver en el debugging los valores de la tabla g_it_sflight
BREAK-POINT.
Se ha incluido un BREAK-POINT para ver la tabla interna g_it_sflight en el debugging.

Si ejecutamos, veremos que en la pantalla de seleccin aparecen los nombres de las variables.
Para poder editarlo tenemos que ir a los textos de seleccin:

Ir a los textos de seleccin.

Editar los campos para mostrar en la pantalla de seleccin.

Ya tenemos la pantalla lista para mostrar y ejecutar el programa.

Pantalla de seleccin con los textos editados.

Cambiar el formato de la fecha


martes, noviembre 19, 2013 No comments
No os gusta el formato de la fecha por defecto en ABAP y queris cambiar su formato de una
manera sencilla? Aqu se explicar cmo hacerlo.

Nos apoyaremos de la variable del sistema SY-DATUM y la funcin CONCATENATE.

Si la fecha es el 19 de noviembre de 2013, el valor de la variable SY-DATUM es 20131119. Como


podis observar, sigue el siguiente formato: AAAAMMDD. Nuestro objetivo va a ser pasarlo al
siguiente formato: DD/MM/AAAA con la funcin CONCATENATE.

REPORT z_fecha.
DATA texto TYPE string.
CONCATENATE sy-datum+6(2) sy-datum+4(2) sy-datum+0(4) INTO texto SEPARATED
BY '/'.
WRITE: texto.
En el valor 20131119 nos situamos en las posiciones 6, 4 y 0 con longitud de 2, 2 y 4
respectivamente, y separamos los textos por el carcter "/".

Copiar una tabla y estructura a partir de la declaracin de


variables
jueves, noviembre 14, 2013 No comments
En este ejemplo se va a mostrar cmo copiar la estructura y la tabla en el proceso de declaracin
de variables para ambos mtodos de declaracin de tablas internas. Cabe indicar que no se copia
ni el contenido de la estructura ni el de la tabla interna.

Primer mtodo (Cabecera + Tabla):

* Tipos
TYPES: BEGIN OF g_ty_encabezado,
nombre(20) TYPE c,
apellido(20) TYPE c,
telefono(9) TYPE n,
END OF g_ty_encabezado.

Segundo mtodo (Cabecera + Tabla con el mismo nombre):

TYPES: g_tt_mitabla TYPE TABLE OF g_ty_encabezado.


* Declaracin de variables
DATA: g_st_encabezado TYPE g_ty_encabezado,
g_it_mitabla TYPE g_tt_mitabla.
* Copiado de la cabecera
DATA: g_st_encabezado_copia LIKE LINE OF g_it_mitabla.
* Copiado de la tabla
DATA: g_it_mitabla_copia LIKE g_it_mitabla.

* Declaracin de la tabla
DATA: BEGIN OF g_it_mitabla OCCURS 0,
campo1(9) TYPE c,
campo2(9) TYPE c,
END OF g_it_mitabla.
* Copiado de la cabecera:
DATA: g_st_encabezado_copia LIKE LINE OF g_it_mitabla.
* Copiado de la tabla:
DATA: g_it_mitabla_copia LIKE g_it_mitabla OCCURS 0 WITH HEADER LINE.
Como se puede apreciar, si se quiere copiar el encabezado de una tabla, la sentencia LIKE LINE
OFfunciona para ambos mtodos. Sin embargo, las sentencias son distintas cuando se copia la
tabla interna.

Para ver las diferencias entre ambos mtodos en un loop, se recomienda ver esta entrada.

Declaracin de tablas internas (dos mtodos)


jueves, noviembre 14, 2013 No comments
Una tabla interna se caracteriza por tener una agrupacin de datos con una misma estructura.
Existen dos formas de declarar una tabla interna, para ello vamos a ver cmo se hace con esta
sencilla tabla:

Nombre

Apellido

Telfono

Juan

Prez

612345678

Lucas

Garca

698765432

Mara

Gutirrez

600111222

Primera forma:
REPORT z_tabla1.
* Tipos
TYPES: BEGIN OF g_ty_encabezado,
nombre(20) TYPE c,
apellido(20) TYPE c,
telefono(9) TYPE n,
END OF g_ty_encabezado.
TYPES: g_tt_mitabla TYPE TABLE OF g_ty_encabezado.
* Declaracin de variables
DATA: g_st_encabezado TYPE g_ty_encabezado,
g_it_mitabla TYPE g_tt_mitabla.
* Rellenado de la tabla
g_st_encabezado-nombre = 'Juan'.
g_st_encabezado-apellido = 'Prez'.
g_st_encabezado-telefono = '612345678'.
APPEND g_st_encabezado TO g_it_mitabla.
g_st_encabezado-nombre = 'Lucas'.
g_st_encabezado-apellido = 'Garca'.
g_st_encabezado-telefono = '698765432'.
APPEND g_st_encabezado TO g_it_mitabla.
g_st_encabezado-nombre = 'Mara'.
g_st_encabezado-apellido = 'Gutirrez'.

g_st_encabezado-telefono = '600111222'.
APPEND g_st_encabezado TO g_it_mitabla.
* Mostrar en pantalla la tabla
LOOP AT g_it_mitabla INTO g_st_encabezado.
WRITE:/ g_st_encabezado-nombre,
AT 22 g_st_encabezado-apellido,
AT 44 g_st_encabezado-telefono.
ENDLOOP.
Segunda forma:
REPORT z_tabla2.
* Declarado de variables
DATA: BEGIN OF g_it_mitabla OCCURS 0,
nombre(20) TYPE c,
apellido(20) TYPE c,
telefono(9) TYPE n,
END OF g_it_mitabla.
* Rellenado de la tabla
g_it_mitabla-nombre = 'Juan'.
g_it_mitabla-apellido = 'Prez'.
g_it_mitabla-telefono = '612345678'.
APPEND g_it_mitabla.
g_it_mitabla-nombre = 'Lucas'.
g_it_mitabla-apellido = 'Garca'.
g_it_mitabla-telefono = '698765432'.
APPEND g_it_mitabla.
g_it_mitabla-nombre = 'Mara'.
g_it_mitabla-apellido = 'Gutirrez'.
g_it_mitabla-telefono = '600111222'.
APPEND g_it_mitabla.
* Mostrar en pantalla la tabla
LOOP AT g_it_mitabla.
WRITE:/ g_it_mitabla-nombre,
AT 22 g_it_mitabla-apellido,
AT 44 g_it_mitabla-telefono.
ENDLOOP.
Se aprecia que en el primer mtodo se crea primero el encabezado y la tabla con TYPES, y a
continuacin se declaran las variables. Sin embargo, en el segundo mtodo se crea directamente
la tabla.
Ntese que a la hora de hacer un LOOP a la tabla, en el primer mtodo se indica la tabla y el

encabezado, mientras que en el segundo caso slo se indica el nombre de la tabla, ya que el
nombre del encabezado y tabla interna es el mismo.

S-ar putea să vă placă și