De string a tabla y viceversa

Introducción

En esta ocasión presento unas macros que permiten convertir strings en tablas internas y viceversa. Hago uso de ellas en mi librería WordWind, pero aquí se recogen como stand-alone en un include para cuando os sea necesario.

Aparte de las obvias funciones de interconversión, tenemos las opciones más sofisticadas de trabajar directamente con tablas tipo TLINE y la opción de hacer wordwrapping, es decir, de no romper las palabras a final de línea, pasándolas a la siguiente.

Las macros

  • vc_tab2str tabla cadena: convierte tabla con texto en string
  • vc_str2tab cadena tabla: convierte string en tabla
  • vc_str2tabwordwrap cadena tabla: esta rompe palabras por espacios o añade guiones
  • vc_str2tline cadena tabla: convierte string a tabla tline de texto estándar haciendo wordwrap
  • vc_tline2str tabla cadena: convierte tabla tline de texto estándar en string

El código

* _        _    ____      _       ____  _        _
*| |_ __ _| |__|___ \ ___| |_ _ _|___ \| |_ __ _| |__
*| __/ _` | '_ \ __) / __| __| '__|__) | __/ _` | '_ \
*| || (_| | |_) / __/\__ \ |_| |  / __/| || (_| | |_) |
* \__\__,_|_.__/_____|___/\__|_| |_____|\__\__,_|_.__/
* as seen in http://cranf.com
* una creación de alberto viñuela miranda
* convierte tablas de texto en cadenas y viceversa
* la tabla ha de tener cabecera.
* ni la cadena ni la tabla se inicializan: se efectua append

*DATA cadena(120) VALUE 'hola amigos como están ustedes'.
*DATA: BEGIN OF tabla OCCURS 0, linea(4), END OF tabla.
*  vc_tab2str tabla cadena.
*    convierte tabla con texto en string
*  vc_str2tab cadena tabla.
*    convierte string en tabla
*  vc_str2tabwordwrap cadena tabla.
*    esta rompe palabras por espacios o añade guiones
*  vc_str2tline cadena tabla
*    convierte string a tabla tline de texto estándar
*    haciendo wordwrap
*  vc_tline2str tabla cadena
*    convierte tabla tline de texto estándar en string.

*tab2str/str2tab
***********************************************************************
DEFINE vc_str2tab."convierte string en tabla de ancho arbitrario
  "vc_str2tab string tablainterna
  perform vc_str2tab tables &2 using &1.
END-OF-DEFINITION.
*
FORM vc_str2tab TABLES ptable USING pstring.
  DATA lstring TYPE string.
  DATA loffset TYPE i.
  DATA lofflen TYPE i.
  DATA llimlen TYPE i.
  DATA lchunks TYPE i.
  DATA ltablength TYPE i.
  DATA lstrlength TYPE i.

  lstring = pstring.
  lstrlength = STRLEN( lstring ).

  DESCRIBE FIELD ptable LENGTH ltablength IN CHARACTER MODE.
  lofflen = ltablength.

  lchunks = lstrlength / ltablength.

  WHILE loffset < lstrlength.
    llimlen = ltablength + loffset.
    IF llimlen > lstrlength.
      lofflen = lstrlength - loffset.
    ENDIF.
    ptable = lstring+loffset(lofflen).
    APPEND ptable.
    loffset = loffset + ltablength.
  ENDWHILE.
  CLEAR ptable.

ENDFORM.                                                    "vc_str2tab
***********************************************************************
DEFINE vc_tab2str."convierte contenido tabla interna en string
  "vc_tab2str tablainterna string.
  perform vc_tab2str tables &1 changing &2.
END-OF-DEFINITION.
*
FORM vc_tab2str TABLES ptable CHANGING pstring.
  LOOP AT ptable.
    CONCATENATE pstring ptable INTO pstring
      IN CHARACTER MODE
      RESPECTING BLANKS.
  ENDLOOP.
ENDFORM.                    "vc_tab2str
***********************************************************************
DEFINE vc_str2tabwordwrap. "convierte string en contenido de tabla interna
  "sin romper las palabras
  "vc_str2tabwordwrap string tablainterna.
  perform vc_str2tabwordwrap tables &2 using &1.
END-OF-DEFINITION.
*
FORM vc_str2tabwordwrap TABLES ptable
                        USING pstring.

  DATA ltablength TYPE i.
  DATA lauxline TYPE string.
  DATA lauxlinepre TYPE string.
  DATA lauxlen TYPE i.
  DATA lguion.
  DATA: BEGIN OF lit_previas OCCURS 0,
        palabra(72),
        END OF lit_previas.
  DATA: BEGIN OF lit_palabras OCCURS 0,
        palabra(72),
        END OF lit_palabras.

  CLEAR lauxline.
  SPLIT pstring AT space INTO TABLE lit_previas.
  DESCRIBE FIELD ptable LENGTH ltablength IN CHARACTER MODE.
* comprobamos que las palabras quepan SIEMPRE
  lguion = 'X'.
  WHILE lguion = 'X'.
    CLEAR lguion.
    REFRESH lit_palabras.
    LOOP AT lit_previas.
      lauxlen = STRLEN( lit_previas-palabra ).
      IF lauxlen > ltablength.
        ltablength = ltablength - 1.
        CONCATENATE lit_previas-palabra(ltablength)
                    '-'
              INTO lit_palabras-palabra.
        APPEND lit_palabras.
        lauxlen = lauxlen - ltablength.
        lit_palabras-palabra = lit_previas-palabra+ltablength(lauxlen).
        ltablength = ltablength + 1.
        APPEND lit_palabras.
        lguion = 'X'.
      ELSE.
        lit_palabras = lit_previas.
        APPEND lit_palabras.
      ENDIF.
    ENDLOOP.
    lit_previas[] = lit_palabras[].
  ENDWHILE.

* hacemos la carga definitiva
  LOOP AT lit_palabras.
    lauxlinepre = lauxline.
    CONCATENATE lauxline lit_palabras-palabra INTO lauxline
     SEPARATED BY space.
    CONDENSE lauxline.
    lauxlen = STRLEN( lauxline ).

    IF lauxlen > ltablength.
      ptable = lauxlinepre. APPEND ptable.
      lauxline = lit_palabras-palabra.
    ENDIF.
  ENDLOOP.

  APPEND lauxline TO ptable.

ENDFORM.                    "vc_str2tabwordwrap
***********************************************************************
DEFINE vc_str2tline."convierte string en contenido de tabla TLINE (texto sap)
  "sin romper las palabras
  "vc_str2tline string tablainternatipotline.
  perform vc_str2tline tables &2 using &1.
END-OF-DEFINITION.
*
FORM vc_str2tline TABLES ptline
                   USING pstring.
  DATA: lwa_tline LIKE tline.
  DATA: BEGIN OF lit_lines OCCURS 0,
        linea LIKE tline-tdline,
        END OF lit_lines.
  vc_str2tabwordwrap pstring lit_lines.

  LOOP AT lit_lines.
    CLEAR lwa_tline.
    IF sy-tabix = 1.
      lwa_tline-tdformat = '*'.
    ENDIF.
    lwa_tline-tdline = lit_lines-linea.
    APPEND lwa_tline TO ptline.
  ENDLOOP.

ENDFORM.                    "vc_str2tline
***********************************************************************
DEFINE vc_tline2str."convierte contenido tabla TLINE (texto sap) en string
  "vc_tline2str tablainternatline string.
  perform vc_tline2str tables &1 using &2.
END-OF-DEFINITION.
*
FORM vc_tline2str TABLES ptline
                CHANGING pstring.
  DATA: lwa_tline LIKE tline.
  DATA: BEGIN OF lit_lines OCCURS 0,
        linea LIKE tline-tdline,
        END OF lit_lines.
  LOOP AT ptline INTO lwa_tline.
    lit_lines-linea = lwa_tline-tdline.
    APPEND lit_lines.
  ENDLOOP.
  vc_tab2str lit_lines pstring.
ENDFORM.                    "vc_tline2str
Publicado en: SAP Sin comentarios ▼

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

*

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

[c] Alberto Viñuela Miranda / Cranfcom 2013-2014

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.