Webservices(I): ficheros xml

lunes, 27 de febrero de 2012

P9150078

Éste y (creo que) los dos siguientes posts del blog van a tratar sobre comunicaciones entre sistemas mediante servicios web o webservices. Explicaré cómo enviar y recibir información desde y hacia nuestro SAP, lo que comunmente llamamos interfaces. Siempre partiendo de que no disponemos del módulo XI/PI de SAP que seguramente nos facilitaría las cosas bastante.

Para empezar diré que la información que trasladaremos entre plataformas la convertiremos al “lenguaje” XML y en este primer post voy a explicar cómo hacerlo.


Transformaciones ABAP/XML y XML/ABAP

SAP provee de dos herramientas básicas para hacer transformaciones de información de ABAP a XML y de XML a ABAP.

  • Utilizando la plantilla de transformación estándar de SAP.
  • Mediante la creación de transformaciones simples a través de la transacción STRANS.

Voy a centrarme en el primer tipo haciendo un pequeño ejemplo. Primero vamos a crear un fichero XML a partir de datos de pedidos de venta extraídos de nuestro sistema. En segundo lugar, imaginaremos que el sistema externo nos ha devuelto esos datos modificados en otro fichero XML que convertiremos igualmente a datos ABAP.

De ABAP a XML

  • Crearemos un pequeño programa ABAP en nuestro editor.
Herramientas / Workbench ABAP / Desarrollo / SE38 – Editor ABAP
  • Extraemos los datos de la tabla de pedidos de posiciones de pedidos de venta VBAP.
  • Llamamos a la función CALL_TRANSFORMATION que convierte los datos a XML.


REPORT zpruebas NO STANDARD PAGE HEADING LINE-SIZE 255.
*********************************************************************************
*Tablas
**********************************************************************************
TABLES:
  vbap.

*********************************************************************************
*Tablas internas
*********************************************************************************
DATA: BEGIN OF ti_vbap OCCURS 0,
  vbeln  LIKE vbap-vbeln,        "Documento
  posnr  LIKE vbap-posnr,        "Posición
  matnr  LIKE vbap-matnr,        "Material
END OF ti_vbap.

*********************************************************************************
*Datos globales
*********************************************************************************
DATA:
  g_xml TYPE string.

*********************************************************************************
***                            SELECTION-SCREEN                                  
*********************************************************************************
SELECT-OPTIONS:
  s_vbeln FOR vbap-vbeln.

*********************************************************************************
*START-OF-SELECTION
*********************************************************************************
START-OF-SELECTION.

  SELECT * FROM vbap
    INTO CORRESPONDING FIELDS OF TABLE ti_vbap
    WHERE vbeln IN s_vbeln.

*********************************************************************************
*END-OF-SELECTION
*********************************************************************************
END-OF-SELECTION.

  CALL TRANSFORMATION id SOURCE data = ti_vbap[]
                         RESULT XML    g_xml.

[…]


  • El resultado para la selección del pedido de ventas 1320000021

    Fichero xml

De XML a ABAP

  • Crearemos un pequeño programa ABAP en nuestro editor.
Herramientas / Workbench ABAP / Desarrollo / SE38 – Editor ABAP
  • Subiríamos los datos a SAP. En próximos posts veremos cómo hacerlo a través de webservice.
  • De nuevo llamamos a la función CALL_TRANSFORMATION para convertir los datos XML a ABAP.

REPORT zpruebas NO STANDARD PAGE HEADING LINE-SIZE 255.
*********************************************************************************
*Tablas
*********************************************************************************

*********************************************************************************
*Tablas internas
*********************************************************************************
* Tabla que contiene el xml
DATA: BEGIN OF ti_xml OCCURS 0,
  string TYPE string,
END OF ti_xml.

* Tabla de datos ABAP
DATA: BEGIN OF ti_vbap OCCURS 0,
  vbeln  LIKE vbap-vbeln,        "Documento
  posnr  LIKE vbap-posnr,        "Posición
  matnr  LIKE vbap-matnr,        "Material
END OF ti_vbap.

*********************************************************************************
*Datos globales
*********************************************************************************
DATA:
  g_xml TYPE string.

*********************************************************************************
***                            SELECTION-SCREEN                                **
*********************************************************************************
PARAMETERS:
  p_fich TYPE string.

*********************************************************************************
*START-OF-SELECTION
*********************************************************************************
START-OF-SELECTION.

* Aquí llenaríamos la variable g_xml con el string xml
* [...]

*********************************************************************************
*END-OF-SELECTION
*********************************************************************************
END-OF-SELECTION.

  CALL TRANSFORMATION id SOURCE XML g_xml
                         RESULT data = ti_vbap.



Al final, los datos del fichero xml estarían incorporados en nuestra tabla interna ABAP ti_vbap.

Más información

En este blog también tenéis información amplia sobre transformaciones XML. Y para una documentación más extensa también podéis consultar este documento.

Imagen inicial | ssinger3

5 comentarios:

  1. Hola,

    Estoy exactamente en un proyecto en el cual debemos usar un web services, pero no encuentro la manera de como ponerlo en servicio (on-line).

    Me podrias decir ¿cuales son las parametrizaciones previas que debo tener para que funcione?

    Te explico lo que hago:
    - He creado desde la Se80 un web services
    - Active desde la TX. SICF algunos servicios.
    - Entro a la tx. SOAMANAGER

    y al final no obtengo nada, el soa manager no se visualiza en el Internet Explorer.

    Espero me puedas ayudar y haber explicado mi problematica

    Gracias
    Saludos,

    ResponderEliminar
    Respuestas
    1. Hola,
      Deberías chequear con tu Basis la configuración del SAP, quizás necesites algún stack adicional como el de Java. No sabría decírtelo con seguidad. Te dejo un enlace del foro de la SDN donde parece ser que alguien tenía el mismo problema http://forums.sdn.sap.com/thread.jspa?threadID=2064013
      Espero que puedas resolverlo.

      Saludos,
      Óscar

      Eliminar
  2. Y cómo sería para hacer un loop a una tabla interna en el xml?

    ResponderEliminar
    Respuestas
    1. El xml no es ABAP. No se pueden hacer loops en ABAP. ¿A qué te refieres?

      Eliminar
  3. Cómo mostrar en el xml los datos "jerarquizados" a partir de una tabla interna?. Por ejemplo:

    area 1
    oficina 1
    oficina 2
    oficina 3
    area 2
    oficina 1
    oficina 2
    oficina 3
    .
    .
    area n
    .
    .

    ResponderEliminar