Creación Modelo OO

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • akiestudio
    Member
    • jul
    • 46

    #1

    Creación Modelo OO

    Buenos días,
    Estoy intentando crear un modelo orientando a objetos, tengo una class abstracta y otra clase de tabla.
    Clase Abstracta.
    Código:
    class ZCL_MODEL_ABSTRACT definition
      public
      abstract
      create public .
    
    public section.
    
      methods CALL_ALL_GETTERS
      final
        importing
          !TABLE type ref to DATA
          !TABLE_NAME type C optional
          !MODEL type ref to ZCL_GW_MODEL optional
        raising
          ZCX_DEMO_BO .
    protected section.
    
      class-methods RAISE_EXCEPTION_ON_ERROR
        importing
          !BAPIRETURN type BAPIRET2_TAB optional
        raising
          ZCX_DEMO_BO .
      PRIVATE SECTION.
    
    ENDCLASS.
    
    
    
    CLASS ZCL_MODEL_ABSTRACT IMPLEMENTATION.
    
    
        METHOD CALL_ALL_GETTERS.
          DATA: struct_descr TYPE REF TO cl_abap_structdescr,
              parameter    TYPE abap_parmbind,
              parameters   TYPE abap_parmbind_tab.
    
          ASSIGN table->* TO FIELD-SYMBOL(<table>).
          CHECK sy-subrc = 0.
    
    * ... otherwise we use RTTS to determine ABAP field names from entity itself.
          TRY.
    *          struct_descr ?= cl_abap_structdescr=>describe_by_data_ref( table ).
               struct_descr ?= cl_abap_structdescr=>describe_by_name( TABLE_NAME ).
              LOOP AT struct_descr->components REFERENCE INTO DATA(component).
                CLEAR parameters.
                TRY.
                    ASSIGN COMPONENT component->name OF STRUCTURE <table> TO FIELD-SYMBOL(<comp>).
                    IF sy-subrc = 0.
                      parameter-name = component->name.
                      parameter-kind = cl_abap_objectdescr=>returning.
                      GET REFERENCE OF <comp> INTO parameter-value.
                      INSERT parameter INTO TABLE parameters.
                      DATA(method_name) = |GET_{ component->name }|.
                      CALL METHOD me->(method_name)
                        PARAMETER-TABLE parameters.
                    ENDIF.
                  CATCH cx_sy_dyn_call_error.
                ENDTRY.
              ENDLOOP.
               CATCH cx_root.
          ENDTRY.
    	
      ENDMETHOD.
    
      METHOD raise_exception_on_error.
      LOOP AT bapireturn REFERENCE INTO DATA(lr_return) WHERE type = 'E'.
        MESSAGE ID lr_return->id TYPE lr_return->type NUMBER lr_return->number
                INTO DATA(error_message)
                WITH lr_return->message_v1 lr_return->message_v2 lr_return->message_v3 lr_return->message_v4.
        RAISE EXCEPTION TYPE zcx_demo_bo
          EXPORTING
            textid        = zcx_demo_bo=>error
            error_message = error_message.
      ENDLOOP.
    
    ENDMETHOD.
    ENDCLASS.
    Clase de tabla.
    Código:
    class ZCL_MODEL_KNA1 definition
      public
      inheriting from ZCL_MODEL_ABSTRACT
      create protected .
    
    public section.
    
      methods CONSTRUCTOR
        raising
          ZCX_DEMO_BO .
      methods MAP_TO_TABLE
        importing
          !TABLE type ref to DATA optional
          !TABLE_NAME type C optional
          !MODEL type ref to ZCL_GW_MODEL optional
        raising
          ZCX_DEMO_BO .
      class-methods GET
        returning
          value(INSTANCE) type ref to ZCL_MODEL_KNA1 .
      methods GET_KUNNR
        returning
          value(KUNNR) type KUNNR
        raising
          ZCX_DEMO_BO .
    protected section.
       METHODS load_kna1_data
       RAISING
          zcx_demo_bo .
        
    private section.
       DATA KNA1_DATA TYPE KNA1.
       class-DATA lo_instances TYPE REF TO ZCL_MODEL_KNA1 .
    
    
    ENDCLASS.
    
    
    
    CLASS ZCL_MODEL_KNA1 IMPLEMENTATION.
    
    
      METHOD CONSTRUCTOR.
        super->constructor( ).
        load_kna1_data(  ).
    
      ENDMETHOD.
    
    
     METHOD get.
    
    
    
        IF lo_instances IS INITIAL.
    *     creation of the object
          CREATE OBJECT lo_instances.
        ENDIF.
    *   assigning reference back to exporting parameter
        instance = lo_instances.
    
    
    
      ENDMETHOD.
    
      method GET_KUNNR.
        KUNNR = me->KNA1_DATA-KUNNR.
      endmethod.
    
    
      METHOD load_kna1_data.
    
        SELECT SINGLE *
          FROM kna1 AS ka
          INTO CORRESPONDING FIELDS OF @ME->KNA1_DATA.
    
        IF sy-subrc NE 0.
          RAISE EXCEPTION TYPE zcx_demo_bo
            EXPORTING
              textid  = zcx_demo_bo=>not_found
              bo_type = 'MODEL_KNA1'.
       ENDIF.
     ENDMETHOD.
    
    
       METHOD MAP_TO_TABLE.
    
        CALL_ALL_GETTERS(
           EXPORTING
             TABLE = TABLE
             TABLE_NAME  = TABLE_NAME
             model = model
             ).
    
      ENDMETHOD.
    ENDCLASS.
    Cuando intento llamarla en el programa,
    Código:
    data lo_mkna1 type REF TO ZCL_MODEL_KNA1.
    data lt_mkna1 type STANDARD TABLE OF kna1.
    data lr_mkna1 type REF TO data.
    data io_model type REF TO zcl_gw_model.
    
    lo_mkna1 = ZCL_MODEL_KNA1=>GET( ).
    
    
    IO_MODEL  = NEW ZCL_GW_MODEL( ).
    data table_name type c LENGTH 40 value 'KNA1'.
    
    lo_mkna1->MAP_TO_TABLE(
      exporting
        TABLE     =  REF #( lr_mkna1 )
        TABLE_NAME = table_name
    *    MODEL       = io_model
    ).
    Al hacer debugg en la clase abstracta nunca entra en:

    ASSIGN COMPONENT component->name OF STRUCTURE <table> TO <comp>.
    sy-subrc siempre devuelve 4, con lo que no entra nunca para cargar los datos en:

    DATA(method_name) = |GET_{ component->name }|.
    CALL METHOD me->(method_name)
    PARAMETER-TABLE parameters.

    Alguien puede decirme que se me está escapando. ¿quizás estoy pasando mal los valores a MAP_TO_TABLE en el programa?

    Muchas gracias
Trabajando...