lunes, 5 de mayo de 2014

Crear Word con objetos OLE2

En este post voy a describir un ejemplo de conectividad y programación Word desde SAP/R3 mediante la tecnología OLE2.
Desde SAP es posible arrancar Word y ejecutar todos sus comandos como abrir fichero, reemplazar, crear un documento nuevo, etc.
En definitiva, está disponible desde ABAP todo el lenguaje de programación Word Basic.

REQUERIMIENTOS FUNCIONALES
Se desean imprimir desde SAP cartas para enviar a los proveedores, informando desde el propio SAP algunos de los datos de los proveedores. Para ello se creará un documento Word de partida con el texto de la carta y con los datos a informar desde SAP intercalados entre un carácter especial (por ejemplo ‘#’).

Una muestra de este documento sería:

Texto libre #cod_prov# texto libre

Texto libre #nom_prov# texto libre

En este ejemplo los campos a informar desde SAP serían cod_prov y nom_prov que se corresponderían al código y nombre del proveedor.


CONSIDERACIONES TÉCNICAS


Para la comunicación via OLE2 se dispone de las siguientes 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 (métodos y propiedades) de una aplicación; así en este ejemplo el infotipo comprende la relación de métodos Word Basic. 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 generar las cartas, una vez extraídos los datos de los proveedores de la base de datos y cargados en un tabla interna se deberá arrancar Word, abrir el fichero plantilla que contiene el formato de la carta, seleccionar todo y pasar todo el texto al portapapeles, crear un nuevo documento (‘documento1’) y copiar el texto seleccionado (la carta completa) al nuevo documento creado. Por último con el comando reemplazar se informarán los datos del proveedor en los campos intercalados entre el carácter ‘#’. Con esto se obtiene el documento siguiente a partir del documento original:

Texto libre 123456 texto libre

Texto libre Mecánica de la Peña texto libre

A continuación se podrían imprimir las cartas solicitadas.

Para generar la siguiente carta se borra todo el texto de ‘documento1’, se pega el contenido del portapapeles (la carta original con los campos a remplazar) y ya se puede ejecutar el comando Reemplazar de nuevo.
Para realizar todos estos pasos sólo hay que utilizar los verbos correspondientes en el infotipo de la aplicación Word. Con el objeto de conocer la sintaxis, la mejor solución es grabar todas las acciones a realizar en una macro de Word, donde se podrá consultar a continuación la sintaxis de las diferentes intrucciones Word que se han ejecutado, pudiendo entonces reproducir este código en ABAP. Por desgracia, los comandos del lenguaje de macros y el infotipo de Word no suelen coincidir, por lo que habrá que realizar numerosas pruebas antes de dar con el verbo y la sintaxis exacta.
A continuación se muestra cómo se procedería para abrir un fichero

Se crea el objeto Word.Basic.
Create object zword 'WORD.BASIC'
Donde zword es una variable de tipo ole2_object

Se abre el archivo ‘c:\Mis documentos\prueba.doc’.
Call method of ZWORD exporting #1 = 'c:\Mis documentos\prueba.doc'
 
PROGRAMA SAP R/3
Se adjunta el código fuente del programa desarrollado en ABAP para SAP R/3 v4.0b, "ZWORD".
REPORT zword.
TABLES lfa1.
DATA: BEGIN OF i_lfa1 OCCURS 0.
        INCLUDE STRUCTURE lfa1.
DATA: END OF i_lfa1.
************************************************************************
* Include necesario para la declaracion de objetos OLE2
************************************************************************
INCLUDE ole2incl.
************************************************************************
* Declaraciones para la llamada a WORD.
DATA zword TYPE ole2_object.
CLEAR zword.
SELECT * FROM lfa1 UP TO 3 ROWS INTO TABLE i_lfa1.
LOOP AT i_lfa1.
  AT FIRST.
    CREATE OBJECT zword 'WORD.BASIC'.
* Se llamará a este método sólo si se desea que WORD quede visible
    CALL METHOD OF zword 'APPSHOW'.
* Se abre el fichero que contiene la plantilla de la carta
    CALL METHOD OF zword 'FILEOPEN' EXPORTING #1 = 'C:\DOCS\PRUEBA.DOC'.
* Se selecciona todo el texto del archivo PRUEBA.DOC
    CALL METHOD OF zword 'EDITSELECTALL'.
* Se copia el texto seleccionado al portapapeles
    CALL METHOD OF zword 'EDITCOPY'.
* Se crea un documento nuevo, al que WORD llama documento1
    CALL METHOD OF zword 'FILENEW'.
* Se pega el texto del portapapeles a documento1
    CALL METHOD OF zword 'EDITPASTE'.
  ENDAT.
* Posicionar al principio del documento
  CALL METHOD OF zword 'STARTOFDOCUMENT'.
* Se reemplazan los campos de la carta por los datos de la tabla I_LFA1
  CALL METHOD OF zword 'WW2_EDITREPLACE' EXPORTING #1 = '#cod_prov#'
    #2 = i_lfa1-lifnr.
  CALL METHOD OF zword 'WW2_EDITREPLACE' EXPORTING #1 = '#nom_prov#'
    #2 = i_lfa1-name1.
* Se imprime el documento1 que ya contiene la carta
  CALL METHOD OF zword 'FILEPRINT' EXPORTING #1 = 'documento1'.
* Posicionar al principio del documento
  CALL METHOD OF zword 'STARTOFDOCUMENT'.
* Se selecciona todo
  CALL METHOD OF zword 'EDITSELECTALL'.
* Se borra la selección
  CALL METHOD OF zword 'EDITCLEAR'.
*Se incorpora el texto original de PRUEBA.DOC
  CALL METHOD OF zword 'EDITPASTE'.
  AT LAST.
* Se cierra el documento activo, documento1 con opción de salir sin salvar
    CALL METHOD OF zword 'DOCCLOSE' EXPORTING #1 = 2.
* Se cierra el documento activo PRUEBA.DOC con opción salir sin salvar
    CALL METHOD OF zword 'DOCCLOSE' EXPORTING #1 = 2.
* Se cierra WORD
    CALL METHOD OF zword 'APPCLOSE'.
* Se libera el objeto ZWORD
    FREE OBJECT zword.
  ENDAT.
ENDLOOP.
        

No hay comentarios:

Publicar un comentario