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

martes, 10 de diciembre de 2013

Crear Dynpros para crear, modificar y visualizar datos en una base de datos.

Datos previos:
Objetivo:
  • Una Dynpro 9000 con tres botones (Crear, Modificar y Visualizar).
  • Una Dynpro 9001 para añadir datos a la base de datos.
  • Una Dynpro 9002 como ventana de diálogo modal, para introducir el código de socio.
  • Una Dynpro 9003, como ventana de diálogo 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
 Añadir una Dynpro (Screen) al Module Pool creado pulsando el botón derecho:

Añadir una Dynpro al Module Pool creado.
Indicar el número de pantalla (se recomienda a partir de 9000).
Crear el elemento tipo OK de la pantalla 9000.
Descomentar los módulos PBO y PAI, y crear ambos objetos pinchando dos veces en el nombre.
En nuestro programa principal se nos habrán creado los objetos PBO y PAI en el código del programa.

Objetos PBO y PAI en el programa.
Como se puede apreciar, en el PBO se añade un Status y un Título, y en el PAI la salida del programa cuando el usuario pulsa el botón Cancel.

Para crear el STATUS y el título se pincha dos veces en el nombre:

Descripción del Status
Activación del botón Cancel cómo mínimo para salir del programa.
Descripción del título del programa.
Pinchamos dos veces al Dynpro 9000 y vamos al Layout para editar la pantalla. Se introducirán los botones de crear, modificar y visualizar:

Ir al Layout para editar la pantalla.
Escribir el código de función del botón.
Botones creados en el Dynpro 9000.

Para poder ejecutar la pantalla creada, es necesario crear una transacción. Hay dos formas:
  1. En la SE93
  2. Directamente en el programa

Crear la transacción en la SE93.
Crear la transacción directamente en el programa.
Se indicará la descripción, el nombre del Module Pool y la pantalla.

Descripción de la transacción.
Module Pool y Dynpro para que la transacción lo ejecute.
Creamos la Dynpro (Screen) 9001 tal y como creamos la 9000. Las únicas diferencias son:
  1. Añadimos el botón 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 características.
Añadimos el botón Back.
Nombras el campo de entrada/salida con el mismo nombre para referenciar.
Dynpro 9001 resultante.
Se necesita comprobar que el nuevo código 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 módulo correspondiente a ejecutar (ver código 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 continuación creamos la Dynpro 9002 con sus correspondientes campos como ventana de diálogo modal. En este caso, el Status tiene que ser del mismo tipo:

Status 9002 como diálogo modal.
Añadimos el código para cuando el usuario pulsa X para salir.
En este caso, dependiendo del botón pulsado en la Dynpro 9000, el botón tendrá como texto Modificar o Visualizarse, por tanto es necesario indicar el botón como campo de salida.

Botón como campo output en el Dynpro 9002.
Finalmente creamos la Dynpro 9003 como ventana de diálogo modal.

Dynpro 9003 como ventana de diálogo modal.
Esta misma Dynpro se va a utilizar para la acción de modificar o visualizar. Las diferencias con respecto a la 9001 son:
  1. El campo del código 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, tendrán un identificador de Grupo1 llamado ID1.
    • Si se da al botón de visualizar, ningún campo es editable, por lo tanto identificamos con ID1 los campos a modificar esa opción.
  3. El botón será un campo de salida, tal y como en el Dynpro 9002.
El campo input del código de socio es solo output.
Identificador de grupo ID1 en todos los campos de entrada/salida salvo en código de socio.
Botón como campo de salida.

Los códigos 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,   "Búsqueda 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 botón
  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 visualización
    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

domingo, 8 de diciembre de 2013

Clave externa en bases de datos

Introducir la clave externa en los siguientes campos de la tabla 3 (Crear tablas):
  • Código Socio
  • Código Libro
1. Tabla: ZBIBLIO_SOCIOS
Campo Tipo
Código de socio NUMC-4
DNI CHAR-9
Nombre CHAR-30
Apellido CHAR-30
Teléfono CHAR-15
Dirección 1 CHAR-75
Dirección 2 CHAR-75
Dirección 3 CHAR-75
Dirección 4 CHAR-75

2. Tabla: ZBIBLIO_LIBROS
Campo Tipo
Código de libro NUMC-8
Autor CHAR-75
Título CHAR-125
Ejemplares disponibles INT-4
Ejemplares totales INT-4

3. Tabla: ZBIBLIO_PRESTAM
Campo Tipo
Código de préstamo NUMC-12
Código de socio (Clave externa con tabla de socios)
Código de libro (Clave externa con tabla de socios)
Fecha inicio préstamo DAT
Fecha estimada devolución DAT
Fecha real devolución DAT

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

Campo socio seleccionado y pinchar en el botón de clave externa.
Introducir la tabla donde está definido el campo y pinchar en el botón de generar propuesta.
Comprobación de las claves externas:

Comprobación de la clave externa en la tabla.