domingo, 26 de mayo de 2013

Integración de Crystal Reports y ALV

Los ALV (Abap List Viewer) es la herramienta de SAP para presentar los informes de una manera más practica y funcional que los típicos listados de texto plano. Su interface permite funcionalidades como filtros, subtotales, totales, variantes de visualización, etc...

Crystal Reports es un aplicación, adquirida por SAP en el 2007, que sirve para diseñar y generar informes desde una amplia gama de fuentes de datos. 


En el ultimo proyecto que he trabajado, el cliente nos pidió que varios ALV pudiesen se impresos en un formato concreto y utilizando Crystal Reports. Reconozco que nunca había trabajado Crystal Reports, si era necesario imprimir el informe,  creaba un smartforms y lo llamaba desde el ALV, pero nunca había intentado integrar ALV y Crystal Reports.

Por suerte existe INTERNET.

"Si alguien ya lo ha hecho, yo puedo hacerlo,
Si nadie lo ha hecho , yo puedo ser el primero"

Los requerimientos minimos para poder integrar ALV y Crystal Report son:
  • SapGui 7.10 o superior.
  • SAP Business Suite 7 Innovations 2010
Si ademas queremos modificar o crear los informes con Crystal Report:
  • SAP Crystal Reports 2008 SP02 o superior.
Lo primero es descargar el addon CR ADD-ON FOR BS APPS 1.0  desde el SAP SUPPORT PORTAL.

Software Downloads > Installations and Upgrade > Search for installations and Upgrade > Buscar "CR ADD-ON FOR BS APPS 1.0"



Click, y  en la nueva ventana,  Click en "Installation" , descargamos el archivo ZIP.


Descomprimir e instalar el add-on.



Despues, comprobamos que en nuestro sistema SAP se puede utilizar Crytal Repport (ECC 6.0).

Primero vamos a la transacción SALV_GUI_CUST o a través de la SPRO:
   IMG > SAP NetWeaver > Application Server > SAP List Viewer > Maintain SAP GUI Specific Settings


También es recomendable activarlo para Web Dynpro en la transacción SALV_WD_CUST


Para probarlo podemos lanzar cualquier ALV GRID(SAP GUI ALV) o Web Dynpro ABAP ALV.

Por ejemplo, ejecutamos el sencillo programa BALVSD02_GRID desde la transacción SE38.

El menú superior, en  VISTA o VIEW, aparecerá ahora la opción CRYSTAL REPORT.


Si os da algún error cuando intentéis pasar a la vista de Crystal Report, por ejemplo CR101, revisar la siguiente nota:

Note 1371966 - ALV/Crystal Reports Integration: Collective note corrections

 ¿Como se añade esa opción en los  Status GUI de  mis ALV ?

Si estáis utilizando un ALV con un Status GUI personalizado, no aparecerá la opción CRYSTAL REPORT.

Tenéis que añadir dos fcodes al Status GUI:
  • Cod. de funcion &VCRYSTAL: Activa la vista crystal report
  • Cod. de funcion &VGRID: Activa la vista ALV normal
Y por ultimo, Activar la opción de grabar/modificar Layout cuando llaméis a la función REUSE_ALV_GRID_DISPLAY

Vamos a modificar el programa Z_ALV_TO_EXCEL  de la anterior entrada para que pueda verse con crystal report.

Aqui teneis el codigo del programa sin adaptar para crystal report.

Primero le añadimos los códigos de funciones al Status GUI del ALV

Cod. de función standard para crystal report / Alv
También marcamos la opción de la función REUSE_ALV_GRID_DISPLAY para grabar layout.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
     EXPORTING
        i_callback_program             = g_repid
        i_callback_user_command        = 'USER_COMMAND_01'
        i_callback_pf_status_set       = 'SET_PF_STATUS_01'
        i_structure_name               = 'T_OUTTAB'
        is_layout                      = gs_layout
        it_fieldcat                    = gt_fieldcat[]
*        it_sort                        = gt_sort[]
*        it_excluding                   = gt_exclude[]
*        I_DEFAULT                      = 'X'
         i_save                         = 'A'  "<-------grabar layouts
         is_variant                     ls_vari
         it_events                      gt_events[]
     TABLES
        t_outtab                       ti_spfli
     EXCEPTIONS
        program_error                  1
        OTHERS                         2.


Ejecutamos el programa.



Si tenemos instalado el SAP Crystal Reports 2008 SP02 o superior podemos descargarnos el formulario a un archivo RPT y modificarlo.



Una vez modificado, importamos el archivo RPT a SAP.


Por ultimo, para que pueda ser visualizado por cualquier usuario que ejecute el programa, grabamos el formulario de crystal report modificado como un layout del ALV.


Cuando el usuario ejecute el programa seleccionara el layout o se puede dejar como layout por defecto.


Fuentes:

lunes, 6 de mayo de 2013

Clasicos Abap: Subir una hoja Excel a una tabla interna

Otro escenario clásico en un proyecto de Sap es, subir los datos contenidos en una hoja excel a una tabla interna para poder trabajar con ellos en el sistema Sap. Por ejemplo, un programa que modifique los precios de los materiales en base a los datos que lee de una hoja excel.

Para subir una hoja Excel  a una tabla interna utilizaremos la bapi TEXT_CONVERT_XLS_TO_SAP.


Todos los campos de la tabla interna debe ser de tipo carácter. Si necesitamos utilizar campos de tipo numérico, primero subimos los datos a una tabla con todos sus campos de tipo carácter y después deberemos implementar un código que convierta los registros de la tabla interna al formato requerido en una nueva tabla interna, esta vez ya como campos numéricos.

Esto se ve siempre mejor con un ejemplo.
Solo voy  a comentar las partes importantes del código, aquí os dejo el código completo.

El usuario quiere actualizar los precios de los materiales a través de una hoja excel con el siguiente formato:
  • Proveedor
  • Material
  • Tipo Registro Info
  • Precio
  • Cantidad Base
  • Moneda
  • UM Precio
El programa subirá los datos de un fichero Excel a una tabla interna y los mostrara por pantalla con un ALV.

*&---------------------------------------------------------------------*
*&      Form  set_filepath
*&---------------------------------------------------------------------*
* Este FORM sirve para el explorador en el que se selecciona el archivo
*----------------------------------------------------------------------*
FORM set_filepath  CHANGING po_ruta TYPE rlgrap-filename.

  CONSTANTS: c_ext_exl   TYPE string     VALUE '*.XLS'.

  DATA: lt_filetable TYPE filetable,
        lx_filetable TYPE file_table,
        wl_sel_text  TYPE string,
        lv_rc TYPE i.

  CLEAR po_ruta.

  wl_sel_text = text-s01.

  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      window_title            = wl_sel_text
      default_extension       = c_ext_exl
    CHANGING
      file_table              = lt_filetable
      rc                      = lv_rc
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      not_supported_by_gui    = 4
      OTHERS                  = 5.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ELSE.
    READ TABLE lt_filetable INTO lx_filetable INDEX 1.
    CHECK sy-subrc EQ 0.
    po_ruta = lx_filetable-filename.
  ENDIF.


ENDFORM.                    " SET_FILEPATH

La siguiente subrutina, sube el archivo excel a una tabla interna, definida con todos sus campos de tipo carácter. Aun no podemos trabajar con estos datos, pues pueden no ser compatibles con los formatos internos de SAP. Por ultimo, recorremos la tabla interna, realizando las conversiones y comprobaciones pertinentes, traspasando los valores, ya en formato interno valido par SAP, a una nueva tabla interna.


*&---------------------------------------------------------------------*
*&      Form  UPLOAD_EXCEL_IT
*&---------------------------------------------------------------------*
*& Subir un archivo excel a una tabla interna
*&---------------------------------------------------------------------
FORM upload_excel_it USING    pi_ruta TYPE rlgrap-filename
                     CHANGING to_file TYPE type_t_datos.


  TYPES: BEGIN OF type_excel,
       lifnr(10) TYPE c, "Proveedor
       matnr(18) TYPE c, "Material
       esokz(1)  TYPE c, "Tipo Registro Info
       netpr(13) TYPE c, "Precio
       peinh(5)  TYPE c, "Cantidad Base
       waers(3)  TYPE c, "moneda
       bprme(3)  TYPE c, "UM Precio
  END OF type_excel.

  DATA: tl_exc TYPE STANDARD TABLE OF type_excel.
  DATA: it_raw TYPE truxs_t_text_data.


  FIELD-SYMBOLS: <fs_exc>  TYPE type_excel,
                 <fs_file> TYPE LINE OF type_t_datos.

  REFRESH: to_file, tl_exc.

  CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
    EXPORTING
*     I_FIELD_SEPERATOR    =
*     i_line_header        = 'X'
      i_tab_raw_data       = it_raw       " WORK TABLE
      i_filename           = pi_ruta
    TABLES
      i_tab_converted_data = tl_exc[]    "ACTUAL DATA
    EXCEPTIONS
      conversion_failed    = 1
      OTHERS               = 2.

  IF ( sy-subrc <> 0 ).
    MESSAGE text-e02  TYPE 'I' DISPLAY LIKE 'E'.
  ELSE.

    DELETE  tl_exc INDEX 1.                    "eliminar la cabecera

    LOOP AT tl_exc ASSIGNING <fs_exc>.

      APPEND INITIAL LINE TO to_file ASSIGNING <fs_file>.

      PERFORM conversion_sap_format USING <fs_exc>-lifnr CHANGING <fs_file>-lifnr.
      PERFORM conversion_sap_format USING <fs_exc>-matnr CHANGING <fs_file>-matnr.
      PERFORM conversion_sap_format USING <fs_exc>-esokz CHANGING <fs_file>-esokz.
      PERFORM conversion_sap_format USING <fs_exc>-waers CHANGING <fs_file>-waers.

      PERFORM conversion_sap_unit USING <fs_exc>-bprme CHANGING <fs_file>-bprme.

      PERFORM conversion_sap_num USING <fs_exc>-netpr CHANGING <fs_file>-netpr.
      PERFORM conversion_sap_num USING <fs_exc>-peinh CHANGING <fs_file>-peinh.

  ENDLOOP.
ENDIF.

ENDFORM.                    " UPLOAD_EXCEL_IT

*&---------------------------------------------------------------------*
*&      Form  CONVERSION_SAP_FORMAT
*&---------------------------------------------------------------------*
FORM conversion_sap_format  USING    pi_output
                            CHANGING po_output.

  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      input  = pi_output
    IMPORTING
      output = po_output.

ENDFORM.                    " CONVERSION_SAP_FORMAT
*&---------------------------------------------------------------------*
*&      Form  CONVERSION_SAP_UNIT
*&---------------------------------------------------------------------*
FORM conversion_sap_UNIT  USING    pi_output
                          CHANGING po_output.

      CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
        EXPORTING
          input          = pi_output
          language       = sy-langu
        IMPORTING
          output         = po_output
        EXCEPTIONS
          unit_not_found = 1.

      IF sy-subrc <> 0.
        clear po_output.
      ENDIF.

ENDFORM.                    " CONVERSION_SAP_FORMAT
*&---------------------------------------------------------------------*
*&      Form  CONVERSION_SAP_NUM
*&---------------------------------------------------------------------*
FORM conversion_sap_NUM  USING    pi_output
                          CHANGING po_output.

      CALL FUNCTION 'MOVE_CHAR_TO_NUM'
        EXPORTING
          chr             = pi_output
        IMPORTING
          num             = po_output
        EXCEPTIONS
          convt_no_number = 1
          convt_overflow  = 2
          OTHERS          = 3.

      IF sy-subrc <> 0.
        clear po_output.
      ENDIF.

ENDFORM.                    " CONVERSION_SAP_FORMAT



Entradas relacionadas:
Clasicos ABAP: Descargar tabla interna a una hoja Excel

sábado, 4 de mayo de 2013

GUIXT: Personalizar el acceso al sistema y el comando image

Un sencillo script de GuiXT que modifica el aspecto visual de la  pantalla de acceso al sistema Sap y le añade una nueva funcionalidad. El script, añadirá una imagen con el logo de la compañía y un pulsador para que, en caso de problemas al acceder al sistema, pueda enviarse un email al administrador de sistemas.

Acceso al sistema Sap

Box (3,1) (11,85) "Acceso al sistema"

pos F[Clv.acc.]    (7,28)   
pos F[Idioma]      (8,28)  
pos F[Mandante] (5,28)  
pos F[Usuarios]   (6,28) 

Image (4,2) (9,25) "logo.jpg" 

text (9,28)   "Problemas de acceso?"
text (10,28) "Por favor, envie un email "
image(9,48) "email.gif" start="mailto:admin@datra.com?subject=Logon in system &V[_database]"
text (10,55) "al administrador"


Acceso al sistema Sap modificado por el script GuiXT

Excepto el comando Image, el resto de comandos utilizados en el script se han explicado en la entrada anterior.

El comando Image permite añadir imágenes, GuiXT admite los formatos BMP, GIF y JPG.
Es un comando muy  versátil, con muchas opciones y parámetros como veremos a continuación.

Image (row,column) "Name of image file"
Image (row1,column1) (row2,column2) "Name of image file"

Solo se admiten los siguientes formatos: BMP, GIF y JPG.

Si no se especifica ninguna ruta para acceder a la imagen,  por defecto, se busca en el mismo directorio en donde se encuentra el script de GuiXT que ejecuta el comando Image. Es posible  acceder a imágenes guardadas en un servidor http o FTP y en el  Repositorio Web de Sap.
Parámetros:
  • (row1,column1) ó (row,column): coordenadas de la esquina superior izquierda 
  • (row2,column2) : coordenadas de la esquina inferior derecha
Opciones:
  • -NoStretch  : Mantiene la anchura y altura de la imagen original 
  • -Plain  : Sin marco resaltado 
  • -NoBuffer  :No se almacena en memoria intermedia. 
  • -Transparent : Solo aplicable a GIF de 8 bits, la imagen se muestra de forma transparente, toma el fondo de la pantalla .
Aparte de estas opciones, también existen unos parámetros especiales para dibujar texto plano sobre la imagen:

  • Textstring=   : Escribe un texto plano sobre la imagen.
  • Textfont=      : Fuente del texto, por defecto es Arial y en sistemas Unicode Arial Unicode MS. 
  • Textcolor=    : Color del texto.
  • Textheight=  : Altura en pixeles, por defecto 10.
  • Textweight=  : Anchura, el valor es entre 1 ( fina) y 9 ( gruesa ), resaltado es 7
  • Textarea=     : Área de la imagen donde se dibujara el texto
                    ..... Textarea=(10,20)       Área de 10x20 desde la esquina superior izquierda
                    ..... Textarea=(-50,-50)    Área de 50x50 desde la esquina inferior derecha
                    ..... Textarea=(30,50,-30,-50)    Área 30x50 centrada en la imagen
  • -textcenter    : El texto queda centrado en la imagen
Por Ejemplo, en el script anterior, para dibujar el texto  "GUIXT" sobre la imagen del logo

   Image (4,2) (9,25) "logo.jpg"  textstring="GUIXT" textheight=80 -textcenter

Texto sobre la imagen

Es posible mostrar varias imágenes en una misma posición, por ejemplo:.

   Image (10,40) (16,65) "img&##.gif"

Para esta finalidad re-nombraremos las imágenes de la siguiente manera :

    IMG01.gif, IMG02.gif, IMG03.gif…..

Por cada click con el botón derecho del ratón sobre la imagen, se incrementara el contador. Sustituyendo los comodines  por 1, 2, 3 o 01, 02, 03 o también 001, 002, 003 (depende de cuantos comodines utilicemos &#, &##, &### ).

Es posible relacionar también la imagen con un campo de datos de la pantalla. Por ejemplo,  si el usuario introduce por pantalla el código de material A03, mostrar por pantalla la imagen imgA06.jpg. Recordemos que para extraer el valor de una variable o elemento de la pantalla, se antepone el carácter especial “&” al nombre de la variable o campo de la pantalla ( Por  ejemplo: &V[data_nombre] , &F[Material] ).

   Image (4,80) "C:\products\img&F[Material].jpg"
La versatilidad de este comando es tal, que si no esta disponible la imagen, podemos ejecutar un archivo exe o bat para que copie la imagen de cualquier localización posible a un directorio local

   Image (row,column) "Name of image file" exe="program name"

   Image (10,40) (18,74) "C:\tempimg\imagen1.gif" exe="C:\prog\getchart.exe"

Una opción muy interesante, es convertir la imagen en interactiva, que responda ante alguna acción o evento provocado por el  usuario, como un click con el ratón, sobre la imagen. este evento o acción puede dar como resultado que se ejecute un Input Screen ( ya lo explicare mas adelante ) o una opción del menú.

    Image (row,column) "Name of image file" Input="string" 

Por ejemplo:

    Al pulsar sobre la imagen, se rellena el campo de la pantalla 'Material' y se ejecuta INTRO.
    Image (4,10) "logo.jpg" Input="Material:1221;OK"

    Al pulsar sobre la imagen, se rellenan los campos de la pantalla 'Material' y 'Planta, pero no se ejecuta intro.
    Image (4,10) "logo.jpg" Input="Material:1221;Planta:1001" 

    Ejecutar   Funciones del menú, selección de vistas en la MM03 al pulsar en la imagen
    Image (4,10) "logo.jpg"  "Input=OK:AUSW" 

    Llamar a otra transaccion en la misma ventana o generar una ventana nueva
    Image (4,10) "logo.jpg"  Input="OK:/NMM01" 
    Image (4,10) "logo.jpg"  Input="OK:/OMM01" 

    Llamar a un Input Screen con parámetros de entrada.
    Image (4,10)   "numbutton.gif" Input="U[digit]:7;OK:process=digit.txt"

El comando también permite ejecutar una aplicación o software externo, un archivo HTLM o un documento, ademas de archivos ejecutables exe o bat

   Image (row,column) "Name of image file" Start="string" 

Por Ejemplo:

   Llamar a un archvio HTLM
   Image (4,10) "logo.jpg"  Start="\\P00800\Doc12\me21.html"


Si estamos utilizando GuiXT para dar soporte a una pantalla táctil, las opciones siguientes pueden ayudar a crear una navegación a través del sistema, por ejemplo, si estamos mostrando un ALV por pantalla podemos crear nuestro propio pulsador para desplazarnos entre las líneas en el ALV.

    Image (0,1) (3,8) "nextline.gif" Input="X[Grid1]:<DOWN>"

Están soportadas las siguientes funciones:
  •  <DOWN> Cursor abajo 
  •  <UP> Cursor arriba 
  •  <LEFT> Cursor a la izquierda 
  •  <RIGHT> Cursor a la derecha 
  •  <NEXT> Page down 
  •  <PRIOR> Page up 
  •  <END> End 
  •  <HOME> Home 
  •  <BOTTOM> Ctrl+End 
  •  <TOP> Ctrl+Home

Panel táctil con GuiXT

jueves, 2 de mayo de 2013

Clasicos ABAP: Descargar tabla interna a una hoja Excel

Esto es un clásico de la programación ABAP que no puede faltar en todo desarrollo , proyecto , listado , etc... siempre habrá un usuario que te pedirá que el listado 'A', 'B' o 'C' tenga la opción de descargarse  a una hoja Excel.

Para descargar una tabla interna a una hoja de excel:  bapi MS_EXCEL_OLE_STANDARD_DAT

IMPORTANTE: Para que esta bapi os funcione, es necesario que la aplicación Microsoft EXCEL este instala en el equipo local.  Esta bapi envía los datos al SapGUI y después al EXCEL, por tanto tampoco funcionara si ejecutáis el programa como un job en fondo o si queréis que el fichero se cree en el servidor o en una unidad de red.

Si  la tabla interna tiene campos numéricos, por ejemplo integer, float... al ejecutar la bapi MS_EXCEL_OLE_STANDARD_DAT saltara un precioso dump. Esto esta relacionado con lo que anteriormente os he comentado, la Bapi no realiza ningún ajuste, transformación o cast con los datos, lo que puede derivar en problemas con campo numérico, decimales o fechas.

Hay que crear otra tabla interna,  idéntica a la que queremos descargar a excel, pero con todos sus campos de tipo carácter. Traspasaremos los registros a la nueva tabla y descargaremos el contenido de la tabla a una hoja excel con la bapi MS_EXCEL_OLE_STANDARD_DAT.

Un ejemplo vale mas que  mil palabras....

Listado ALV que muestra los vuelos para las compañías y fechas seleccionadas:

Nota: solo voy a pegar las partes importantes del código, si queréis el código completo del ejemplo lo tenéis aquí.


Añadir un pulsador para descargar el ALV a una hoja excel y el siguiente código para controlar el evento.

*---------------------------------------------------------------------*
*       FORM USER_COMMAND_01  Process Call Back Events (Begin)         *
*---------------------------------------------------------------------*
FORM user_command_01 USING ucomm    LIKE sy-ucomm
                        selfield TYPE slis_selfield.

  DATA: wl_file TYPE string.

  CASE ucomm.
    WHEN '&EXC'.
      PERFORM get_filename  CHANGING wl_file.
      PERFORM download_to_exc  USING wl_file ti_spfli.
  ENDCASE.
ENDFORM.                    "user_command_01

*---------------------------------------------------------------------*
*      Form  GET_FILENAME
*---------------------------------------------------------------------*
*     Abrir navegador para seleccionar fichero
*----------------------------------------------------------------------*
FORM get_filename  CHANGING p_file TYPE string.

  DATA w_file LIKE rlgrap-filename.

  CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
    CHANGING
      file_name     = w_file
    EXCEPTIONS
      mask_too_long = 1
      OTHERS        = 2.

  p_file = w_file.

ENDFORM.                      "GET_FILENAME

*---------------------------------------------------------------------*
*      Form  DOWNLOAD_TO_EXC
*---------------------------------------------------------------------*
FORM download_to_exc  USING Pi_file  TYPE STRING
                            ti_spfli TYPE type_t_spfli.

  TYPES: BEGIN OF tl_name,
    fldname(11) TYPE c,
   END OF tl_name.

  DATA: tl_name  TYPE STANDARD TABLE OF tl_name.

  DATA: wl_file TYPE  rlgrap-filename.

  FIELD-SYMBOLS:  <FL> TYPE tl_name.

  wl_file = Pi_file.

  LOOP AT gt_fieldcat .
    APPEND INITIAL LINE TO tl_name ASSIGNING <FL>.
    <FL>-fldname =  gt_fieldcat-fieldname.
  ENDLOOP.

  CALL FUNCTION 'MS_EXCEL_OLE_STANDARD_DAT'
    EXPORTING
      file_name                 = wl_file
      data_sheet_name           = 'SPFLI'
      password_option           = 0
    TABLES
      data_tab                  = ti_spfli
      fieldnames                = tl_name
    EXCEPTIONS
      file_not_exist            = 1
      filename_expected         = 2
      communication_error       = 3
      ole_object_method_error   = 4
      ole_object_property_error = 5
      invalid_filename          = 6
      invalid_pivot_fields      = 7
      download_problem          = 8
      OTHERS                    = 9.

  CASE sy-subrc.
    WHEN 1.
      MESSAGE e000(yv01) WITH 'File does not exist'.
    WHEN 2.
      MESSAGE e000(yv01) WITH 'Filename expected'.
    WHEN 3.
      MESSAGE e000(yv01) WITH 'Communication error'.
    WHEN 4.
      MESSAGE e000(yv01) WITH 'OLE object method error'.
    WHEN 5.
      MESSAGE e000(yv01) WITH 'OLE object property error'.
    WHEN 6.
      MESSAGE e000(yv01) WITH 'Invalid filename'.
    WHEN 7.
      MESSAGE e000(yv01) WITH 'Invalid pivot fields'.
    WHEN 8.
      MESSAGE e000(yv01) WITH 'Download problem'.
    WHEN 9.
      MESSAGE e000(yv01) WITH 'Other problem'.
  ENDCASE.


ENDFORM.                    " DOWNLOAD_TO_EXC


La tabla interna TL_NAME son las cabeceras de las columnas. Si comentáis el parámetro de entrad de la bapi o le pasáis una tabla interna vacía, generara la hoja excel sin cabecera para las columnas.

Preguntamos donde quiere guardar la hoja excel


Tabla interna descargada a hoja excel

En este ejemplo , como todos los campos son de tipo caracter ( CONNID es NUMC, texto numérico ) , no existe ningun problema en pasar directamente la tabla a la bapi MS_EXCEL_OLE_STANDARD_DAT. Pero, si añadimos un nuevo campo numerico a la tabla interna:

TYPES: BEGIN OF type_spfli,
  carrid     TYPE spfli-carrid,    "compañía aérea
  connid     TYPE spfli-connid,    "Código de conexión de vuelo directo
  countryf   TYPE spfli-countryfr, "Clave de país
  cityfrom   TYPE spfli-cityfrom,  "Ciudad de salida
  airpfrom   TYPE spfli-airpfrom,  "Aeropuerto de salida
  countryto  TYPE spfli-countryto, "Clave de país
  cityto     TYPE spfli-cityto,    "Ciudad de llegada
  airpto     TYPE spfli-airpto,    "Aeropuerto de destino
  integer    TYPE i,               "CAMPO NUMERICO
END OF type_spfli.

Aunque el campo integer este vació en todos los registros, al descargar a excel dará el siguiente DUMP

sólo se permiten caracteres
Hay que traspasar, antes de llamar a la bapi, todo el contenido de la tabla ti_spfli a una tabla cuyos campos sean todos de tipo caracter.



*---------------------------------------------------------------------*
*      Form  DOWNLOAD_TO_EXC
*---------------------------------------------------------------------*
FORM download_to_exc  USING pi_file  TYPE string
                            ti_spfli TYPE type_t_spfli.

  TYPES: BEGIN OF tl_name,
    fldname(11) TYPE c,
   END OF tl_name.

  TYPES: BEGIN OF type_excel,
    carrid(3)    TYPE c,
    connid(4)    TYPE c,
    countryfr(3) TYPE c,
    cityfrom(20) TYPE c,
    airpfrom(3)  TYPE c,
    countryto(3) TYPE c,
    cityto(20)   TYPE c,
    airpto(3)    TYPE c,
    integer(15)  TYPE c,
  END OF type_excel.

  DATA: tl_name  TYPE STANDARD TABLE OF tl_name.
  DATA: tl_excel TYPE STANDARD TABLE OF type_excel.

  DATA: wl_file TYPE  rlgrap-filename.

  FIELD-SYMBOLS:  <FN> TYPE tl_name,
                  <FO> TYPE TYPE_spfli,
                  <FD> TYPE type_excel.

  wl_file = pi_file.

  LOOP AT gt_fieldcat .
    APPEND INITIAL LINE TO tl_name ASSIGNING <FN>.
    <FN>-fldname =  gt_fieldcat-fieldname.
  ENDLOOP.

  LOOP AT ti_spfli ASSIGNING <FO>.

    APPEND INITIAL LINE TO TL_EXCEL ASSIGNING <FD>.

    MOVE: <FO>-carrid    TO <FD>-CARRID,
          <FO>-connid    TO <FD>-CONNID,
          <FO>-countryfr TO <FD>-countryfr,
          <FO>-cityfrom  TO <FD>-cityfrom,
          <FO>-airpfrom  TO <FD-airpfrom,
          <FO>-countryto TO <FD>-countryto,
          <FO>-cityto    TO <FD>-cityto,
          <FO>-airpto    TO <FD>-airpto.

    WRITE <FO>-integer TO <FD>-INTEGER.

  ENDLOOP.

  CALL FUNCTION 'MS_EXCEL_OLE_STANDARD_DAT'
    EXPORTING
      file_name                 = wl_file
      data_sheet_name           = 'SPFLI'
      password_option           = 0
    TABLES
      data_tab                  = TL_EXCEL
      fieldnames                = tl_name
    EXCEPTIONS
      file_not_exist            = 1
      filename_expected         = 2
      communication_error       = 3
      ole_object_method_error   = 4
      ole_object_property_error = 5
      invalid_filename          = 6
      invalid_pivot_fields      = 7
      download_problem          = 8
      OTHERS                    = 9.

  CASE sy-subrc.
    WHEN 1.
      MESSAGE e000(yv01) WITH 'File does not exist'.
    WHEN 2.
      MESSAGE e000(yv01) WITH 'Filename expected'.
    WHEN 3.
      MESSAGE e000(yv01) WITH 'Communication error'.
    WHEN 4.
      MESSAGE e000(yv01) WITH 'OLE object method error'.
    WHEN 5.
      MESSAGE e000(yv01) WITH 'OLE object property error'.
    WHEN 6.
      MESSAGE e000(yv01) WITH 'Invalid filename'.
    WHEN 7.
      MESSAGE e000(yv01) WITH 'Invalid pivot fields'.
    WHEN 8.
      MESSAGE e000(yv01) WITH 'Download problem'.
    WHEN 9.
      MESSAGE e000(yv01) WITH 'Other problem'.
  ENDCASE.


ENDFORM.                    " DOWNLOAD_TO_EXC



Después de ajustar el código, si volvemos a ejecutar y descargar a excel:


Descargar a hoja excel tabla interna con campos numéricos
Notas relacionadas:
   721793 - Problems with MS_EXCEL_OLE_STANDARD_DAT
   104165 - Problems with MS EXCEL-download from HR-reports