* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ Clase de SETS
CLASS zini_cl_rango DEFINITION.
PUBLIC SECTION.
CLASS-METHODS: get_rango IMPORTING p_name TYPE string
p_wildcards TYPE xfeld OPTIONAL
EXPORTING p_data TYPE ANY TABLE.
PRIVATE SECTION.
CONSTANTS: c_version type c LENGTH 05 VALUE '01.00',
c_date type datum value '20240517',
c_copyleft type c LENGTH 25 value 'http://www.bergonzini.com'.
ENDCLASS.
CLASS zini_cl_rango IMPLEMENTATION.
METHOD get_rango.
DATA: t_R_RANGO TYPE STANDARD TABLE OF setnode,
obj type ref to data.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ Optimización
DATA(l_name) = CONV char70( p_name ).
IMPORT p_data TO p_data FROM MEMORY ID l_name.
IF sy-subrc EQ 0.
EXPORT p_data FROM p_data TO MEMORY ID l_name.
EXIT.
ENDIF.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ Creacion de la tabla dinamica
DATA(l_wildcards) = abap_true.
DATA(l_setname) = p_name.
IF p_wildcards IS SUPPLIED.
l_wildcards = p_wildcards.
ENDIF.
***** SELECT SINGLE rollname INTO @DATA(l_rollname) FROM setheader WHERE setname = @l_setname.
*****
***** IF sy-subrc NE 0.
******--[ Aquí podemos salir o dejar que de el DUMP la linea posterior para detectar que falta
******--[ el SET... DUMP! DUMP! DUMP! DUMP!
***** ENDIF.
*****
***** DATA(t_components) = VALUE cl_abap_structdescr=>component_table(
***** ( name = 'SIGN' type = cl_abap_elemdescr=>get_c( 1 ) )
***** ( name = 'OPTION' type = cl_abap_elemdescr=>get_c( 2 ) )
***** ( name = 'LOW' type = CAST #( cl_abap_elemdescr=>describe_by_name( l_rollname ) ) )
***** ( name = 'HIGH' type = CAST #( cl_abap_elemdescr=>describe_by_name( l_rollname ) ) )
***** ).
*****
***** DATA(table_desc) = cl_abap_tabledescr=>create(
***** p_line_type = cl_abap_structdescr=>create( t_components )
***** p_table_kind = cl_abap_tabledescr=>tablekind_std
***** ).
*****
***** DATA: table TYPE REF TO data.
***** CREATE DATA table TYPE HANDLE table_desc.
***** FIELD-SYMBOLS <table> TYPE ANY TABLE.
***** ASSIGN table->* TO <table>.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ Buscamos el rango
t_R_RANGO = VALUE #( ( subsetname = l_setname ) ).
*--[ Creamos la Working Area por si peta el Select de abajo
create data obj like LINE OF p_data.
ASSIGN obj->* TO FIELD-SYMBOL(<fs_wa>).
LOOP AT t_R_RANGO INTO DATA(l_R_RANGO).
SELECT subsetname FROM setnode APPENDING CORRESPONDING FIELDS OF TABLE t_R_RANGO
WHERE setname = l_R_RANGO-subsetname .
TRY.
SELECT valsign AS sign
valoption AS option
valfrom AS low
valto AS high
FROM setleaf APPENDING CORRESPONDING FIELDS OF TABLE p_data
WHERE setname = l_R_RANGO-subsetname..
CATCH cx_sy_dynamic_osql_semantics.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[
*--[ Segunda oportunidad por problemas de formato
CLEAR sy-subrc.
SELECT valsign AS sign,
valoption AS option,
valfrom AS low,
valto AS high
FROM setleaf INTO TABLE @DATA(x_data)
WHERE setname = @l_R_RANGO-subsetname.
*--[ Más lento
loop at x_data into data(ax).
clear <fs_wa>.
MOVE-CORRESPONDING ax to <fs_wa>.
insert <fs_wa> into table p_data.
endloop.
ENDTRY.
ENDLOOP.
IF l_wildcards = abap_true.
LOOP AT p_data "<table>
ASSIGNING FIELD-SYMBOL(<f_R_RANGO>).
ASSIGN ('<F_R_RANGO>-LOW') TO FIELD-SYMBOL(<f_LOW>).
ASSIGN ('<F_R_RANGO>-OPTION') TO FIELD-SYMBOL(<f_option>).
ASSIGN ('<F_R_RANGO>-HIGH') TO FIELD-SYMBOL(<f_high>).
IF <f_LOW> CA '*'. <f_option> = if_fsbp_const_range=>option_contains_pattern. CLEAR <f_high>. ENDIF.
ENDLOOP.
ENDIF.
* p_DATA[] = <table>[].
EXPORT p_data FROM p_data TO MEMORY ID l_name.
ENDMETHOD.
ENDCLASS.
***end-of-SELECTION.
** DATA: r_rango LIKE RANGE OF BKPF-blart.
** zini_cl_rango=>get_rango( EXPORTING p_name = 'ZNOMBRE_DEL_SET'
*** p_wildcards = abap_false
** IMPORTING p_data = r_rango ).