martes, 23 de diciembre de 2014

SAP BI. Sistemas fuente

Es este post os vot a hablar, dentro del entorno de SAP BI, de los sistemas fuente. Llamaremos sistema fuente a cualquier entorno del que nuestro sistema SAP BI se alimente. Puede ir desde nuestro propio sistema SAP R/3, pasando por diferentes bases de datos de diferentes sistemas, o un simple fichero plano.


Podemos hacer una definición de cada uno de ellos mas concreta:

  • Sistema SAP R/3: BI está plenamente integrado con SAP R/3. Funciona como una herramienta central de data warehousing. SAP suministra las estructuras y los programas de extracción predefinidos. Éstos permiten que los datos fuente de SAP se carguen directamente en el almacén de datos.
  • Integración con SAP XI: Puede enviar datos de fuentes SAP y externas a BI utilizando SAP Exchange Infrastructure (SAP XI). La transferencia de datos mediante SAP XI se basa en Simple Object Access Protocol (SOAP).
    SAP está basado en estándares generales para permitir la integración de sistemas externos. En el centro de la infraestructura hay una comunicación basada en XML que utiliza HTTP. El contenido específico de la aplicación se transfiere en mensajes en un esquema XML definido por el usuario del emisor al receptor utilizando Integration Server (una parte de SAP XI).
  • Sistemas externos a SAP: Es posible utilizar BI como una base de datos consolidada para el reporting que cubre toda la organización, especialmente en una infraestructura de sistema heterogénea. SAP nos proporciona herramientas que permiten implementar estas interfases con rapidez y eficiencia.
  • Proveedores de datos: BI también puede suministrarse con datos orientados al destino de los
    proveedores. Por ejemplo, ACNielsen o Dun & Bradstreet proporcionan datos de estudios de mercado que pueden cargarse en BI para su comparación y a continuación pueden valorarse respecto a sus propios datos operativos.
  • Bases de datos (DB Connect) o fuentes complejas (Universal Data Integration [UDI]): BI permite que los datos se carguen desde sistemas de bases de datos externas o fuentes complejas de datos alimentadas por drivers de terceros específicos de aplicación.
     

sábado, 13 de diciembre de 2014

Últimas novedades en facturación electrónica

Hay novedades sobre el tema de la facturación electrónica. A través de CUVIV hemos podido saber que SAP ha publicado lo siguiente:
 
- Ya está liberada para clientes pilotos la solución básica basada en la localización española de RE-FX. Las notas son las siguientes:
  • 2104258 eDocument - eInvoicing for Real-Estate
  • 2104405 eDocument Spain - eInvoicing for Real-Estate - Basic Solution
  • 2105267 RE-FX: DDIC objects for SAP note 2104258
- La nota de consultoría para la generación del XML es la 2103002 - Spain: Electronic invoice format. El contenido de la misma se liberará la semana 52.
 
- La situación actual de la solución completa; tanto la creación del XML como la firma electrónica basado en AIF y HCI también se liberará la semana 52 para clientes piloto.
 

jueves, 11 de diciembre de 2014

Manual SAP BW/BI TBW310 en español

A través de ForoSap he encontrado el manual de SAP BW/BI TBW310 en español. En mi caso, tenía este y otros manuale en ingles. Tenerlos en español es una ayuda adicional y que supongo que para todas las personas que no dominen bien el ingles una gran ayuda. Os dejo el enlace donde podeis encontrar el link para descargarlo. Debeis registraros en ForoSap para poder hacerlo.

 
 
En el manual vais a encontrar los conceptos básicos que cualquier persona que trabaje con SAP BW de SAP debe dominar. Es el pilar para posteriormente poder ir avanzando dentro del mundo del Business Intelligence.
 
El indice del libreo es el siguiente:
 
Capítulo 1: SAP NetWeaver y BI: Resumen, posicionamiento y fundamentos
  • Aspectos fundamentales de Data Warehousing y Business
  • Intelligence
  • Resumen de SAP NetWeaver Business Intelligence (BI)
  • Entrega de soluciones SAP NetWeaver: Prácticas, escenarios y tipos de utilización de TI
  • SAP NetWeaver Business Intelligence: Resumen de Data Warehousing
Capítulo 2: Objetos del nivel BI Data Warehouse
  • Workbench
  • InfoSitios: Utilización empresarial
  • InfoObjetos: Características
  • InfoObjetos: Ratios
  • El InfoCubo BI: un esquema estrella ampliado
  • Creación de InfoCubos
Capítulo 3: Adquisición y transformación de datos desde sistemas fuente SAP
  • Flujo de datos: Resumen
  • Carga de datos maestros de un sistema fuente SAP
  • Carga de datos variables desde un sistema fuente SAP
  • Procesos de ETL y carga de jerarquías
Capítulo 4: Adquisición de datos desde otros sistemas
  • Extracción desde sistemas externos: resumen
  • Carga de ficheros planos
Capítulo 5: Business Content
  • Descubrir Business Content (repository de metadatos)
  • Activación de Business Content
Capítulo 6: Otros InfoSitios
  • Objetos DataStore
  • VirtualProviders y adquisición de datos en tiempo real
  • MultiSitios e InfoSets BI
Capítulo 7: Administración de destinos de datos
  • Tareas de gestión del sistema en BI: resumen
  • Administración de InfoCubos
  • Administración de objetos DataStore
  • Cadenas de procesos
Capítulo 8: Introducción a la optimización de rendimiento de
una query
  • Introducción a la optimización del rendimiento de una query en BI
  • Agregados BI
  • BI Accelerator
  • Resumen de estadísticas

miércoles, 10 de diciembre de 2014

Como incluir un editor de texto en nuestro programa

En este post os voy a enseñar una sencilla función que nos permite habilitar un editor de textos donde podremos mostrar un texto (Por ejemplo leido con la funcion READ_TEXT) o simplemente habilitar al usuario un espacio donde el pueda escribir lo que desee.

La función que vamos a utilizar es CATSXT_SIMPLE_TEXT_EDITOR. Como veis los parámetros a pasar son muy sencillos:

  • Titulo
  • Modo de edición: Editable/No Editable
  • Posición relativa de la ventana

En la tabla CH_TEXT será donde insertaremos el texto a mostrar o de donde recogeremos el texto introducido por el usuario. Por ejemplo puede que queramos mostrar un texto en modo no editable, simplemente a nivel informativo, o puede que queramos dejar en blanco el editor de texto para que el usuario introduzca lo que quiera.

El resultado final de ejecutar el módulo de función es el siguiente:


En otro post veremos como podemos incluir en una dynpro un editor de texto como un elemento mas de la ventana. En este caso el editor de textos realmente se lanza como si fuera un pop-up. Es una alternativa mas.

martes, 9 de diciembre de 2014

Como ampliar la transacción CO11N de notificación de órdenes

Es este post vamos a ver como podemos ampliar la transacción de notificación de órdenes CO11N. Añadiremos una sub-screen donde incluiremos los campos que necesitemos notificar.

El primer paso es indicar en la parametrización que vamos a incluir una pestaña personalizada. Para realizar esto utilizaremos la transacción OPK0. Podemos añadir hasta tres pestañas personalizadas.


Añadimos la pestaña y le damos un nombre:

 
Después de esto tenemos que definir la sub-screen con los nuevos campos. Para hacer esto utilizamos una user-exit y un modulo de funciones. La user-exit es “CONFPP07” y el modulo de funciones “XCOF”.
 
De cara a almacenar los nuevos campos tenemos diferentes opciones. Una de las opciones sería añadir una APPEND a la tabla AFRU e incluir los nuevos campos. Cuidado con esta opción, la tabla AFRU es una tabla que soporta muchos registros y si realizamos un APPEND lo deberemos hacer con mucho cuidado. Otra opción sería por ejemplos guardar los nuevos campos en una tabla Z que nos creemos nosotros mismos.

Tenemos que crear una de las tres subscreen posibles. En nuestro ejemplo utilizaremos la 0900

 
E incluimos los campos que necesitemos.
 


La lógica para tratar los valores que se introduzcan en estos nuevos campos la deberemos incluir dentro de la user-exit CONFPP07.


lunes, 8 de diciembre de 2014

Introducción ABAP. Instrucciones básicas

Continuamos en este post con la introducción a ABAP. En este caso vamos a comentar las instrucciones mas básicas que podemos realizar.

Asignación

Existen varias formas de asignar a una variable:

-Asignación directa:  <variable> =  valor.
 El valor se puede especificar como un literal, el contenido de una constante  o el contenido de una variable.

-Sentencia MOVE: Asigna un valor a una variable.

             MOVE   <valor>   TO   <variable>.

-Sentencia MOVE-CORRESPONDING: Mueve el contenido de los campos de una estructura a los campos que tengan el mismo nombre de otra estructura.

           MOVE-CORRESPONDING <origen> TO <destino>.

-Sentencia CLEAR: Inicializa el contenido de un campo a su valor inicial según el tipo de dato.

            CLEAR  <campo>.

-OFFSETS:  Se puede hacer referencia parcial a una parte de un campo, indicando el número de posiciones que hay hasta la posición en la que se comienza a referenciar utilizando + y la cantidad de posiciones que se referencia entre paréntesis.

      MOVE <campo1> + <posiciones>(longitud) TO <campo2>.

 Ejemplo: DATA: d_dato1(8) TYPE c VALUE ‘ABCDEF’,
                              d_dato2(4) TYPE c.

                
                d_dato2 = d_dato1+2(4).
   Ahora   d_dato2 = ‘CDEF’.

Condicionales

Operadores condicionales.

 Igual:            <valor1>  EQ    <valor2>
                           <valor1>   =      <valor2>
 No igual:       <valor1>  NE    <valor2>
                           <valor1>   <>    <valor2>
 Mayor:          <valor1>   GT    <valor2>
                           <valor1>     >     <valor2>
 Menor:          <valor1>   LT     <valor2>
                            <valor1>   <      <valor2>
 Mayor o igual:       <valor1>  GE    <valor2>
                                    <valor1>   >=   <valor2>
 Menor o igual:       <valor1>  LE    <valor2>
                                    <valor1>   <=   <valor2>
 <valor1> BETWEEN <valor2> AND <valor3>.
 <valor1> IS INITIAL.    Si tiene el valor inicial.
 <valor> IN <rango>.    Si <valor> tiene un valor comprendido en el rango <rango>

Operadores lógicos.

<condicion1>   AND <condicion2>
< condicion1>   OR   <condicion2>
NOT <condición>.

Sentencias IF <condición> ..... ENDIF.

      Ejemplo:  IF NOT d_dato IS INITIAL.
                               WRITE  d_dato.
                       ENDIF.


 Escribe por pantalla el valor introducido en d_dato si se recibe un valor distinto del inicial.

Sentencias CASE <variable>.......ENDCASE.

Permiten ejecutar diferentes grupos de sentencias en función del valor contenido en <variable>, delimitando las sentencias con la cláusula WHEN <valor>.
El valor OTHERS comprende todos los valores que no hayan sido especificados en las anteriores cláusulas WHEN.

Ejemplo:   CONSTANTS: c_centrado TYPE c VALUE ‘c’,
                                          c_izquierda TYPE c VALUE ‘i’,
                                          c_derecha    TYPE c VALUE ‘d’.
                  DATA: d_alineación TYPE c,
                               d_texto(100) TYPE c.
                  CASE d_alineación.
                        WHEN c_centrado.
                               WRITE  d_texto CENTERED. 
                         WHEN c_izquierda.
                                WRITE d_texto LEFT-JUSTIFIED.
                         WHEN c_derecha.
                                WRITE d_texto RIGHT-JUSTIFIED.
                         WHEN OTHERS.
                                WRITE d_texto.
                  ENDCASE.


Operadores condicionales para cadenas de texto.

<cadena1>  CO   <cadena2>  Si todos los caracteres, incluidos los espacios de 1, están en 2.
Si la condición es cierta, la variable SY-FDPOS contendrá la longitud de <cadena1>, sino, contiene el OFFSET del primer carácter de <cadena1> que no existe en <cadena2>.
<cadena1>  CN   <cadena2>  Si existe algún carácter en 1 que no está en 2, incluido espacios.
Si la condición es cierta, la variable SY-FDPOS contendrá el OFFSET del primer carácter de <cadena1> que no existe en <cadena2>, sino, contiene la longitud de <cadena1>.
<cadena1>  CA   <cadena2>  Si alguno de 1 incluido espacios, está en <cadena2>.
Si la condición es cierta, la variable SY-FDPOS contendrá el OFFSET del primer carácter de <cadena1> que existe en <cadena2>, sino, contiene la longitud de <cadena1>.
<cadena1>  NA   <cadena2>  Si ninguno de los caracteres de <cadena1>, está en <cadena2>.
Si la condición es cierta, la variable SY-FDPOS contendrá la longitud de <cadena1>, sino, contendrá el OFFSET del primer carácter de <cadena1> que existe en <cadena2>.
<cadena1>  CS   <cadena2>  La condición se cumple si  <cadena1> contiene a  <cadena2>.
Si la condición es cierta, la variable SY-FDPOS contendrá el OFFSET del primer carácter de <cadena2> que existe en <cadena1>, sino, contiene la longitud de <cadena1>.
<cadena1>  NS   <cadena2>.  La condición se cumple si  <cadena1> no contiene a  <cadena2>.
Si la condición es cierta, la variable SY-FDPOS contendrá la longitud de <cadena1>, sino, contendrá el OFFSET del primer carácter de <cadena2> que existe en <cadena1>.
<cadena>  CP   <patrón>.  La condición se cumple si  <cadena> contiene el patrón de búsqueda <patrón>. Este patrón permite utilizar el carácter * para representar cualquier cadena de caracteres y + para representar cualquier carácter.
Si la condición es cierta, la variable SY-FDPOS contendrá el OFFSET del primer carácter de <patrón> que existe en <cadena>, sino, contiene la longitud de <cadena>.
Ejemplo:  La condición ‘Jose Luis Diaz’ CP ‘Jose*Diaz’ es verdadera y devuelve 0 en SY-FDPOS. La condición ‘JoseLuisDiaz’CP ‘Jose+Luis’ es falsa y devuelve 12 en SY-FDPOS.
<cadena>  NP   <patrón>.  La condición se cumple si  <cadena> no contiene el patrón de búsqueda <patrón>.
Si la condición es cierta, la variable SY-FDPOS contendrá la longitud de <cadena>, sino, contendrá el OFFSET del primer carácter de <patrón> que existe en <cadena>.


viernes, 28 de noviembre de 2014

SAPUI5. Entorno de desarrollo

En este post os voy a hablar del entorno de desarrollo para SAPUI5. Cuando queramos comenzar a construir nuestras propias aplicaciones con SAPUI5 deberemos utilizar Eclipse. Es una potente y completa plataforma de programación, desarrollo y compilación de elementos tan variados como sitios web, programas en C++ o aplicaciones Java. Es una herramienta de código abierto y multiplataforma.
Una vez hemos instalado la herramienta, existen multitud de plugin disponibles que aumentan la funcionalidad de la herramienta y nos permiten trabajar con un monton de tecnologias diferentes. Este es el punto en el que nos encontramos, para trabajar con SAPUI5 debemos instalarnos un plugin que nos de toda la funcionalidad necesaria. En el siguiente link os dejo un enlace donde encontrareis todas las instrucciones necesarias para instalarlo.

 
 
Destacar que se recomienda tener instalada la versión de Eclipse Luna o Kepler (Son dos de las últimas versiones).
 
Evidentemente SAP poner a nuestra disposición el SAPUI5 SDK donde vamos a encontrar muchos recursos disponibles a nuestra disposición, como controles, demos, manuales, etc.
 
Como veis las herramientas que necesitamos para desarrollar con SAPUI5 están al alcance de nuestra mano. Solo queda animarse a desarrollar!!!


Introducción ABAP. Subrutinas

Continuamos repasando los conceptos básicos de ABAP, el lenguaje de programación de SAP. En este post vamos a hablar de las subrutinas.

Las subrutinas son conjuntos de instrucciones que pueden ser llamadas desde el programa en diversas ocasiones.
Para definirlas se utilizan las palabras clave FORM y ENDFORM que se especifican al inicio y final de las instrucciones que forman la subrutina. Para llamarla se utiliza la sentencia PERFORM.

Ejemplo:  PERFORM  ejemplo.                Llama a la subrutina.
                .......
                FORM ejemplo.                         Definición de la subrutina.
                     -----
                ENDFORM.

El programa principal y la subrutina se pueden comunicar mediante parámetros pasados por valor o referencia, siendo recomendable especificar el tipo de dato al definirlo.

Pase de parámetros por referencia

      PERFORM  <nombre>  USING  parametro1  parametro2.
      .....
      FORM <nombre>  USING parametro1   parametro2.
         ----
      ENDFORM.


Los parámetros que son pasados a la subrutina en la llamada  (FORMALES), se actualizan con los parámetros (ACTUALES) definidos en la subrutina.

Ejemplo:  DATA: d_numero1 TYPE i VALUE 1,
                                  d_numero2 TYPE i VALUE 2.
                     PERFORM sumar USING d_numero1 d_numero2.
                     ….
                     FORM sumar USING l_numero1 type i
                                                         l_numero2  type i.
                            l_numero1 = l_numero1 + l_numero2.
                     ENDFORM.


Ahora:  d_numero1 = 3      y d_numero2 = 2.
Pase de parámetros por referencia

      PERFORM  <nombre>  USING  parametro1  parametro2.
      .....
      FORM <nombre> USING VALUE (parametro1) VALUE(parametro2).
         ----
      ENDFORM.


Los parámetros que son pasados a la subrutina no se actualizan con el valor de los parámetros definidos en la subrutina.

Ejemplo:  DATA: d_numero1 TYPE i VALUE 1,
                                  d_numero2 TYPE i VALUE 2.
                     PERFORM sumar USING d_numero1 d_numero2.
                     ….
                     FORM sumar USING l_numero1 type i
                                                        Value( l_numero2)  type i.
                            l_numero2 = 3.
                            l_numero1 = l_numero1 + l_numero2.
                     ENDFORM.


Ahora:  d_numero1 = 4    y   d_numero2 = 2.

Utilizando STRUCTURE se puede pasar como parámetro una estructura y hace referencia a sus campos en la subrutina.

Ejemplo: DATA: BEGIN OF r_provincias,
                                Codigo   LIKE lfa1-lifnr,
                                Nombre  LIKE lfa1-name1,
                           END OF r_provincias.
             PERFORM informar USING r_provincias.
             FORM informar USING rs_provincias STRUCTURE r_provincias.
                  rs_provincias-nombre = ‘JOSE’.
             ENDFORM.


También se puede pasar como parámetro una tabla interna. Para hacer referencia se utiliza TABLES:

Ejemplo:  DATA  d_contador TYPE i VALUE 1.
                DATA: BEGIN OF i_provincias OCCURS 0,
                                Codigo   LIKE lfa1-lifnr,
                                Nombre  LIKE lfa1-name1,
                           END OF i_provincias.
            PERFORM informar   TABLES   i_provincias
                                                 USING     d_contador.
            FORM informar TABLES is_provincias STRUCTURE i_provincias
                                        USING VALUE(l_contador).
                  is_provincias-codigo =  d_contador.
                  is_provincias-nombre = ‘JOSE’.
                 APPEND is_provincias.  
             ENDFORM.


Se inserta el registro en la tabla interna i_provincias.









martes, 25 de noviembre de 2014

Factura Electrónica con la Administración Pública

Os dejo la última información publicada sobre este tema. La información la he obtenido a través de CUVIV.

A continuación el contenido de la noticia:

"SAP ha liberado la nota 2070409 que es un recopilatorio de otras notas para la instalación del eDocument Framework.

SAP España se ha comprometido a liberar la solución básica que consiste en la instalación del eDocument Framework junto con la generación del XML en SAP. La generación del XML en SAP será otra nota que SAP estima liberar durante diciembre.

La parte de conexiones con FACe, firma electrónica de las facturas o adaptación de los datos maestros queda fuera del scope de SAP (para España) y deberá ser desarrollada a medida por cada uno de los clientes."

sábado, 22 de noviembre de 2014

ALV Orientado a Objetos (OO) On Value Request (Ayuda de búsqueda)

En este post vamos a ver como podemos añadir una ayuda de búsqueda sobre cualquier columna de nuestro ALV OO.

La clase que voy a utilizar para generar el ALV es CL_GUI_ALV_GRID y el evento que vamos a utilizar es ONF4( On Value Request ).
El primer paso es definir el método que va a gestionar este evento dentro de la clase controladora que nos hayamos definido para controlar los diferente eventos dentro del ALV.

CLASS lcl_event_handler DEFINITION.

  PUBLIC SECTION .

    METHODS:

* Ayuda de busqueda
    handle_user_onf4 FOR EVENT onf4 OF cl_gui_alv_grid
      IMPORTING e_fieldname 

                e_fieldvalue 
                es_row_no 
                er_event_data 
                et_bad_cells 
                e_display,

Seguimos definiendo la Implementación del método dentro de la clase.

CLASS lcl_event_handler IMPLEMENTATION .

* Ayuda de búsqueda
  METHOD handle_user_onf4.
    PERFORM handle_user_onf4 USING e_fieldname
                                        e_fieldvalue
                                        es_row_no
                                        er_event_data
                                        et_bad_cells
                                        e_display.
  ENDMETHOD.                    "handle_user_onf4


Una vez tenemos definido e implementado el método que va a cotrolar el evento debemos asociarselo al objeto de la clase cl_gui_alv_grid que hayamos definido para crear el ALV.

*--Registering handler methods to handle ALV Grid events
    SET HANDLER gr_event_handler->handle_user_onf4    FOR gref_alvgrid.


Como último paso debemos indicar al ALV sobre que columnas se va a aplicar el evento. Podemos incluirlo en todas las columnas que necesitemos.

*   Registramos los campos que van a disponer de ayuda de búsqueda personalizada
    REFRESH it_f4.
    l_f4-fieldname  'CHARG'.
    l_f4-register   'X'.
    l_f4-getbefore  space.
    l_f4-chngeafter space.
    APPEND l_f4 TO it_f4.

    CALL METHOD gref_alvgrid->register_f4_for_fields
      EXPORTING
        it_f4 it_f4.


Para generar la ayuda de búsqueda tenemos diferente módulos de funciones como puede ser F4IF_INT_TABLE_VALUE_REQUEST ó HELP_VALUES_GET_WITH_TABLE.

miércoles, 19 de noviembre de 2014

Factura Electrónica con la Administración Pública

A partir del 15/01/2015 entrará en vigor la facturación electrónica será obligatorio el envio de factura electrónica a las administraciones públicas.

SAP está trabajando en el desarrollo de una solución. Su propuesta pasa por la instalación del eDocument FrameWork con mapeo de campos desde SAP a la estructura de FacturaE (mediante una herramienta llamada AIF).

El envio de la factura electrónica se realizaría a través de una plataforma Cloud de SAP (SAP HCI) en la que se podrían realizar parametrizaciones locales a nivel de país y firmar digitalmente la factura.
Y finalmente el envío mediante WebService al FACe (a desarrollar por cada cliente).
Recientemente SAP ha liberado las notas, de la solución básica ( eDocument Framework ) para España, para los clientes piloto. La nota que detalla la lista de notas a instalar es la  2070409. Decir que aun está en pruebas.

Os seguiré informando según se vayan publicando mas noticias.

sábado, 15 de noviembre de 2014

Introducción ABAP. Definición de datos

Voy a comenzar a publicar varios post sobre los conceptos básicos del lenguaje de programación de SAP, ABAP.
El primer apartado lo vamos a dedicar a la definición de datos. El primer caso es conocer que tipos de datos nos proporciona el lenguaje. Os voy a presentar los tipos básicos que nos proporciona ABAP:

Variables

Las variables se definen por defecto de tipo carácter Texto con longitud 1.
  Ejemplo:   DATA  d_caracter.              (Vble de texto con long 1)
                   DATA  d_caracter(8).         (Vble de texto con long 8)
                   DATA: d_numero_car(5)    TYPE N,


                                d_numero               TYPE I,
                                d_fecha                   TYPE D.
                   DATA  d_contador             TYPE I VALUE 1.

 

Con la cláusula LIKE podemos declarar una variable con los mismos atributos de longitud y tipo que un campo del diccionario de datos o que otra variable definida anteriormente.
        Ejemplo:    DATA  d_dato  LIKE lfa1-lifnr.

Constantes

Las constantes se definen con la sentencia CONSTANTS:
        
CONSTANTS  <constante> (longitud) TYPE <tipo> VALUE <valor>.

Mismas reglas que para variables, excepto que siempre hay que inicializarlo y no puede ser modificado durante la ejecución.
     Ejemplo:  CONSTANTS  c_dato  LIKE lfa1-lifnr VALUE ‘JOSE’.

Estructuras

Una estructura es un conjunto de campos relacionados lógicamente y se define con DATA:
   DATA: BEGIN OF <estructura>


                ………………,
                END OF <estructura>.

 
   
  Ejemplo:   DATA: BEGIN OF   r_estructura


                                  Codigo LIKE lfa1-lifnr,
                                  Fecha   TYPE d,
                                END OF  r_estructura.

 
 
También se puede incluir en la definición de una estructura, la de una tabla del diccionario de datos o una estructura definida previamente en el programa utilizando la instrucción  INCLUDE ESTRUCTURE ......... .
        Ejemplo:  DATA  BEGIN OF  r_sociedades OCCURS 0.


                                       INCLUDE STRUCTURE T001.
                                       DATA: contador(20) TYPE N,
                                    END OF r_sociedades.

 
      
Para llamar a los campos de una estructura se especifica el nombre de la estructura y del campo, separados por guión.
     Ejemplo:        r_sociedades-nombre = ‘JOSE’.

Rangos

Los rangos son tablas internas con una estructura determinada que se utilizan para almacenar rangos de valores para un tipo de campo y se definen con RANGES:
            RANGES:   <rango> FOR  <campo>.

La estructura de un rango se compone de los siguientes campos:
-SIGN: Campo de tipo carácter de longitud 1, que indica si los valores especificados en el rango se incluyen (I) o se excluyen (E) del mismo.
 
-OPTION: Campo de tipo carácter de dos posiciones que indica el operador lógico que une los valores especificados en el rango. Los valores que puede tomar son:
  • EQ = equal
  • NE = not equal
  • GE = greater or equal
  • GT = greater than
  • LE = less or equal
  • LT = less than
  • CP = contains pattern
  • NP = not contains pattern
-LOW: Valor inicial del rango. Este campo tiene el mismo tipo que el campo al que hace referencia el rango.
 
-HIGH: Valor final del rango. Es del mismo tipo que el campo al que hace referencia el rango.

Los rangos se utilizan para chequear valores válidos en sentencias condicionales del campo en cuestión. Si el rango no tiene ningún registro, se asume que cualquier valor del campo es válido.
Ejemplo:    TABLES:  LFA1.


                   RANGES:  r_rango FOR lfa1-lifnr.
                   r_rango-sign    = ‘I’.
                   r_rango-option = ‘BT’.        (entre)
                   r_rango-low     = ‘1’.
                   r_rango-high    = ‘9’.
                   APPEND r_rango.

 

El rango creado hace referencia a los valores del campo lfa1-lifnr comprendidos entre el 1 y el 9, ambos inclusive por tener ‘I’.
  
Field-Symbols
 
Los Field-Symbols son campos simbólicos que se pueden referenciar a un campo concreto, en tiempo de ejecución del programa y se definen con FIELD-SYIBOLS:
        FIELD-SYMBOLS   <nombre>.                ¡¡Poner <........>!!

Utilizando ASSIGN se asigna un campo al field-symbol y a partir de entonces, las operaciones que se realicen sobre el field-symbol, hacen referencia al campo asignado.
 
Ejemplo: FIELD-SYMBOLS:  <campo>.


               DATA: d_contador1 TYPE i,
                            d_contador2 TYPE i.

 
               ASSIGN d_contador1 to <campo>.


               <campo>  =  <campo> + 1.
               ASSIGN d_contador2 to <campo>.
               <campo>  =  <campo> + 2.

 

Ahora   d_contador1 tiene el valor 1 y d_contador2 tiene el valor 2.
 

SAP y Samsung se unen para aportar nuevas soluciones de movilidad

SAP y Samsung han oficializado un acuerdo con el objetivo de crear un ecosistema de movilidad empresarial abierto y global que permita que los usuarios del amplio catálogo de dispositivos, wearables y soluciones empresariales móviles de Samsung puedan beneficiarse de SAP Mobile Platform e integrarse de forma más simple y segura con SAP.
 
Serán diseñadas apps móviles y experiencias de usuario que saquen provecho de las capacidades de los dispositivos de Samsung. Además la colaboración también va encaminada a ayudar a los desarrolladores móviles y web a innovar y que los grandes ecosistemas de integradores de sistemas de ambas compañías puedan crear de forma más rápida soluciones verticales que puedan responder a las necesidades del mercado y a las oportunidades de Internet de las Cosas

Inicialmente el acuerdo se centrará en escenarios clave de sectores verticales donde el cambio hacia la movilidad, unido a emergentes escenarios de Internet de las Cosas en el lugar de trabajo, presenta las mayores oportunidades a la hora de proporcionar valor a los clientes. Se centrarán en las siguientes industrias:
  • Retail
  • Gas y petróleo
  • Finanzas
  • Sanidad
Por ejmplo, para Retail, proporcionarán a los comercios minoristas un acceso más inmediato a los datos de inventario y de disponibilidad de producto desde los dispositivos móviles, wearables y pantallas de gran formato de Samsung; al mismo tiempo que ofrecerán acceso a los datos del cliente, de modo que puedan usar la solución SAP Precision Marketing para poner en marcha un marketing personalizado.
  
Si nos fijamos en el sector del gas y petróleo, las apps móviles SAP Work Manager y SAP Field Service están disponibles en la Samsung GALAXY Tab Active (y en el futuro en sus wearables), permitiendo completar el trabajo in situ a pie de campo.
  
En cuanto al sector financiero, SAP y Samsung tienen la intención de co-desarrollar soluciones de banca móvil para permitir una experiencia segura y sencilla para los clientes, además de facilitar servicios bancarios más inteligentes.
  
Finalmente, en sanidad, tratarán de llevar la analítica de SAP HANA Cloud Platform a los dispositivos móviles de Samsung con aplicaciones personalizadas para esta industria. Existe el planteamiento de mejorar la gestión de la asistencia sanitaria con conexiones más seguras a la información de salud y poner en marcha un proyecto piloto destinado a la gestión de enfermedades crónicas basada en SAP HANA Cloud Platform.
 
En definitiva un paso mas de SAP para acercar la movilidad a todo el mundo.
 
 
 

jueves, 13 de noviembre de 2014

Ejecutar transacción en un modo nuevo

En este post seguimos viendo algunos módulos de funciones intersantes que pueden sernos útiles en muchos desarrollo. En este caso os voy mostrar el FM ABAP4_CALL_TRANSACTION que ejecuta una transacción en un modo nuevo. Podemos pasarle parámetros a la transacción. En el ejemplo vamos a ejecutar la transacción VA03 (Visualizar Pedido de Ventas). A continuación el ejemplo:

DATA: msg_text(80) TYPE c, "Message text
      itab_spa TYPE STANDARD TABLE OF rfc_spagpa,
      wa_spa   TYPE rfc_spagpa.


* Fill out parameters
wa_spa-parid = 'AUN'.
wa_spa-parval = '0006012345'.
APPEND wa_spa TO itab_spa.


CALL FUNCTION 'ABAP4_CALL_TRANSACTION' STARTING NEW TASK 'SORD'
  DESTINATION 'NONE'
  EXPORTING
      tcode = 'VA03'
  TABLES
      spagpa_tab = itab_spa
  EXCEPTIONS
    communication_failure = 1
    system_failure        = 2 .

miércoles, 12 de noviembre de 2014

Obtener con ABAP el texto de un mensaje a partir del ID y del Número

En este post os voy a dejar un módulo de funciones muy sencillo que nos devuele el texto de un mensaje devuelto por el sistema. Muchas veces cuando ejecutamos BAPI´s o FM estas nos devuelven mensajes en la tabla RETURN. Tenemos el ID del mensaje, su número y los parametros que le acompañen, pero no tenemos el texto completo del mensaje.

Para solucionar esto podemos utilizar el FM SAPTRX/GET_MESSAGE_TEXT. Le pasamos los parámetros correspondientes y nos devuelve el texto completo del mensaje. Como ejemplo:

CALL FUNCTION '/SAPTRX/GET_MESSAGE_TEXT'
        EXPORTING
          MSGID                      = return-MSGID
          MSGNO                      = numero
          MSGV1                      = m1
          MSGV2                      = m2
          MSGV3                      = m3
          MSGV4                      = m4
        IMPORTING
          MESSAGETEXT                = i_mensaje
        EXCEPTIONS
          NO_MESSAGE_RETRIEVED       = 1
          OTHERS                     = 2.

Con el mensaje completo que nos devuelve pordemos, por ejemplo, mostrarselo al usuario por pantalla.

domingo, 9 de noviembre de 2014

Tratar ficheros de un servidor FTP en SAP

En este post os voy a explicar como podemos tratar ficheros que se encuentran almacenados en un servidor FTP.

El primer paso va a ser crearnos una RFC que nos permita conectarnos al servidor FTP. Ejecutamos la transacción SM59 y creamos una nueva RFC dentro de "Conexiones TCP/IP". Le damos el nombre "SAPFTP". Es importante rellenar los parámetros tal cual los marco en la siguiente imagen:

 
A continuación os voy a dejar el código de ejemplo. Vamos a realizar los siguientes pasos:
  • Listar los documentos del directorio.
  • Leemos los ficheros
  • Copiamos los ficheros a una carpeta de nuestra red
  • Borramos los ficheros tratados del FTP.
En el ejemplo voy a copiar los ficheros a través de la AL11. Un paso previo a la copia de los ficheros a nuestra red es que tengamos definida la ruta en SAP a través de la AL11 (Y tengamos los permisos pertinentes para poder hacerlo).

Una vez realizados todos los pasos previo esté sería el programa a ejecutar:

l_login 'usuario'.
l_password 
'Contraseña'.
l_direction 
'Dirección FTP'.

l_strlen 
STRLENl_password ).
* Realizamos la conexión al FTP
CALL FUNCTION 'HTTP_SCRAMBLE'
  
EXPORTING
    SOURCE      
l_password
    sourcelen   
l_strlen
    
key         l_scr_key
  
IMPORTING
    destination 
l_password.

CALL FUNCTION 'FTP_CONNECT'
  
EXPORTING
    user            
l_login
    password        
l_password
    host            
l_direction
    rfc_destination 
l_rfc_dst
  
IMPORTING
    handle          
l_handle
  
EXCEPTIONS
    not_connected   
1.

IF sy-subrc 0.

  
REFRESHmtab_data.

* Listamos los ficheros en el ftp
  
CALL FUNCTION 'FTP_COMMAND'
    
EXPORTING
      handle        
l_handle
      command       
'ls'
    
TABLES
      
data          mtab_data
    
EXCEPTIONS
      tcpip_error   
1
      command_error 
2
      data_error    
3
      
OTHERS        4.

* Marcamos el directorio local sobre el que vamos a trabajar y copiar los ficheros
  
local '\\Ruta\Carpeta_Ficheros\'.
  
CONCATENATE 'lcd' local INTO cmd SEPARATED BY space.

  
CALL FUNCTION 'FTP_COMMAND'
    
EXPORTING
      handle        
l_handle
      command       
cmd
    
TABLES
      
data          mtab_lcd
    
EXCEPTIONS
      tcpip_error   
1
      command_error 
2
      data_error    
3
      
OTHERS        4.

* Leemos los ficheros en el ftp
  
LOOP AT mtab_ficheros.

    
REFRESHmtab_fich,
             mtab_rename
,
             mtab_get
.

    
CALL FUNCTION 'FTP_SERVER_TO_R3'
      
EXPORTING
        handle         
l_handle
        fname          
mtab_ficheros-fichero
        character_mode 
'X'
      
TABLES
        
text           mtab_fich
      
EXCEPTIONS
        tcpip_error    
1
        command_error  
2
        data_error     
3
        
OTHERS         4.

*   Copiamos el archivo al directorio marcado
    
CONCATENATE 'get' mtab_ficheros-fichero INTO cmd SEPARATED BY ' '.
    
CALL FUNCTION 'FTP_COMMAND'
      
EXPORTING
        handle        
l_handle
        command       
cmd
      
TABLES
        
data          mtab_get
      
EXCEPTIONS
        tcpip_error   
1
        command_error 
2
        data_error    
3
        
OTHERS        4.

*   Borramos los ficheros leidos
    
CONCATENATE 'del' mtab_ficheros-fichero INTO cad SEPARATED BY space.

    
CALL FUNCTION 'FTP_COMMAND'
      
EXPORTING
        handle        
l_handle
        command       
cad
      
TABLES
        
data          mtab_del
      
EXCEPTIONS
        command_error 
1
        tcpip_error   
2.

  
ENDLOOP.
* Cerramos la conexión con el FTP
  
CALL FUNCTION 'FTP_DISCONNECT'
    
EXPORTING
      handle 
l_handle
    
EXCEPTIONS
      
OTHERS 1.
ENDIF.