ABAPSTRINGCLASS

  1. REPORT zini_WRAP_STRINGS.
  2.  
  3. CLASS zini_text_wrap DEFINITION.
  4.  
  5.   PUBLIC SECTION.
  6.  
  7.     CONSTANTS porcent_justify TYPE i VALUE 80. " 80%
  8.  
  9.     METHODS:
  10.       from_read_text IMPORTING i_name   TYPE any
  11.                                i_maxlen TYPE i
  12.                                i_halign TYPE c
  13.                      EXPORTING t_out    TYPE string_t,
  14.       from_string IMPORTING i_string TYPE any
  15.                             i_maxlen TYPE i
  16.                             i_halign TYPE c
  17.                   EXPORTING t_out    TYPE string_t,
  18.       align_string IMPORTING i_string        TYPE string
  19.                              i_maxlen        TYPE i
  20.                              i_halign        TYPE c
  21.                    RETURNING VALUE(e_string) TYPE string.
  22.  
  23. ENDCLASS.
  24.  
  25. CLASS zini_text_wrap IMPLEMENTATION.
  26.  
  27.   METHOD align_string.
  28.     CONSTANTS c_dic type c LENGTH 15 value '··^¨ºª#~&%|'.
  29.     DATA: l_s   TYPE char1024,
  30.           t_res TYPE match_result_tab.
  31.     CASE i_halign.
  32.       WHEN 'J' OR 'j' OR 'w' OR 'W'.
  33.         WRITE i_String TO l_s LEFT-JUSTIFIED.
  34.         DATA(l_porcen) = strlen( i_string ) * 100 / i_maxlen.
  35.         IF l_porcen >= porcent_justify.
  36.             DATA(l_len) = strlen( l_s ).
  37.  
  38.           do 10 times.
  39.           data(l_join) = c_dic+sy-index(1).
  40.           if l_s na l_join.
  41.              exit.
  42.           endif.
  43.           enddo.
  44.           TRANSLATE l_s+0(l_len) USING ' ¬'.
  45.           DO.
  46.             l_len = strlen( l_s ).
  47.             FIND ALL OCCURRENCES OF '¬' IN l_s+0(l_len) RESULTS t_res.
  48.             SORT t_res BY offset DESCENDING.
  49.             DELETE t_res WHERE offset = 0.
  50.  
  51.             LOOP AT t_res INTO DATA(l_indice).
  52.               l_s = |{ l_s+0(l_indice-offset) }{ l_join }{ l_s+l_indice-offset }|.
  53.               IF strlen( l_s ) >= i_maxlen.
  54.                 EXIT.
  55.               ENDIF.
  56.             ENDLOOP.
  57.             IF strlen( l_s ) >= i_maxlen.
  58.               EXIT.
  59.             ENDIF.
  60.           ENDDO.
  61.  
  62.         data(l_using) = |{ l_join } ¬ |.
  63.         translate l_s USING l_using.
  64.         ENDIF.
  65.       WHEN 'L' OR 'l' OR 'I' OR 'i'. WRITE i_String TO l_s LEFT-JUSTIFIED.
  66.       WHEN 'C' OR 'c'.               WRITE i_string TO l_s+0(i_maxlen) CENTERED.
  67.       WHEN 'R' OR 'r' OR 'D' OR 'd'. WRITE l_s TO l_s+0(i_maxlen) RIGHT-JUSTIFIED.
  68.       WHEN OTHERS.                   l_s = i_string.
  69.     ENDCASE.
  70.     e_string = l_s.
  71.   ENDMETHOD.
  72.  
  73.   METHOD from_string.
  74.     DATA: l_s TYPE string.
  75.     REFRESH t_out.
  76.     IF i_string IS INITIAL.
  77.       APPEND i_string TO t_out.
  78.       EXIT.
  79.     ENDIF.
  80.     SPLIT i_string AT ' ' INTO TABLE DATA(t_tab).
  81.  
  82.     LOOP AT t_TAB INTO DATA(l_tab).
  83.  
  84.       DATA(l_MAX) = strlen( l_s ) + strlen( l_tab ) + 1. "El espacio
  85.       IF l_max > i_maxlen.
  86.         l_s = align_string( EXPORTING I_string = l_s
  87.                                       i_maxlen = i_maxlen
  88.                                       i_halign = i_halign ).
  89.         APPEND l_s TO t_out.
  90.         l_s = l_tab.
  91.       ELSE.
  92.         l_s = |{ l_s } { l_tab }|.
  93.       ENDIF.
  94.  
  95.       AT LAST.
  96.         l_s = align_string( EXPORTING I_string = l_s
  97.                                       i_maxlen = i_maxlen
  98.                                       i_halign = i_halign ).
  99.         APPEND l_s TO t_out.
  100.       ENDAT.
  101.  
  102.     ENDLOOP.
  103.   ENDMETHOD.
  104.  
  105.   METHOD from_read_text.
  106.     DATA: lt_text TYPE STANDARD TABLE OF tline.
  107.     DATA: t_table TYPE string_t,
  108.           l_s     TYPE string,
  109.           l_name  TYPE thead-tdname.
  110.  
  111.     l_name = i_name .
  112.     CALL FUNCTION 'READ_TEXT'
  113.       EXPORTING
  114.         id                      = 'ST'
  115.         language                = sy-langu
  116.         name                    = l_name
  117.         object                  = 'TEXT'
  118.       TABLES
  119.         lines                   = lt_text
  120.       EXCEPTIONS
  121.         id                      = 1
  122.         language                = 2
  123.         name                    = 3
  124.         not_found               = 4
  125.         object                  = 5
  126.         reference_check         = 6
  127.         wrong_access_to_archive = 7
  128.         OTHERS                  = 8.
  129.  
  130.     LOOP AT lt_text INTO DATA(ls_text).
  131.       IF ls_text-tdformat = '*'.
  132.         APPEND l_S TO t_table.
  133.         CLEAR l_s.
  134.       ENDIF.
  135.       CONCATENATE l_s ls_text-tdline INTO l_s SEPARATED BY ' '.
  136.       IF l_s IS INITIAL.
  137.         APPEND l_s TO t_table.
  138.       ENDIF.
  139.       AT LAST.
  140.         APPEND l_s TO t_table.
  141.       ENDAT.
  142.     ENDLOOP.
  143.     DATA: l_out TYPE string_t.
  144.     LOOP AT t_table INTO l_S.
  145.       from_string( EXPORTING i_string = CONV string( l_s )
  146.                              i_maxlen = i_maxlen
  147.                              i_halign = i_halign
  148.                        IMPORTING t_out = l_out ).
  149.       APPEND LINES OF l_out TO t_out.
  150.     ENDLOOP.
  151.   ENDMETHOD.
  152.  
  153. ENDCLASS.
  154.  
  155.  
  156. END-OF-SELECTION.
  157.  
  158.   DATA: t_out TYPE string_t.
  159.  
  160.   DATA(l_zini) = NEW zini_text_wrap( ).
  161.   l_zini->FROM_read_text( EXPORTING i_NAME = 'GASTOS20240000005227EG_INF_NFOBSER'
  162.                                      i_maxlen = 80
  163.                                      i_halign = 'J'
  164.                            IMPORTING t_out = t_out ).
  165.  
  166.  
  167.  
  168.   loop at t_out into data(l_out).
  169.     if l_out is not INITIAL.
  170.       write / l_out.
  171.     else.
  172.       write / '<--- [ENTER]'.
  173.     endif.
  174.   endloop.