viernes, enero 04, 2013

Application Component no actualizado en Process Integration Scenario


Puede darse el caso que, tras añadir nuevos SWCV a un producto, no se vea reflejado en el ESR. Por ejemplo, al definir un Application Component dentro de un Process Integration Scenario, el SWCV no aparezca en el cuadro de Associated Software Coponent Versions del producto seleccionado.

martes, agosto 28, 2012

Acceder al contenido de cualquier tabla remota

El siguiente programa muestra el contenido de cualquier tabla que se encuentre en un sistema remoto (y cuya estructura sea conocida para el sistema actual). Esto es útil si se desea hacer una copia de los datos de una tabla de producción en el entorno de desarrollo, por ejemplo.

Como requisito, es necesario tener definida en el sistema local la conexión a la BD del sistema remoto. Esto se hace a través de la transacción DBACOCKPIT.  Una vez configurada y probada, podemos probar el siguiente código:

viernes, agosto 24, 2012

Devolver mensajes de error estándar de proxies

Cuando se definen interfaces con Fault Message Type, para rellenar la estructura estándar cuando se han producido errores existe el siguiente método:
  
  datastandard_data type zpi_exchange_fault_data,
        detail_data   type zpi_exchange_log_data,
        ls_return     type bapiret2.



miércoles, junio 27, 2012

XML en CDATA


Es común encontrarse con interfaces que se comunican mediante mensajes XML en un campo de texto. Esto suele complicar la definición del escenario, requiriendo de mapeos externos mediante JAVA o XSLT.

A continuación muestro una propuesta, que considero sencilla desde mi punto de vista, para abordar este tipo de escenarios.

Partimos del siguiente mensaje de petición:

SOAPaction: http://ejemplo.es/ws/accionSOAPx

<?xml version="1.0" encoding="UTF-8"?>
<ns1:ObtenerDatos
      xmlns:ns1="http://ejemplo.es/appnetws">
<ns1:sToken>
<![CDATA[
<?xml version="1.0" encoding="UTF-8"?>
<TOKEN>
<AppName>APPNAME</AppName>
<AppToken>APPTOKEN</AppToken>
</TOKEN>
]]>
</ns1:sToken>
</ns1:ObtenerDatos>

jueves, junio 21, 2012

Incluir SOAPaction en mensaje

Una manera de indicar la acción SOAP del mensaje es mediante la siguiente UDF:

DynamicConfiguration conf = (DynamicConfiguration) container
.getTransformationParameters( )
.get(StreamTransformationConstants.DYNAMIC_CONFIGURATION);


DynamicConfigurationKey key = DynamicConfigurationKey.create( 
"http:/"+"/sap.com/xi/XI/System/SOAP",  
"THeaderSOAPACTION"); 


conf.put(key, action[0]);


result.addValue(action[0]); 

Dicha UDF espera como parámetro de entrada una string llamada "action" que contendrá el valor de la acción que corresponda. El mapeo deberá ir directo contra la cabecera del mensaje destino.


miércoles, mayo 09, 2012

SOAP: call failed: java.io.IOException: invalid content type for SOAP: TEXT/HTML; HTTP 401 Unauthorized

Recientemente cambiaron el entorno de desarrollo de host. A raíz de esto empecé a tener problemas con la conexión entre PI y el sistema ECC actualizado, a pesar de que los passwords y usuarios permanecían iguales. Tras reiniciar PI y realizar varios intentos de conexión, comprobaba que, aunque me aseguraba de que el password estaba bien introducido, veía que el usuario se terminaba bloqueando. Al final, le asigné un password nuevo al usuario en el ECC y conseguí que se conectara correctamente.

Según me comentan, el motivo puede venir por el SAP Secure Store, ya que ahí se guarda algún tipo de relación entre USUARIO - CLAVE - SISTEMA por lo que, aunque el usuario y la clave permanezcan igual, al haber cambiado el ID del sistema, existe una incoherencia en el acceso.

miércoles, abril 25, 2012

Redondeos en ABAP

Este es un ejemplo de cómo se comportan los distintos tipos de redondeo en ABAP:

  imp_round roundval  = imp_total
                     dec  2
                     mode cl_abap_math=>round_up ).



*--------------------------------------------------------------------*
*  Ejemplo: 438,7648

*--------------------------------------------------------------------*
*  ROUND_HALF_UP     438,7600
*  ROUND_HALF_DOWN   438,7600
*  ROUND_HALF_EVEN   438,7600
*  ROUND_UP          438,7700  <-- Es lo mismo
*  ROUND_DOWN        438,7600
*  ROUND_CEILING     438,7700  <-- No es igual
*  ROUND_FLOOR       438,7600
*--------------------------------------------------------------------*
*  Ejemplo:
438,7648-
*--------------------------------------------------------------------*
*  ROUND_HALF_UP     438,7600-
*  ROUND_HALF_DOWN   438,7600-
*  ROUND_HALF_EVEN   438,7600-
*  ROUND_UP          438,7700- <-- Es lo mismo
*  ROUND_DOWN        438,7600-
*  ROUND_CEILING     438,7600- <-- No es igual (tira hacia positivo)
*  ROUND_FLOOR       438,7700-
*--------------------------------------------------------------------*