Bajar un reporte de fondo en .xls

El usuario requería bajar la información de un ALV grid a un xls, pero la corrida iba a ser en fondo. Y la bajada tenía que ser tal cual el ALV grid, mismo orden de columnas, nombres, etc.

En resumen, antes de la ejecución del ALV se uso la función  ‘LT_DBDATA_READ_FROM_LTDX’ para leer el catálogo de una variante de disposición, después por medio de una tabla dinámica parseo los datos y son bajados en el servidor por medio de OPEN DATASET en un texto plano separado con tabuladores pero con extensión .xls

El Excel ya automáticamente lo abre correctamente.

Dejo el código para darse una idea del desarrollo.

DATA: l_varkey    TYPE LTDXKEY,
      TI_LTDXDATA TYPE TABLE OF LTDXDATA WITH HEADER LINE,
      WA_LTDXDATA TYPE LTDXDATA,
      flag_no_out(1),
      l_variante  TYPE ZRPT_HPARAM1-DESCRIPCION,
      l_ruta      TYPE ZRPT_HPARAM1-DESCRIPCION,
      l_archivo   TYPE ZRPT_HPARAM1-DESCRIPCION,
      l_path(120).

  l_varkey-REPORT = sy-repid.
  l_varkey-VARIANT = l_variante.
  l_varkey-TYPE = ‘F’.

* Se lee el catálogo de la variante
  CALL FUNCTION ‘LT_DBDATA_READ_FROM_LTDX’
    EXPORTING
      I_TOOL             = ‘LT’
      IS_VARKEY          = l_varkey
    TABLES
      T_DBFIELDCAT       = TI_LTDXDATA
    EXCEPTIONS
      NOT_FOUND          = 1
      WRONG_RELID        = 2
      OTHERS             = 3 .
  IF SY-SUBRC = 0.

    LOOP AT TI_LTDXDATA.
      WA_LTDXDATA = TI_LTDXDATA.
      AT NEW KEY1.
        CLEAR flag_no_out.
      ENDAT.

      IF WA_LTDXDATA-PARAM = ‘NO_OUT’ AND WA_LTDXDATA-VALUE = ‘X’.
        flag_no_out = ‘X’.
      ENDIF.

      AT END OF KEY1.
        IF flag_no_out IS INITIAL.
          ti_columns-name = TI_LTDXDATA-KEY1.
          APPEND ti_columns.
        ENDIF.
      ENDAT.
    ENDLOOP.
  ENDIF.

* Creación de tabla interna dinámica
TYPE-POOLS : abap.
FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE,
               <dyn_wa>,
               <dyn_field>.

DATA: dy_table TYPE REF TO data,
      dy_line  TYPE REF TO data,
      xfc TYPE lvc_s_fcat,
      ifc TYPE lvc_t_fcat,
      l_string(1024),
      l_xls(1024).

class cl_abap_char_utilities definition load.
DATA: tab type x value 9,
      htab(1) type c,
      l_newline(1),
      f_flag(1),
      ls_fieldcat TYPE LINE OF slis_t_fieldcat_alv..

htab = cl_abap_char_utilities=>horizontal_tab.
l_newline = cl_abap_char_utilities=>CR_LF.

DATA: begin of ti_lines OCCURS 0,
        texto(40),
      END OF ti_lines.

  LOOP AT ti_columns.
    CLEAR xfc.
    xfc-fieldname = ti_columns-name .
    xfc-datatype = ‘CHAR’.
    xfc-OUTPUTLEN = ’40’.
    APPEND xfc TO ifc.
  ENDLOOP.

* Create dynamic internal table and assign to FS
  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog  = ifc
      i_length_in_byte = ‘X’
    IMPORTING
      ep_table         = dy_table.
  ASSIGN dy_table->* TO <dyn_table>.

* Create dynamic work area and assign to FS
  CREATE DATA dy_line LIKE LINE OF <dyn_table>.
  ASSIGN dy_line->* TO <dyn_wa>.

CONCATENATE l_ruta l_archivo ‘.xls’ INTO l_path.

OPEN DATASET l_path FOR OUTPUT IN TEXT MODE ENCODING DEFAULT .
IF sy-subrc <> 0.
  WRITE: / text-M05, l_path.
ENDIF.

CLEAR: l_xls, f_flag.
LOOP AT ti_columns.
  READ TABLE gt_fieldcat WITH KEY fieldname =     ti_columns-name INTO ls_fieldcat.
  IF sy-subrc = 0.
   IF f_flag IS INITIAL.
     l_xls = ls_fieldcat-seltext_l.
     f_flag = ‘X’.
   ELSE.
   concatenate l_xls ls_fieldcat-seltext_l INTO l_xls SEPARATED BY htab.
   ENDIF.
  ENDIF.
ENDLOOP.
TRANSFER l_xls TO l_path.

DATA: TYP(1),
      col(40),
      l_i TYPE I,
      col_wa(40).

FIELD-SYMBOLS: <col_value> TYPE ANY,
               <column> TYPE ANY.

CLEAR: l_xls, f_flag.
LOOP AT gt_outtab. “gt_outtab es la tabla que muestra el ALV con sus datos y columnas.
  MOVE-CORRESPONDING gt_outtab TO <dyn_wa>.
  LOOP AT ti_columns.
    READ TABLE gt_fieldcat WITH KEY fieldname = ti_columns-NAME INTO ls_fieldcat.
    IF sy-subrc = 0.
      CONCATENATE ls_fieldcat-tabname ‘-‘ ls_fieldcat-fieldname INTO col.
      CONCATENATE ‘<dyn_wa>-‘ ls_fieldcat-fieldname INTO col_wa.
      ASSIGN (col) TO <col_value>.
      ASSIGN (col_wa) TO <column>.
      CLEAR typ.
      DESCRIBE FIELD <col_value> TYPE typ LENGTH l_i.
      IF typ = ‘D’.

        CONCATENATE <col_value>+6(2) <col_value>+4(2) <col_value>(4) INTO <column> SEPARATED BY ‘-‘.
      ELSEIF typ = ‘P’.
        <column> = <col_value>.
        TRANSLATE <column> USING ‘.,’.
      ELSEIF typ = ‘I’.
        <column> = <col_value>.
        IF <col_value> < 0.
          <column>  = <col_value>.
          CALL FUNCTION ‘CLOI_PUT_SIGN_IN_FRONT’
            CHANGING
              VALUE         = <column>.
        ENDIF.
      ENDIF.

      CONDENSE <column>.
      IF f_flag IS INITIAL.
        l_xls = <column>.
        f_flag = ‘X’.
      ELSE.
      concatenate l_xls <column> INTO l_xls SEPARATED BY htab.
      ENDIF.
    ENDIF.
  ENDLOOP.

TRANSFER l_xls TO l_path.
CLEAR: l_xls, f_flag.
ENDLOOP.

CLOSE DATASET l_path.
ENDIF. "Variant

6 Responses to “Bajar un reporte de fondo en .xls”

  1. dumpman@gmail.com Says:

    Hola, en http://saperosonline.blogspot.com.es/2013/12/recoger-los-campos-en-pantalla-de-un.html he hecho referencia a este post.
    Saludos y gracias, tu trabajo me ha ayudado montón!

  2. Clund19624.wordpress.com Says:

    Ajit Weekly s mark variations followed the reasons of
    feline genus cancer and vaccinum colligated sarcoma is a complicated topic.

    Bump more please describe type of workout and frequence.
    The Pearl River curse word and needed to provide info that is true and right to the topper
    of their ability.

  3. Rodrigo Giner de la Vega Says:

    el parámetro I_SAVE puede tomar varios valores. Te dije la A porque es la que permite ambos modos, standard y por usuario.

    ‘ ‘ = Display variants cannot be saved
    ‘X’ = Standard save mode
    ‘U’ = User-specific save mode
    ‘A’ = Standard and user-specific save mode

    Con respecto a la gt_outtab. la estructura es la que muestra el ALV dependerá de como lo tienen ustedes.

    Como la bajada se hace artesanalmente por ejemplo si tienen un campo fecha lo bajaría con el formato interno ‘20110817’ porque no van a pasar las rutinas de conversión.

    Actualicé el código con la última versión que tiene algunas conversiones, el que estaba era viejo y a veces funcionaba mal.

    Disculpas por la desprolijidad acabo de darme cuenta que se murío el plug in que usaba para codificar código ABAP. -_-

    Saludos

  4. vanesa Says:

    muchas gracias desde ya

  5. vanesa Says:

    Hola Rodrigo, estoy viendo este codigo, y tengo unas dudas: la tabla gt_outtab la estamos “loopeando ” pero no la estamos llenando, esto es correcto? igualmente al no tener de que tipo es se me complico un poco ver donde llenarla.
    La otra consulta es si cuando llamamos a la FM del ALV, el I_SAVE tendria que ser X? en una consulta me respondiste que sea A.


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: