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:
SAP proporciona programas de ejemplo en sistema que comienzan por SALV_DEMO_*. Estos a su vez se basan en datos de ejemplo similares a los empleados con los ejemplos de vuelos, los cuales se pueden iniciar en el sistema a través del report BCALV_GENERATE_ALV_T_T2.

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:

miércoles, abril 07, 2010

Mapear Excepción RFC en Tipo de Mensaje

Por norma general, la manera de informar las excepciones es a través de los Tipos de Mensajes de Fallos (Fault Message Types), los cuales poseen una estructura estándar a la que se le pueden añadir campos adicionales. No obstante, la versión PI 7.0 permite utilizar otros tipos de mensajes para informar dichas excepciones como lo son los propios mensajes de la RFC (RFC Message) o mensajes externos (External Message), pero no permite utilizar ningún tipo ya definido en el Integration Builder. A continuación voy a explicar cómo podemos "reutilizar" un tipo ya definido para devolver los mensajes de excepción devueltos por una RFC.

En el escenario planteado tenemos una función RFC que tiene como parámetro de salida una tabla de mensajes de tipo BAPIRET2 donde se vuelca información sobre si la ejecución ha sido correcta o no.  En nuestro caso queremos que si se produce una excepción también se informe en la misma tabla, por lo que deseamos utilizar el mismo tipos de datos devuelto para pasar las excepciones.

martes, abril 06, 2010

Message Mappings: documentos interesantes

En un foro de SDN he encontrado un post con enlaces a varios documentos relacionados con el MM:

Mapping functionality in XI
https://www.sdn.sap.com/irj/sdn/go/portal/prtroot/docs/library/uuid/9202d890-0201-0010-1588-adb5e89a6638

SAP Exchange Infrastructure - Graphical_Mapping
https://www.sdn.sap.com/irj/sdn/go/portal/prtroot/docs/library/uuid/6658bd90-0201-0010-fbb6-afe25fb398d3

SAP Exchange Infrastructure - Graphical Mapping Exercise
https://www.sdn.sap.com/irj/sdn/go/portal/prtroot/docs/library/uuid/fd5ebd90-0201-0010-d697-91374d5b5190

SAP Exchange Infrastructure - Graphical Mapping - Advanced
https://www.sdn.sap.com/irj/sdn/go/portal/prtroot/docs/library/uuid/be05e290-0201-0010-e997-b6e55f9548dd

SAP Exchange Infrastructure: Mapping Patterns - Understand Context Handling in Message Mapping - Webinar Powerpoint
https://www.sdn.sap.com/irj/sdn/go/portal/prtroot/docs/library/uuid/f59730fa-0901-0010-df97-c12f071f7d3b

SAP NetWeaver Exchange Infrastructure Mapping Troubleshooting - Webinar Powerpoint
https://www.sdn.sap.com/irj/sdn/go/portal/prtroot/docs/library/uuid/e01e9400-9e81-2910-20a5-a862945a5e98

Mapping Lookups a RFC API
https://www.sdn.sap.com/irj/sdn/thread?threadID=196308

XI 3.0 New Mapping Features
https://www.sdn.sap.com/irj/sdn/go/portal/prtroot/docs/library/uuid/8a57d190-0201-0010-9e87-d8f327e1dba7

Fuente:

lunes, marzo 08, 2010

Activar colas registradas

Cuando el mensaje de una cola no ha sido enviado debido a algún error, el resto de mensajes que se almacenan en la misma quedan bloqueados hasta que se trate el primer mensaje. Una vez solucionado, al intentar activar la cola, SAP devuelve el siguiente mensaje:



Por lo que deberemos "anular la inscripción" de las colas afectadas mediante la transacción SMQR. Para ello bastará seleccionar la/s cola/s implicada/s y pulsar el botón "Anular inscripción". De este modo podremos activar las colas de nuevo para que se procesen los mensajes restantes.

NOTA: tras activar las colas deberemos volver a "inscribir" la/s cola/s implicada/s a través de la SMQR para que vuelvan a su funcionamiento normal.

Enlace de referencia:

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.

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:

    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.

    Enlaces de iniciación


    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:

      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":
      • TAXCOM-BUKRS = Sociedad correspondiente
      • TAXCOM-MWSKZ = Indicador de impuestos correspondiente
      • TAXCOM-KPOSN <> '00000'
      • TAXCOM-XMWST = 'X'
        En la mayoría de los casos querremos calcular el impuesto que le corresponde a un determinado material, para ello será necesario acceder al registro info correspondiente (tablas EINA/EINE).

        miércoles, septiembre 23, 2009

        Server certificate rejected by ChainVerifier

        En ocasiones, los servidores FTPS firman sus propios certificados. Esto implica que SAP no será capaz de dar por bueno el certificado, mostrando el siguiente mensaje de error:



        Para hacer que SAP acepte el certificado deberemos seguir los siguientes pasos:

        1º Añadir el certificado del cliente al directorio de certificados de confianza (TrustedCAs) mediante el SAP J2EE Visual Administrator, tal como dice la nota SAP 821267.

        2º Una vez importado el certificado, el siguiente paso consiste en asociar la dirección IP del servidor FTP al nombre canónico que se especifica en el certificado. Esta es una manera de validar que el certificado viene de quien se espera que venga. En mi caso, para realizar las pruebas de conexión utilicé el cliente FTP "curl" y para acceder al servidor ponía su dirección IP (12.34.567.89). Esto hacía que no coincidiera con la dirección que especificaba el certificado ("ServidorFTP"), tal como reflejan los mensajes informativos que aparecían al establecer la comunicación:



        Al añadir la entrada correspondiente en el fichero HOST, podremos acceder con éxito utilizando el nombre  común ("ServidorFTP"):



        Lo que para "curl" es un simple aviso, para SAP es determinante y si no coinciden no dejará acceder. Así que la dirección "ServidorFTP" es la que tendremos que especificar en el adaptador FTP para que SAP acepte el certificado con éxito.

        server_ftps

        Enlaces de referencia:

            martes, julio 28, 2009

            Añadir timestamp al nombre de un fichero mediante Java mapping

            En el siguiente código se muestra cómo añadir el timestamp al nombre de un fichero a través de una UDF (User-Defined Function) mediante acceso a las variables del sistema.



            Como variables de entrada tenemos el nombre del fichero y un indicador (addTimestamp) para decidir si hay que incluir el timestamp o no.

            Enlaces de referencia:

              viernes, junio 19, 2009

              Error during STOR/APPE epilogue

              Uno de los posibles motivos por los que no haya llegado un fichero a un servidor FTP es que el servidor esté lleno. Este caso aparecerá reflejado en la herramienta de visualización de mensajes de XI (XI Message Display Tool), informando un log similar al siguiente:


              Error during communication with SLD: User credentials are invalid or user is denied access

              Este error aparece cuando se intenta acceder al "Runtime Workbench" del repositorio de XI, en este caso, tras introducir las credenciales de usuario, aparece el error "Following error occurred while executing the application: Error during communication with System Landscape Directory: User credentials are invalid or user is denied access". El problema puede estar en que el usuario de XI "XIRWBUSER" o "PIRWBUSER" (dependiendo de la versión de XI) está bloqueado.

              En la entrada Usuario PIRWBUSER bloqueado frecuentemente se indica cómo solucionar este problema.

              Más información:

              http://sap.ittoolbox.com/groups/technical-functional/sap-basis/error-during-communication-with-system-landscape-directory-user-credentials-are-invalid-or-user-is-denied-access-1718332

              martes, junio 16, 2009

              Cliente FTP multiprotocolo y multiplataforma

              En ocasiones, existen servidores FTP que hacen uso del protocolo TLS. Esto requiere configurar de la manera adecuada el firewall tras el que se encuentra el servidor XI para que se pueda conectar de manera correcta con dicho servidor FTP.

              Para comprobar si el firewall estaba bien configurado, busqué un cliente FTP multiprotocolo disponible para varios sistemas operativos (UNIX, AIX, Linux, Windows,...) de manera que me permitiera realizar una prueba de conexión desde un equipo, en mi caso con Windows, exterior a la red y, una vez logrado conectar con el servidor FTP, reproducir los mismos comandos, pero esta vez desde el cliente FTP instalado en el servidor XI.

              El cliente utilizado fue el Curl y el enlace de descarga es http://curl.haxx.se/download.html (recomiendo usar el wizard de descarga para obtener la últiva versión: http://curl.haxx.se/dlwiz/).

              El cliente funciona por comandos. En Windows no necesita instalación, basta descomprimir el archivo en una carpeta local y seguidamente ejecutar los comandos. La versión que utilicé fue la curl-7.19.5-ssl-sspi-zlib-static-bin-w32.zip.

              El servidor FTP requería:
              • Protocolo: TLS
              • Puerto: 990
              • Conexión: pasiva

                Para las pruebas de conexión basta con que funcione algunos de los siguientes comandos:

                Comandos que muestran el contenido de la carpeta raíz del servidor de pruebas:

                C:\curl>curl -k -u <user>:<pass> --ftp-ssl -1 ftp://ftp.server.com:990

                C:\curl>curl -k -u <user>:<pass> --ftp-ssl-reqd -1 ftp://ftp.server.com:990

                C:\curl>curl -k -u <user>:<pass> --ftp-pasv --ftp-ssl -1 ftp://ftp.server.com:990


                Resultado:

                drwxrwxr-x   5 (?)      (?)          4096 Mar 31 13:14 dir

                Comandos que muestran un listado del directorio /DIR/:

                C:\curl>curl -k -u <user>:<pass> --ftp-pasv --ftp-ssl -1 ftp://ftp.server.com:990/dir/

                Resultado:

                drwxrwxr-x   2 (?)      (?)          4096 Jun  8 16:27 input
                drwxrwxr-x   2 (?)      (?)          4096 Jun  8 16:28 output



                A continuación indico el significado de las opciones utilizadas:

                -k/--insecure
                (SSL) This option explicitly allows curl to perform "insecure" SSL connections
                and transfers. All SSL connections are attempted to be made secure by using the
                CA certificate bundle installed by default. This makes all connections considered
                "insecure" fail unless -k/--insecure is used.

                -u/--user <user:password>
                Specify the user name and password to use for server authentication. Overrides
                -n/--netrc and --netrc-optional.
                If you just give the user name (without entering a colon) curl will prompt for
                a password.
                If you use an SSPI-enabled curl binary and do NTLM authentication, you can
                force curl to pick up the user name and password from your environment by simply
                specifying a single colon with this option: "-u :".
                If this option is used several times, the last one will be used.

                --ftp-ssl
                (FTP) Try to use SSL/TLS for the FTP connection. Reverts to a non-secure
                connection if the server doesn’t support SSL/TLS. See also --ftp-ssl-control and
                --ftp-ssl-reqd for different levels of encryption required. (Added in 7.11.0)

                --ftp-ssl-reqd
                (FTP) Require SSL/TLS for the FTP connection. Terminates the connection if the
                server doesn’t support SSL/TLS. (Added in 7.15.5)

                -1/--tlsv1
                (SSL) Forces curl to use TLS version 1 when negotiating with a remote TLS server.


                Lo único que falta es probar que estos mismos comandos funcionan desde el servidor de XI con la configuración actual del firewall.

                jueves, mayo 14, 2009

                Objetos de autorización (AUTHORITY-CHECK OBJECT)

                Los objetos de autorización disponibles se encuentran en las transacciones SU20 y SU21. Mediante la primera podremos buscar por campo/elemento de datos los objetos disponibles. Por ejemplo, podemos buscar qué objetos de autorización existen asociados al campo división (GSBER). Al hacer doble clic sobre el resultado de la búsqueda accederemos a la pantalla de "Ámbito de autorización" donde se detalla, en la sección inferior, los objetos de utilización que utilizan el criterio seleccionado. Para el caso del campo División, nos puede ser útil los objetos de autorización que se encuentran en la clase de objeto FI.

                La transacción SU21 ofrece más detalle sobre los objetos de autorización. Si quisiéramos conocer la composición del objeto F_BKPF_GSB, el cual se encuentra en la clase FI, deberemos buscar por el nombre del objeto mediante el icono de los prismáticos y hacer doble clic sobre el mismo. El objeto F_BKPF_GSB está compuesto de la siguiente manera:

                F_BKPF_GSB

                Tras conocer la composición del objeto, podremos hacer uso del mismo del siguiente modo:



                Donde p_gsber es el campo que contiene la división sobre la que se quiere comprobar si el usuario tiene permiso. También se puede hacer uso del identificador ACTVT para determinar el tipo de actividad que se quiere comprobar. Las atividades permitidas del objeto se pueden visualizar en la parte inferior de la ventana de descripción del objeto en la transacción SU21.

                jueves, abril 30, 2009

                Reemplazar caracteres por espacios en blanco

                El siguiente código reemplaza los caracteres que concuerden con las expresiones lógicas por un espacio en blanco. Nótese como la definición del espacio en blanco se realiza mediante comillas simples inversas (`), esto es así porque se trata de una expresión de "sustitución".



                Significado de las expresiones:
                • GC_ISO_EXP: sustituye los caracteres típicos de ficheros XML y de texto por espacios en blanco (< >' " & ; : ¨ ^).
                • GC_LN: sustituye los caracteres que NO sean minúsculas (\l) ni mayúsculas (\u) ni numéricos (\d).
                • GC_LC: sustituye los caracteres que NO sean minúsculas (\l) ni mayúsculas (\u) ni numéricos (\d) ni el guión (-) ni la barra (/).
                • GC_LNG: sustituye los caracteres que NO sean minúsculas (\l) ni mayúsculas (\u) ni numéricos (\d) ni el guión (-) .

                  La constante GC_ISO contiene los caracteres imprimibles propios del conjunto ISO 8859-1, para las pruebas.

                  martes, abril 28, 2009

                  Función de mapeo de usuario para decodificar un campo en Base64

                  La siguiente función definida por usuario o User-Defined Function (UDF) decodifica el contenido de un campo en base64.

                  decodebase64

                  En este caso he utilizado la librería "sun.misc.BASE64Decoder" de la que es propietaria SUN. Podría valer cualquier otra, pero es la que utilizaban en el código de referencia que utilicé para este ejemplo: https://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/9793

                  De manera análoga se puede codificar un campo en Base64 utilizando la librería correspondiente.

                  martes, marzo 24, 2009

                  Comprobar conexión servidor hacia fuera

                  A la hora de consumir un web service externo es necesario saber si la conexión hacia el exterior está configurara correctamente (puertos del firewall, etc.). Una manera sencilla de realizar dicha comprobación es a través de la creación de una conexión HTTP con servidor externo (tipo G) en la transacción SM59 y en la que incluiremos la dirección del servidor al que se desea acceder. Para comprobar si hay conexión bastará pulsar el botón "Test de conexión".

                  test_external_server

                  Una mala configuración puede provocar que se reciban timeouts a la hora de invocar el web service o que se produzcan fallos a la hora de crear el socket de comunicación...