Anuncio

Colapsar
No hay anuncio todavía.

Separar una cadena en varios campos

Colapsar
X
 
  • Filtrar
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes

  • Separar una cadena en varios campos

    Hola amigos, estoy teniendo problemas con algo muy sencillo:

    Tengo un archive: prueba.csv

    UD00000000;0090000000;50.26
    UD00000000;0090000002;45.56
    UD00000000;0090000004;300.25-
    UD00000000;0090000005;45.26
    UD00000000;0090000024;48.15
    UA00000000;0090000025;11.17
    UA00000000;0090000027;200.58-
    UD00000000;0090000030;600.25
    UD00000000;0090000031;123.95
    UA00000000;0090000032;-201.63

    quiero agarrar cada linea y separarla en base al separador ';' y meter el resultado en una table interna, les dejo mi codigo:

    Código:
    REPORT Z_JE_CC.
    *Definimos el tipo de tabla(la estructura)
    TYPE-POOLS:  truxs.
    
    types: begin of t_tabla,
             f1(20) type c,
             f2(20) type c,
             f3(20) type c,
    *         f3 type p decimals 3,
           end of t_tabla.
    types: begin of t_tabla2,
             f1(100) type c,
    *         f3 type p decimals 3,
           end of t_tabla2.
    data: it_tabla type table of t_tabla, it_tablauncampo TYPE TABLE OF t_tabla2.
    field-symbols: <fs_tabla> type standard table, <fs_wa> like line of it_tabla, <fs_wa2> like line of it_tablauncampo.
    
    
    SELECTION-SCREEN BEGIN OF BLOCK Pant_Capt WITH FRAME TITLE Text-001.
    
    Parameters: p_arch LIKE RLGRAP-FILENAME Obligatory DEFAULT 'c:\temp\prueba.csv'.
    
    SELECTION-SCREEN END OF BLOCK Pant_Capt.
    
    At Selection-Screen On Value-Request For p_arch.
      CALL FUNCTION 'F4_FILENAME'
        EXPORTING
          PROGRAM_NAME  = SY-REPID
          DYNPRO_NUMBER = SY-DYNNR
          FIELD_NAME    = 'PATH'
        IMPORTING
          FILE_NAME     = P_arch.
    *BREAK-POINT.
      if sy-subrc = 0.
        clear it_tabla.
        unassign <fs_tabla>.
        "Cargamos la tabla de un solo campo.
        perform Load_Archivo_itab tables it_tablauncampo using p_arch.
        ASSIGN it_tablauncampo to <fs_tabla>.
        perform Separar_Tabla tables it_tabla it_tablauncampo.
        assign it_tabla to <fs_tabla>.
        BREAK-POINT.
      else.
        MESSAGE E398(00) WITH 'Error no se selecciono Archivo'.
      endif.
    
    
    *&---------------------------------------------------------------------*
    *&      Form  LOAD_ARCHIVO_ITAB
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->P_IT_TABLA  text
    *      -->P_P_ARCH  text
    *----------------------------------------------------------------------*
    FORM LOAD_ARCHIVO_ITAB  TABLES   P_IT_TABLA
                                       "Insert correct name for <...>
                            USING    P_P_ARCH.
      data: lv_xi type i.
      REFRESH P_IT_TABLA.
      CALL FUNCTION 'WS_UPLOAD'
        EXPORTING
          filename            = P_P_ARCH
          filetype            = 'ASC'
        TABLES
          data_tab            = P_IT_TABLA
        EXCEPTIONS
          conversion_error    = 1
          file_open_error     = 2
          file_read_error     = 3
          invalid_table_width = 4
          invalid_type        = 5
          no_batch            = 6
          unknown_error       = 7
          OTHERS              = 8.
      IF sy-subrc NE 0.
        WRITE : ' Error in opening file : ' , P_P_ARCH.
        STOP.
      ENDIF.
      DESCRIBE TABLE P_IT_TABLA lines lv_xi.
    *  BREAK-POINT.
    ENDFORM.                    "LOAD_ARCHIVO_ITAB
    " LOAD_ARCHIVO_ITAB
    *&---------------------------------------------------------------------*
    *&      Form  SEPARAR_TABLA
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->P_IT_TABLE  text
    *----------------------------------------------------------------------*
    FORM SEPARAR_TABLA  TABLES   P_IT_TABLA P_it_tablauncampo .
      "Insert correct name for <...>.
      field-symbols: <fs_xtabla> type STANDARD TABLE, <fs_xwa> type any.
      constants: separator(1) type c value ';'.
    *  data: lv_aux(100) type c.
      data: lv_aux type string, lv_aux2 type string, gt_raw_data  TYPE truxs_t_text_data, go_table     TYPE REF TO cl_salv_table.
    *  assign p_it_tablauncampo to <fs_xtabla>.
      assign it_tablauncampo to <fs_xtabla>.
      break-point.
      CALL FUNCTION 'TEXT_CONVERT_TEX_TO_SAP'
        EXPORTING
         I_FIELD_SEPERATOR          = ';'
         i_tab_raw_data             = it_tablauncampo[]
    
        TABLES
          I_TAB_CONVERTED_DATA       = it_tabla[]
       EXCEPTIONS
         CONVERSION_FAILED          = 1
         OTHERS                     = 2.
      IF SY-SUBRC <> 0.
       MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      ENDIF.
      break-point.
      loop at <fs_xtabla> ASSIGNING <fs_wa2>.
         lv_aux2 = <fs_wa2>-f1.
    *     SPLIT lv_aux2  AT CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB  INTO TABLE it_tabla.
    *      lv_aux2 = <fs_wa2>-f1.
    *     lv_aux2 = 'aa;bb;cc;dddd;ee;'.
    *     SPLIT lv_aux2 at separator into lv_aux.
    *      BREAK-POINT.
      endloop.
    
      TRY.
          CALL METHOD cl_salv_table=>factory
    *    EXPORTING
    *      LIST_DISPLAY   = IF_SALV_C_BOOL_SAP=>FALSE
    *      R_CONTAINER    =
    *      CONTAINER_NAME =
            IMPORTING
              r_salv_table   = go_table
            CHANGING
              t_table        = it_tabla.
        CATCH cx_salv_msg .
      ENDTRY.
      break-point.
    
      go_table->display( ).
    
    ENDFORM.                    " SEPARAR_TABLA
    Lo que he intentado:

    1) al mandar llamado:

    CALL FUNCTION 'TEXT_CONVERT_TEX_TO_SAP'
    EXPORTING
    I_FIELD_SEPERATOR = ';'
    i_tab_raw_data = it_tablauncampo[]

    TABLES
    I_TAB_CONVERTED_DATA = it_tabla[]
    EXCEPTIONS
    CONVERSION_FAILED = 1
    OTHERS = 2.

    tambien lo intente sin los [] me marca este error:


    Short Text
    Type conflict when calling the function module "TEXT_CONVERT_TEX_TO_SAP".

    no se por que, si sigo la documentacion.

    2) Intente tambien esto:

    loop at <fs_xtabla> ASSIGNING <fs_wa2>.
    lv_aux2 = <fs_wa2>-f1.
    SPLIT lv_aux2 AT CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB INTO TABLE it_tabla.
    * BREAK-POINT.
    endloop.

    Esto me funciono un poco mas, pero el problema es que: mi archive (cada linea) tiene separacion con un punto y coma, no con un # entonces me lo separa bien raro.

    No encontre como indicarle a la function que el separador era ';'

    3) Quise hacerlo manualmente:

    loop at <fs_xtabla> ASSIGNING <fs_wa2>.
    lv_aux2 = <fs_wa2>-f1.
    SPLIT lv_aux2 AT separator INTO lv_aux.
    * SPLIT lv_aux2 AT CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB INTO TABLE it_tabla.
    * lv_aux2 = <fs_wa2>-f1.
    * lv_aux2 = 'aa;bb;cc;dddd;ee;'.
    * SPLIT lv_aux2 at separator into lv_aux.
    * BREAK-POINT.
    endloop.

    La variable lv_aux esta declarada como string pero aun asi me marca el siguiente error al checker el codigo (f2) antes de activar:

    Unable to interpret "LV_AUX". Possible causes: Incorrect spelling or comma error.

    Algun consejo?


    Les agradezco, se que es un problema sencillo, pero no me sale.

    Gracias.

  • #2
    Hola!

    te estás complicando mucho, sólo debes utilizar la sentencia SPLIT.

    Cargas el archivo en una tabla interna donde cada campo es un char de 150 en este caso.

    Después hacés lo siguiente:

    Código:
    LOOP AT t_aux.
    
    SPLIT t_aux-campolargo AT ';' into
       Tabladestino-campo1
       Tabladestino-campo2
       Tabladestino-campo3.
    
    append tabladestino.
    ENDLOOP.
    Cualquier duda avisa que intentaré ayudarte.

    Comentario


    • #3
      Solucionado

      Listo koken
      Funciono tu codigo.

      quedando:

      Código:
      loop at <fs_xtable> ASSIGNING <fs_wa2>.
           lv_aux2 = <fs_wa2>-f1.
           SPLIT lv_aux2 AT ';' into
              it_table-f1
              it_table-f2
              it_table-f3.
           append it_table.
      endloop.
      tuve que declarer mi table WITH HEADER LINE

      tambien lo solucione mandando llamar la FM:

      'TEXT_CONVERT_TEX_TO_SAP'

      quedando:

      Código:
        CALL FUNCTION 'TEXT_CONVERT_TEX_TO_SAP'
          EXPORTING
            I_FIELD_SEPERATOR    = ';'
            i_tab_raw_data       = gt_raw_data[]
          TABLES
            I_TAB_CONVERTED_DATA = it_table[]
          EXCEPTIONS
            CONVERSION_FAILED    = 1
            OTHERS               = 2.
        IF SY-SUBRC <> 0.
          MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
                 WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
        ENDIF.
      Gracias Felices Fiestas

      Comentario

      Trabajando...
      X