Buenos días,
Estoy intentando crear un modelo orientando a objetos, tengo una class abstracta y otra clase de tabla.
Clase Abstracta.
Clase de tabla.
Cuando intento llamarla en el programa,
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
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.
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.
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
).
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