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

0 comentarios :

Publicar un comentario