domingo, 31 de agosto de 2014

SMARTFORMS II Creación del formulario

Seguimos con el segundo capítlo dedicado a los SMARTFORMS. En este caso vamos a crear el formulario que en siguientes post iremos diseñando.

Existen dos funciones necesarias para el funcionamiento de un formulario SmartForm:
  1. SSF_FUNCTION_MODULE_NAME 
  2. Variable
La función “variable” es una función que se genera en el momento de la creación del SmartForm.
Introducimos en la línea de comando la transacción SMARTFORMS y presionar la tecla INTRO.
 
 

 
 En esta pantalla debemos seleccionar la opción Estilos y escoger el estilo creado en el paso anterior llamado WSEDOLLY, luego seleccionar la primera opción Formulario y dar un nombre a nuestro formulario; en este caso se llamará ZFORMULARIO y presionar el botón Crear.
 
 
Aparecerá la siguiente pantalla con dos pestañas:
  • Propiedades Generales. Sobre esta pestaña debemos colocarle una breve descripción sobre nuestro formulario, como además, el autor, el idioma, etc.

  • Opciones de Salida. Sobre esta pestaña definimos el formato de página, los caracteres por pulgadas, líneas por pulgadas, y la salida del formulario.

A partir de aquí comenzaremos a crear las diferentes ventanas del formulario, pero esto lo veremos en el siguiente post.

 

SMARTFORMS I Creación de estilos

Voy a comenzar una serie de post sobre SMARTFORMS. SAP Smart Forms es una herramienta de impresión de formularios. Con esta herramienta podemos crear y modificar formularios mediante la utilización de una herramienta de diseño gráfico.

Cualquiera que se haya tenido que enfrentar a la tarea de construir un formulario en SAP, sabre que es una de las cosas mas tediosas a las que nos podemos enfrentar. Las herramientas que nos ha proporcionado SAP tradicionalmente no son una maravilla precisamente. Pero como la elaboración de formularios es algo bastante habitual, deberemos conocerlo.

La creación de un SmartForm se divide en dos fases:
  1. Creación del programa control.
  2. Creación del SmartForm
Cabe anotar que los SmartForm solo pueden ser utilizados con tablas que se encuentren incluidas en el diccionario de datos, por lo que se hace necesario crear la tabla adecuada a nuestras necesidades.

Creación de estilo

Escribir en la línea de comandos la transacción que se muestra en el recuadro negro

 
Definir un estilo nuevo para ser aplicado en el formulario, lo primero a realizar es colocar un nombre al estilo; en este caso se llamará ZWSEDOLLY (paso 1) y luego presionar el botón Crear (Paso 2)

 
Posteriormente aparecerá la siguiente ventana en donde debemos dar doble clic sobre el nodo Formatos de Párrafo, y sobre este mismo dar clic derecho y seleccionar la opción Crear Nodos como se muestra en la siguiente pantalla.


Aparecerá la siguiente ventana emergente solicitando un nombre para el formato de párrafo; para este ejemplo se creará el formato de párrafo WS.


Aparecerá la siguiente pantalla en donde se debe definir los atributos que va a tener ese párrafo tales como la fuente, el tamaño, los tabuladores, etc.


Sangrias e Interlin

La primera pestaña “Sangrías e Interlin.” esta divida en cuatro secciones:

  1. Alineación --> La alineación se refiere siempre al margen derecho e izquierdo definido para el párrafo.
  2. Sangría
    Margen izquierdo de un párrafo. El margen izquierdo es la distancia entre el margen izquierdo de la ventana y el comienzo de las líneas de texto del párrafo.

    Margen derecho de un párrafo. El margen derecho es la distancia entre el margen derecho de la ventana y el margen derecho del texto con margen justificado.

    Sangría en la primera línea del párrafo. La sangría es definida como la distancia entre el margen izquierdo y el comienzo de la primera línea. La sangría podrá ser indicada como valor positivo o valor negativo.
  3. Interlineado

    Espacio anterior. Es la distancia entre el espacio posterior del párrafo anterior y la primera línea del párrafo actual.

    Interlineado. Es la distancia entre la línea de base inferior de un renglón de texto y la línea de base superior del renglón siguiente.

    Espacio posterior. Es la distancia entre la última línea del párrafo actual y el espacio anterior al párrafo siguiente
Tabuladores

Marcamos la pestaña Tabuladores como se muestra en la imagen

 
Esta pantalla consta de una tabla en donde debemos configurar nuestro tabulador.
  1. Posición. La posición se indica como distancia del margen izquierdo de la ventana. 
  2. Unidad. Unidad de medida para definir la posición de una tabulación. 
  3. Alineación. Define el tipo de alineación que tendrá el párrafo.
Selecciona  la pestaña Font como se muestra en la siguiente imagen


Fuente

Esta pantalla consta de una tabla en donde debemos configurar la fuente que tendrá nuestro párrafo. 
  1. Font. En esta lista seleccionamos la fuente que deseamos utilizar para el párrafo.
  2. Altura de font. Es el tamaño que tendrá la fuente.
  3. Sección de font. En esta lista seleccionamos el tipo de letra existente.
Despues de haber realizado los pasos anteriores debemos dar doble clic en parte izquierda de la pantalla sobre el nodo Datos Cab. Como se muestra en el recuadro negro de la siguiente pantalla.


Para poder seleccionar el párrafo creado en el paso anterior.


Guardamos, activamos y listo.

viernes, 29 de agosto de 2014

Configuración de SAP para el envío de correos electrónicos ( SCOT & SOST )

En este post os voy a comentar como configurar el servidor SMTP de correo electrónico. Si queremos enviar email a través de SAP deberemos tenerlo configurado correctamente. Es muy sencillo y se hace en pocos pasos.

En este caso vamos a utilizar un host donde tenemos albergado nuestro servidor de correo electrónico.

La configuración la vamos a realizar a través de la transacción SCOT. Accedemos a ella y hacemos doble clic sobre "SMTP".


Le marcamos como nodo en funcionamiento con la opción "Nodo en operación" y le indicados el host de nuestro servidor de correco electrónico:


Además en el tipo de dirección soportada (Internet) debemos indicarle que se aceptan todos:


Una vez realizados estos pasos la configuración ha finalizado y podriamos comenzar a enviar correos electrónicos desde SAP.

Un último paso sería indicar en nuestro usuario SAP una dirección de correo electrónico. Cuando enviemos un email SAP lo hará a través de la dirección que tengamos indicada en ese campo de nuestro usuario.


Una vez que comencemos a enviar email a través de SAP disponemos de una transacción que nos permitirá monitorizarlos. Se trata de la transacción SOST


Aqui iremos viendo listados todos los mensajes que vayamos generando, indicando el status en el que se encuentran. Lo habitual es que los mensajes no se envien automaticamente y se programe un job cada X minutos que los envie.

El job se programa desde la transacción SCOT. En el menu hacemos clic sobre Opciones-->Jobs de envio

 
Tras estos se nos abrirá una ventana donde deberemos crear un job indicando la opción para el envio a todo tipo de direcciones.


Y finalmente se nos abré la ventana de configuración del job. Lo principal indicar la frecuencia con la que se ejecutará.

jueves, 28 de agosto de 2014

Migración e integración de datos en un sistema BI

En este post voy a continuar hablando sobre conceptos relacionados con sistemas de Business Intelligence. En este caso voy a referirme a la migración e integración de datos, lo que se suele conocer mas como procesos ETL.

La integración de datos es un concepto íntimamente ligado a la arquitectura Datawarehouse (DW) desde sus etapas iniciales. Esencialmente un DW debe ser capaz de combinar en un único espacio los datos que recibe de diversas fuentes.

Para lograr esta integración se emplean los procesos de Extracción, Transformación y Carga o, por sus siglas en inglés, ETL. Estos procesos siguen una serie de pasos a través de los cuales consiguen la integración final de los datos. Para ello, en primer lugar, extraen los datos a partir de fuentes diversas y heterogéneas, para después transformarlos a través de conversiones y limpieza, y finalmente ser
cargados en el DW.

La eficiencia y fiabilidad de los procesos ETL son un factor clave que influye directamente en el correcto funcionamiento de nuestro DW. Hay que destacar que un proceso ETL supone complejos desarrollos. Claro está, que si vamos a trabajar con el BI de SAP, este nos proporcionará de manera estandar muchos procesos ETL predeterminados. Aunque siempre tendremos que hacer desarrollos a medida, pues muy pocas veces, estos procesos se adaptarán 100% a nuestras necesidades.

FASES DE LOS PROCESOS ETL

Hay que tener en cuenta que el proceso de ETL consume una gran parte del tiempo destinado a un proyecto de BI (alrededor del 60% o el 80%), lo cual le convierte en un punto estratégico para el éxito de nuestro proyecto, que requiere una estrategia clara, recursos, habilidades especializadas y tecnología.

Todo proceso de ETL requiere una extracción, una transformación y una carga para poder acceder a los datos de las fuentes de información, e incluye cinco subprocesos:

1. Extracción: mediante este proceso se recuperan los datos procedentes de las diversas fuentes de información, obteniéndose, por consiguiente, datos en bruto.

2. Limpieza: en este paso se chequean los datos en bruto para ver su calidad y para eliminar duplicados, corregir posible errores y completar los valores vacíos. Gracias a este proceso se transforman los datos para evitar en lo posible errores de carga, y obtener, al final datos limpios y de calidad.

3. Transformación: gracias a este paso, los datos limpios y de calidad se recuperan, para proceder a su estructura y resumen en los distintos modelos de análisis. Al final de esta fase se dispondrá de datos limpios, consistentes, resumidos y útiles.

4. Integración: en este paso se comprueba que los datos cargados en el DW son consistentes con las definiciones y formatos del DW, asegurándonos su correcta integración dentro de los diversos modelos enmarcados en las diferentes áreas de negocio definidas en el mismo. No hay que olvidar que este tipo de procesos pueden ser complejos.

5. Carga: en este paso final se añaden los nuevos datos al DW.


Estos pasos son a nivel conceptual. No todas las herramientas de BI tienen porque seguirlos, o incluso puede añadir algun paso adicional. Lo que está claro es que este proceso es uno de los procesos fundamentales dentro de un proyecto de BI. Debemos conocerlo y dominarlo ampliamente.


martes, 26 de agosto de 2014

¿POR QUE UN SOLUCIÓN BI?

En este post os voy a dar algunos motivos por los cuales una empresa debe adoptar una solución de BI. Parece obvio, pero en muchas empresas es deficil hacer entender la necesidad de tener herramientas potentes para la gestión de la información. Muchas veces nos topamos con usuarios que defienden que ellos pueden hacerlo todo con un Excel.
Mi opinión en estos casos es sencilla, dejarles que se estrellen ellos solos!!!En el muy corto plazo son capaces de montar un informe en una hoja de cálculo, seguramente mas rapido de lo que seriamos nosotros en implementarlo, pero en el largo plazo acabarán claudicando ante el poder de la tecnología. Hay que ser pacientes y constantes en nuestro trabajo, es dificil a veces, lo se, pero si seguimos esa senda llegaremos a cumplir nuestros objetivo y la tecnología se impondra.

Y ahora si, ¿POR QUE UN SOLUCIÓN BI?

1. Un solo punto de acceso a la información
Gracias a los sistemas BI toda compañía puede liberar la información almacenada en sus bases de datos, mediante el uso de un único punto de acceso, un portal BI. No importa donde se encuentre la información, almacenada en sus sistemas ERPs, en el CRM, Datawarehouse, Datamarts, o cualquier aplicación especifica de negocio, los usuarios podrán generar sus informes, y realizar un Drill-Down exhaustivo de la información a fin de entender las motivaciones de su empresa, sin necesidad de conocimientos técnicos en lo referente a las estructuras de datos subyacentes. Las aplicaciones BI
más exitosas permiten hacer este proceso con una interfaz gráfica sin tecnicismos y de fácil uso.
 
2. Respuestas oportunas a las preguntas de la empresa

El problema en muchas compañías es la dificultad que encuentran la mayoría de los empleados para acceder a la información, un territorio reservado al departamento de TI. Si bien los equipos de TI pueden realizar búsquedas y generar los informes solicitados por los usuarios desde los sistemas transaccionales, este acercamiento al reporting se caracteriza por una limitada flexibilidad y altos tiempos de ejecución, un enfoque de auto-servicio en lo relativo a la información proporciona unos beneficios mayores. Hay que entender que las ejecuciones de consultas analíticas que requiere BI consumen gran cantidad de recursos. Por ejemplo, imaginemos que un usuario de negocio necesita realizar una consulta que analice la evolución de pedidos de los 10 principales productos durante los últimos cinco años. En un sistema transaccional, esta consulta no sólo requeriría un enorme esfuerzo de procesamiento, sino que además, la ejecución debería utilizar los recursos habitualmente utilizados por los sistemas de facturación en puntos de ventas, pedidos de clientes, o compras a proveedores. Procesos que por otro lado son claves para el día a día de la compañía.
Sin embargo mediante una aplicación BI, que permita un acceso directo y sencillo a la información, los usuarios pueden responder cuestiones que vayan surgiendo sobre la marcha. Además, al contar
con información precisa y actualizada, las respuestas generadas serán más efectivas y contribuirán de una manera más notable en la consecución de las metas marcadas.

La clave para liberar la información reside en dar a los usuarios las herramientas necesarias para encontrar respuestas a sus preguntas de una manera rápida y fácil. Algunos de los usuarios quedarán
satisfechos con informes estándar que se actualizan regularmente, tales como reportes de los inventarios actuales de la empresa, ventas por canal, o informes del estatus de sus clientes. No obstante, las respuestas ofrecidas en estos informes pueden derivar en nuevas cuestiones. A su vez, otros usuarios pueden estar más interesados en un acceso dinámico a la información. Este hecho puede conducir, de nuevo, a preguntas adicionales, que no podrán responderse, en este caso, mediante un informe predefinido.

Cabe destacar que los usuarios dedican gran cantidad de su tiempo en acceder a informes estándar o personalizados, mientras que una pequeña parte de sus tareas requieren la consulta de una fuente externa para conseguir información adicional, que no estaba disponible en el informe original. Con objeto de solventar esta demanda y evitar la frustración de los usuarios (y el consecuente retraso para los equipos de TI), se requiere un sistema BI que permita a los usuarios realizar solicitudes de información de manera autónoma a partir de las fuentes de datos con las que cuenta la empresa.

viernes, 22 de agosto de 2014

Cursos gratuitos de formación SAP

Os dejo un link con diferentes cursos de SAP gratuitos. Tienen muy buena pinta. Estan relacionados sobre todos con SAP HANA y SAP Fiori, pero hay alguno mas interesante.
Solo hay que registrarse y duspués apuntaros a los cursos que mas os puedan interesar.

 
 
Ánimo y a aprender!!!!!!

martes, 19 de agosto de 2014

Debugging en SAP

En este post os voy a hablar sobre una de las herramientas que todo desarrollador debe dominar a la perfección, el DEBUGGING. Basicamente lo que nos permite es ir ejecutando un programa linea a linea de código podiendo controlar como se va ejecutando el programa. Podremos ir viendo los valores que van tomando nuestras variables. Es esencial dominarla para depurar nuestros programas y solucionar las diferentes incidencias que van surgiendo.

También podremos utilizar el debigging para entender que hacen los programas en un determinado punto, buscar porciones de código que podamos reutilizar en nuestros programas, etc. Resumiendo, una herramienta indispensable para toda persona que tengan intención de desarrollar un programa.

A continuación explicaré brevemente como utilizar está herramienta dentro de cualquier programa SAP.

En la siguiente imagen vemos como podemos lanzar un programa en modo debugging. Principalmente tenemos dos opciones.


Una vez uniciado el programa en este modo podremos ir fijando breakpoints. Estos son puntos donde el código se parará siempre que pase por ahí. Una vez que la ejecución para nosotros tenemos el control y tenemos diferentes opciones a realizar.

En la siguiente imagen veremos diferentes posibilidades que nos ofrece la pantalla de debugging de SAP.


Las funciones mas importantes son:
  • Single Step: Ejecuta la siguiente linea de programa
  • Execute: Ejecuta todos los pasos pertenecientes a la línea.
  • Continue: Ejecuta el código hasta el siguiente break-point o hasta el final del programa.
  • Table: Visualiza el contenido de tablas internas.
  • Breakpoint: Define break-point.
  • Editor: Salta al edito de abap.
  • Hexadecimal: Visualiza datos en formato hexadecimal.
  • Replace: Realiza modificaciones en los datos.
Para avanzar por el programa podemos utilizar las teclas rápidas que nos ofrece SAP (F5, F6, F7, F8). Esto nos permitirá avanzar mucho mas rápido.


Podemos marcar breakpoints en diferentes lugares. En la imagen vemos todas las opciones.


Segun vamos fijando breakpoints si pulsamos el boton "Grabar" estos quedarán marcados, es decir, si finalizamos la ejecución del programa y volvemos a lanzarlo los breakpoints seguirán marcados. No tenemos que marcarlos cada vez.

Otra opción que nos da SAP son los Watchpoint, que lo que hacen es marcar un breakpoint en el código cuando la variable que marcamos cambia de valor.

 
 
Si queremos finalizar la ejecución del programa sin que se nos pare en ninguno de los breakpoints que tenemos marcados, podemos hacerlo mediante el menú.
 




lunes, 18 de agosto de 2014

Query 2 Report. Construye Reports en solo 2 minutos

En este post os voy a hablar de un programa que he descrubierto para generar listados de forma rápida en SAP. Podeis consultarlo en el SCN de SAP si quereis.

Voy a comentarlo con un ejemplo y finalmente dejaré el código de la transacción. Esta herramienta permite crear informes en 2 minutos. La pantalla de selección, los textos de selección y el código se genera automáticamente.

Lo primero de todo es descargarse el código de la transacción ZQ2R.

Una vez lo hayamos descargado y creado ejecutaremos ZQ2R. Pulsamos el botón QuickViewer

 
Como ejemplo vamos a crear la típica query en la que consultaremos los vuelos desde uns ciudad.
 

Después de introducir el nombre de la consulta (FlightsFrom_NY) pulsamos el botón Crear.
En este ejemplo vamos a utilizar la fuente de datos "Table Join", con la que podremos enlazar varias tablas.


Pulse el botón insertar tabla para agregar las siguientes tablas: SPFLI (horarios de vuelos), SFLIGHT (Vuelos) y SCARR (aerolíneas).

 

Una vez seleccionadas las tabla volvemos hacia atrás (F3).


Seleccionamos los campos que se mostrarán en el listado, y los campos que formarán parte de la pantalla de selección.

 
Podemos seleccionar la forma de ordenación de las columnas.
 

Finalmente grabamos la query y damos un nombre al report.

 
 
 
Tras realizar estos pasos volvemos a la pantalla inicial de la transacción ZQ2R y copiamos el código que hemos asignado al report (AQ01SYSTQV000001FLIGHTSFROM_NY) y Ejecutamos.

 
 
 
Podemos definir diferentes características de los parámetros de selección.
 





Incluso marcar valores por defecto si es necesario


Podemos definir los Textos de selección para los diferentes campos.


Finalmente presionamos volver y ya tenemos generado el programa que ejecutará el report.

 
Si lo ejecutamos desde la transacción SE38 veremos que el programa se ha generado correctamente.
 
 
 
 
Y para mi lo mas interensate, el código del programa generado está muy bien estructurado. A partir de este código podemos meter al report mucha mas funcionalidad y nos habremos ahorrado un bien tiempo de programación. Os dejo el código de ejemplo.
 
*&-----------------------------------------------------------------*
*& Report ZQ2R_FLIGHTSFROM_NY
*&-----------------------------------------------------------------*
REPORT zq2r_flightsfrom_ny.
 
*&-----------------------------------------------------------------*
*&  Include ZQ2R_FLIGHTSFROM_NY_TOP
*&-----------------------------------------------------------------*
CONSTANTS:
  c_cityfr TYPE spfli-cityfrom VALUE 'NEW YORK'.
 
TABLES:
  spfli,
  sflight.
 
TYPES:
  tyr_carrid TYPE RANGE OF spfli-carrid,
  tyr_fldate TYPE RANGE OF sflight-fldate,
 
  BEGIN OF ty_data,
    cityfrom TYPE spfli-cityfrom,
    cityto   TYPE spfli-cityto,
    carrname TYPE scarr-carrname,
    fldate   TYPE sflight-fldate,
  END OF ty_data,
  tyt_data TYPE STANDARD TABLE OF ty_data.
 
DATA t_data TYPE STANDARD TABLE OF ty_data.
*&-----------------------------------------------------------------*
*&  Include ZQ2R_FLIGHTSFROM_NY_SEL
*&-----------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK a WITH FRAME.
 
PARAMETER p_cityfr TYPE spfli-cityfrom DEFAULT c_cityfr.
SELECT-OPTIONS s_carrid FOR spfli-carrid MEMORY ID car.
SELECT-OPTIONS s_fldate FOR sflight-fldate MEMORY ID day OBLIGATORY.
 
SELECTION-SCREEN END OF BLOCK a.
*&-----------------------------------------------------------------*
*&  Include ZQ2R_FLIGHTSFROM_NY_F01
*&-----------------------------------------------------------------*
*&-----------------------------------------------------------------*
*&      Form  SET_SELECTION_FIELD_DISABLED
*&-----------------------------------------------------------------*
FORM set_selection_field_disabled USING p_spname TYPE aqs_spname.
 
  DATA lv_spname_length TYPE i.
 
  lv_spname_length = strlen( p_spname ).
 
  LOOP AT SCREEN.
    IF screen-name(lv_spname_length) = p_spname.
      screen-input = 0.
      MODIFY SCREEN.
    ENDIF.
  ENDLOOP.
 
ENDFORM.                    " SET_SELECTION_FIELD_DISABLED
 
*&-----------------------------------------------------------------*
*&      Form  GET_DATA
*&-----------------------------------------------------------------*
FORM get_data USING p_cityfr TYPE spfli-cityfrom
                    s_carrid TYPE tyr_carrid
                    s_fldate TYPE tyr_fldate
           CHANGING t_data   TYPE tyt_data.
 
 
  SELECT spfli~cityfrom
         spfli~cityto
         scarr~carrname
         sflight~fldate
    FROM ( spfli
           INNER JOIN sflight
           ON  sflight~carrid = spfli~carrid
           AND sflight~connid = spfli~connid
           INNER JOIN scarr
           ON  scarr~carrid = sflight~carrid )
    INTO TABLE t_data
         WHERE spfli~cityfrom = p_cityfr
           AND spfli~carrid IN s_carrid
           AND sflight~fldate IN s_fldate .
 
ENDFORM.                    " GET_DATA
 
*&-----------------------------------------------------------------*
*&      Form  ALV
*&-----------------------------------------------------------------*
FORM alv USING t_data TYPE tyt_data.
 
  DATA:
    o_sorts     TYPE REF TO cl_salv_sorts,
    o_columns   TYPE REF TO cl_salv_columns,
    o_display   TYPE REF TO cl_salv_display_settings,
    o_functions TYPE REF TO cl_salv_functions_list,
    o_layout    TYPE REF TO cl_salv_layout,
    ls_key      TYPE        salv_s_layout_key,
    o_alv       TYPE REF TO cl_salv_table.
 
* Gel ALV object
  TRY.
      cl_salv_table=>factory(
        IMPORTING
          r_salv_table = o_alv
        CHANGING
          t_table      = t_data ).
    CATCH cx_salv_msg.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDTRY.
 
* ALV Sort
  o_sorts = o_alv->get_sorts( ).
  TRY.
      o_sorts->add_sort( 'CITYFROM' ).
      o_sorts->add_sort( 'CITYTO' ).
      o_sorts->add_sort( 'CARRNAME' ).
      CALL METHOD o_sorts->add_sort
        EXPORTING
          columnname = 'FLDATE'
          sequence   = if_salv_c_sort=>sort_down.
    CATCH cx_salv_not_found
          cx_salv_existing
          cx_salv_data_error.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
         WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDTRY.
 
* Get columns
  o_columns = o_alv->get_columns( ).
* Set the column optimization
  o_columns->set_optimize( ).
 
  o_display = o_alv->get_display_settings( ).
  o_display->set_striped_pattern( abap_true ).
 
* Generic ALV functions
  o_functions = o_alv->get_functions( ).
  o_functions->set_all( ).
 
* Layout
  o_layout = o_alv->get_layout( ).
  ls_key-report = sy-repid.
  o_layout->set_key( ls_key ).
  o_layout->set_save_restriction( if_salv_c_layout=>restrict_none ).
 
  o_alv->display( ).
 
ENDFORM.                    " ALV
 
AT SELECTION-SCREEN OUTPUT.
  PERFORM set_selection_field_disabled: USING 'P_CITYFR'.
 
START-OF-SELECTION.
  PERFORM get_data USING p_cityfr
                         s_carrid[]
                         s_fldate[]
                CHANGING t_data.
 
END-OF-SELECTION.
  PERFORM alv USING t_data.

 


sábado, 9 de agosto de 2014

Enviar un email en SAP con SO_NEW_DOCUMENT_SEND_API1

En este post os voy a comentar como podemos enviar un email en SAP de una forma muy sencilla. Utilizaremos el módulo de funciones SO_NEW_DOCUMENT_SEND_API1.

Este módulo de funciones nos da la posibilidad de enviar email a diferentes destinatarios, incluyendo asunto, cuerpo, destinatarios, etc. A continuación os dejo un ejemplo.

  DATAmaildata TYPE sodocchgi1.
  
DATAmailtxt TYPE TABLE OF solisti1 WITH HEADER LINE.
  
DATAmailrec TYPE TABLE OF somlrec90 WITH HEADER LINE.

  CLEARmaildatamailtxtmailrec.
  
REFRESHmailtxtmailrec.



Ahora rellenamos el asunto del email y el cuerpo. El contenido del cuerpo es una tabla donde podremos cargar tantas lineas como necesitemos.

  maildata-obj_name 'SAPRPT'.
  maildata
-obj_descr 'Asunto del email'.
  
maildata-obj_langu sy-langu.

  mailtxt
-line = 'Cuerpo del email...'.
  
APPEND mailtxt.


El siguiente paso es cargar la lista de destinatarios. En este caso hay solo uno, pero podriamos cargar los que fueran necesarios.

  mailrec-receiver 'emaildestino@mail.com'.
  ailrec
-rec_type 'U'. "La U indica que como destino estamos indicando un email
  
APPEND mailrec.



Finalmente ejecutamos el módulo de funciones pasando como parámetros los datos que hemos cargado previamente.

    CALL FUNCTION 'SO_NEW_DOCUMENT_SEND_API1'
      
EXPORTING
        document_data              
maildata
        document_type              
'RAW'
        put_in_outbox              
'X'
        commit_work                
'X'
      
TABLES
        object_header              
mailtxt
        object_content             
mailtxt
        receivers                  
mailrec
      
EXCEPTIONS
        too_many_receivers         
1
        document_not_sent          
2
        document_type_not_exist    
3
        operation_no_authorization 
4
        parameter_error            
5
        x_error                    
6
        enqueue_error              
7
        
OTHERS                     8.