Patrón de diseño Model-View-Controller

Vamos a crear un programa ejecutable implementamos el código fuente del patrón de diseño MVC creando las clases locales LCL_MODELO, LCL_VISTA y LCL_CONTROLADOR.
La clase modelo accede a la tabla de maestros de proveedores (LFA1) para obtener los datos.
Creamos un SELECT-OPTIONS para filtrar los datos por el campo LIFNR.
En la clase que representa la vista, utilizamos el módulo de funciones estándar REUSE_ALV_GRID_DISPLAY para pintar los datos.
En el evento START-OF-SELECTION probaremos todo el desarrollo.

  1. La solución en código fuente:
    DATA: gv_acreedor TYPE lifnr.
    SELECT-OPTIONS so_lifnr FOR gv_acreedor.
    *----------------------------------------------------------------------*
    * CLASS lcl_modelo DEFINITION
    *----------------------------------------------------------------------*
    *
    *----------------------------------------------------------------------*
    CLASS lcl_modelo DEFINITION.
    PUBLIC SECTION.
    METHODS: set_modelo, " IMPORTING acreedores LIKE gt_range_acreedor,
    get_modelo RETURNING VALUE(acreedores) TYPE bbp_lfa1_t.
    PRIVATE SECTION.
    DATA table_acreedores TYPE bbp_lfa1_t.
    ENDCLASS. "lcl_modelo DEFINITION
    *----------------------------------------------------------------------*
    * CLASS lcl_modelo IMPLEMENTATION
    *----------------------------------------------------------------------*
    *
    *----------------------------------------------------------------------*
    CLASS lcl_modelo IMPLEMENTATION.
    METHOD set_modelo.
    SELECT * FROM lfa1
    INTO TABLE table_acreedores
    WHERE lifnr IN so_lifnr."acreedores.
    ENDMETHOD. "set_modelo
    METHOD get_modelo.
    acreedores = table_acreedores.
    ENDMETHOD. "get_modelo
    ENDCLASS. "lcl_modelo IMPLEMENTATION
    *----------------------------------------------------------------------*
    * CLASS lcl_vista DEFINITION
    *----------------------------------------------------------------------*
    *
    *----------------------------------------------------------------------*
    CLASS lcl_vista DEFINITION.
    PUBLIC SECTION.
    METHODS pintar_acreedores IMPORTING acreedores TYPE bbp_lfa1_t.
    ENDCLASS. "lcl_vista DEFINITION
    *----------------------------------------------------------------------*
    * CLASS lcl_vista IMPLEMENTATION
    *----------------------------------------------------------------------*
    *
    *----------------------------------------------------------------------*
    CLASS lcl_vista IMPLEMENTATION.
    METHOD pintar_acreedores.
    DATA lt_datos TYPE TABLE OF lfa1.
    lt_datos = acreedores.
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
    * I_INTERFACE_CHECK = ' '
    * I_BYPASSING_BUFFER = ' '
    * I_BUFFER_ACTIVE = ' '
    * I_CALLBACK_PROGRAM = ' '
    * I_CALLBACK_PF_STATUS_SET = ' '
    * I_CALLBACK_USER_COMMAND = ' '
    * I_CALLBACK_TOP_OF_PAGE = ' '
    * I_CALLBACK_HTML_TOP_OF_PAGE = ' '
    * I_CALLBACK_HTML_END_OF_LIST = ' '
    i_structure_name = 'LFA1'
    * I_BACKGROUND_ID = ' '
    * I_GRID_TITLE =
    * I_GRID_SETTINGS =
    * IS_LAYOUT =
    * it_fieldcat = lt_fieldcat
    * IT_EXCLUDING =
    * IT_SPECIAL_GROUPS =
    * IT_SORT =
    * IT_FILTER =
    * IS_SEL_HIDE =
    * I_DEFAULT = 'X'
    * I_SAVE = ' '
    * IS_VARIANT =
    * IT_EVENTS =
    * IT_EVENT_EXIT =
    * IS_PRINT =
    * IS_REPREP_ID =
    * I_SCREEN_START_COLUMN = 0
    * I_SCREEN_START_LINE = 0
    * I_SCREEN_END_COLUMN = 0
    * I_SCREEN_END_LINE = 0
    * I_HTML_HEIGHT_TOP = 0
    * I_HTML_HEIGHT_END = 0
    * IT_ALV_GRAPHICS =
    * IT_HYPERLINK =
    * IT_ADD_FIELDCAT =
    * IT_EXCEPT_QINFO =
    * IR_SALV_FULLSCREEN_ADAPTER =
    * IMPORTING
    * E_EXIT_CAUSED_BY_CALLER =
    * ES_EXIT_CAUSED_BY_USER =
    TABLES
    t_outtab = lt_datos
    EXCEPTIONS
    program_error = 1
    OTHERS = 2.
    IF sy-subrc <> 0.
    * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
    * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.
    ENDMETHOD. "pintar_acreedores
    ENDCLASS. "lcl_vista IMPLEMENTATION
    *----------------------------------------------------------------------*
    * CLASS lcl_controlador DEFINITION
    *----------------------------------------------------------------------*
    *
    *----------------------------------------------------------------------*
    CLASS lcl_controlador DEFINITION.
    PUBLIC SECTION.
    METHODS: set_modelo IMPORTING modelo TYPE REF TO lcl_modelo,
    get_modelo EXPORTING modelo TYPE REF TO lcl_modelo,
    set_vista IMPORTING vista TYPE REF TO lcl_vista,
    get_vista EXPORTING vista TYPE REF TO lcl_vista.
    PRIVATE SECTION.
    DATA: modelo TYPE REF TO lcl_modelo,
    vista TYPE REF TO lcl_vista.
    ENDCLASS. "lcl_controlador DEFINITION
    *----------------------------------------------------------------------*
    * CLASS lcl_controlador IMPLEMENTATION
    *----------------------------------------------------------------------*
    *
    *----------------------------------------------------------------------*
    CLASS lcl_controlador IMPLEMENTATION.
    METHOD set_modelo.
    me->modelo = modelo.
    ENDMETHOD. "set_modelo
    METHOD get_modelo.
    modelo = me->modelo.
    ENDMETHOD. "get_modelo
    METHOD set_vista.
    me->vista = vista.
    me->vista->pintar_acreedores( acreedores = me->modelo->get_modelo( ) ).
    ENDMETHOD. "set_vista
    METHOD get_vista.
    vista = me->vista.
    ENDMETHOD. "get_vista
    ENDCLASS. "lcl_controlador IMPLEMENTATION
    START-OF-SELECTION.
    DATA: gr_vista TYPE REF TO lcl_vista,
    gr_modelo TYPE REF TO lcl_modelo,
    gr_controlador TYPE REF TO lcl_controlador.
    CREATE OBJECT: gr_vista,
    gr_modelo,
    gr_controlador.
    gr_modelo->set_modelo( ).
    gr_controlador->set_modelo( modelo = gr_modelo ).
    gr_controlador->set_vista( vista = gr_vista ).
    view raw 02_12_05.abap hosted with ❤ by GitHub
  2. La pantalla de selección de nuestro programa ejecutable:foto 1
  3. Los resultados obtenidos:foto 2

2 comentarios de “Patrón de diseño Model-View-Controller

  1. Guillermo Chauran dice:

    Buenos días, estoy estudiando este modelo MVC, lo copie tal cual y me genera este error.

    Clase ZLCL_CONTROLADOR,Método SET_VISTA
    Field “GET_MODELO(” is unknown. It is neither in one of the specified
    tables nor defined by a “DATA” statement . . . . . . . . . .
    agradezco vuestra ayuda

    • Gheorghe Valer dice:

      Hola Guillermo,

      En la clase lcl_modelo el método get_modelo debería de estar definido en la encapsulación pública tal como se observa el la línea 15 de la primera clase lcl_modelo.

      Un saludo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Wishlist 0
Continue Shopping
Todos
Cursos
Máster
Todos
Cursos
Máster
Todos
Cursos
Máster