viernes, diciembre 19, 2008

Datos SLD no se actualiza en sistema ECC

Síntomas

  • Obtención del mensaje LCR_GET_OWN_BUSINESS_SYSTEM - NO_BUSINESS_SYSTEM al realizar una llamada a proxy desde la máquina ECC o al ejecutar la transacción SXI_CACHE desde dicha máquina. También puede verse desde la transacción SLD_CACHE.
  • La tabla LCRT_CLNTCACHE está vacía. En esta tabla es donde se recogen los datos de la SLD de la máquina XI.

    Posibles problemas

    1. El usuario de la transacción SLDAPICUST puede estar mal. El usuario que se indica en esta transacción debe estar definido en la máquina XI. Si el usuario está definido en XI y el problema está en que el password definido en la transacción SLDAPICUST de la máquina ECC está mal, lo podremos saber porque si ejecutamos la transacción SLDCHECK 3 veces  comprobamremos que en XI el usuario está bloqueado.
    2. También se recomienda comprobar que el parámetro com.sap.aii.connect.integrationserver.r3.client del perfile de integración se corresponde con el mandante del Servidor de Integración.

      Más información

        jueves, diciembre 04, 2008

        Error al enviar mensajes de ECC a XI

        Se puede dar la posibilidad de que al enviar un mensaje desde ECC a XI aparezca el error HTTP_RESP_STATUS_CODE_NOT_OK por problemas de autorización del usuario. Esto es común cuando se realizan "reseteos" de contraseñas generalizadas o se borran usuarios.

        Para registrar de manera correcta al usuario, se deberá ir a "XI" (a pesar de que la conexión es ECC -> XI) y en la transacción SICF deberemos ir al nodo default_host -> sap -> xi -> engine y haciendo doble clic sobre engine, asignaremos el usuario correspondiente.

        Mensajes asíncronos no se envían/reciben con proxies

        De entre las diferentes fuentes de las que puede proceder el problema (mala configuración del adaptador, mala configuración del escenario, no se ha actualizado la cache, etc.), se encuentra el caso en el que la cola de envío o la de recepción se encuentre saturada, generalmente porque uno de los mensajes contiene errores y no permite que el resto se ejecuten.

        El escenario del que hablo hace referencia a un tipo de comunicación proxy asíncrona (asynch) relacionada con un canal de comunicación de tipo fichero de contenido fijo (File Content Conversion). En este caso se ha programado la interfaz para que cada vez que se detecte un fichero determinado en un directorio de XI se procese y se envíe mediante proxy al sistema ERP. El problema estaba en que al dejar el fichero en el directorio, el canal de comunicación correspondiente lo procesaba adecuadamente pero el mensaje nunca llegaba al sistema ERP (existía un mensaje de envío, pero no uno de recepción).

        Existen varios modos para acceder a la cola de envío/recepción de mensajes. Uno es a través de la transacción SXMB_MONI y en la misma línea del mensaje en cuestión aparece un link, fuera de pantalla, a la derecha, a la cola en la que se encuentra. La otra manera es de manera directa a través de las transacciones SMQ1 (cola de salida) y SMQ2 (cola de entrada). Se recomienda revisar ambas colas y si se encuentran llenas bastará lanzar los mensajes ( F8 ) o eliminarlos para que los futuros mensajes de la interfaz puedan circular.

        jueves, octubre 16, 2008

        El Payload del contendido de un mensaje no aparece en el Message Monitoring

        ACTUALIZADO: por fin he encontrado la manera de registrar los mensajes síncronos en el monitor de XI. Para ello hay que ir a la transacción SXMB_ADM -> Configurar Integration Engine -> Configuración específica y añadimos el parámetro:
        • Categoría: RUNTIME
        • Parámetro: LOGGING_SYNC
        • Valor actual: 1

          Y por si acaso, también recomiendan tener el valor del TRACE_LEVEL a nivel 3.

          Referencia: https://forums.sdn.sap.com/message.jspa?messageID=4599158

          Existen tres premisas que se deben conocer relacionadas con los payloads de los mensajes gestionados por XI:
          1. Por defecto, los mensajes SÍNCRONOS no se almacenan en XI para ahorrar espacio de almacenamiento.
          2. Hasta la versión PI 7.0 no hay manera directa de configurar XI para que guarde los mensajes síncronos procesados.
          3. En la versión de PI 7.1 existe una opción de indicar al servidor que guarde los mensajes síncronos procesados y ésta se describe en el blog Display Adapter Synchronous Message Content in RWB of PI 7.1

            Respecto al punto 2, no es del todo cierto. Existe un mecanismo de archivado de mensajes que permite, mediante un job, indicar qué mensajes de qué interfaces se deseean mantener registrados en el sistema. A esta opción se accede a través de la transaccion SXMB_ADM -> Especificar interfaces para archivo y tiempos de permanencia (Define Interfaces for Archiving and Retention Periods).


            En esta pantalla definiremos qué interfaces queremos rastrear y a través del botón Retention period indicaremos los días que deseamos que permanezcan los mensajes almacenados en el sistema. Por defecto los mensajes síncronos aceptados aparecen como no almacenables (0 días), por lo que deberemos cambiarlo para que dichos mensajes queden registrados.


            Una vez realizado esto deberemos planificar el job encargado de registrar los mensajes y, por último, para poder ver los mensajes recogidos en el sistema deberemos utilizar la transacción XMS_SARA para ir al administrador de mensajes y acceder a los archivos deseados en función del día.

            Referencias:

              martes, octubre 14, 2008

              Eliminar Espacio de Nombres de fichero XML

              Los ficheros XML generados por defecto en XI contienen una especificación explícita del espacio de nombres, aunque sólo exista uno.



              En ocasiones los mensajes que nos envían vienen sin especificar dicho espacio de nombres:



              Para otros tipos de adaptadores (Ficheros/FTP, SOAP, …) existen módulos que permiten definir/filtrar los espacios de nombres de los ficheros (mirar entrada Cambiar la codificación de caracteres de un fichero XML), pero para el adaptador XI (ABAP Proxy) no es posible utilizar módulo alguno. Para ello es necesario modificar los tipos de mensajes involucrados y dejar en blanco el campo XML Namespace.



              Una vez hecho esto, será necesario regenerar el/los ABAP proxies correspondientes desde la máquina con la que esté conectada el servidor XI a través de la transacción SPROXY.

              Referencias:

                lunes, octubre 13, 2008

                Probar un Web Service

                Una vez publicado un Web Service (mirar esta entrada para más información), falta poder probarlo. Existen varios modos de probar el funcionamiento de los Web Services.

                Uno de ellos es mediante el uso de herramientas externas específicas como lo son:

                  Otro modo sería a través de la herramienta SAP Web Services Navigator (for Web services created/deployed on SAP Web AS) que proporciona XI para probar sus servicios web. Esta herramienta es el Navegador de Web Services y se puede acceder a ella desde la URL http://<servidor>:<puerto_java>/wsnavigator/enterwsdl.html. En ella deberemos introducir la dirección URL del WSDL publicado en la máquina. Para conocer dónde están publicados los servicios dentro de XI deberemos ejecutar la transacción SICF y navegar por el árbol base hasta encontrar el nombre del servicio correspondiente. Por defecto la ruta de los servicios suele ser: /default_host/sap/bc/bsp/sap/. Una vez conocida su ubicación se facilitará la URL al navegador (p.ej.: http://<servidor>:<puerto>/sap/bc/bsp/sap/aplicacion_ws/servicio_web.wsdl ). Tras introducir la ubicación del fichero WSDL se nos pedirá que nos identifiquemos en el sistema XI. A continuación, una vez cargado, pulsaremos sobre la opción Test y seleccionaremos la interfaz que deseamos probar pulsando sobre ella. Por último introduciremos los datos de entrada "a mano" y al pulsar el botón Send nos devolverá el mensaje de respuesta devuelto por el servidor. Este mecanismo es más visual e intuitivo pero no es muy rentable del punto de vista funcional ya que para pruebas que necesiten introducir muchos valores serían inviables de este modo.

                  Por último, también se podría usar la página HTML cuyo código se proporciona en este link, la cual permite tanto introducir el código de petición XML a mano como a través de fichero, además de otras opciones de selección relativas al tipo de comunicación del servicio.

                  Referencias:

                    Publicar un Web Service

                    ACTUALIZACIÓN (2009/03/11) - Este artículo pretende describir los pasos necesarios para generar el archivo WSDL correspondiente al Web Service creado sin llegar a tocar la publicación del mismo en los directorios UDDI. Mediante el fichero WSDL, el sistema externo podrá conocer la estructura de los datos del servicio y la dirección de conexión del mismo, por lo que bastará con hacerles llegar dicho fichero para que se puedan conectar al servicio deseado. Si se desea conocer más acerca de la publicación del fichero en directorios UDDI se puede consultar los enlaces de referencia que se encuentran al final del artículo.

                    Una vez definido y configurado correctamente la interfaz de tipo Web Service queda publicar el servicio correspondiente.  En el Integration Builder existe un asistente que permite generar el documento WSDL necesario para que los servicios externos se puedan comunicar con el Web Service. Esta herramienta se puede encontrar en el menú Tools -> Define Web Service...


                    Lo primero por lo que te pregunta el asistente es por la URL del canal de entrada del servidor SOAP de integración (Integration Server SOAP inbound channel). Bastará pulsar el botón de proponer URL (Propouse URL) para que el asistente nos facilite una URL válida del tipo http://<servidorXI>:<http_port>/sap/xi/engine?type=entry. No se recomienda el uso de esta URL ya que, aunque es válida para conectar con el servicio, no hace uso de la capa SOAP y, por lo tanto, no es segura.  Para hacer uso de la capa SOAP, la URL debe ser del tipo  http://<host>:<java_port>/XISOAPAdapter/MessageServlet?channel=<party>:<service>:<channel> o, en el caso de no existir PARTY: http://<host>:<java_port>/XISOAPAdapter/MessageServlet?channel=:<service>:<channel> (manteniendo los ':' previos al servicio).

                    Ejemplo: http://ServidorXI:50000/XISOAPAdapter/MessageServlet?channel=:Service_BS:Sender_WS_CC

                    Para comprobar que la dirección es válida se podrá probar la URL en el navegador de Internet y, tras identificarse con un usuario con los permisos adecuados, devolverá una página con el siguiente contenido:

                    Message Servlet is in Status OK


                    Status information:

                    Servlet com.sap.aii.af.mp.soap.web.MessageServlet (Version $Id: //tc/xi/NW04S_12_REL/src/_adapters/_soap/java/com/sap/aii/af/mp/soap/web/MessageServlet.java#4 $) bound to /MessageServlet
                    Classname ModuleProcessor: null
                    Lookupname for localModuleProcessorLookupName: localejbs/ModuleProcessorBean
                    Lookupname for remoteModuleProcessorLookupName: null
                    ModuleProcessorClass not instantiated
                    ModuleProcessorLocal is Instance of com.sap.aii.af.mp.processor.ModuleProcessorLocalLocalObjectImpl0_0
                    ModuleProcessorRemote not instantiated

                    En segundo lugar se nos pedirá que indiquemos la interfaz de mensaje del Repositorio de Integración que deseamos publicar. Hay que tener en cuenta que si el que inicia el servicio es el sistema externo, la interfaz será de salida (outbound). Para seleccionarla utilizaremos el botón de ayuda que aparece junto a los campos.


                    El tercer paso consiste en indicar el sistema que inicia el servicio, en el campo Service se indicará el nombre lógico de la máquina (sistema o servicio de negocios), en el campo Interface Name indicaremos el nombre de la interfaz de mensajes que se especificó en el paso anterior y el espacio de nombres será el correspondiente a dicha interfaz.


                    Una vez introducidos los campos necesarios, pulsaremos Finish y se generará el archivo WSDL que  permitirá a los sistemas externos comunicarse con el Web Service de nuestro sistema. Para ello pulsaremos el botón SAVE y lo guardaremos en algún directorio local de nuestro equipo. Hay que tener en cuenta que el servicio web está en funcionamiento desde el momento en el que se activan los canales de comunicación, por lo que la generación del WSDL no guarda relación con la activación del mismo.

                    A continuación podremos incluir el servicio web en la Biblioteca BSP a través de la transacción SE80, pero esto no es necesario para el funcionamiento del mismo. En ella deberemos seleccionar el paquete donde deseemos vincular el servicio y con el botón derecho sobre el mismo seleccionaremos la opción Crear -> Biblioteca BSP. Seguidamente pulsaremos de nuevo con el botón derecho sobre la Biblioteca BSP recién creada y seleccionaremos la opción Crear -> Aplicación BSP y, por último, sobre la propia aplicación pulsaremos una vez más con el botón derecho del ratón y crearemos una aplicación.

                    Cada aplicación puede contener más de un Web Service definido. Para crear un WS a partir del fichero WSDL que acabamos de generar pulsaremos con el botón derecho del ratón sobre la aplicación creada y seleccionaremos la opción Crear -> Objeto MIME -> Importar y seleccionaremos el archivo WSDL que hemos creado. No hay que olvidar activar la aplicación BSP tras generar el objeto MIME para que funcione correctamente. En este caso, cada vez que se modifique la "estructura" de los componentes implicados en la interfaz será necesario generar de nuevo el fichero WSDL y actualizarlo en la aplicación de la biblioteca BSP correspondiente (activando la aplicación después de su importación).

                    Referencias:

                      UDDI:

                        sábado, octubre 11, 2008

                        Problema de conexión de SPROXY a nivel de mandante

                        Este problema me sucedió en un entorno de red filtrado por un servidor proxy. La transacción SPROXY desde un mandante determinado, el 100, funcionaba correctamente mientras que para otro mandante de la misma máquina, el 200, dicha transacción devolvía un error de conexión con el Integration Builder.

                        Para conocer el posible motivo del fallo ejecuté el test de conexión que se proporciona en la transacción SPROXY y concretamente fallaba en el tercer punto, al ejecutar el report SPROX_CHECK_IFR_RESPONSE aparecía el siguiente mensaje:



                        El problema estaba en que para el mandante 200 se había activado la parametrización del proxy mientras que para el 100 no lo estaba. Esta parametrización es dependiente del mandante y para activarla/desactivarla hay que ir a la  transacción SICF y en el menú superior ir Mandante --> Parametriz.proxy (Ctrl+F2) y desmarcar la casilla "Parametriz.proxy activa" o en su defecto se pueden definir los filtros de las direcciones correspondientes.


                        El mensaje que devolvía el report SPROX_CHECK_IFR_RESPONSE se debía a que intentaba resolver la dirección de "servidorXI" a través del proxy en vez de resolverlo a través de los registros DNS definidos en el propio servidor.

                        Cambiar la codificación de caracteres de un fichero XML

                        Por defecto XI genera los mensajes XML en formato UTF-8. Para que estos se codifiquen en otro formato como el ISO-8859-1 habrá que configurar el adaptador receptor para que éste se encargue de hacerlo.

                        Como ejemplo se mostrará la configuración para un receptor de tipo fichero. Para lograr que el “contenido” del fichero se muestre en formato ISO-8859-1 se necesita añadir un módulo específico al adaptador que se encarga de realizar la conversión, entre otras cosas. En el caso de los ficheros XML, para que el módulo pueda procesar el contenido del fichero éste deberá ser de tipo BINARIO, de otro modo se producirá una excepción a la hora de procesar el fichero diciendo que el fichero pasado no se encuentra en el formato correcto. Esta restricción queda especificada en el enlace Configuring the Receiver File/FTP Adapter, en el apartado "Select the File Type of the document".



                        En la pestaña Module del adaptador se inserta el módulo AF_Modules/XMLAnonymizerBean en una posición anterior al módulo CallSapAdapter ya que de lo contrario se enviaría el fichero antes de procesarlo.

                        file_adapter_module

                        Una vez definido el módulo como tipo “Local Enterprise Bean”, se deberán especificar los parámetros anonymizer.acceptNamespaces y anonymizer.encoding. El primero sirve para filtrar los Espacios de Nombre (namespaces) del fichero que se desean conservar (los que no se informen aquí se eliminarán del fichero). Hay que tener en cuenta que un fichero XML puede contener más de un espacio de nombres definido y a través de este parámetro también se permitirá renombrar a los mismos. En el caso del namespace principal se indicará haciéndole corresponder 2 comillas simples (‘’). En la nota 880173 - XI 3.0 Adapter Framework XML Anonymizer Modulese se muestran varios ejemplos sobre el comportamiento de estos parámetros.

                        El segundo parámetro, encoding, indica el formato con el que se generarán los datos del fichero.

                        En este caso los valores que se le han dado a los parámetros han sido:
                        • anonymizer.acceptNamespaces = http://www.server.com/DIR/NameSpace ‘’
                        • anonymizer.encoding = ISO-8859-1

                          Para más información se pueden consultar los siguientes enlaces:

                            jueves, octubre 09, 2008

                            Reloj de proceso y mensaje en barra de estatus

                            La función SAPGUI_PROGRESS_INDICATOR imprime el reloj de proceso en la barra de estatus y el mensaje que se indique. En el siguiente ejemplo, se buscan todas las transacciones a las que no tiene permiso el usuario que ejecuta el código. Mientras se muestra el progreso de la búsqueda mediante el reloj el cual se actualiza cada 25% para que el refresco de pantalla no sea incómodo:


                            lunes, octubre 06, 2008

                            MAPPING.NO_MAPPINGPROGRAM_FOUND

                            El motivo de que se produzca este error se debe a que uno de los campos pasados contiene un formato no esperado y por lo tanto no se puede mapear en XI, lanzando un mensaje como el que sigue:



                            Cuando el volumen de datos enviados es demasiado grande se aconseja probar el servicio con un mensaje más pequeño representativo que nos permita validar el correcto funcionamiento de la interfaz. Una vez comprobado que el proceso de mapeo funciona correctamente, habrá que detectar cuál fue el campo que vino informado con un formato incorrecto (p.ej. "100,09" en vez de "100.09").

                            Otra posible causa de este error se debe a que los datos de la cache no hayan sido actualizados, por lo que bastaría refrescarla para que se registren los cambios.

                            lunes, septiembre 15, 2008

                            Definición de Rango Numérico

                            La transacción para definir un objeto de tipo rango de números es la SNRO. A continuación se muestra un ejemplo de definición de rango de números:



                            Para obtener el siguiente valor del objeto desde un programa habrá que utilizar la siguiente función:



                            Donde la variable "pch_numpre" es del mismo dominio que el objeto numérico y contendrá el valor actual tras incrementar el contador del rango numérico.

                            Referencias:

                            viernes, septiembre 12, 2008

                            Adobe Forms: Incluir logos, imágenes de fondo y datos de varias tablas

                            En el siguiente artículo se indica cómo crear un Adobe Form (tx:SFP) al que se le añade imágenes y devuelve tablas con datos recopilados de disntintas fuentes a partir de unos parámetros de entrada variables:

                            Scenario on displaying logo, background image and fetching data from multiple tables

                            Ficheros con tamaño de línea fijo

                            Cuando se desea generar un fichero de texto con longitud de línea fija, en muchas ocasiones se utilizan espacios para rellenar el espacio sobrante al final de las mismas por lo que se debe especificar de la siguiente manera que no se ignoren los espacios finales según se vaya a generar el fichero en local o en el servidor:

                            Local


                            Cuando se descarga el fichero en local, se deberá indicar que NO se excluyan los espacios en blancos al final de la línea mediante el parámetro TRUNC_TRAILING_BLANKS_EOL vacío:



                            Servidor


                            Cuando el fichero se va a generar en el servidor bastará añadir la sentencia LENGTH seguida del tamaño de la línea del fichero y ésto hará que las líneas cuyo contenido sea inferior al indicado se rellenen por el final con espacios en blanco:


                            viernes, agosto 01, 2008

                            PhotoRec

                            Se trata de una gran utilidad para recuperar ficheros tras una gran pérdida, como lo puede ser darse cuenta de que no copiaste las fotos de aquel fabuloso viaje antes de formatear el disco duro... ¿verdad Manolillo ;) ?

                            Para aquellos que les pueda interesar describiré los pasos básicos que seguí para recuperar los archivos deseados. La situación con la que me encontré fue con un equipo portatil recién formateado sin sistema operativo instalado por lo que la probabilidad de recuperar todos o la mayor parte de los archivos es bastante alta. Como es lógico, el programa de recuperación se debe ejecutar a través de un sistema operativo así que hay 3 opciones:
                            1. Coger el disco duro afectado y ensamblarlo en otro equipo que disponga de sistema operativo instalado (tedioso en el caso de los portátiles...).
                            2. POCO RECOMENDABLE: Instalar un sistema operativo sobre el propio disco duro afectado, esto podría machacar parte o totalidad de los archivos a recuperar...
                            3. Utilizar un sistema operativo volátil de tipo LiveCD.

                              Yo considero la tercera opción como la más recomendable y menos costosa. A ser posible si ya viene con la utilidad instalada mejor (Knoppix la tiene). Antes de empezar recomiendo disponder de algún dispositivo de almacenamiento externo tipo pendrive para almacenar todos los archivos en él, ya que las versiones Live de los sistemas operativos no permiten almacenar gran cantidad de datos (dependiendo de la memoria del sistema) por lo que cuanto mayor sea la capacidad del dispositivo externo, mejor (dependiendo de los archivos que se deseen recuperar...).

                              Hay que destacar que PhotoRec es multiplataforma, en mi caso utilicé una versión LiveCD de Ubuntu, que no la tenía instalada por lo que a continuación describo los pasos que seguí para poder recuperar los archivos:
                              1. Me descargué el paquete correspondiente desde aquí (en mi caso: la versión Linux, kernel 2.6.x i386/x86_64, tar.bz).
                              2. A través de la consola de comandos descomprimí el archivo: 
                                • bunzip2 testdisk-6.10.linux26.tar
                                • bz2tar -xvf testdisk-6.10.linux26.tar
                              3. Antes de ejecutar el programa, deberemos concectar el/los dispositivos donde deseamos que se almacenen los archivos recuperados (siempre que se llene un dispositivo, el programa pedirá que se le especifique una nueva ubicación para continuar guardando el resto de archivos que encuentre).
                              4. Una vez descomprimido, el programa se puede lanzar mediante el siguiente comando. Una recomendación es ejecutar el programa fuera de la interfaz gráfica (Ctrl+Alt+F4 -> Ctrl+Alt+F7 para volver) ya que es un programa que consume muchos recursos (en mi caso para 80GB estuvo 3 horas) y si estás en modo gráfico puede que se cuelgue el sistema.
                                • sudo testdisk-6.10/linux/photorec_static

                              Con ésto ya estaremos en la aplicación. La interfaz es muy intuitiva (en inglés, claro), con las opciones justas y propone por defecto los valores correctos (si detecta que la partición anterior se trataba de NTFS se marcará esta opción a la hora de elegir el formato en el que estaban grabados los ficheros a recuperar). Mi recomendación es echar un vistazo a estos links antes de utilizar la aplicación:

                                Buena suerte.

                                jueves, julio 31, 2008

                                Crear un fichero de texto comprimido en ZIP

                                Existe una clase estándard en SAP, CL_ABAP_ZIP, que permite crear archivos de texto comprimidos en ZIP. Existen varios modos de conseguir dicho fin. Un objeto de la clase CL_ABAP_ZIP puede contener más de un archivo. Todos los archivos que contengan deben estar codificados en binario (XSTRING).

                                A continuación se muestra un ejemplo de cómo convertir el contenido de una tabla interna a un fichero ZIP.



                                Si lo que se desea es comprimir un archivo que se encuentra en una ubicación determinada, lo que deberemos hacer es, en primer lugar, leer el contenido del archivo en una variable de tipo binaria (xstring) y a continuación pasarle el contenido de esa variable al objeto de la clase CL_ABAP_ZIP que la vaya a contener.


                                miércoles, julio 30, 2008

                                SAP Netweaver Developer Studio

                                Se trata de una herramienta de utilidad para el desarrollo en XI. Se puede descargar, junto a una serie de herramientas complementarias, desde los siguientes enlaces:



                                martes, julio 29, 2008

                                RFC vs. Proxy

                                En el presente post he querido reflejar las ventajas y contras que aparecen al utilizar RFCs y al utilizar ABAP Proxies. Es por ello que antes de decirdir qué método utilizar será recomendable que tengamos en cuenta las siguientes caracteríscitas:

                                ABAP Proxies

                                Ventajas

                                • Permite definir todas las estructuras necesarias a partir de esquemas XSD o ficheros WSDL.
                                • Funcionan sin problemas con estructuras anidadas (tablas dentro de otras tablas).

                                  Inconvenientes

                                  • Al importar el proxy en el ERP se generan numerosos objetos con nombres muy largos. Si se desea renombrar dichos objetos habrá que tener en cuenta que cada vez que sea necesario importar de nuevo el proxy (debido a cambios) los nombres de los objetos deberán ser cambiados de nuevo.
                                  • Es necesario configurar la conexión desde el sistema ERP al sistema XI para que la transacción SPROXY pueda importar los proxies correctamente.
                                  • El acceso a los métodos de las clases y las llamadas a éstos es más tediosa que con las RFCs.

                                    RFCs

                                    Ventajas

                                    • La definición del código es mucho más directa que a través de los proxies.
                                    • La llamada a las funciones RFCs es más sencilla.
                                    • La actualización de las estructuras que utiliza es más directa.

                                      Desventajas

                                      • Requiere que definamos las estructuras enteras en el sistema ERP a pelo. Si éstas disponen de muchos campos, la cosa se complica.
                                      • No funciona bien con estructuras de tipo tabla que contienen campos que a la vez son de tipo tabla.

                                        A continuación muestro 2 enlaces que pueden ser de interés:

                                          lunes, julio 28, 2008

                                          Controlar tiempos de ejecución

                                          Si lo que se desea conocer es cuánto se tarda en ejecutar una porción de código, la sentecia GET RUN TIME FIELD nos vendrá como anillo al dedo. A continuación muestro un ejemplo de utilización:



                                          Los tiempos t1 y t2 vienen dado en microsegundos por lo que será necesario dividirlos por 1.000 para pasarlos a milisegundos y por 1.000.000 si se desea tener en segundos.

                                          miércoles, julio 09, 2008

                                          EAN-128

                                          A la hora de tratar con códigos EAN-128 existen módulos de funciones estándar que permiten tanto codificar como decodificar de este modo.

                                          Dentro del grupo de funciones LE_EAN128 se encuentran los módulos:
                                          • LE_EAN128_ENCODE: Crear un código de barras estándar para ean128
                                          • LE_EAN128_DECODE: Descodificación de un código de barras estándar para ean128
                                          • LE_EAN128_LABEL_OUTPUT: EAN128 etiqueta: Edición impresa
                                          • LE_EAN128_LABEL_READ: EAN128 etiqueta: datos

                                            Hay que tener en cuenta que para que el proceso de codificación se realice correctamente será necesario tener parametrizado de forma correcta las secciones comprendidas en el área de customizing (SPRO) Logistics - General --> Handling Unit Management --> Basics --> Define EAN128.

                                            Existe otro grupo de funciones que también debe tenerse en cuenta y es el LE_BARCODE. Dentro del cual el módulo de función más significativo es el:
                                            • LE_BARCODE_AI_READ: Lee la descripción de códigos de barras
                                            Los datos referentes a los códigos AI (longitud, tipo, etc.) definidos en el sistema se encuentran en la tabla T313D, mientras que la tabla T313G recoge los caracteres especiales (prefijos y delimitadores) utilizados en cada tipo de codificación. Por ejemplo, partiendo del siguiente código EAN128 :
                                            • (02)08470006043066(17)150400(37)006(10)1022134
                                            El código EAN128 tiene definido, por defecto, el código ']C1' como prefijo y el código hexadecimal '1D' (group separator) como separador de campos de longitud variable. Esto quiere decir que para que la función de decodificación reconozca el anterior código, este se debería pasar de habría que pasar el código EAN de la siguiente manera:
                                            • ]C102084700060430661715040037006#101022134
                                            Donde '#' representa el carácter no imprimible "group separator".

                                              Más info: http://www.scribd.com/doc/3262714/EAN128-E

                                              jueves, julio 03, 2008

                                              ccBPM

                                              A través del cross-component BPM se permiten definir procesos de negocios automatizados ampliando así la potencia de componente de integración de procesos de SAP. El ccBPM permite, entre otras cosas, recibir mensajes individuales a través de una determinada interfaz para postermiormente unificarlos en una lista y distribuirlos a las máquinas correspondiente, por ejemplo.

                                              Los procesos definidos a través del ccBPM están basados en el estándard BPEL4WS, definido entre otros por SAP, IBM y Microsoft. Es por ello que dichos procesos pueden ser exportados a otros sistemas y, por otra parte, se pueden importar procesos de negocios definidos en otros sistemas, siempre y cuando sigan este estándar.

                                              Antes de definir los procesos de integración mediante el ccBPM, se deberá configurar el entorno XI de manera correcta (diseño y configuración), tal como se especifica en éste enlace.

                                              Para más información: http://help.sap.com/saphelp_nw04/helpdata/en/3c/831620a4f1044dba38b370f77835cc/frameset.htm

                                              Anteponer el signo de los números

                                              El siguiente código vuelca el contenido de un número real (negativo) a una variable alfanumérica, poniendo el signo como prefijo de la misma.


                                              jueves, junio 05, 2008

                                              Obtener el siguiente número secuencial

                                              Donde el parámetro NR_RANGE_NR es de tipo INRI-NRRANGENR y el parámetro OBJETO es de tipo INRI-OBJECT.


                                              lunes, junio 02, 2008

                                              Convertir campos del ALV en totalizables

                                              Para que los botones de sumatoria y subtotales se activen en un listado se deberán especificar los campos que se deseen totalizar a partir de referencias a campos de tablas estándar. De este modo SAP conocerá el tipo (decimales, signo, etc.) y podrá realizar las sumas de manera correcta.



                                              Si, además, marcamos el campo "DO_SUM", esto hará que se muestra una línea de totales al final del listado.

                                              Ocultar campos de pantalla

                                              Hay veces en las que se hace necesario ocultar ciertos campos de la pantalla de selección. Sobre todo cuando se utilizan bases de datos lógicas que incluyen campos propios. En estos casos habrá que saber en primer lugar cuál es el nombre de los campos que deseamos ocultar. Ésto se puede lograr visualizando la pantalla de selección estándar del sistema (dynpro nº 1000). Los campos se recogen en la pestaña Lista de elementos y dentro de ésta deberemos ir a la pestaña Grupos modif./Funciones para conocer los grupos a los que están asignados.

                                              Supongamos que deseamos ocultar aquellos campos que pertenezcan al GRUPO1 YB1. El lugar donde debemos codificar ésto es en el evento AT SELECTION-SCREEN OUTPUT. Y el código sería el siguiente:



                                              Nótese que el campo INPUT puesto a 0 sirve para aquellos campos de entrada salida, ya que si no especificamos este valor, aunque se pongan invisibles se seguirán mostrando.

                                              Llamadas a listados con retorno

                                              Algunas veces se crean programas que, en función de unas opciones de selección, permiten visualizar un tipo de listado u otro. Lo ideal es que el usuario no tenga salir del programa y volver a cada vez que quiera cambiar de listado, sino volver a la pantalla de selección y desde ahí elegir el nuevo listado que desea visualizar.

                                              Esto se consigue mediante la combinación CALL SCREEN + LEAVE TO SCREEN 0. A continuación se muestra un ejemplo.

                                              En el programa principal habrá un código del siguiente estilo:



                                              Y los módulo PAI de las pantallas deberán contener un código similar a éste:



                                              Es importante hacer uso del CALL SCREEN ya que si utilizamos la sentencia LEAVE TO SCREEN 0 con SET SCREEN nos echará del programa.

                                              viernes, mayo 23, 2008

                                              Delimitaciones dinámicas en LDB_PROCESS

                                              Cuando usamos bases de datos lógicas de partidas de FI hay campos que no aparecen directamente en la pantalla de selección, pero sí a través del botón de delimitaciones opcionales. los programas estándar que incluyen la LDB en los atibutos gestionan correctamente estas delimitaciones, pero... ¿cómo las especificaríamos si utilizamos la función LDB_PROCESS? aquí va un ejemplillo.



                                              Funciones relacionadas con los días de los períodos

                                              PERIOD_DAY_DETERMINE: devuelve primer/último días de período
                                              - Entrada: I_GJAHR, I_MONAT, I_PERIV (de sociedad en T001)
                                              - Salida: E_FDAY, E_LDAY, E_SPERIOD (indicador período especial)

                                              FIRST_DAY_IN_PERIOD_GET / LAST_DAY_IN_PERIOD_GET
                                              - Entrada: I_GJAHR, I_PERIV (de sociedad en T001) , I_POPER (período)
                                              - Salida: E_DATE (primer / último día)

                                              Gracias a Lucas León.

                                              Esperar 'n' segundos

                                              Si se desea meter un retardo de 'n' segundos en el código se puede utilizar la siguiente instrucción:


                                              Opciones del DELETE ADJACENT

                                              El motivo de este post es para explicarles unas opciones del DELETE de las tablas internas, que puede resultar de gran ayuda. Supongo que los más experimentados en Abap ya sabrán de ellas, pero el resto puede que no lo hayan visto.

                                              Supongamos que nos pasan una tabla con muchísimos registros, de los cuales pueden haber duplicados. Necesitamos tener un solo registro de cada tipo, por lo que nos interesa eliminar de la tabla los duplicados. Para ello, podemos hacer lo siguiente:
                                              1. ordenamos la tabla -> SORT tabla_interna.
                                              2. eliminamos los duplicados -> DELETE ADJACENT DUPLICATES FROM tabla_interna.

                                              Este delete eliminaría los duplicados de los registros, pero sólo aquellos que coincidan en todos los campos. Si cada registro se compone de varios campos, tienen que coincidir en todos para ser eliminados.

                                              Si lo que nos interesa es eliminar registros que coincidan sólo en uno, dos, ... n campos, lo especificariamos de la siguiente forma.
                                              1. ordenamos la tabla -> SORT tabla_interna.
                                              2. eliminamos los duplicados -> DELETE ADJACENT DUPLICATES FROM tabla_interna COMPARING campo1 campo2 ... campoX.

                                              dónde cada campo es el nombre del campo en la tabla interna.

                                              Por ejemplo.

                                              Tenemos la estructura siguiente, formada por tres campos:



                                              Ahora queremos aplicar lo explicado antes, pero para que tenga en cuenta sólo el campo MATKL a la hora de eliminar duplicados.
                                              1. SORT gt_fich_gr_articulos.
                                              2. DELETE ADJACENT DUPLICATES FROM gt_fich_gr_articulos COMPARING MATKL.

                                              Se eliminarian todos los registros duplicados excepto uno, el primero de la ordenación, con el mismo campo MATKL, aunque los dos campos siguientes sean diferentes.

                                              Gracias a Samuel Artiles.

                                              Estructura para CALL TRANSACTIONS

                                              Con la estructura CTU_PARAMS podemos definir algunos parámetros del CALL TRANSACTION como modo de ejecución (Sólo errores, Visible, Invisible,...), modo de actualización, tamaño estándar de dynpro,...

                                              Para su uso, por ejemplo, podemos definir un parámetro de tipo CTU_PARAMS-XXXXXX en la pantalla de selección y ello nos dará la posibilidad de seleccionar los diferentes aspectos en la ejecución del CALL TRANSACTION.

                                              Ejemplo:


                                              Cambiar el Infoset a un Query

                                              Muchos (sobre todo funcionales) se habrá tropezado alguna vez cuando intenta copiar un query, porque no pueden cambiar el infoset. Pues bien, si no lo sabían, aquí está el truco.

                                              1. Transacción SQ01 (SAP Query). Copiar el QUERY1 en QUERY2. El QUERY2 tendrá asignado el INFOSET1 y no se puede cambiar.
                                              2. Transacción SQ02 (Infosets). Copiar el INFOSET1 en INFOSET2. Hacer las modificaciones que quieran en el INFOSET2.
                                              3. Download el QUERY2 a fichero. Para ello ir a Infosets, Entorno->Transportes (Camioncito).
                                              4. Editar el fichero de texto y cambiar INFOSET1 por INFOSET2.
                                              5. Upload del QUERY2.
                                              Y Listo. El QUERY2 será remplazado por el del fichero, que tiene el nuevo infoset.

                                              Gracias a Jorge Martel por esta información.

                                              Comprobación del NIF



                                              para españa p.e.: COUNTRY = 'ES' y TAX_CODE_1 = nif a comprobar

                                              en las excepciones devuelve si el NIF es válido o no.

                                              martes, mayo 20, 2008

                                              Reutilizar un tipo importado de una RFC

                                              En muchas ocasiones habremos deseado aprovechar los tipos importados de las RFCs, evitando así diseñar los tipos necesarios para el mapeo con éstas, sobre todo si constan de muchos campos. Pues bien, existe una manera de hacerlo un poco casera pero eficaz. Para ello deberemos localizar en primer lugar la RFC/iDoc donde se encuentre el tipo a utilizar.

                                              Una vez localizada, exportaremos el esquema XSD del tipo de mensaje deseado. En este caso exportaremos el correspondiente a la petición (request). Para ello iremos al menú Tools -> Export XSD -> Request... . Ésto nos generará el fichero .xsd en la ubicación que le hayamos indicado. A continuación, editaremos dicho fichero para poder importarlo desde el tipo que vayamos a crear. Supongamos que el tipo de datos que vamos a crear se llamará DT_DUMMY y que pertenece al dominio "http://dummy.es".


                                              En primer lugar deberemos reemplazar el nombre del dominio con el que fue exportado el esquema. En este caso el dominio es "urn:sap-com:document:sap:rfc:functions", debiendo remplazarlo por "http://dummy.es". En sugundo lugar, faltará reemplazar el nombre del tipo del elemento "item" de "*_E_INTE_CAN_ALMACEN" a "DT_DUMMY". Guardamos los cambios.

                                              Con ésto ya podremos crear el nuevo tipo de datos basado en el de la RFC. El nombre del tipo de datos y del dominio debe coincidir con lo que hemos puesto en el fichero. Para importar el esquema modificado deberemos seleccionar la etiqueta "XSD" y pulsar el icono de importar esquema.


                                              En el momento de importarlo nos aparecerá un mensaje de aviso informando que se ignorará el elemento global que se define en el esquema, pero no debemos de darle mayor importancia ya que hace referencia al nombre de la RFC del que proviene. Con ello tendremos definido el nuevo tipo con los mismos campos y características que el tipo de la RFC, solo faltará aplicar las reglas de cardinalidad en función de las especificaciones.

                                              lunes, mayo 19, 2008

                                              Acerca las USER EXITS

                                              Las user exits (Function module exits) son salidas desarrolladas por SAP. La salida se implementa como una llamada a un módulo de función. El código para el módulo de función lo escribe el desarrollador. No escribes el código directamente en el módulo de función sino en el include que está en dicho módulo.

                                              La nomenclatura estándar de los módulos de función de las user exits es:
                                              • EXIT_

                                              La llamada a un módulo de función de user exit se realiza de la siguiente manera:
                                              • CALL CUSTOMER-FUNCTION

                                              Ejemplo:

                                              El programa de la transacción VA01 es SAPMV45A.

                                              Si se busca CALL CUSTOMER-FUNCTION en el programa SAPMV45A se encontrará ( entre otras user exits):



                                              La exit llama al módulo de función EXIT_SAPMV45A_003

                                              Para encontrar las user exits que se necesitan se puede hacer uso del programa que se detalla en esta entrada del blog: User Exits de una transacción.

                                              Enlaces de interés:

                                              USER-EXITs de una transacción

                                              A continuación se muestra el código de un REPORT que devuelve las USER-EXITS de una transacción determinada:



                                              jueves, mayo 15, 2008

                                              Menú del Message Mappings desactivado

                                              Para que el menú del Message Mappings esté activo, es necesario utilizar la versión 1.4.1 de java.


                                              La versión a utilizar es un parámetro dependiente de usuario en Windows, para definir que se utilice la versión 1.4.1 deberemos ir al Panel de Control -> Java y picar sobre la pestaña "Java". Una vez ahí pulsaremos el botón "Ver" referente a la JNLP que se ve en la siguiente imagen:

                                              Y por último dejamos solamente marcada la versión 1.4 de Java.

                                              Conocer las BAdIs de una transacción

                                              Para conocer qué BAdIs son llamadas cuando se ejecuta una transacción determinada deberemos seguir los siguientes pasos.
                                              1. TX. SE80 -> Seleccionamos Clase / Interfase.
                                              2. Dentro de ella colocamos la clase CL_EXITHANDLER.
                                              3. Seleccionar el método GET_INSTANCE.
                                              4. Colocar un BREAK en la llamada al metodo:



                                              Ahora al ejecutar el proceso/transacción deseado, cada vez que se invoque a una BADI se podrá conocer el nombre de la BADI en el parametro "exit_name".

                                              lunes, mayo 12, 2008

                                              Información sobre BAdIs

                                              En el siguiente enlace se muestra un pequeño tutorial sobre cómo detectar las BAdIs (Business Add-Ins) relacionadas con determinadas transacciones y cómo implementarlas:
                                              También desde el portal de ayuda de SAP se muestra más información sobre esta técnica:

                                              martes, abril 29, 2008

                                              Convertir unidades de medida de materiales

                                              Para convertir las unidades de medida en las que viene dado un material en otras (de caja a unidades, p.ej.) se utiliza la siguiente función:


                                              lunes, abril 21, 2008

                                              Cómo abrir ficheros mediante Match-code


                                              Cómo rellenar las tablas de ejemplos de vuelos de SAP

                                              Para ello nos iremos a la transacción SE38 y ejecutaremos el programa SAPBC_DATA_GENERATOR. Este programa rellenará todas las tablas que tienen que ver con la aplicación de vuelos de SAP e inicializa los rangos numéricos correspondientes.

                                              NOTA: El programa elimina cualquier dato previo que se encuentren en esas tablas.

                                              Más info: Setting Up the Flight Data Application

                                              Cómo localizar la vista de la que se alimentan los Match Codes

                                              Activamos el modo depuración (tx: /h) y pulsamos F4 sobre el campo que queremos investigar. Entramos en la llamada a la función 'DD_SHLP_CALL_FROM_DYNP' y a continuación entramos en la subrutina F4PROZ. Tras la llamada la función 'DD_SHLP_GET_DIALOG_INFO', el método vendrá dado en el campo SHLP_TOP-INTDESCR-SELMETHOD y el tipo (vista, tabla, etc.) en el campo SHLP_TOP-INTDESCR-SELMTYPE.

                                              NOTA: Por norma general se suelen denominar con una 'M' como prefijo seguida de la tabla de la que se alimentan. Por ejemplo: para un campo de centros (WERKS) cuyo ámbito de valores reside en la tabla T001W, la vista que utiliza como método para el match code es la MT001W.

                                              martes, febrero 26, 2008

                                              Transacciones útiles

                                              SAP ECC

                                              • /H Depurar el programa en ejecución
                                              • SP02 Visualizar ficheros de spool propios
                                              • SM04 Eliminar un proceso bloqueado (Modos->Borrar modo)
                                              • SE14 Adapta los datos (contenido) de una tabla (útil para pasar de un campo más genérico a uno más restrictivo: 80char --> 75char)
                                              • SE30 Análisis tiempo ejecución
                                              • SE37 Biblioteca de funciones
                                              • SE38 Biblioteca de programas
                                              • SE39 Comparador de códigos
                                              • SE78 Gestión de gráficos de formulario
                                              • SE93 Editor de transacciones
                                              • SU01 Información de usuario (permisos, parámetros, ...)
                                              • RZ10 Perfiles del sistema
                                              • SMICM Monitorización de servicios ICM
                                              • SE09 Órdenes de transporte
                                              • PA30 Actualizar datos maestros personal (HR)
                                              • SM30 Insertar/Actualizar datos directamente en una tabla/vista
                                              • SE56 Actualiza las tablas cuando se le añaden/quitan campos
                                              • SPRO Customizing (IMG)
                                              • AL11 Ver directorios en la máquina
                                              • ST05 SQL Trace
                                              • ST22 Errores en ejecución ABAP
                                              • SU53 Visualizar datos autorización de usuario

                                              SAP XI

                                              • SXI_MAPPING_TEST Test Environment for All
                                              • SXMB_IFR Iniciar Integration Builder
                                              • SM58 RFC Transaccional (monitoriza las llamadas a las RFCs)
                                              • SM59 Destinos RFC (visualizar y actual.)
                                              • SICF Actualización del árbol serv.HTTP
                                              • SXMB_MONI Integration Engine: Monitoring
                                              • SXMB_ADM Integration Engine: Gestión
                                              • SXMB_ADMIN Integration Engine: Gestión y Monitoring
                                              • SXI_CACHE XI Directory Cache

                                              Links

                                              • http://servidor:50000/rep/start/index.jsp XID: Exchange Infrastructure Tool
                                              • http://servidor:50000/mdt/index.jsp XI Message Display Tool
                                              • http://servidor:50000/MessagingSystem/monitor/monitor.jsp XI Message Display Tool Monitor
                                              • http://servidor:50000/CPACache/refresh?mode=full CPA cache refresh (mode=full)
                                              • http://servidor:50000/wsnavigator/enterwsdl.html Web Services Navigator

                                              Enlaces de XI

                                              Links a SDN y otras por categorías: http://nilkanthk.googlepages.com/

                                              Manuales How To...: http://www.erpgenie.com/sap/netweaver/xi/howto.htm

                                              Links
                                              SAP library XI
                                              A Beginner’s Guide to SAP XISettings, Part I
                                              A Beginner’s Guide to SAP XI Settings, Part II

                                              Refer to some basic SDN tv demos of XI at following location.
                                              https://www.sdn.sap.com/irj/sdn/docs?rid=/webcontent/uuid/110ff05d-0501-0010-a19d-958247c9f798#xi

                                              The best way to learn XI would be to use the Wealth of material available in XI from its forums, weblogs, presentations ,etc.

                                              Also, I would suggest this link on SAP help for any info that you want on XI,
                                              http://help.sap.com/saphelp_nw04/helpdata/en/14/80243b4a66ae0ce10000000a11402f/frameset.htm

                                              Further, this thread deals with everything that is needed for a starter on XI. Do check it out,
                                              https://www.sdn.sap.com/irj/sdn/thread?forumID=44&threadID=112843
                                              https://www.sdn.sap.com/irj/sdn/thread?forumID=44&threadID=51336&messageID=527697
                                              https://www.sdn.sap.com/irj/sdn/thread?threadID=113060&messageID=1261698

                                              Conectividad:
                                              https://www.sdn.sap.com/irj/sdn/weblogs?blog=/pub/wlg/3022 conexión máquina ECC con XI


                                              Following are the links to weblogs which will help to develop the basic scenarios:

                                              IDoc to File
                                              ABAP Proxy to File
                                              File to JDBC
                                              File to ABAP Proxy
                                              File to File Part 1
                                              File to File Part 2
                                              Any flat file to any Idoc
                                              File to RFC
                                              File to Mail
                                              Dynamic File Name Part 1
                                              Dynamic File Name Part 2
                                              Dynamic Mail Address
                                              Message Flow in XI
                                              Walk through BPM
                                              Schedule BPM
                                              Use of Synch - Asynch bridge in ccBPM
                                              Use of Synch - Asynch bridge in ccBPM
                                              Maintain RFC destination centrally
                                              Triggering Email from folder
                                              Handling different partners for IDoc
                                              Modeling Integration Scenario in XI
                                              Testing of integration process
                                              Authorization in XI
                                              Authorization in XI - help.sap.com
                                              Alert Configuration
                                              Trouble shoot alert config
                                              Call UNIX Shell Script
                                              Transport in XI
                                              Using ABAP XSLT Extensions for XI Mapping
                                              Mail Adaptor options
                                              Collection of IDoc to Single File
                                              Controlling access to Sensitive Interfaces
                                              The same filename from a sender to a receiver file adapter - SP14
                                              Payload Based Message Search in XI30 using Trex Engine
                                              XI : Configuring CCMS Monitoring for XI- Part I
                                              XI: HTML e-mails from the receiver mail adapter
                                              XI : FAQ's Provided by SAP


                                              Bibliografía

                                              MASTERING IDOC BUSINESS SCENARIOS WITH SAP XI

                                              lunes, febrero 25, 2008

                                              Transporte a Productivo

                                              1. Transacción SE09


                                              Si sólo se van a transportar programas, se marca la casilla “Órdenes de Workbench”, si el transporte contiene parametrizaciones realizadas por funcionales habrá que marcar “Órdenes de Customizing”.

                                              La sección Status de la orden permite mostrar las órdenes que se van a liberar (Modificable) y/o las ya liberadas.

                                              Pulsar el botón “Visual.”


                                              Liberar las tareas asociadas a la orden y a continuación la propia orden. Para ello se pone el cursor sobre la carpeta correspondiente y se pulsa el botón del camión: Liberar directamente (F9).

                                              Pulsamos F5 (refrescar) hasta que todas las tareas y órdenes hayan sido liberadas.

                                              2. Importar las órdenes liberadas

                                              Desde productivo o desde desarrollo introducir la transacción STMS y pulsar el botón del camión: Resumen import (F5).

                                              Seleccionar (doble clic) la cola del sistema destino al que se ha transportado la orden (productivo), por norma general el que tiene mayor número de órdenes.


                                              A continuación, en el listado de la cola pulsamos refrescar (F5) y nos desplazamos al final de la misma. Ahí veremos las órdenes importadas con el icono de un rayo verde al lado. A continuación pulsamos sobre el botón de la barra de herramientas donde aparece el mismo icono del rayo verde y confirmamos sobre el mensaje de aviso.

                                              Por último y MUY IMPORTANTE es seleccionar la orden recién transportada y pulsar el botón del camión con el cuadradito chico: Importar orden (ctrl. + F11). NO DAR AL OTRO CAMIÓN porque importaríamos TODAS las órdenes.

                                              Sub-screens en pantallas de selección

                                              En el siguiente post se explica cómo se añaden sub-pantallas a las pantallas de selección (SELECTION-SCREEN). Este ejemplo está motivado por la falta de opciones de formato que poseen los parámetros de entrada/salida estándar que proporcionan las instrucciones PARAMETERS.


                                              Se desea crear una interfaz que le permita introducir al usuario notas referentes a incidencias y observaciones cuyo contenido puede llegar a ocupar hasta 375 caracteres. Existen dos inconvenientes iniciales que aparecen al declarar tales campos como PARAMETERS:
                                              • Permiten como máximo introducir hasta 255 caracteres.
                                              • El marco visible del campo es de 45 caracteres por lo que el usuario no puede ver el mensaje al completo.

                                              Solución
                                              Se ha optado por definir dos DYNPROS, una para cada campo, e incluirlas en la pantalla de selección estándar (DYNPRO 1000) como sub-pantallas. Cada DYNPRO estará formada por 5 campos de entrada/salida con longitud máxima (y visual) de 75 caracteres. Obteniéndose el resultado que se muestra en la imagen.

                                              El código necesario se describe a continuación.