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-
*--------------------------------------------------------------------*


martes, marzo 20, 2012

Parámetros de Memoria (Memory ID)

Una manera de establecer medidas de control análoga a los objetos de autorización es mediante parámetros de memoria que se asignen a los usuarios.

Para crear un parámetro de memoria, se puede realizar mediante la tx: SE80: Crear -> Otros (1) -> ID parámetros SET/GET.

Una vez creado, se puede añadir a los parámetros de los usuarios que se deseen en la pestaña "Parámetros" de la SU01.

Para comprobar se puede utilizar la función "ISH_USR05_GET":

  DATA l_value TYPE xuvalue.

  CALL FUNCTION 'ISH_USR05_GET'
    EXPORTING
      ss_bname         = sy-uname
      ss_parid         = 'ZPARAMETER'
    IMPORTING
      ss_value         = l_value
    EXCEPTIONS
      parid_not_found  = 1
      bname_is_initial = 2
      parid_is_initial = 3
      OTHERS           = 4.
  IF sy-subrc <> 0.
    CLEAR l_value.
  ENDIF.
  IF l_value  = 'X'.
    RETURN.
  ENDIF.

GET_BUSINESS_SYSTEM_ERROR

Si a la hora de ejecutar una interfaz, devuelve el mensaje GET_BUSINESS_SYSTEM_ERROR es posible que se hayan realizado cambios en el Technical System que está registrado en el SLD. Para comprobar que se trata de este error, podemos ejecutar la transacción SLDCHECK y veremos que existe un problema a la hora de obtener el BS correspondiente.

Para ello deberemos confirmar que en el SLD el BS está apuntando al TS correcto. Este problema aparece cuando se realizan cambios en la configuración de los TS como pueden ser opciones de balanceo, etc.

martes, febrero 07, 2012

Depurar sentencias en adaptadores JDBC

Cuando se utilizan conexiones JDBC y no se obtiene el resultado esperado puede ser útil conocer exactamente qué sentencia SQL se está enviando a la BD. Esto se recomienda en entornos de desarrollo y la manera de configurarlo es la siguiente:

El parámetro se debe especificar en la tabla de parámetros: 

JDBC Receiver Adapter Parameters
    1. Parameter name: "logSQLStatement"
       Parameter type: boolean
       Parameter value: true for any string value, 
                        false only for empty string
       Parameter value default: false (empty String)



 

El resultado de la consulta se podrá visualizar en el log del canal de comunicación del adaptador correspondiente.

Referencias: