martes, 28 de enero de 2014

Cómo crear un Smartform con una tabla y un código de barras

Objetivo:
  • Imprimir un Smartform en un Report.
  • La variable CARRID será un parámetro de entrada del Smartform.
  • Se mostrará el código de barras correspondiente al CARRID y toda la información relacionada con la tabla SFLIGHT
Diseño del Smartform:
Diseño del Smartform: Texto, código de barras y tabla
  1. Crear un código de barras en la transacción SE73 (ZBARCODE).
    • Seleccionar System Bar Codes y Change.
    • Crear el nuevo código de barras con Code128 y rotación normal.
    Transacción SE73 para crear un Código de Barras.

    Dar a nuevo y seleccionar las propiedades deseadas.
  2. Crear un estilo de Smartform en la transacción SMARTFORMS.
    • Crear un nodo de Paragraph Format (P0).
      • Márgenes por defecto y centrado
      • Helve 10pt
    • Crear otro nodo de Paragraph Format (P1).
      • Márgenes por defecto y centrado.
      • Helve 22pt y negrita.
    • Asignar a Header Format el formato P0.
    • Añadir un nodo Character Format (BC)
      • Asignar el Código de Barras creado anteriormente en la SE73.
    Crear un nuevo estilo en la transacción SMARTFORMS.

    Añadir un nodo en Paragrapgh Format.

    Indicar las propiedades a P0.

    Asignar el formato P0 a Header Format.

    Añadir un nodo a Character Format para el código de barras.

    Asignar el código de barras creado en la SE73.

  3. Crear el Smartform en la transacción SMARTFORMS.

    • Pulsar Form Painter para ver/ocultar el diseño del formulario.
    • Indicar el estilo creado anteriormente en la pestaña Output Options.
    • Añadir los parámetros necesarios en Form Interface:
      • Parámetro de entrada Carrid en la pestaña Import.
      • Tabla interna it_sflight en la pestaña Tables.
    • Añadir una estructura global SFLIGHT en Global Definitions (necesario para hacer un loop a la tabla it_sflight)
    • Crear las ventanas TITULO y BARCODE situándolas con sus tamaños y posiciones correspondientes.
    • Introducir un texto en las ventanas TITULO y BARCODE referenciando las variables necesarias pulsando Insert Field y las variables entre el símbolo & (ver imágenes). Además seleccionar el estilo en la pestaña 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 indicarán cinco columnas y su ancho.
      • Introducir la tabla interna it_sflight y la estructura st_sflight en la pestaña Data.
      • Seleccionar el estilo creado en la pestaña Output.
Crear el formulario en la transacción SMARTFORMS.

Asignar el estilo creado.

Añadir parámetro import CARRID.

Añadir la tabla it_sflight en la que se almacenará la información de la aerolínea.

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

Crear las ventanas necesarias.

Renombrar las ventanas y posicionarlas correctamente.

Añadir texto a las ventanas TITULO y BARCODE.

Introducir el parámetro CARRID entre & (Escribir &carrid& en la ventana, no directamente en el texto).
Añadir una tabla a la ventana Main.

Añadir dos tipos de linea (HEADER y MAIN) e indicar la separación de las columnas.

Indicar la tabla interna it_sflight y la estrucutra st_sflight en la pestaña Data.

Selección del estilo Output de la tabla.

Añadir 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 línea MAIN.
  1. Crear un Report en la transacción 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

Introducción del parámetro CARRID.

Visualización del Smartform.

lunes, 6 de enero de 2014

Crear un Tree dentro de un Docking y mostrar un ALV

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 código no ha sido creado directamente, sino que copiado y adaptado de los ejemplos disponibles en el sistema SAP.

En la transacción 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.                    "HANDLE_EXPAND_NO_CHILDREN

ENDCLASS.                    "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.

sábado, 4 de enero de 2014

Ver el listado de códigos de iconos

Para ver el listado de iconos SAP con sus códigos, 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 botón de ejecutar (F8)

Listado de iconos SAP.

jueves, 26 de diciembre de 2013

Renovar la licencia de MiniSAP (NetWeaver Trial)

Muchos usuarios no tienen acceso a un servidor SAP, con lo que la única opción de practicar en casa es usar la versión de MiniSAP (Instalar MiniSAP). Dicha versión tiene un periodo de licencia de 3 meses, con lo que es necesario renovarla cuando está apunto de expirarse. 

Los pasos para llevar a cabo esta tarea son los siguientes:
  1. Buscar el Hardware ID (HWID) de tu sistema mediante comandos:
    • Cambiar el directorio escribiendo:  cd C:\usr\sap\NSP\SYS\exe\uc\NTI386
    • Anotar el HWID al escribir: saplicense -get

    Cambio de directorio mediante comandos.

    Códifo HWID de nuestro sistema.

  2. Solicitar una nueva clave en SAP Sneak Preview License Key Request
    • Rellenar los datos con tu usuario y el HWID.

    Solicitud de la clave a SAP.

  3. Al finalizar, SAP te enviará un email con un archivo de texto (NSP.txt).
  4. Iniciar sesion con el usuario con el que has estado trabajando normalmente e ir a la transacción SLICENSE.
    • Introducir la nueva licencia pulsando el botón en Nueva Licencia e Instalar. Tendremos que seleccionar el archivo de texto enviado a nuestro email.

Pulsar Nueva Licencia para iniciar el proceso de instalación.

Pulsar Install para seleccionar el archivo enviado por SAP.

La nueva licencia ha sido instalado con el icono verde.

viernes, 20 de diciembre de 2013

Modificar el texto de un botón

Objetivo:
  • Modificar el texto de un botón una vez que que se haya introducido el texto en un campo input/output.
Creamos una dynpro con un campo texto, un input/output y un botón.

Las características más importantes son:
  1. Mayúsculas y minúsculas en el campo input/output.
  2. Campo de salida en el botón.
Admitimos minúsculas y mayúsculas en el campo input/output
El botón se indica que es un campo de salida.
Cada vez que se ejecuta el Process Before Output, el botón toma el valor del input/output.

Códigos:
  • Dynpro
PROCESS BEFORE OUTPUT.
  MODULE status_9000.
  MODULE load_text.
*
PROCESS AFTER INPUT.
  MODULE user_command_9000.
  • Report
*&---------------------------------------------------------------------*
*& Report  Z_BOTON
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  z_boton.

DATA: ok_code_9000 TYPE sy-ucomm,
      b_9000(20) TYPE c,
      io_9000(20) TYPE c value 'Default Text'.

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
*&---------------------------------------------------------------------*
*&      Module  LOAD_TEXT  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE load_text OUTPUT.
  b_9000 = io_9000.
ENDMODULE.                 " LOAD_TEXT  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9000  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.
  CASE ok_code_9000.
    WHEN 'CANCEL'.
      LEAVE PROGRAM.
  ENDCASE.
ENDMODULE.                 " USER_COMMAND_9000  INPUT

Resultado:

Texto inicial del botón.

Texto de prueba tras introducir el texto en el campo input/output.

martes, 17 de diciembre de 2013

Ejemplo de Batch Input

Objetivos:
  1. Crear un Tabstrip, y en una pestaña mostrar los socios en una tabla de control
  2. Seleccionar los socios a modificar con un checkbox
  3. Ejecutar con un Batch Input la modificación de cada uno de los socios seleccionados a través 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 transacción ZBIBLIO_01 (Ver aquí)
Creamos un nuevo Report en la SE38.

Crear un nuevo Report con la SE38
Añadimos una Dynpro 9000 con su correspondiente Status para salir del programa.
Añadimos una Dynpro.
Acción 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. Código de función al pinchar en las secciones.
  4. Si se desea introducir los modulos en includes.
Proceso para crear las pestañas en una Dynpro.
Al haber indicado tres secciones en el Tabstrip, automáticamente se nos habrá generado tres Dynpros subscreen y la siguiente programación de diálogo con sus correspondientes módulos 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 pestaña de Socios, tendremos que ir al subscreen 9001.

Introducimos una tabla de control y un botón.

Añadiendo los campos Input/output referenciando con la base de datos.
Tabla de control y botón resultante en el dynpro 9001.
A continuación nos interesa saber cuál 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 grabación:

Nueva grabación en la transacción SM35.
Nueva grabación para iniciar el proceso

Asignar el nombre de la grabación y la transacción.
Se habrá ejecutado la transacción indicada anteriormente. A partir de este paso, hay que realizar la modificación de solo un usuario sin hacer un paso de mas, ya que se grabaría. Cuando hayamos acabado, cerramos la transacción y aparecerá una tabla BDCDATA de la grabación:

Tabla BDCDATA generada con la grabación.
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 códigos 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.

* Añadimos 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