lunes, 5 de mayo de 2014

Crear Excell con objetos OLE2

En este post voy a describir un ejemplo de conectividad y programación Excel desde SAP/R3 mediante la tecnología OLE2.

  Desde SAP es posible arrancar Excel y ejecutar todos sus comandos como crear objetos como filas, libros, rangos de celdas, etc; sobre los cuales se pueden ejecutar métodos como insertar, copiar, asignar propiedades a una celda (como formato numérico con separador de miles), asignar texto a una celda, etc.
En definitiva, está disponible desde ABAP todo el lenguaje de programación Excel.

REQUERIMIENTOS FUNCIONALES
Se desea volcar a Excel un listado obtenido desde SAP. Se puede generar un fichero de texto que luego podrá ser abierto desde Excel (donde habrá que formatearlo cuidadosamente de forma manual) o se puede abrir Excel y mostrar la información en un archivo ya formateado directamente desde SAP.

CONSIDERACIONES TÉCNICAS
Para la comunicación via OLE2 se dispone de las sentencias ABAP

CREATE OBJECT
CALL METHOD
SET PROPERTY
GET PROPERTY

Todos los programas que utilicen tecnología OLE2 deberán hacer referencia al include OLE2INCL, que contiene las definiciones de tipos necesarias para declarar los objetos.
Asimismo en SAP existe la transacción SOLI que muestra las aplicaciones que soportan comunicación OLE2 con sus infotipos. Los infotipos son la relación de verbos (propiedades y métodos) de una aplicación; así en este ejemplo el infotipo comprende la relación de métodos y propiedades de Excel. Otra forma de consultar el infotipo es mediante la transacción SE16 sobre la tabla OLELOAD. De cualquiera de las dos formas se pueden consultar las acciones a ejecutar sobre aplicaciones externas mediante OLE, accesibles desde un programa ABAP.

PROCEDIMIENTO A SEGUIR
Para volcar la información de un listado SAP a formato Excel, se creará una tabla interna con todo el contenido del listado, teniendo en cuenta que se declararán en la tabla interna de trabajo los valores numéricos como campos de tipo numérico (puesto que en caso de que se declaren de tipo texto, una vez en Excel no se podrá efectuar cálculos con dichos campos).
Una vez informada la tabla interna se grabará en un fichero local con la función WS_DOWNLOAD, siendo el formato del fichero destino WK1 (formato para hoja de cálculo).
A continuación se deberá arrancar Excel, abrir el fichero, crear un libro nuevo, copiar los datos del fichero al libro y cerrar el fichero. Después se puede formatear las columnas numéricas con punto en los miles, insertar la cabecera del listado con los textos correspondientes en la fila uno del libro y aplicar al libro una presentación en rejilla.

Para realizar todos estos pasos sólo hay que utilizar los verbos correspondientes en el infotipo de la aplicación Excel. Con el objeto de conocer la sintaxis exacta, la mejor solución es grabar todas las acciones a realizar en una macro de Excel, donde se podrá consultar a continuación la sintaxis de las diferentes intrucciones Excel que se han ejecutado, pudiendo entonces reproducir este código en ABAP.

        A continuación se muestra cómo se procedería para abrir un fichero
Se crea el objeto Hoja Excel
Create object hoja_excel ‘Excel.Sheet’
Donde hoja_excel es una variable de tipo ole2_object.
Para tener acceso a todos los verbos EXCEL desde el programa se debe crear el objeto aplicación excel como un método del objeto hoja_excel
CALL METHOD OF hoja_excel ‘Application’ = excel
La macro grabada en Excel al abrir el fichero contiene la siguiente instrucción
Workbooks.Open FileName:="C:\Mis documentos\P2210.xls",
Se identifica Workbooks como objeto y OpenFileName como el método que se ejecuta sobre el objeto Workbooks, con el nombre del archivo como un parámetro del método OpenFileName.
Se localiza en la la tabla OLELOAD el verbo WORKBOOKS, que es un método del objeto aplicación Excel creado (a esta conclusión se llega consultado la ayuda de Visual Basic para Excel). Por tanto se puede crear el objeto libros_trabajo aplicando el método WORKBOOKS sobre el objeto excel del modo siguiente:
CALL METHOD OF excel ‘WORKBOOKS’ = libros_trabajo
Finalmente ya se puede aplicar el método OpenFileName sobre el objeto libros_trabajo
CALL METHOD OF libros_trabajo = libro EXPORTING 1# = ‘C:\Mis documentos\P2210.xls’.

PROGRAMA SAP R/3
Se adjunta el código fuente del programa desarrollado en ABAP para SAP R/3 v4.0b, "ZEXCEL".
REPORT zexcel.
************************************************************************
* Include necesario para la declaracion de objetos OLE2
************************************************************************
INCLUDE ole2incl.
************************************************************************
************************************************************************
* Declaraciones para la llamada a EXCEL.
DATA hoja_excel TYPE ole2_object.
DATA excel TYPE ole2_object.
DATA libro TYPE ole2_object.
DATA ole_sheets TYPE ole2_object.
DATA ole_sheet TYPE ole2_object.
DATA ole_libro TYPE ole2_object.
DATA libros_trabajo TYPE ole2_object.
DATA ole_datasheet TYPE ole2_object.
DATA ole_datacells TYPE ole2_object.
DATA l_lines TYPE i.
DATA l_lineas(10) TYPE c.
DATA rango TYPE ole2_object.
DATA row TYPE ole2_object.
DATA ventana TYPE ole2_object.

DATA end(10) TYPE c.
* Se crea el objeto Hoja Excel.
CREATE OBJECT hoja_excel 'Excel.Sheet'.
* Se llama a la aplicación Excel.
CALL METHOD OF hoja_excel 'Application' = excel.
* Se hace visible la aplicación Excel
SET PROPERTY OF excel 'Visible' = 1.
CALL METHOD OF excel 'Workbooks' = libros_trabajo.
* Se abre el archivo con los datos del listado
CALL METHOD OF libros_trabajo 'Open' = libro EXPORTING
  #1 = 'C:\DOCS\PRUEBA.XLS'.
CALL METHOD OF libro 'Worksheets' = ole_sheets.
* Se crea un nuevo libro y se copian los datos del fichero al libro
CALL METHOD OF ole_sheets 'Item' = ole_datasheet EXPORTING #1 = 1.
CALL METHOD OF ole_datasheet 'Copy'.
!
* Se cierra el fichero de trabajo con los datos.
call method of libro 'Close' exporting #1 = 0.
GET PROPERTY OF excel 'ACTIVESHEET' = ole_sheet.
CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
  #1 = 'C1' #2 = 'H1'.
* Se formatea el ancho de columna
SET PROPERTY OF rango 'COLUMNWIDTH' = 21.
GET PROPERTY OF excel 'ACTIVEWINDOW' = ventana.
* Se muestra el libro con el formato en rejilla
SET PROPERTY OF ventana 'DISPLAYGRIDLINES' = -1.
FREE OBJECT rango.
* Se obtiene el total de líneas de la tabla para crear
* un rango con todas las celdas númericas y formatearlas
DESCRIBE TABLE i_detmedi LINES l_lines.
WRITE l_lines TO l_lineas.
TRANSLATE l_lineas USING '. '.
* Se aplica el formato numérico con decimales en los miles a
* las celdas que contienen importes.
CONCATENATE 'H' l_lineas INTO end.
CONDENSE end NO-GAPS.
CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
  #1 = 'C1' #2 = end.
SET PROPERTY OF rango 'NUMBERFORMAT' = '#,##0'.
FREE OBJECT rango.
*Se informa la cabecera del listado, insertando una fila en blanco al principio del mismo
CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
  #1 = 'A1'.
CALL METHOD OF rango 'ENTIREROW' = row.
CALL METHOD OF row 'INSERT'.
FREE OBJECT rango.
FREE OBJECT row.
* Creando un rango con cada una de las celdas e informando el texto
* en las celdas se obtiene la cabecera
call method of ole_sheet 'RANGE' = rango exporting
  #1 = 'A1'.
SET PROPERTY OF rango 'FORMULAR1C1' = text-003.
FREE OBJECT rango.
CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
  #1 = 'B1'.
SET PROPERTY OF rango 'FORMULAR1C1' = text-012.
FREE OBJECT rango.
CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
  #1 = 'C1'.
SET PROPERTY OF rango 'FORMULAR1C1' = text-007.
FREE OBJECT rango.
CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
  #1 = 'D1'.
SET PROPERTY OF rango 'FORMULAR1C1' = text-008.
FREE OBJECT rango.
CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
  #1 = 'E1'.
SET PROPERTY OF rango 'FORMULAR1C1' = text-013.
FREE OBJECT rango.
CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
  #1 = 'F1'.
SET PROPERTY OF rango 'FORMULAR1C1' = text-010.
FREE OBJECT rango.
CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
  #1 = 'G1'.
SET PROPERTY OF rango 'FORMULAR1C1' = text-011.
FREE OBJECT rango.
CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
  #1 = 'H1'.
SET PROPERTY OF rango 'FORMULAR1C1' = text-013.
FREE OBJECT rango.
* Se liberan todos los objetos creados
FREE OBJECT libro.
FREE OBJECT libros_trabajo.
FREE OBJECT ventana.
FREE OBJECT ole_sheet.
FREE OBJECT rango.
FREE OBJECT ole_sheets.
FREE OBJECT ole_datasheet.
FREE OBJECT hoja_excel.
FREE OBJECT excel.

No hay comentarios:

Publicar un comentario