viernes, 26 de marzo de 2010

¡¡¡ APROBADO !!!

Al final sí que había convocatoria para el examen de certificación SAP Certified Application Associate ABAP with SAP NetWeaver este mes de Marzo, acabo de llegar a casa con el aprobado debajo del brazo, al final he sacado un 73%, lo cual no está nada mal !!
¡¡¡¡¡ Bueno, ahora a celebrar el título !!! :D

viernes, 5 de marzo de 2010

CL_GUI_ALV_GRID versus CL_SALV_TABLE

Tenemos dos opciones diferentes para construir ALV:

1. La antigua ALV Object Method, basada en la clase global cl_gui_alv_grid, y
2. la nueva ALV Object Model, basada en la clase cl_salv_table .

Bien, en este artículo resumiré los pasos para crear ambos ALV, y así podremos ver las similitudes y diferencias entre ambos ALV.

Comenzamos con el antiguo:

CL_GUI_ALV_GRID

En este caso el proceso para generar un ALV paso a paso sería el siguiente:

Paso previo: Reservar un área de la pantalla (usando el Screen Painter) con un contenedor, el contenedor lo dibujaremos con el Custom Control Area.

1. En nuestro programa, declaramos una variable de referencia a la clase contenedor cl_gui_custom_container.

2. Instanciamos un objeto de la clase contenedor.

3. Enlazamos el objeto/instancia al área reservada en la pantalla mediante el parámetro container-name de la instancia recién creada.

4. Declaramos una variable de referencia a la clase cl_gui_alv_grid.

5. Creamos un instancia de la clase anterior y se hace referencia al objeto container creado en el paso 2. Para ello usamos el parámetro i_parent.

6. Pasamos los datos para mostrar en pantalla en las casillas del ALV. Los datos se pasan con una tabla interna al método de la clase alv: set_table_for_first_display.

7. Opcionalmente, indicamos el catálogo de campos para los campos del ALV, asignando una tabla, estructura o vista en el parámetro i_structure_name.

8. Opcionalmente, podemos indicar el layout para especificar la conformación del ALV.

Bien, estos son los pasos mínimos necesarios para crear el ALV, aquí podemos ver un ejemplo:

DATA:
t_mara TYPE TABLE OF mara,
mi_layout TYPE lvs_s_layo,
mi_alv_grid TYPE REF TO cl_gui_alv_grid,
mi_contenedor TYPE REF TO cl_gui_custom_container.

IF mi_contenedor IS NOT BOUND.
CREATE OBJECT mi_contenedor
EXPORTING
container_name ='nombre_contenedor_screen_painter'.
CREATE OBJECT mi_alv_grid
EXPORTING
i_parent = mi_contedor.
ENDIF.

CALL METHOD mi_alv_grid -> set_table_for_first_display
EXPORTING
i_structure_name = 'MARA'
is_layout = mi_layout
CHANGING
it_outtab = t_mara.

Si quisiéramos visualizar este ALV en pantalla completa, entonces no reservaríamos un area de control en la pantalla y no crearíamos un control contenedor, en cambio, tendríamos que asignar un valor estático a la parámetro export i_parent, de la siguiente manera:
i_parent = cl_gui_custom_container => screen0.

También tendríamos que manejar los eventos, como por ejemplo un double-click, print_top_of_list, etc., la clase cl_gui_alv_grid tiene 32 eventos.
Para manejar los eventos, seguimos los siguientes pasos:

1. Creamos una clase local para incluir los métodos manejadores de eventos
2. Definimos en la clase, el método 'manejador' por el evento que necesitemos (por ejemplo, para el doble-clic)
3. Implementamos el método de la clase ( en este caso, lo que queremos que sucede cuando el usuario pulse doble clic)
4. Registramos el método manejador a la instancia/objeto de nuestro ALV, usando SET HANDLER.

Veamos un ejemplo:
CLASS lcl_receptor_eventos DEFINITION.
PUBLIC SECTION.
METHODS:
metodo_doble_click
FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row e_column.
ENDCLASS.

CLASS lcl_receptor_eventos IMPLEMENTATION.
METHOD metodo_doble_click.

READ TABLE t_mara INDEX e_row-index INTO s_mara.

ENDMETHOD.

ENDCLASS.

DATA:
mi_alv TYPE REF TO cl_gui_alv_grid,
receptor_eventos TYPE REF TO lcl_receptor_eventos.

CREATE OBJECT receptor_eventos.
SET HANDLER receptor_eventos -> metodo_doble_click FOR mi_alv.



Ahora, vamos a hacer un ALV de los nuevos (ALV Object Model), basados en la clase:

CL_SALV_TABLE

En este caso, tendríamos que seguir los siguientes pasos:

1. Tenemos que definir una variable de referencia de tipo de la clase cl_salv_table.
2. Definimos una tabla interna para mostrar los datos.
3. A continuación, cargamos la tabla interna con los datos que queremos mostrar.
4. Creamos la instancia del ALV llamando al método estático FACTORY de la clase cl_salv_table (en lugar del CREATE OBJECT).

En dicho método sólo son obligatorios 2 parámetros:
r_salv_table , que especifica el nombre del ALV instanciado, y,
t_table , que es la tabla interna que contendrá los datos que muestre el ALV.

5. Mostramos el ALV con la sentencia display.
(Este tipo de ALV no necesita catálogo de campos, y contiene una serie de métodos para reordenar la columnas, ocultar columnas, etc.)

Veamos un ejemplo:
CLEAR: tabla_interna.
SELECT * FROM spfli
INTO CORRESPONDING FIELDS OF TABLE tabla_interna
WHERE carrid IN s_carrid.

TRY.
cl_salv_table =>factory(
IMPORTING
r_salv_table = mi_tabla
CHANGING
t_table = tabla_interna ).

ENDTRY.
mi_tabla -> display( ).











martes, 2 de marzo de 2010

Código ABAP para enviar emails

Publico el link con el código ABAP necesario para enviar emails de wiki.sdn.sap.com:
en este ejemplo se recuperan registros de la tabla ekpo y se rellena la información un fichero .xls que luego se enviará adjunto en el mensaje de correo electrónico, usando la función 'SO_DOCUMENT_SEND_API1'

miércoles, 17 de febrero de 2010

Examen de certificación C_TAW12_70

Al final me iba a presentar al examen de certificación oficial TAW12_70 (SAP development associate ABAP with NetWeaver), el próximo mes de Abril, pero me acaban de informar que para el mes de Abril no hay convocatoria en Madrid, o sea que lo pospongo para Mayo, por una parte mejor, porque la cantidad de materia que entra en el examen es gigantesca... Bueno, creo que a alguno de mis compañeros del curso del año pasado los veré en el examen de Mayo :)

Transacciones más comunes del módulo MM

El otro día inicié una serie acerca de Webdynpro, pero antes de continuar voy a incluir una lista bastante útil de las transacciones más comunes del módulo MM. Ahí va, espero que os sea de utilidad:


ME00 Gestión Materiales. Compras
MB00 Gestión Materiales. Gestión de Stocks
MR00 Gestión Materiales. Verificar Facturas
MRBE Gestión Materiales. Valoración
LPRO Gestión Materiales. Pronostico de Material
MD00 Gestión Materiales. Planificación Necesidades
MI00 Gestión Materiales. Inventario
MM00 Gestión Materiales. Maestro Materiales
CL00 Gestión Materiales. Clasificación
VA00 Gestión comercial. Ventas
VL00 Gestión Materiales. Expedición
MCE9 Sistema Info. Compras.
MCC2 Sistema Info. Gestión Stocks
MCT2 Sistema Info. Comercial
MC01 Sistema Info. Buscar vía Set Info.
MC02 Sistema Info. Buscar vía Texto
MCB1 Sistema Info. Controlling Stocks
ME90 Imprimir Orden de Entrega
MBSF Conformidad. Liberar Recepción
MK03 Entorno. Consulta de Proveedores
ME3N Entorno. Consulta Contratos
MM03 Entorno. Consulta de maestro de materiales
MR03 Entorno. Consulta Facturas
MMBE Entorno. Resumen de Stocks
MB51 Entorno. Consulta Mov. Material
MB01 Mvtos. Almacén. Entrada por pedido
MB1A Mvtos. Almacén. Salida de material
MBST Mvtos. Almacén. Anular documento
MBRL Mvtos. Almacén. Devolución a Proveedor
MB03 Mvtos. Almacén. Visualizar documento
ME56 Solicitud de Pedido. Asignar contrato.
ME5A Sol. Pedido. Listados. Generalidades
ME5K Sol. Pedido. Listados. Por imputación
ME5W Sol. Pedido. Listados. Nueva presentación
ME56 Sol. Pedido. Funciones siguiente. Asignar
ME57 Sol. Pedido. Funciones siguientes. Asignar y tratar
ME52 Sol. Pedido. SolP generadas. MRP. Modificar
ME53 Sol. Pedido. SolP generadas MRP. Visualizar
ME4L Pet. Ofertas/Oferta. Listados. Por proveedor
ME4M Pet. Ofertas/Oferta. Listados. Por material
ME4S Pet. Ofertas/Oferta. Listados. Por licitación
ME4C Pet. Ofertas/Oferta. Listados. Por grupo artículos
ME4N Pet. Ofertas/Oferta. Listados. Por petición oferta
ME2L Pet. Ofertas/Oferta. Listados. Por proveedor.
ME41 Pet. Ofertas/Oferta. Crear
ME42 Pet. Ofertas/Oferta. Modificar
ME43 Pet. Ofertas/Oferta. Visualizar
ME47 Pet. Ofertas/Oferta. Actualizar
ME48 Pet. Ofertas/Oferta. Visualizar
ME49 Pet. Ofertas/Oferta. Comparación precios
ME21 Pedido/Contrato. Crear
ME58 Pedido/Contrato. Mediante sol. pedido
ME22 Pedido/Contrato. Modificar
ME23 Pedido/Contrato. Visualizar
ME28 Pedido/Contrato. Liberar
ME2L Pedido/Contrato. Listados. Por proveedor
ME2M Pedido/Contrato. Listados. Por material
ME2K Pedido/Contrato. Listados. Por imputación
ME2C Pedido/Contrato. Listados. Por grupo de artículos
ME2N Pedido/Contrato. Listados. Por número de pedido
ME31 Pedido/Contrato. Pedido Abierto. Crear
ME32 Pedido/Contrato. Pedido Abierto. Modificar
ME33 Pedido/Contrato. Pedido Abierto. Visualizar
ME58 Pedido/Contrato. Pedido de Baremo. Mediante sol. Pedido
MB01 Conformidad. Crear
MB02 Conformidad. Modificar
MB03 Conformidad. Visualizar
ME11 Conformidad. Registro Info. Crear
ME12 Conformidad. Registro Info. Modificar
ME13 Conformidad. Registro Info. Visualizar
ME14 Conformidad. Registro Info. Modificaciones
ME15 Conformidad. Registro Info. Petición de borrado
ME01 Conformidad. Libro de Pedidos. Actualizar
ME03 Conformidad. Libro de Pedidos. Visualizar
ME04 Conformidad. Libro de Pedidos. Modificaciones
MEQ1 Conformidad. Regulación por cuota. Actualizar
MEQ3 Conformidad. Regulación por cuota. Visualizar
MEQ4 Conformidad. Regulación por cuota. Modificaciones
MEQM Conformidad. Regulación por cuota. Listado por material
ME61 Conformidad. Evaluación proveedor. Actualizar
ME62 Conformidad. Evaluación proveedor. Visualizar
ME63 Conformidad. Evaluación proveedor. Reevaluación autom.
ME64 Conformidad. Evaluación proveedor. Comparación evaluac.
ME6A Conformidad. Evaluación proveedor. Modificaciones
ME6H Conformidad. Evaluación proveedor. Análisis estándar
ME1l Conformidad. Listados. Por proveedor
ME1M Conformidad. Listados. Por material
ME1W Conformidad. Listados. Por grupo artículos
ME1P Conformidad. Listados. Histor. precio-pedido
ME1E Conformidad. Listados. Histor. precio-oferta.
ME0M Conformidad. Visualizar listado. Por material.
SU53 Visualiza los objetos de autorización de un usuario.

martes, 2 de febrero de 2010

Web Dynpros

Podemos imaginar un componente Web Dynpro como un contenedor para todas las cosas que necesitamos crear, de forma análoga a un module pool como contenedor de las pantallas y el código de las transacciones, dicho contenedor debe tener al menos una vista y al menos una ventana.

Bien, para empezar, resumiré brevemente los pasos a realizar:

1. En primer lugar llamaremos al Object Navigator
2. Elegiremos de la lista desplegable la opción "Web Dynpro Comp./Intf."
3. Asignaremos un nombre nuevo, por ejemplo "ZWEB_DYNPRO" y pulsaremos el botón "Display", como el Componente o interface no existirá, nos pedirá confirmación para crear el objeto.
4. Creamos una vista haciendo clic con el botón derecho del ratón sobre el objeto recién creado "ZWEB_DYNPRO" y selecionando la opción Create > View.
5. Asignamos un nombre a nuestra vista.
6. Nos conectamos al servidor con nuestro usuario y password para acceder al editor de vistas.

El Editor de Vista va a ser nuestro área de trabajo a partir de ahora, en la próxima entrada subiré unas capturas de lo que llevamos hasta ahora, un saludin!

miércoles, 27 de enero de 2010

Hoy voy a iniciar una pequeña serie de artículos acerca de los Web Dynpros, y al final, intentaré subir un video con un caso práctico al blog. Gracias a los WebDynpros, podemos desarrollar aplicaciones de negocio Web, tanto en el entorno de desarrollo de ABAP como en el de Java.

En este caso, vamos a centrarmos en el Web Dynpro ABAP. La idea, es que una aplicación web, en principio, es muy sencilla de usar y aprender para los usuarios. Además, si desarrollamos aplicaciones para el explorador, ni siquiera es necesario instalar el SAP GUI. Y, además, los metadatos del Webdynpro son independientes de la plataforma donde se ejecute la aplicación.

Los Web Dynpro fueron lanzados con SAP NetWeaver Application Server 7.0. Para soportarlo, el Objetc Navigator (SE80), ahora contiene una serie de herramientas para WebDynpro, con las que podremos crear una buena parte de la aplicación, sin necesidad de crear desde cero el código fuente.