Iniciemos explicando cómo podemos generar un proceso
paralelo usando modulo de funciones:
Básicamente son dos fragmentos de código los cuales se deben
desarrollar:
Después de seleccionar los datos a procesar se hace la
llamada al modulo de funciones que se va a ejecutar en paralelo:
START-OF-SELECTION.
PERFORM GET_DATA CHANGING
tab_datos.
“Nos enfocaremos solo en el perform call parallel
PERFORM CALL_PARALLEL USING
TAB_DATOS.
PERFORM SHOW_LOGS USING
GT_LOG.
FORM call_parallel using tab_datos type ztt_datos.
Field-Symbols:
<fs_datos> type zst_datos.
Loop at
tab_datos assigning <fs_datos> .
CALL FUNCTION 'Z_FM_PARALLELS' STARTING NEW
TASK gv_taskname
DESTINATION IN GROUP gv_system
PERFORMING f_finalizar_funcion ON END OF
TASK
EXPORTING
it_datos = <fs_datos>
“ Es muy importante agregar las exceptions ya que nos permitirán
informarnos en qué momento “falla la llamada al paralelo y saber la razón”
EXCEPTIONS
system_failure = 1
MESSAGE mess
communication_failure = 2 MESSAGE mess
resource_failure = 3.
"Tipo de relación
CASE sy-subrc.
WHEN 0. "Si
no hay error se incrementa contador de éxito.
gv_snd_jobs = gv_snd_jobs + 1.
WHEN 1 or 2.
MESSAGE mess TYPE 'I'.
WHEN 3. "Si hubo error se hace
esperar a la tarea.
IF
gv_snd_jobs >= 1 AND gv_exc_flag = 0.
gv_exc_flag = 1.
WAIT UNTIL gv_rcv_jobs >=
gv_snd_jobs
UP TO 5 SECONDS.
ENDIF.
IF sy-subrc = 0.
gv_exc_flag = 0.
ELSE.
MESSAGE 'Resource failure' TYPE 'I'.
ENDIF.
WHEN OTHERS.
MESSAGE 'Other Error' TYPE 'I'.
Endloop….
* Se hace esperar a la tarea para que se ejecute
correctamente.
WAIT UNTIL gv_rcv_jobs >= gv_snd_jobs.
Endform.
Una vez finalizado todos los llamados a la función paralela
el programa llama al perform donde recibimos el resultado de su ejecución y
guardamos los logs correspondientes.
FORM f_finalizar_funcion USING gv_taskname.
DATA: mess
TYPE c LENGTH 80.
task_wa-name = gv_taskname.
gv_rcv_jobs = gv_rcv_jobs + 1.
* Se reciben los resultados del RFC para loguear los
mensajes.
RECEIVE RESULTS FROM FUNCTION ' Z_FM_PARALLELS '
TABLES
e_tab_return = gt_log
“Es importante colocar las exceptions en caso de algún error
de comunicación o el paralelo tenga “algún problema
EXCEPTIONS
system_failure = 1 MESSAGE mess
communication_failure = 2 MESSAGE mess .
IF sy-subrc eq 0.
task_wa-dest = info-rfcdest.
ELSE.
task_wa-dest = mess.
ENDIF.
APPEND task_wa TO task_list.
*
* Se loguean todos los mensajes
CLEAR gs_log.
LOOP AT gt_log INTO gs_log.
CLEAR gv_tam_msj.
gv_tam_msj = strlen( gs_log-message ).
IF gv_tam_msj > 50.
gs_message-msg_text_2 =
gs_log-message+50.
IF gv_tam_msj > 100.
gs_message-msg_text_3 =
gs_log-message+100.
ENDIF.
ENDIF.
gs_message-msgty = gs_log-type.
gs_message-msg_text_1 = gs_log-message.
APPEND gs_message TO gt_message.
CLEAR: gs_message.
* gt_message[].
CLEAR gs_log.
*
ENDLOOP.
FREE: gt_log.
*
ENDFORM.
Cabe destacar que con esta lógica solo estamos generando un
proceso paralelo por cada registro de la tabla interna y lo ideal sería darle
mas carga a la función paralela para que sea más eficiente.
No hay comentarios.:
Publicar un comentario