https://alejandroajc.wordpress.
com/2015/04/10/manual-sap-workflow/
Manual SAP Workflow
Cita abril 10, 2015 alejandroajc
Que es un Workflow
Es una herramienta que permite la implementación técnica de
procesos de negocio complejos independientemente del tiempo y
del lugar.
El flujo de trabajo es controlado y coordinado activamente por el
sistema workflow. El control incluye la monitorización de pasos de
trabajo individuales y el inicio de procesos para escalar las tareas
que lleguen a su fecha de vencimiento.
El sistema workflow se integra completamente con las funciones
de negocio del sistema R/3 a través de su Business Object
Repository BOR en la transacción SWO1.
Adicionalmente el sistema Workflow permite su integración con la
gestión de la organización, lo que permite relacionar personas o
estructuras organizativas a las tareas del workflow.
Creación de un Workflow
A continuación se indican los pasos que se tienen que realizar para
la creación de un workflow y comprede la siguiente arquitectura.
Definición e implementación
del Business Object
Repository
Lo primero que se tiene que hacer es la creación del BOR, que se
realiza en la transacción SWO1.
Vamos a la transacción SWO1
Conforme lo creamos sale de la siguiente forma.
Estado de un tipo de objeto
A continuación se indican los estados de un tipo de objeto:
Modelado : En este estado el tipo de objeto no se puede
instanciar, es decir no se pueden generar objetos de este tipo.
Implementado : Solo para pruebas, uso interno o
posiblemente inestable.
Liberado : Liberado para ser utilizado por el cliente, solo se
podrán realizar ampliaciones pero no modificar radicalmente el
tipo.
Obsoleto : El tipo de objeto ha sido reemplazado por otro.
A continuación vamos a indicar que el BOR está como tipo de
objeto “Implementado” y luego vamos a Grabar y generar y luego
en “Liberado”.
Desarrollo de un tipo de objeto campo clave
A continuación lo que se tendrá que generar los campos claves del
objeto que acabamos de crear.
A continuación grabaremos y generaremos el objeto, una vez
grabado pondremos el campo clave primero en “Implementado” y
luego en “Liberado”.
Desarrollo de un tipo de objeto atributo
A continuación lo que se tendrá que generar los atributos del
objeto que acabamos de crear.
Los atributos pueden ser o de base de datos o virtuales, en este
ejemplo crearemos un atributo virtual.
Atributo virtual
Al generar un atributo virtual el sistema no generará el código
automáticamente pero si nos presentará donde debemos colocar el
programa (entre las clausulas GET_PROPERTY y
END_PROPERTY).
El atributo se crea mediante el programa (como una variable) y
luego se coloca como resultado en el container del objeto mediante
la macro SWC_SET_ELEMENT.
En el caso que el atributo virtual sea un objeto deberemos
instanciar un objeto mediante la macro SWC_CREATE_OBJECT.
A continuación grabaremos y generaremos el objeto, una vez
grabado pondremos el atributo primero en “Implementado” y
luego en “Liberado”.
Ahora se tendrá que implementar el código del atributo.
get_property estado changing container.
SELECT SINGLE estado INTO object-estado
FROM zprocesowf
WHERE identificador EQ object-key-identificador.
swc_set_element container ‘estado’ object-estado.
end_property.
Desarrollo de un tipo de objeto método
Los métodos son las actividades que podemos llevar a cabo sobre
un objeto, pueden ser de dos tipos:
Asincronos: El resultado siempre es enviado de vuelta al
programa llamador en la forma de un evento
Sincronos: El resultado es enviado directamente al programa
que lo ejecuto.
Ambos tipos de métodos pueden recibir datos a través de
parámetros (parámetros de importanción) .
A continuación grabaremos y generaremos el objeto, una vez
grabado pondremos el método, primero en “Implementado” y
luego en “Liberado”.
Después se tendrá que realizar la implementación del método.
begin_method cambiarestado changing container.
DATA: lv_identificador TYPE numc10,
lv_estado TYPE cms_re_dte_obj_cond.
DATA: ls_proceso TYPE zprocesowf.
swc_get_element container ‘IDENTIFICADOR’ lv_identificador.”
Dato de entrada de la tarea
swc_get_element container ‘ESTADO’ lv_estado.” Dato de entra
da de la tarea
UPDATE zprocesowf
SET estado = lv_estado
WHERE identificador = lv_identificador.
COMMIT WORK AND WAIT.
swc_set_element container ‘ESTADO’ lv_estado.” Dato de salida
de la tarea.
end_method.” Cambiar estado
Después de realizar la implementación se tendrán que declarar los
parámetros.
Desarrollo de un tipo de objeto evento
Para lanzar el workflow se tendrá que definir un evento de
lanzamiento.
A continuación grabaremos y generaremos el objeto, una vez
grabado pondremos el evento primero en “Implementado” y luego
en “Liberado”.
Definición e implementación del
Workflow
Para realizar la implementación del workflow vamos a la
transacción PFTC,
Datos del container
Lo primero que se tiene que hacer es incluir en el container el BOR
que hemos creado.
Datos básicos
Workflow Builder
A continuación se definirá el proceso de negocio mediante el
workflow builder y el evento desencadenante del workflow.
Definición del evento desencadenante
Crear Tarea
Primero se tiene que crear una tarea en la Transacción PFTC para
luego asociarla a una actividad del workflow.
Ahora se tiene que crear la actividad
Ponemos la tarea antes creada
Tarea de decisión de usuario
A continuación vamos hacer una tarea de decisión de usuario, para
enviar una tarea al Workitem de un un usuario.
Después vamos a la transacción SE37, para crear la función que
determinará el responsable
ACTOR_TAB LIKE SWHACTOR
AC_CONTAINER LIKE SWCONT
FUNCTION zwf_usuario_tarea.
*”———————————————————————-
*”*”Interfase local
*” TABLES
*” ACTOR_TAB STRUCTURE SWHACTOR
*” AC_CONTAINER STRUCTURE SWCONT
*”———————————————————————-
INCLUDE <cntain>.” Incluimos el container del BOR
DATA: lv_identificador TYPE numc10,
lv_estado TYPE cms_re_dte_obj_cond.
DATA: ls_log TYPE zlog_procesowf.
swc_get_element ac_container ‘IDENTIFICADOR’ lv_identificad
or.
swc_get_element ac_container ‘ESTADO’ lv_estado.
actor_tab-otype = ‘US’.
actor_tab-objid = sy-uname.
APPEND actor_tab.
actor_tab-otype = ‘US’.
actor_tab-objid = ‘AJIMENEZ’.
APPEND actor_tab.
ls_log-identificador = lv_identificador.
ls_log-estado = lv_estado.
CONCATENATE ‘US’ ‘AJIMENEZ’ INTO ls_log-usuario.
ls_log-fecha = sy-datum.
ls_log-hora = sy-uzeit.
INSERT zlog_procesowf FROM ls_log.
COMMIT WORK AND WAIT.
ENDFUNCTION
Después vamos a la transacción PFAC.
Creamos la actividad en el workflow
Se pone el número de la regla que acabamos de crear.
A continuación se pone la tarea que hemos creado
Cuando se lanza el workflow tiene que salir lo siguiente.
A continuación muestro como se ve el Worflow.
Programa para lanzar
Workflow
*&———————————————————————*
*& Report ZLANZAR_WF
*&
*&———————————————————————*
*&
*&
*&———————————————————————*
REPORT zlanzar_wf.
TABLES: zprocesowf.
CONSTANTS: lc_estado TYPE cms_re_dte_obj_cond VALUE ‘IN
ICIO’.
DATA: lv_rango TYPE numc10,
ls_proceso TYPE zprocesowf.
DATA: lv_identificador LIKE swr_struct-object_key,
lv_evento LIKE swr_struct-event,
lv_swf_xmlcnt TYPE swf_xmlcnt,
lv_swf_xmlsiz TYPE swf_xmlsiz,
lt_mensaje TYPE TABLE OF swr_messag.
CALL FUNCTION ‘NUMBER_GET_NEXT’ ” número para el Log
EXPORTING
nr_range_nr = ’01’
object = ‘ZPROCESO’
quantity = ‘1’
IMPORTING
number = lv_rango.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WIT
H sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ls_proceso-identificador = lv_rango.
ls_proceso-estado = lc_estado.
INSERT zprocesowf FROM ls_proceso.
COMMIT WORK AND WAIT.
lv_identificador = ls_proceso-identificador.
lv_evento = ls_proceso-estado.
CALL FUNCTION ‘SWF_CREATE_EVENT’
EXPORTING
object_type = ‘ZPROCESOWF’
object_key = lv_identificador
event = lv_evento
xml_container = lv_swf_xmlcnt
xml_size = lv_swf_xmlsiz
commit_work = ‘X’
event_language = sy-langu
language = sy-langu
user = sy-uname
TABLES
message_lines = lt_mensaje.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WIT
H sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.