ABAPSTEMP 04

  1. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  2. *--[ Clase de SETS
  3. CLASS zini_cl_rango DEFINITION.
  4.  
  5.   PUBLIC SECTION.
  6.  
  7.     CLASS-METHODS: get_rango IMPORTING p_name      TYPE string
  8.                                        p_wildcards TYPE xfeld OPTIONAL
  9.                              EXPORTING p_data      TYPE ANY TABLE.
  10.   PRIVATE SECTION.
  11.      CONSTANTS: c_version  type c LENGTH 05 VALUE '01.00',
  12.                 c_date     type datum       value '20240517',
  13.                 c_copyleft type c LENGTH 25 value 'http://www.bergonzini.com'.
  14.  
  15. ENDCLASS.
  16.  
  17. CLASS zini_cl_rango IMPLEMENTATION.
  18.  
  19.      METHOD get_rango.
  20. DATA: t_R_RANGO TYPE STANDARD TABLE OF setnode,
  21.       obj type ref to data.
  22.  
  23. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  24. *--[ Optimización
  25.     DATA(l_name) = CONV char70( p_name ).
  26.  
  27.     IMPORT p_data TO p_data FROM MEMORY ID l_name.
  28.     IF sy-subrc EQ 0.
  29.       EXPORT p_data FROM p_data TO MEMORY ID l_name.
  30.       EXIT.
  31.     ENDIF.
  32.  
  33. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  34. *--[ Creacion de la tabla dinamica
  35.     DATA(l_wildcards) = abap_true.
  36.     DATA(l_setname) = p_name.
  37.     IF p_wildcards IS SUPPLIED.
  38.       l_wildcards = p_wildcards.
  39.     ENDIF.
  40.  
  41. *****    SELECT SINGLE rollname INTO @DATA(l_rollname) FROM setheader WHERE setname = @l_setname.
  42. *****
  43. *****    IF sy-subrc NE 0.
  44. ******--[ Aquí podemos salir o dejar que de el DUMP la linea posterior para detectar que falta
  45. ******--[ el SET... DUMP! DUMP! DUMP! DUMP!
  46. *****    ENDIF.
  47. *****
  48. *****    DATA(t_components) = VALUE cl_abap_structdescr=>component_table(
  49. *****                         ( name = 'SIGN'   type = cl_abap_elemdescr=>get_c( 1 ) )
  50. *****                         ( name = 'OPTION' type = cl_abap_elemdescr=>get_c( 2 ) )
  51. *****                         ( name = 'LOW'    type = CAST #( cl_abap_elemdescr=>describe_by_name( l_rollname ) ) )
  52. *****                         ( name = 'HIGH'   type = CAST #( cl_abap_elemdescr=>describe_by_name( l_rollname ) ) )
  53. *****                         ).
  54. *****
  55. *****    DATA(table_desc) = cl_abap_tabledescr=>create(
  56. *****                                p_line_type  = cl_abap_structdescr=>create( t_components )
  57. *****                                p_table_kind = cl_abap_tabledescr=>tablekind_std
  58. *****                           ).
  59. *****
  60. *****    DATA: table TYPE REF TO data.
  61. *****    CREATE DATA table TYPE HANDLE table_desc.
  62. *****    FIELD-SYMBOLS <table> TYPE ANY TABLE.
  63. *****    ASSIGN table->* TO <table>.
  64.  
  65. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  66. *--[ Buscamos el rango
  67.  
  68.  
  69.     t_R_RANGO = VALUE #( ( subsetname = l_setname ) ).
  70.  
  71. *--[ Creamos la Working Area por si peta el Select de abajo
  72.     create data obj like LINE OF p_data.
  73.     ASSIGN obj->* TO FIELD-SYMBOL(<fs_wa>).
  74.  
  75.     LOOP AT  t_R_RANGO INTO DATA(l_R_RANGO).
  76.       SELECT subsetname FROM setnode APPENDING CORRESPONDING FIELDS OF TABLE t_R_RANGO
  77.         WHERE setname = l_R_RANGO-subsetname .
  78.  
  79.       TRY.
  80.           SELECT valsign    AS sign
  81.             valoption  AS option
  82.             valfrom    AS low
  83.             valto      AS high
  84.             FROM setleaf APPENDING CORRESPONDING FIELDS OF TABLE p_data
  85.             WHERE setname   = l_R_RANGO-subsetname..
  86.         CATCH cx_sy_dynamic_osql_semantics.
  87. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  88. *--[
  89. *--[ Segunda oportunidad por problemas de formato
  90.           CLEAR sy-subrc.
  91.           SELECT valsign    AS sign,
  92.             valoption  AS option,
  93.             valfrom    AS low,
  94.             valto      AS high
  95.             FROM setleaf INTO TABLE @DATA(x_data)
  96.             WHERE setname   = @l_R_RANGO-subsetname.
  97. *--[ Más lento
  98.             loop at x_data into data(ax).
  99.                clear <fs_wa>.
  100.                MOVE-CORRESPONDING ax to <fs_wa>.
  101.                insert <fs_wa> into table p_data.
  102.             endloop.
  103.       ENDTRY.
  104.     ENDLOOP.
  105.     IF l_wildcards = abap_true.
  106.       LOOP AT p_data "<table>
  107.         ASSIGNING FIELD-SYMBOL(<f_R_RANGO>).
  108.  
  109.         ASSIGN ('<F_R_RANGO>-LOW')    TO FIELD-SYMBOL(<f_LOW>).
  110.         ASSIGN ('<F_R_RANGO>-OPTION') TO FIELD-SYMBOL(<f_option>).
  111.         ASSIGN ('<F_R_RANGO>-HIGH')   TO FIELD-SYMBOL(<f_high>).
  112.  
  113.         IF <f_LOW> CA '*'. <f_option> = if_fsbp_const_range=>option_contains_pattern. CLEAR <f_high>.  ENDIF.
  114.       ENDLOOP.
  115.     ENDIF.
  116. *    p_DATA[] = <table>[].
  117.     EXPORT p_data FROM p_data TO MEMORY ID l_name.
  118.   ENDMETHOD.
  119.  
  120. ENDCLASS.
  121.  
  122. ***end-of-SELECTION.
  123. **  DATA: r_rango LIKE RANGE OF BKPF-blart.
  124. **  zini_cl_rango=>get_rango( EXPORTING p_name = 'ZNOMBRE_DEL_SET'
  125. ***                                p_wildcards = abap_false
  126. **                        IMPORTING p_data = r_rango ).