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:
martes, agosto 28, 2012
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:
data: standard_data type zpi_exchange_fault_data,
detail_data type zpi_exchange_log_data,
ls_return type bapiret2.
data: standard_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:
<?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>
Etiquetas:
CDATA,
SOAP,
SOAPaction,
XSLT
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.
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.
Etiquetas:
JAVA MAPPING,
SOAP,
SOAPaction,
XI
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.
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 = round( val = 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-
*--------------------------------------------------------------------*
imp_round = round( val = 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.
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.
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:
El resultado de la consulta se podrá visualizar en el log del canal de comunicación del adaptador correspondiente.
Referencias:
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:
Suscribirse a:
Entradas (Atom)