Todos sabemos que el mundo está evolucionando. Así es SAP. 🙂
En la era de SAP ECC, solía haber un generador de flujo de trabajo (Código de transacción – SWDD) que une todos los componentes del flujo de trabajo y el ciclo de aprobación muy estrechamente con todos los componentes básicos.
SAP HANA ideó un diseño de solución aún mejor para el mecanismo de aprobación generalizado mediante el cual el ciclo de aprobación de documentos comerciales ahora se puede configurar dinámicamente.
Hoy en día, la mayor parte del mecanismo de aprobación de documentos estándar se basa en un flujo de trabajo flexible. (por ejemplo, RFQ, cotización de proveedor, contrato de compra, orden de compra y muchos más. Documentos que respaldan el flujo de trabajo flexible | Ayuda SAP Portal)
También puede encontrar la necesidad de crear un mecanismo de aprobación mediante el uso de Flujo de trabajo flexible para un proceso comercial específico para su cliente/proceso organizacional.
Como parte de esta serie de blogs, compartiré el enfoque de desarrollo necesario para crear un flujo de trabajo flexible.
Según el aprobador involucrado en el ciclo de aprobación de documentos comerciales, el flujo de trabajo flexible admite el siguiente tipo de ciclos de aprobación (por diseño):
Paso 1- Cree una clase global agregando las siguientes interfaces como miembro de ella: BI_OBJECT & IF_WORKFLOW. (Esta clase servirá como tipo de objeto principal requerido para el flujo de trabajo flexible)
Paso 2- Implemente todos los métodos de interfaz (sin lógica por ahora) y también cree un método llamado WORKITEM_EXECUTE como Public Instance Method sin parámetros ni lógica. (Lo que servirá para el propósito del método de ejecución ficticio durante la ejecución real del elemento de trabajo más adelante).
Paso 3-También agregue los siguientes 3 eventos en clase junto con los parámetros:
Paso 4-Ir al código de transacción SWDD_ESCENARIO y cree un nuevo flujo de trabajo flexible.
Paso 5-Cree un elemento contenedor en la clase de referencia del contexto del escenario creada anteriormente, que servirá como el objeto principal requerido en el flujo de trabajo flexible.
Paso 6- Introduzca los datos del proceso en la primera pestaña y asigne el evento de inicio de flujo de trabajo con el evento de clase SUBMITTED_FOR_APPROVAL.
Paso 7-Cree 2 clases globales más (de la superclase adecuada, como se muestra en la captura de pantalla a continuación), que servirán como clases de devolución de llamada para el flujo de trabajo. (Clase de datos de definición y clase de datos de tiempo de ejecución)
Paso 8-Cree una actividad y proporcione un nombre significativo. (Mantenga la ID de la tarea en blanco, el sistema generará una ID de tarea estándar que podemos copiar para crear nuestra propia tarea personalizada)
La lista de actividades debería comenzar a parecerse a la siguiente después de la creación:
Paso 9-Método de objeto de mapa creado anteriormente en el nivel de tarea.
Paso 10-Configure el Resultado en la pestaña Resultado junto con su naturaleza POSITIVO/NEGATIVO.
Paso 11-Establezca el enlace del nivel de tarea de la siguiente manera:
Paso 12-Establezca el enlace de eventos de la siguiente manera en el nivel de eventos de inicio de flujo de trabajo y active el enlace de eventos. (En la pestaña Datos de proceso)
Paso 13-Cargue contenido entregado previamente en la pestaña Control de flujo de trabajo para activar la Aprobación automática (de manera predeterminada, antes de que el paso de flujo de trabajo haya sido configurado por la aplicación de plantilla de flujo de trabajo relevante).
El formato XML para este contenido entregado previamente será el siguiente:
<?xml version="1.0" encoding="UTF-8"?>
<workflow formatVersion="3.0" id="">
<scenario>Scenario ID e.g., WSXXXXXXXX</scenario>
<scenarioVersion/>
<subject>Title</subject>
<validFrom/>
<validTo/>
<processFlow artifactId="">
<activity artifactId="">
<step id="$ScenarioVersion$ActivityId" e.g., "$0000$InspAutoapproval"/>
</activity>
</processFlow>
</workflow>
Una vez hecho esto, active el flujo de trabajo. Debe generar los componentes de tiempo de ejecución necesarios para que se ejecute el flujo de trabajo.
Una vez que el flujo de trabajo anterior se envía/activa a través de la actividad de creación/cambio de documentos comerciales relevantes, el elemento de trabajo se crea como un proceso de aprobación de flujo de trabajo normal.
Este elemento de trabajo se ejecuta automáticamente ya que no hay intervención humana involucrada.
Internamente activa la llamada a la clase de devolución de llamada que creamos y asignamos anteriormente.
Para realizar cualquier decisión del sistema: aprobar/rechazar y actualizar el documento comercial relevante, es necesario redefinir el siguiente método de clase Runtime Data: if_swf_flex_ifs_run_appl~result_callback.
Puede implementar la lógica comercial requerida para aprobar/rechazar el documento comercial en función de los criterios involucrados al implementar la lógica requerida que se refiere a la siguiente implementación de muestra:
CLASS zcl_blg_insp_wfl_run_appl_base DEFINITION
PUBLIC
INHERITING FROM cl_swf_flex_ifs_run_appl_base
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
METHODS if_swf_flex_ifs_run_appl~result_callback
REDEFINITION .
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS ZCL_BLG_INSP_WFL_RUN_APPL_BASE IMPLEMENTATION.
METHOD if_swf_flex_ifs_run_appl~result_callback.
DATA: lv_object_reference TYPE sibflpor,
lv_inspplanuuid TYPE sysuuid_x16.
lv_object_reference = CORRESPONDING #( io_context->get_leading_object_reference( ) ).
" get the Plan for the workflow call.
IF lv_object_reference IS NOT INITIAL.
lv_inspplanuuid = lv_object_reference.
"Read plan details based on UUID
SELECT SINGLE @abap_true
FROM zblg_t_insp_tsp
WHERE uuid = @lv_inspplanuuid
AND approvalstatus="W" "Waiting For approval
AND isdeleted = @abap_false
INTO @DATA(lv_exists).
" is the Plan is in awaiting approval status, and exist, we will process it.
IF sy-subrc EQ 0 AND lv_exists = abap_true.
DATA lv_decision TYPE swc_elem.
lv_decision = io_result->get_result( )-result.
"set status to approved if the decision indicated to do so
IF lv_decision = 'APPROVED'.
DATA(lv_status) = 'A'.
"set status to rejection - upon rejection
ELSEIF lv_decision = 'REJECTED'.
lv_status="R".
ENDIF.
" Take relevant action - upon Approval/Rejection
UPDATE zblg_t_insp_tsp SET approvalstatus = lv_status
WHERE uuid = lv_inspplanuuid.
" validate the plan could be updated.
IF sy-subrc <> 0.
RAISE EXCEPTION TYPE cx_swf_flex_ifs_run_exception
EXPORTING
textid = cx_swf_flex_callback_exception=>system_error
m_id = CONV string( io_result->get_result( )-wi_id ).
ENDIF.
ENDIF.
ENDIF.
ENDMETHOD.
ENDCLASS.
Creé una implementación de ejemplo del flujo de trabajo anterior donde una aplicación RAP activará la aprobación del flujo de trabajo una vez que se cree un plan de inspección.
Los siguientes son los componentes básicos necesarios para esta implementación:
Paso 1-Defina una determinación que se activará al guardar durante la operación de creación.
determination startWorkflow on save { create; }
Paso 2-Invoque el activador del flujo de trabajo tras la ejecución de la determinación y establezca el estado del objeto original en espera de aprobación.
CLASS lhc_inspectionplan DEFINITION INHERITING FROM cl_abap_behavior_handler.
PRIVATE SECTION.
METHODS startworkflow FOR DETERMINE ON SAVE
IMPORTING keys FOR inspectionplan~startworkflow.
ENDCLASS.
CLASS lhc_inspectionplan IMPLEMENTATION.
METHOD startworkflow.
READ ENTITIES OF zi_blg_inspectionplantp IN LOCAL MODE
ENTITY inspectionplan
ALL FIELDS WITH CORRESPONDING #( keys )
RESULT DATA(lt_inspplans)
FAILED DATA(lt_failed).
LOOP AT lt_inspplans ASSIGNING FIELD-SYMBOL(<fs_inspplan>).
IF NEW lu_zi_blg_inspectionplantp( )->start_workflow( iv_inspplanuuid = <fs_inspplan>-inspectionplanuuid ) = abap_false.
MODIFY ENTITIES OF zi_blg_inspectionplantp IN LOCAL MODE
ENTITY inspectionplan
UPDATE FIELDS ( approvalstatus )
WITH VALUE #( ( %tky = <fs_inspplan>-%tky
approvalstatus="W" ) )
REPORTED DATA(lt_update_reported)
FAILED DATA(lt_modifyfailed).
ENDIF.
ENDLOOP.
ENDMETHOD.
ENDCLASS.
Paso 3-Cree una clase local y un método de utilidad para invocar el flujo de trabajo cuando se solicite desde la implementación de la determinación anterior.
CLASS lu_zi_blg_inspectionplantp DEFINITION.
PUBLIC SECTION.
METHODS start_workflow
IMPORTING
!iv_inspplanuuid TYPE sysuuid_x16
RETURNING
VALUE(rv_failed) TYPE abap_bool .
ENDCLASS.
CLASS lu_zi_blg_inspectionplantp IMPLEMENTATION.
METHOD start_workflow.
CONSTANTS: lc_objecttype TYPE sibftypeid VALUE 'ZBLG_INSP_WORKFLOW',
lc_event TYPE sibfevent VALUE 'SUBMITTED_FOR_APPROVAL'.
DATA: lv_objectkey TYPE sibfinstid.
IF iv_inspplanuuid IS INITIAL.
RETURN.
ENDIF.
" Get a container for the submitted function
DATA(lo_event_container) = cl_swf_evt_event=>get_event_container( im_objcateg = cl_swf_evt_event=>mc_objcateg_cl
im_objtype = lc_objecttype
im_event = lc_event ).
TRY.
lo_event_container->set( name="IV_OBJECT_ID" value = iv_inspplanuuid ).
lv_objectkey = iv_inspplanuuid.
" Raise workflow event
cl_swf_evt_event=>raise( im_objcateg = cl_swf_evt_event=>mc_objcateg_cl
im_objtype = lc_objecttype
im_event = lc_event
im_objkey = lv_objectkey
im_event_container = lo_event_container ).
CATCH cx_swf_evt_invalid_objtype
cx_swf_evt_invalid_event
cx_swf_cnt_container.
rv_failed = abap_true.
ENDTRY.
ENDMETHOD.
ENDCLASS.
Paso 1-Tras la creación del plan de inspección, el estado se estableció en En espera de aprobación.
Paso 2-Puede verificar el registro del flujo de trabajo (código de transacción: SWI1) para asegurarse de que la ejecución del flujo de trabajo esté completa.
Paso 3-Tras la ejecución exitosa, el estado cambiará a Aprobado.
En la publicación de blog actual, hemos aprendido los conceptos básicos del flujo de trabajo flexible, cómo implementar el escenario de aprobación automática y cómo integrarlo/invocarlo a través de una aplicación basada en RAP.
Para una mayor comprensión, utilice las siguientes referencias que me han ayudado a adquirir conocimientos sobre esta función y a motivarme a escribir esta publicación de blog:
Escribiré blogs sobre los siguientes temas pronto. Manténganse al tanto. –
Por favor proporcione sus comentarios y haga preguntas en la sección de comentarios.
Saludos,
Shyam Vasani
Calle Eloy Gonzalo, 27
Madrid, Madrid.
Código Postal 28010
Paseo de la Reforma 26
Colonia Juárez, Cuauhtémoc
Ciudad de México 06600
Real Cariari
Autopista General Cañas,
San José, SJ 40104
Av. Jorge Basadre 349
San Isidro
Lima, LIM 15073