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:
Mostrando entradas con la etiqueta ABAP. Mostrar todas las entradas
Mostrando entradas con la etiqueta ABAP. Mostrar todas las entradas
martes, agosto 28, 2012
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.
martes, septiembre 06, 2011
Caracteres de escape
En las expresiones regulares, se pueden emplear ciertos caracteres comodín para realizar búsquedas que encajen con determinados patrones. Dichos caracteres dependen del entorno en el que se empleen.
Si se va a realizar comparaciones entre valores de variables del código ABAP, los comodines disponibles son:
Si se va a realizar comparaciones entre valores de variables del código ABAP, los comodines disponibles son:
- Asterisco ('*') para ristras de caracteres
- Signo más ('+') para caracteres individuales.
- Signo porcentaje ('%') para las ristras de caracteres
- Guión bajo ('_') para caracteres individuales.
Etiquetas:
ABAP
lunes, agosto 29, 2011
SERIALIZATION ERROR
A la hora de enviar un eMail mediante el adaptador de correo de PI, es necesario pasar el contenido del mensaje a formato XSDANY (ver nota 748024), el cual se trata de un RAWSTRING.
Para realizar la conversión del contenido, nos vale alguna función que convierta de STRING a XSTRING, tal como SCMS_STRING_TO_XSTRING. El problema está en que, si pasamos este contenido al proxy encargado de realizar el envío del mail, así tal cual, lo más seguro es que el método devuelva una excepción indicando que ha habido un error en la serialización.
Esto es porque el mensaje del contenido que vamos a pasar debe estar contenido entre etiquetas (da igual lo que pongan), pero deben delimitar el mensaje.Ejemplo:
Enlaces relacionados:
Para realizar la conversión del contenido, nos vale alguna función que convierta de STRING a XSTRING, tal como SCMS_STRING_TO_XSTRING. El problema está en que, si pasamos este contenido al proxy encargado de realizar el envío del mail, así tal cual, lo más seguro es que el método devuelva una excepción indicando que ha habido un error en la serialización.
Esto es porque el mensaje del contenido que vamos a pasar debe estar contenido entre etiquetas (da igual lo que pongan), pero deben delimitar el mensaje.Ejemplo:
Enlaces relacionados:
Etiquetas:
ABAP,
CX_ST_SERIALIZATION_ERROR,
XI
jueves, julio 21, 2011
Probar BAPIs en SE37 con commits
Para probar una BAPI, se puede utilizar la transacción SE37 y rellenar los campos que sean necesarios con el inconveniente de no poder ver el objeto creado en la base de datos debido a que falta el commit. Pues para solucionar este problema, existe una opción en el menú de la SE37 que te permite ejecutar varias funciones seguidas: Módulo funciones -> Verificar -> Secuencias test.
viernes, junio 17, 2011
Mensajes de confirmación en proxies asíncronos
Cuando se envía una mensaje de manera asíncrona, puede interesar conocer si el mensaje ha llegado correctamente o si ha habido algún tipo de error. Este escenario me lo encontré en una comunicación proxy -> jdbc, donde quería conocer si la inserción en la base de datos se hizo correctamente.
Como requisito, es necesario que el sistema origen tenga definido el adaptador proxy de recepción para que pueda recibir el mensaje de confirmación (con esto es suficiente, no es necesario definir nada más como el "Receiver agreement"). En el caso de PI 7.11 en adelante, también será necesario definir en el adaptador de envío, la conexión que utilizará para devolver las confirmaciones (esta conexión debe ser creada previamente en el NWA de PI).
Un aspecto a tener en cuenta es que, en mi caso no servía indicar el path "/MessagingSystem/receive/AFW/XI", ya que me daba un error de servicio no activado. Sin embargo sí me sirvió utilizar el path "/sap/xi/engine?type=receiver" y activar el servicio sap/xi/engine en el sistema ECC (tx: SICF), para que pueda recibir dichas respuestas.
Como requisito, es necesario que el sistema origen tenga definido el adaptador proxy de recepción para que pueda recibir el mensaje de confirmación (con esto es suficiente, no es necesario definir nada más como el "Receiver agreement"). En el caso de PI 7.11 en adelante, también será necesario definir en el adaptador de envío, la conexión que utilizará para devolver las confirmaciones (esta conexión debe ser creada previamente en el NWA de PI).
Un aspecto a tener en cuenta es que, en mi caso no servía indicar el path "/MessagingSystem/receive/AFW/XI", ya que me daba un error de servicio no activado. Sin embargo sí me sirvió utilizar el path "/sap/xi/engine?type=receiver" y activar el servicio sap/xi/engine en el sistema ECC (tx: SICF), para que pueda recibir dichas respuestas.
viernes, marzo 25, 2011
Conocer las BTEs de una transacción
De manera análoga al modo de conocer las BADIs de una transacción, bastaría con poner break-points en los módulos de función:
Enlaces de referencia:
- PC_FUNCTION_FIND
- BF_FUNCTIONS_FIND
Enlaces de referencia:
lunes, septiembre 27, 2010
Conocer los Objetos de Autorización de una Transacción
A través de las transacciones SU22 y SU24 podremos conocer y editar los objetos de autorización que afectan a las transacciones que indiquemos. La principal diferencia entre ambas transacciones es que la SU22 se encarga de mantener la relación de objetos de autorización de SAP, los cuales se recogen en las tablas USOBT y USOBX, y se mantiene mediante la transacción SU25, mientras que la SU24 está enfocada a los objetos de autorización definidos por el cliente, los cuales se almacenan en las tablas USOBT_C y USOBX_C. (NOTA: Todos los objetos de SAP aparecen también en los objetos del cliente).
Etiquetas:
ABAP,
AUTHORITY-CHECK,
AUTORIZACIÓN
jueves, septiembre 16, 2010
Crear ficheros de pruebas para programas Batch Input
La aplicación "Data Transfer Tools" (tx: SXDA_TOOLS) permite generar de manera automática ficheros de prueba necesarios para programas batch input.
Dicho fichero se puede utilizar a modo de plantilla para realizar las pruebas que se deseen. Por ejemplo, si se quiere realizar una actualización de los datos de un acreedor, existe el report estándar RFBIKR00 el cual ejecuta un B-I a partir de un fichero de entrada con una estructura específica. Con el fin de no generar el fichero de prueba a pelo, iríamos a la transacción SXDA_TOOLS e indicaremos que deseamos crear un fichero para el tipo de objeto LFA1 (Vendor), para el programa RFBIKR00 que es de tipo BINP (Batch Input):
Dicho fichero se puede utilizar a modo de plantilla para realizar las pruebas que se deseen. Por ejemplo, si se quiere realizar una actualización de los datos de un acreedor, existe el report estándar RFBIKR00 el cual ejecuta un B-I a partir de un fichero de entrada con una estructura específica. Con el fin de no generar el fichero de prueba a pelo, iríamos a la transacción SXDA_TOOLS e indicaremos que deseamos crear un fichero para el tipo de objeto LFA1 (Vendor), para el programa RFBIKR00 que es de tipo BINP (Batch Input):
Etiquetas:
ABAP,
DATA TRANSFER
miércoles, septiembre 15, 2010
Crear transacción de una vista de actualización
Para crear una transacción de una vista de actualización deberemos, a través de la tx. SE93, crear una "Transacción con parámetros (transacción de parámetros)". En el bloque de valores de propuesta indicaremos que la transacción objetivo es la SM30 y marcaremos el flag "Omitir imagen inicial".
Por último, al final de la pantalla, habrá que añadir los siguientes parámetros:
Enlaces de referencia:
Por último, al final de la pantalla, habrá que añadir los siguientes parámetros:
- VIEWNAME: (nombre de la vista)
- UPDATE: X
Enlaces de referencia:
martes, agosto 17, 2010
Cancelar importación de una orden de transporte en curso
Para cancelar una orden de transporte que se encuentre colgada en estado "Import en ejecución" hay que seguir los siguientes pasos:
- Seleccionamos la orden que se desea cancelar en la STMS.
- Vamos a la opción Pasar a -> Importar monitor (Ctrl+F8).
- Una vez ahí, aparece una lista con entradas de ejecución de importaciones anteriores que estarán en verde, excepto la orden que se encuentra colgada, la cual aparecerá en gris.
- Seleccionamos la orden en gris y haciendo clic con el botón derecho del ratón, escogemos la opción "Borrar entrada".
- Por último, nos autenticamos en el sistema y con ello se habrá reiniciado el estado de la importación y podremos reimportar la orden, si fuera necesario.
Etiquetas:
ABAP,
TRANSPORTE
viernes, julio 30, 2010
Importar y exportar clases en formato XML
En el siguiente enlace, Sergey Korolev indica cómo podemos importar/exportar clases abap entre sistemas por medio de ficheros XML. Bastante útil.
miércoles, abril 28, 2010
Usos de ALV en Netweaver 04
Para los que aún sigan utilizando el modelo de programación antiguo para los ALV de SAP, adjunto un par de enlaces en el que se definen cómo utilizar el modelo introducido a partir de SAP Netweaver 04:
Enlace de referencia:
- SAP List Viewer - The New Programming Model in SAP NetWeaver 04
- Utilizing The New ALV Object Model
- FI Report Using the ALV OM Model
- Power of ABAP Objects: Overcome the Restrictions of SALV Model
Enlace de referencia:
viernes, abril 23, 2010
Vista de actualización "no modificable"
Cuando queremos crear una vista de actualización de una tabla que sea editable en el entorno destino, necesitamos saber si dicho entorno permite modificaciones de tablas. Esto lo podremos saber porque si no definimos correctamente la rutina de grabación de la vista de actualización, al intentar editar la tabla en el destino (mediante tx: SM30, p.ej.) aparecerá un mensaje informativo indicando:
Mandante XXX tiene status "no modificable"
Esto se soluciona indicando la opción "Rutina de grabación individual o ninguna" en la vista de actualización:
Mandante XXX tiene status "no modificable"
Esto se soluciona indicando la opción "Rutina de grabación individual o ninguna" en la vista de actualización:
jueves, febrero 25, 2010
Obtener contenido de campos de dynpros antes de pulsar Enter
La siguiente función permite obtener el contenido del campo que se desee de la pantalla de selección (dynpro) sin necesidad de que el usuario haya pulsado ENTER. Esto es útil para aquellos programas cuyos datos de selección dependen unos de otros.
Etiquetas:
ABAP,
DYNPRO,
GET_DYNP_VALUE
lunes, febrero 22, 2010
Pragmas y Pseudocomentarios en ABAP
Hay algunos programas en los que aparecen comentarios del tipo "#EC seguido de un comando. Pues bien, dichos pseudocomentarios sirven para eludir los mensajes de aviso relacionados que aparecen al validar el código del programa mediante transacciones como SLIN y SCI. Estas transacciones sirven para garantizar la calidad del código.
Es a partir de SAP Netweaver 7.1 EhP1 cuando estos pseudocomentarios pasan a ser obsoletos y en su defecto se pasa a hacer uso de los pragmas.
Enlace de referencia:
Es a partir de SAP Netweaver 7.1 EhP1 cuando estos pseudocomentarios pasan a ser obsoletos y en su defecto se pasa a hacer uso de los pragmas.
Enlace de referencia:
- http://sapport.blogspot.com/2009/03/pseudo-comments-and-pragmas-in-abap.html
- ABAP Testing and Troubleshouting
- Evaluating the Quality of Your ABAP Programs and Other Repository Objects with the Code Inspector
- ABAP Code Inspector Wiki
Etiquetas:
"#EC,
ABAP,
PRAGMAS,
PSEUDOCOMMENTS
miércoles, enero 27, 2010
Iniciación a WebDynpro
En la siguiente entrada recojo información básica para iniciarse en el mundo de los WebDynpros.
Conocimientos previos necesarios para probar una aplicación:
Para acceder al servicio de aplicación es importante que enlace sea informado del estilo:
http://<host>.<dominio>.<ext>:<puerto>/sap/bc/webdynpro/sap/<aplicación>
Servicio de aplicación Webdynpro
Servicios básicos del sistema
Enlaces de iniciación
- Web Dynpro ABAP - SAP Library
- Web Dynpro ABAP - SDN
- [PDF] Web Dynpro ABAP Programming Guidelines
Conocimientos previos necesarios para probar una aplicación:
Para acceder al servicio de aplicación es importante que enlace sea informado del estilo:
http://<host>.<dominio>.<ext>:<puerto>/sap/bc/webdynpro/sap/<aplicación>
Servicios necesarios activos (SICF)
Servicio de aplicación Webdynpro
- /sap/bc/webdynpro/sap/<aplicación>
Servicios básicos del sistema
Enlaces relacionados con seguridad
martes, enero 19, 2010
Depurar un proceso lanzado en fondo (job)
En ocasiones un report funciona correctamente al ejecutarlo online, pero puede fallar cuando se ejecuta en fondo (modo batch). En ese caso, el job aparece como cancelado en la transacción SM37. La mayoría de las veces, la información que aparece en la transacción ST22 es suficiente para determinar la causa, pero esto no siempre es así. La cuestión es: ¿cómo puedo depurar el programa en fondo para saber dónde ha fallado?
Existe un modo a través de la transacción SM37. Para ello se deberá seleccionar qué proceso se desea depurar, marcando la casilla correspondiente y, a continuación, introducir el comando "JDBG" en el campo de comandos tal como se muestra en la siguiente captura de pantalla:
De este modo se iniciará un modo debug en el que se repetirá el proceso que falló considerando los mismos parámetros de entrada que tenía en su origen.
Más información:
Existe un modo a través de la transacción SM37. Para ello se deberá seleccionar qué proceso se desea depurar, marcando la casilla correspondiente y, a continuación, introducir el comando "JDBG" en el campo de comandos tal como se muestra en la siguiente captura de pantalla:
De este modo se iniciará un modo debug en el que se repetirá el proceso que falló considerando los mismos parámetros de entrada que tenía en su origen.
Más información:
lunes, octubre 26, 2009
Calcular impuesto de un precio determinado
Para conocer cuál es el impuesto que le corresponde a un importe determinado podremos utilizar la siguiente FM estándar:
Donde "l_taxcom" es una estructura de entrada en la que rellenaremos los campos necesarios y "l_fwste" es el importe resultante del impuesto que le corresponde al precio indicado.
Para que la función devuelva dicho importe, deberemos informar como mínimo los siguientes campos de la estructura "TAXCOM":
Donde "l_taxcom" es una estructura de entrada en la que rellenaremos los campos necesarios y "l_fwste" es el importe resultante del impuesto que le corresponde al precio indicado.
Para que la función devuelva dicho importe, deberemos informar como mínimo los siguientes campos de la estructura "TAXCOM":
- TAXCOM-BUKRS = Sociedad correspondiente
- TAXCOM-MWSKZ = Indicador de impuestos correspondiente
- TAXCOM-KPOSN <> '00000'
- TAXCOM-XMWST = 'X'
Suscribirse a:
Entradas (Atom)