Librería ABAP
zvcExcel

IMPORTANTE: La última versión que realicé de esta librería data de 2010. Es posible que en la actualidad necesite alguna adaptación.

Introducción

Es difícil tener la ocasión de escribir “SAP” y “glamour” en la misma frase. Esto es especialmente cierto a la hora de exportar ALVs como excel, sobretodo desde versiones antiguas de R/3, pues los resultados son horrorosos a la vista. Y aunque tampoco es la única manera que existe de generar hojas de cálculo desde SAP, ya que tenemos clases ABAP dedicadas, en este caso tenemos que hablar de fealdad a la hora de programarlas.

Si además queremos construir excels un tanto complejos con fórmulas, diversidad de titulares, disposiciones no estrictamente tabulares, etc…, etc… entonces estamos en un auténtico aprieto.

La solución

Para resolver todo esto presento la librería zvcExcel que, aunque no está todo lo acabada que me gustaría, en su forma actual ofrece muchas posibilidades, siendo su mejor baza el enfoque de programación que soporta, muy cercano, en el fondo, al del usuario de Office.

ejemplo elemental de uso de la librería

Estrategia

Un humano, a la hora de generar hojas de cálculo, se dedica a mover el cursor e ir rellenando allí donde le apetece o le parece más adecuado, gozando de mucha libertad a la hora de hacer el diseño. Un programa, sin embargo, por lo general sólo se limita a rellenar filas y columnas de datos con una línea de cabecera y gracias.

Rellenar usando un cursor

zvcExcel utiliza una especie de cursor que podemos “mover” libremente, utilizando un lenguaje de macros, rellenando las casillas que nos interesan, dotándolas así de diferente estética y contenidos.

Fórmulas excel reales

Mientras que lo habitual a la hora de totalizar o realizar cálculos en la exportación de éxceles es incrustarlos a piñon en el resultado, zvcExcel permite que introduzcas auténticas fórmulas de excel para que el usuario final, si lo desea, pueda modificar valores en la hoja resultante sin que las cifras se descuadren.

Código de ejemplo

Lo mejor para entender cómo funciona la librería es leer este código de ejemplo, que es el que genera el gráfico de arriba y está ampliamente comentado. Lo único que precisa para funcionar es el include que al final de este artículo adjunto, junto con este mismo programa, en un zip:

REPORT zvcexcel_ejemplo.

INCLUDE zvcexcel.

DATA it_excel TYPE TABLE OF vcxt_excel.
DATA it_ekpo TYPE TABLE OF ekpo WITH HEADER LINE.

START-OF-SELECTION.

  SELECT *
  FROM ekpo
  INTO TABLE it_ekpo
  UP TO 10 ROWS
  WHERE netpr NE 0
    AND menge NE 0
    AND txz01 NE space.

* COMIENZA LA GENERACIÓN DEL EXCEL
* refrescamos nuestra tabla it_excel, que hemos definido nosotros.
  REFRESH it_excel.

* este macro borra las definiciones anteriores y establece un estilo
* de texto por defecto para toda la hoja, y sitúa el cursor en A1
  vcx_initialize.

* este macro hace que cada vez que ejecutemos VCX_CELLVAL, el cursor
* avance una casilla en horizontal. con VCX_AUTOXINC_OFF desactivamos.
  vcx_autoxinc_on.

* empezamos a definir la estética. es necesario saber CSS
* en algunos casos, como ciertas fórmulas, deberemos investigar
* los CSS propios de microsoft, que comienzan por mso-
  vcx_classcss 'titulo' 'font-family:impact;font-size:24px'.
  vcx_classcss 'cabeza' 'font-weight:bolder;font-size:14px;' &
  'background-color:#660000;color:#ffffff'.
  vcx_classcss 'numero' 'color:#ff9900;font-size:12px;' &
  'font-weight:bolder'.
  vcx_classcss 'total' 'font-size:14px;border-top:1px #000000 solid'.
* definimos la clase fecha, para campos tipo datum, utilizando
* un valor por defecto de la librería
  vcx_classcss 'fecha' vcxdefaultdateformat.


* vamos a cargar la primera celda de título.
* le asignamos una estética ANTES de dar valor
  vcx_cellclass 'titulo'.
* fusionamos 6 celdas en horizontal para que quepa bien el título
  vcx_cellspan 6.
* y al final le damos valor. debido a VCX_AUTOXINC_ON avanza el cursor
  vcx_cellval 'ejemplo de excel generado con zvcExcel'.
* salto de línea
  vcx_crlf.
* la celda de abajo la usaremos de comentario y tomará estética defecto
  vcx_cellval 'un tanto elemental'.
  vcx_crlf.

* esta instrucción hace que TODAS las celdas definidas a partir de ahora
* tengan estética tipo 'cabeza'.
  vcx_autoclass 'cabeza'.
  vcx_cellval 'Pedido'.
  vcx_cellval 'Pos.'.
  vcx_cellval 'Concepto'.
  vcx_cellval 'Fecha'.
  vcx_cellval 'Cant.'.
  vcx_cellval 'Un.'.
  vcx_cellval 'Precio'.
* con space desactivamos la clase 'cabeza'.
  vcx_autoclass space.
  vcx_crlf.

* internamente no se trabaja en formato A1 típico excel, sino con
* coordenadas x,y type i. vcx_x y vcx_y recogen en todo momento las
* coordenadas actuales del cursor.

* filainicio y filafin nos servirá para delimitar el rango de una suma
  DATA filainicio TYPE i.
  DATA filafin TYPE i.

  filainicio = vcx_y.

* un vulgar loop nos permite rellenar la hoja rápidamente
  LOOP AT it_ekpo.
    vcx_cellclass 'numero'.
    vcx_cellval it_ekpo-ebeln.
    vcx_cellval it_ekpo-ebelp.
    vcx_cellval it_ekpo-txz01.
    vcx_cellclass 'fecha'.
    vcx_cellval it_ekpo-aedat.
    vcx_cellval it_ekpo-menge.
    vcx_cellval it_ekpo-meins.
    vcx_cellval it_ekpo-netpr.
    vcx_crlf.
  ENDLOOP.

* como al final hay un salto de línea, restamos uno para rango de suma
  filafin = vcx_y - 1.

* vamos a poner la fila de totales con una raya encima
  vcx_autoclass 'total'.
* desplazamos el cursor a la derecha hasta la columna F
  DO 5 TIMES.
    vcx_cellval ''.
  ENDDO.
* también podríamos haber utilizado VCX_XINC que mueve cursor a derecha

* escribimos la leyenda para el total.
  vcx_cellval 'SUMA:'.

* la siguiente instrucción nos va a meter en la celda la fórmula
* =SUMA(G4:G53)
* aunque nosotros lo hacemos como si dijeramos (7,4):(7,53) y no G4:G53
  vcx_cellsum 7 filainicio 7 filafin.
  vcx_cellval space.

* en este ejemplo VCX_CELLFORMULA, más complicado: permite introducir
* cualquier fórmula siempre que sea en el formato interno de excel, en
* el que el nombre de las funciones no es el español. también debemos
* utilizar coordenadas alfanuméricas y no numéricas. no es problema:

* si queremos convertir una coordenada x en letras,
* lo haremos con VCX_NUMBER2ALFA. no hay límite más allá que
* el del propio excel.

* del mismo modo, VCX_COORDS2ALFA convierte (x,y) en formato A1. si uno
* de los valores es 0, lo transforma en totalidad de fila o columna
* ejemplo: ncoords2alfa 4 3 valor. hace valor = 'D3'.
* ejemplo: ncoords2alfa 4 0 valor. hace valor = 'D'.

* aunque aquí ya no haría falta, desactivamos la clase 'total'.
  vcx_autoclass ''.

* generamos el excel dentro de la tabla
  vcx_excelgenerate it_excel.

* y lo descargamos localmente.
  vcx_exceldownload it_excel 'c:prueba.xls'.

* importante: si excel ya tiene abierto el fichero, no lo podremos
* descargar.

* otros macros están descritos dentro de la librería y no
* necesitan mucha explicación
Lo único que lamento de esta librería es el hecho de que todavía no está lo suficientemente completa para mi gusto, puesto que las posibilidades de ampliación son enormes. Animo a aquellas personas que decidan ampliarla a compartir su trabajo tras hacerlo.

El include

Podéis descargar el include zvcExcel y el programa de ejemplo aquí:

zvcExcel 0.9beta + ejemplo

Publico esta librería bajo licencia GPL sin limitaciones a la hora de alterar o ampliar el código, respetando siempre su autoría o autorías y conservando la licencia GPL. Su venta está prohibida.

A disfrutar.

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.