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.