sábado, 31 de mayo de 2014

Notas de SAP

En este post vamos a hablar de una aspecto vital a la hora de trabajar con SAP, las notas. En el día a día se hace imprescindible saber manejar correctamente la búsqueda de notas.

¿Qué son las notas de SAP?

Muy sencillo, son publicaciones de SAP a sus clientes. En la nota SAP pone a disposicíón de sus clientes información útil. En muchos casos se trata de correcciones a errores detectados. Estos errores suelen ser notificados por los usuarios, tras lo cual SAP realiza la corrección y la publica en una nota (Abordaremos en otro post como se aplican estas notas en nuestro sistema).
También podemos encontrarnos con notas que nos informas de mejoras o de nuevas funcionalidades.
 
Para buscar notas debemos acceder al SAP Support Portal. Para ello debemos disponer de usuario y contraseña. SAP provee este usuario a todos los clientes que tengan instalado su producto.
 
Tipos de nota

Tenemos principalmente dos tipos de notas:
  • How To: Estas nostas responden a dudas o cuestiones planteadas por los usuarios sobre las diferentes notas de SAP. No incluyen ninguna corrección para nuestro sistema. 
 
  • Notas correctivas:  Este grupo de notas, como hemos comentado al comienzo, responden a correcciones sobre errores detectados en el sistema. En este caso os pongo como ejemplo la reciente nota de seguridad 2068693. Sap detecto un fallo de seguridad y ha publicado una nota en la que pone a disposición de sus clientes la corrección correspondiente.
 
 
Si nos detenemos a revisar una orden veremos que está dividida en diferentes partes. Si nunca has visto una te va a costar comprender que es cada cosa, puede llegar a ser un poco lioso si no tenemos claro como se estructuran. Vamos a seguir con el ejemplo de la nota de seguridad para ver cada una de sus partes.

Lo primero que nos encontramos es el "sintoma", es decir, el problema detectado, cual es el porque de la existencia de esa nota. Normalmente cuando estamos buscando notas, en este apartado deberiamos encontrar una descripción similar al problema que estamos sufriendo en nuestro sistema.
 

 En el siguiente bloque lo que encontramos son palabras clave relacionadas con el problema. Muchas veces serán códigos de transacción o modulos afectados.
 
 
Seguimos, en el bloque que veremos a continuación SAP nos da una explicación de los motivos del error y también nos suele indicar como reproducirlo. También nos suele recordar que revisemos si la tenemos la versión del sistema donde se está produciendo el error. Puede ser, como en este caso, que la nota no nos aplique y no sea necesario que la implementemos.

Tras todas estas explicaciones, la nota nos indicará los pasos a realizar para solucioanr el problema. Puede ser que la solución requiera de correcciones manuales (deberemos aplicarlas nosotros misos) o que se deban aplicar las correcciones automaticamente (Veremos como hacerlo en otro post).
 
Normalmente tras la solución nos encontramos con un apartado de cabecera, donde se nos da información general sobre la nota (fecha de liberación, prioridad, categoría, etc.).
 


 
Tras toda esta información encontramos un apartado vital, "Validity". Aquí podemos ver a que componentes y que releases aplica la nota. Es aquí donde vamos a ver si la nota aplica a nuestro sistema o no.
 
Tras esto, y en función del release se nos listarán las correcciones que aplica la nota en cada caso. Podremos acceder a cada una de las correcciones y ver en detalle cuales son los cambios que van a aplicarse.

A continuación se nos indicará un listado de Support Packages donde la nota está incluida. Esto significa que si tenemos instalado en nuestro sistema alguno de estos Support Packages, no será necesario que apliquemos la nota.


Finalmente tendremos dos apartados mas, uno de referencias (Se nos indica si esta nota está relacionada con alguna otra nota) y otro de documentos adjuntos (Muchas veces SAP adjunta documentos con explicaciones para la implementación de la nota. Sobre todo cuando las correcciones son manuales).


Introducción a BI

En este post vamos a hacer una pequeña introducción en otro mundo nuevo, el del Business Intelligence. Tema que da para mucho y del que hablaremos mucho.

Las Tecnologías de la Información (TI) constantemente presentan nuevas metodologías y técnicas para facilitar la gestión en las empresas. Algunas son modas, otras corroboran día a día su efectividad e idoneidad en diferentes empresas y sectores, convirtiéndose en una solución imprescindible y recomendable.

El Business Intelligence (Inteligencia de Negocios) no es una moda, es una tecnología que ampliamente ha demostrado su utilidad, son innumerables los casos de éxito, así como las empresas que van poniendo en marcha proyectos para implementarlo.

 

¿Qué es el BI?

Es un conjunto de metodologías y técnicas dirigidas a facilitar el análisis de la información, para apoyar la toma de decisiones.

¿Cómo facilita el análisis de la información?

Las empresas constantemente generan información que la tiene dispersa en diferentes fuentes (bases de datos o ficheros) y en ocasiones, también tiene a su disposición datos generados fuera de la organización, tales como las estadísticas de su sector. A través de técnicas de BI, es posible agrupar todos estos datos en un solo contenedor.
En este proceso de consolidación de datos, se consideran sólo la información necesaria para el análisis de la gestión del negocio. El resultado de este proceso es el establecimiento de una fuente información única para toda su organización.

La técnica que permite consolidar la información se conoce como DataWarehousing y el contenedor de información se denomina DataWarehouse.

Para llevar la información desde las diferentes fuentes de datos al Datawarehouse, se diseñan unos procesos denominados ETL, un acrónimo formado por las iniciales de las tres acciones, que a grosso modo, consiste esta actualización del repositorio: Extraer, Transformar y Cargar (Extract, Transform and Load). Extraer los datos de las fuentes origen (Internas o Externas), adaptar o transformar los datos al formato requerido y cargar o grabar los datos en el DataWarehouse.

martes, 27 de mayo de 2014

¿Qué es SAP HANA?

SAP HANA es una solución SAP que combina tecnología de Base de Datos, el procesado de datos y la capacidad de ser una plataforma de aplicaciones in-memory y en tiempo real. La plataforma proporciona librerías para planificación, análisis predictivo, procesamiento de textos y analítica de negocio.
Esta nueva arquitectura permite la convergencia del procesado de datos basados tanto en OLTP como en OLAP, dentro de una única columna de datos in-memory basada en características ACID, eliminando redundancia de datos y latencia.
Gracias a que proporciona capacidades avanzadas – como el análisis predictivo de textos, procesado espacial, virtualización de datos en la misma arquitectura – simplifica los aspectos de desarrollo de aplicaciones y procesado sobre grandes fuentes y estructuras de datos. Esto convierte a SAP HANA en la plataforma más adecuada para construir e implementar aplicaciones de gestión y analíticas de última generación.

El poder de SAP HANA

Analítica en Tiempo Real

  • Analítica operacional
Con analítica transaccional y datos almacenados de forma conjunta, SAP HANA proporciona analíticas siempre disponibles para todas las combinaciones de datos posibles. Toma decisiones de forma inmediata usando analíticas operacionales en tiempo real, tanto si los datos vienen de aplicaciones SAP, como de cualquier otro aplicativo, fichero o fuente de datos
  • Repositorio de Datos – Data Warehousing
SAP HANA usa todo el potencial del Big Data gracias a su capacidad para manipular grandes volúmenes de datos en tiempo real, ya sean éstos estructurados o no. Permite construir un repositorio de datos integrado con Hadoop o migrar fácilmente tu actual SAP Business Warehouse a SAP HANA y tomar decisiones con rapidez dentro de la ventana de oportunidad.
  • Análisis predictivo, espacial y de textos
SAP HANA proporciona una suite de gran potencia para realizar análisis predictivos de librerías espaciales y de textos, pudiendo estar éstos en diferentes fuentes. Visualiza nuevas oportunidades y consigue visión profunda del negocio gracias al análisis unificado de todo tipo de datos.

Aplicaciones en tiempo real

  • Fidelización del Consumidor
La transformación de las TICs en un modelo basado en las interacciones con el consumidor en tiempo real, hace de SAP HANA una herramienta ideal para soportar este nuevo paradigma centrado en cliente o consumidor.
  • Siente y Responde
Gestionar un negocio en tiempo real requiere el ajuste en tiempo real de millones de señales de diferentes dispositivos y máquinas repartidos en varias partes del mundo. Adáptate con SAP HANA al Internet of Things.
  • Planificación y Optimización
Adáptate a los cambios organizativos de tu organización gracias a la plataforma HANA en tiempo-real y su capacidad de recudir capas de procesado, así como de acelerar cálculos complejos para simulaciones y planificación.

Plataforma en tiempo real

  • Servicios de Base de Datos y Procesado de Datos
SAP HANA puede funcionar como una Base de Datos común tanto para procesado online transaccional (OLTP) como para procesado analítico online (OLAP), eliminando duplicidades de datos y latencia.
  • Servicios de Plataforma para Aplicaciones
SAP HANA puede ser utilizado como una plataforma desde la que ejecutar aplicativos de negocio como ERP o CRM, lo que permite a estas aprovechar toda la potencia de procesado in-memory y facilitando enormemente las tareas de migración o upgrade.
  • Servicio de Integración y Virtualización de Datos
Los servicios de integración y virtualización de datos permite la copia de grandes volúmenes de datos, procesado de eventos y acceso inteligente a datos desde diferentes fuentes.
  • Servicios de Implementación Críticos – Cloud, Appliance
SAP HANA se puede desplegar como una plataforma de servicios en la Nube o como una máquina o servidor físico con centro de datos a medida.

Este es un tema que va a dar para mucho, y que nos acercara también al mundo que nos abre el BigData.

domingo, 25 de mayo de 2014

El internet de las cosas

En este post voy a dejaros un link desde el que os podeis descargar un interesante articulo publicado en la revista Leaners sobre "El internet de las cosas".

Tema muy interesante y apasionante. En el articulo podreis haceros una idea de en que consiste y algunas de las aplicaciones que puede tener. Es un tema a seguir muy de cerca en los próximos años.

https://www.dropbox.com/s/23239tny1l9ccus/LEANERS04_MAY2014_FOCUS_ON_Internet_de_las_cosas.pdf

Cualquier aportación sobre el tema será bien recibida.

miércoles, 21 de mayo de 2014

Charsets y Codepages. UNICODE

No siempre tenemos que preocuparnos de la codificación de caracteres de los ficheros que abrimos y cerramos en R/3, pero en ocasiones sí. Por ejemplo, cuando destinados a un proyecto en Japón debemos hacer una carga de clientes con nombres etruscos.

Si realmente no estás familiarizado/a con el concepto de juegos de caracteres, es muy importante superar el mito extendidísimo de que un caracter de texto ocupa siempre un byte. Eso es cierto para la mayoría de textos en inglés que no usan caracteres extraños, o cuando utilizamos textos de windows y nuestro SAPGUI está enterado de por donde se mueve. Pero no siempre ocurre así.
Podría extenderme sobre las diversas variaciones de juegos de caracteres, sistemas de codificación, etc… pero no lo voy a hacer porque ya hay un estupendo artículo que explica en que consisten y, esencial, porque llegaron a ser como son: Lo Absolutamente Mínimo que cada Desarrollador de Software, Absoluta y Positivamente, Debe Saber sobre Unicode y Juegos de Caracteres. Este texto, muy clarificador, unido a este FAQ sobre UTF, debería ser bastante para entender lo esencial sobre este asunto.

El código que adjunto es una demostración de cómo se pueden utilizar objetos ABAP para convertir textos de unos sistemas de codificación a en otros. Para facilitar las pruebas, hago uso de la interesante función SCMS_STRING_TO_XSTRING para transformar el texto del parámetro de entrada del report en xstring. ¿Por qué?
Obviamente no podemos trabajar con strings puros, ya que de ese modo su contenido real, sus bytes, permanecen opacos a nuestra vista durante su tratamiento. Por eso se hace absolutamente necesario el uso de xstrings, con lo que a la hora de cargar y grabar ficheros codificados de modo extraño lo haremos en modo binario.
Es importante señalar que ABAP no utiliza los diversos nombres y alias de los distintos juegos de caracteres para realizar las conversiones, ya que utiliza un código numérico interno para definirlos. Existe una función que traduce, más bien intenta, los nombres estándar a estos códigos internos. Pero funciona tan horrorosamente mal y es tan poco práctica que ni la menciono. Es mucho mejor mirar directamente el contenido de la tabla TCP00, cruzar los dedos y deducir, a base de pruebas (este mismo programa puede ayudar) cual es el código numérico que necesitamos. Digo lo de las pruebas porque las descripciones son espantosas y muy poco clarificadoras.
Como curiosidad: el programa RSCPINST muestra los juegos de caracteres utilizados en SAPGUI, servidor y base de datos. Quizás sirva de ayuda.

A continuacion muestro un pequeño ejemplo:

REPORT  zzcharsetsycodepages NO STANDARD PAGE HEADING.
"As seen on http://cranf.com

DATA windows1252 TYPE xstring. "xcadena en windows1252
DATA utf8 TYPE xstring. "xcadena en UTF-8
DATA utf16 TYPE xstring. "xcadena en UTF-16
DATA conversionutf8 TYPE REF TO cl_abap_conv_x2x_ce. "instancia de la conversión
DATA conversionutf16 TYPE REF TO cl_abap_conv_x2x_ce. "instancia de la conversión
DATA longitud TYPE i. "lo necesitamos, queramos o no

"parámetro de entrada
PARAMETERS cadena TYPE string LOWER CASE DEFAULT 'España Cañí y Olé'.

"**********************************************************************
"en un primer paso tiramos de la función de conversión de string en xstring,
"pasándole el código interno de charset ABAP (están en la tabla TCP00)
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
  EXPORTING
    text     = cadena
    encoding = '1160' "windows1252, véase tabla TCP00 para deducir número
  IMPORTING
    buffer   = windows1252
  EXCEPTIONS
    failed   = 1
    OTHERS   = 2.
"esta función nos puede bastar para conversión de un string en la cadena hexadecimal
"con el charset que nos dé la gana. estupenda, ¿verdad?
"pero ahora vamos a pasar de un xstring a otro xstring con distinta codificación
"instanciamos primero el objeto conversor


TRY.
    CALL METHOD cl_abap_conv_x2x_ce=>create
      EXPORTING
        in_encoding  = '1160' "windows1252
        ignore_cerr  = abap_false
        out_encoding = '4110' "código utf-8, véase tabla TCP00
        input        = windows1252
      RECEIVING
        conv         = conversionutf8. "es la instancia de un objeto, ojo!
  CATCH cx_parameter_invalid_type .
  CATCH cx_parameter_invalid_range .
  CATCH cx_sy_codepage_converter_init .
ENDTRY.

"convertimos occidental a UTF-8
TRY.
  CALL METHOD conversionutf8->convert_c
    IMPORTING
      len = longitud.
ENDTRY.

"y obtenemos el valor UTF8 como xstring
CALL METHOD conversionutf8->get_out_buffer
  RECEIVING
    buffer = utf8.

"**********************************************************************
"para rizar el rizo, pasamos de UTF8 a UTF16 little endian
TRY.
    CALL METHOD cl_abap_conv_x2x_ce=>create
      EXPORTING
        in_encoding  = '4110' "código utf-8, véase tabla TCP00
        ignore_cerr  = abap_false
        out_encoding = '4103' "utf-16 little endian (4102 sería big endian)
        out_endian   = 'L' "indica opcionalmente big endian / little endian
        input        = utf8
      RECEIVING
        conv         = conversionutf16. "instancia del objeto
  CATCH cx_parameter_invalid_type .
  CATCH cx_parameter_invalid_range .
  CATCH cx_sy_codepage_converter_init .
ENDTRY.

"hacemos la conversión de UTF8 a UTF16
TRY.
  CALL METHOD conversionutf16->convert_c
    IMPORTING
      len = longitud.
ENDTRY.

"obtenemos finalmente el valor UTF16 como xstring
CALL METHOD conversionutf16->get_out_buffer
  RECEIVING
    buffer = utf16.

"**********************************************************************
"y aquí los resultados
WRITE: / 'String      :', cadena.
WRITE: / 'windows1252 :', windows1252.
WRITE: / 'UTF-8       :', utf8.
WRITE: / 'UTF-16      :', utf16.


El resultado que obtenemos es el siguiente:

String      : España Cañí y Olé
windows1252 : 45737061F161204361F1ED2079204F6CE9
UTF-8       : 45737061C3B161204361C3B1C3AD2079204F6CC3A9
UTF-16      : 4500730070006100F1006100200043006100F100ED002000790020004F006C00E900

lunes, 19 de mayo de 2014

Consultas Dinámicas (SELECT)

En este post voy a poner un ejemplo sencillo de como podemos generar SELECT (Consultas) de manera dinámica con ABAP. Para ello describo dos sencillo ejemplos.


Para crear una SELECT dinámica hacemos lo siguiente:

  DATA : w_field(10),
         i_field 
LIKE TABLE OF w_field,
         aux 
TYPE wogxxx.

  CLEAR w_field.
  
REFRESH i_field.

  CONCATENATE c_wog0 mes INTO w_field.
  
APPEND w_field TO i_field.

*   Coste teorico
    
CLEAR: aux,
           p_teorico.

    
SELECT (i_field)
    
INTO aux
    
FROM cosp
    
WHERE objnr = p_objnr AND
          versn = c_versn 
AND
          wrttp = c_wrttp_05 
AND
          hrkft = p_hrkft.
      
p_teorico = p_teorico + aux.
    
ENDSELECT.

Otro ejemplo, esta vez para el WHERE sería:
  DATA: cond(72TYPE c,
        itab 
LIKE TABLE OF cond.
  
DATA wa TYPE spfli-cityfrom.

  
PARAMETERS: city1(10TYPE c,
              city2(
10TYPE c.


  
CONCATENATE 'CITYFROM = ''' city1 '''' INTO cond.
  
APPEND cond TO itab.

  
CONCATENATE 'OR CITYFROM = ''' city2 '''' INTO cond.
  
APPEND cond TO itab.

  
CONCATENATE 'OR CITYFROM = ''' 'BERLIN' '''' INTO cond.
  
APPEND cond TO itab.

  
SELECT cityfrom
    
INTO wa
    
FROM spfli
    
WHERE (itab).
  
ENDSELECT.

martes, 13 de mayo de 2014

Mandantes

En este post vamos a hacer una introducción a los mandantes en SAP. Voy a tratar de explicar en que consisten.

Una instancia es una unidad administrativa que combina los  componentes del sistema SAP ofreciendo uno o más servicios que son arrancados o parados conjuntamente.
Dentro de la base de datos, los datos de un sistema SAP pueden dividirse en:
      • Datos dependientes de mandante, que son datos que afectan solamente al mandante de trabajo, como por ejemplo maestros de usuarios y datos de aplicación.
      • Datos no dependientes de mandante, que son datos que afectan a todo el entorno del sistema, como por ejemplo datos parametrizables de mandante y todos los objetos de repositorio.
      • El diccionario ABAP es el diccionario de datos que es parte del repositorio ABAP. Cada pieza de información del diccionario, es introducida una sola vez y entonces está disponible en cualquier lugar del sistema.
El entorno de ejecución del sistema SAP consiste en todos los programas ABAP requeridos durante la ejecución.

Un mandante es un criterio organizativo, definido como una entidad legal y organizacionalmente independiente, en un sistema SAP. (Por ejemplo, un holding de empresas). Se caracteriza por tener un conjunto propio de tablas y datos. A nivel de base de datos, un mandante es un subconjunto lógico de registros.
Los factores a considerar en la configuración de mandantes son:
      • Un SISTEMA SAP se instala con tres mandantes estándar:
        • Mandante 000: Mandante de Referencia SAP
        • Mandante 001: Mandante de trabajo SAP
        • Mandante 066: Mandante de Servicio Early Watch
      • La creación de otros mandantes se realiza como copia de un mandante estándar SAP, normalmente el 001.
      • Existen tablas “independientes “ de mandante
      • Es posible (y necesario) crear varios mandantes durante el proyecto: pruebas, formación inicial, formación a usuarios, etc.
      • Los mandantes pueden “protegerse” de modificaciones o “transportes”

 

Las posibles configuraciones  de mandantes y sistemas son:
 
Para la gestión y configuración de los mandantes, se usa la transacción SCC4.


 
 

lunes, 12 de mayo de 2014

Crear tabla interna dinamicamente

En este post vamos a poner un ejemplo muy utíl cuando estamos programando, vamos a explicar como generar una tabla interna de forma dinámica, sin haberla definido previamente. Es sencillo hacerlo y nos da mucho potencial a la hora de programas nuestras aplicaciones.

Para crear una tabla interna dinámicamente hacemos lo siguiente:

FIELD-SYMBOLS: <lt_table> TYPE table,
               <l_disp> 
TYPE table,
               <l_line> 
TYPE ANY,
               <fs_xlsdata> 
TYPE ANY. 
DATA : lt_fieldcat TYPE lvc_t_fcat,
         ls_fieldcat 
LIKE LINE OF lt_fieldcat,
         indice(
2TYPE c,
         cad(
2TYPE c.

  
DATA ls_layout TYPE lvc_s_layo.
  
DATA: gs_fieldcat       TYPE lvc_s_fcat.
  
DATA: gt_fieldcat    TYPE lvc_t_fcat.
  
DATA: lt_data TYPE REF TO data,
        out_line 
TYPE REF TO data,
        wa_fieldcat 
LIKE LINE OF lt_fieldcat,
        l_objtab 
LIKE STANDARD TABLE OF ddfieldin,
        wa_objtab 
LIKE LINE OF l_objtab,
        ws_count(
3TYPE c VALUE '1',
        wa_gxxltv 
TYPE gxxlt_v.

  
DATA: lv_ncampo(20TYPE c.
Añadimos los campos indicando el nombre de la columna, el tipo de dato y la longitud
* Añadimos los campos generales
  
LOOP AT r_campos.

    
gs_fieldcat-fieldname = r_campos-low.
    gs_fieldcat-outputlen = r_campos-high+
4(3).
    gs_fieldcat-datatype = r_campos-high(
4).
    
CLEAR gs_fieldcat-col_pos.
    
APPEND gs_fieldcat TO gt_fieldcat.
    
CLEAR gs_fieldcat.

  
ENDLOOP.
Generamos la estructura de la tabla interna con el siguiente método
* create dynamic table with the frontend fieldcatalog
  
CALL METHOD cl_alv_table_create=>create_dynamic_table
    
EXPORTING
      it_fieldcatalog           = gt_fieldcat
    
IMPORTING
      ep_table                  = lt_data
    
EXCEPTIONS
      generate_subpool_dir_full = 
1
      
OTHERS                    = 2.
A partir de la estructura generada creamos la tabla interna y una línea de cabecera utilizando field-simbols.

  
IF sy-subrc EQ 0.
    
ASSIGN lt_data->* TO <lt_table>.
  
ENDIF.

  
CREATE DATA out_line LIKE LINE OF <lt_table>.
  
ASSIGN out_line->* TO <l_line>.