Code: Alles auswählen.
FUNCTION Z_DUMMY_RFC.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*" IMPORTING
*" VALUE(LANGU) TYPE SPRAS
*" EXPORTING
*" VALUE(T100) TYPE T100
*"----------------------------------------------------------------------
* Damit das Ganze etws länger dauert
* lese den ganzen Schrott
select * from t100
into t100
where sprsl = langu.
endselect.
* Da der FB einen Dialogprozess belegt
* unterliegt er auch der Zeitsteuerung (TIMEOUT)
* damit es nicht zu einem Abbruch kommt
* kann ein
WAIT up to 10 seconds.
* eingebaut werden
* Aber Achtung die Benutzer/ADMIN werden nicht erfreut sein
* wenn dauernd DIA-Prozesseb elegt werden !
* Keine Write !
ENDFUNCTION.
Code: Alles auswählen.
*&---------------------------------------------------------------------*
*& Report Z_DUMMY_RFC *
*& *
*&---------------------------------------------------------------------*
*& Startet 2 WP parallell *
*& der eigene Prozess wird auch mit einer Aufgabe betraut *
*& liest T100 *
*&---------------------------------------------------------------------*
REPORT z_dummy_rfc MESSAGE-ID zdum.
TYPES : BEGIN OF ty_task,
name(8) TYPE c.
TYPES : END OF ty_task.
DATA new_taskname(8) TYPE c.
DATA it_tasks TYPE TABLE OF ty_task.
FIELD-SYMBOLS <fs_task> TYPE ty_task.
DATA wa_task TYPE ty_task.
DATA it_t100 TYPE TABLE OF t100.
START-OF-SELECTION.
PERFORM starte_rfc.
END-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Form starte_rfc
*&---------------------------------------------------------------------*
FORM starte_rfc .
DATA wa_t100 TYPE t100.
* Hier sollte jetzt zuerst eine Verarbeitung
* für die Ermittlung der zu verarbeitenden Pakete stehen
* und ein Loop statt der einzelnen Aufrufe
* Aber ! das System prüft ob es überhaupt freie WP
* und die Belastung nicht so hoch wird, ausserdem
* dürfen höchstens 5 Prozesse gestartet werden (ERP2004)
* 1.Task
new_taskname = 'SPRAS=E'.
CALL FUNCTION 'Z_DUMMY_RFC'
STARTING NEW TASK new_taskname
PERFORMING ende_rfc ON END OF TASK
EXPORTING
langu = 'E'
* Importing geht hier nich, wird in end_rfc übergeben !
* IMPORTING
* T100 =
EXCEPTIONS
communication_failure = 1
system_failure = 2
RESOURCE_FAILURE = 3.
IF sy-subrc EQ 0.
wa_task-name = new_taskname.
APPEND wa_task TO it_tasks.
ELSE.
MESSAGE e000 WITH 'ERROR:' sy-subrc.
ENDIF.
* 2.Task
new_taskname = 'SPRAS=D'.
CALL FUNCTION 'Z_DUMMY_RFC'
STARTING NEW TASK new_taskname
PERFORMING ende_rfc ON END OF TASK
EXPORTING
langu = 'D'
* Importing geht hier nich, wird in end_rfc übergeben !
* IMPORTING
* T100 =
EXCEPTIONS
communication_failure = 1
system_failure = 2
RESOURCE_FAILURE = 3.
.
IF sy-subrc EQ 0.
wa_task-name = new_taskname.
APPEND wa_task TO it_tasks.
ELSE.
MESSAGE e000 WITH 'ERROR:' sy-subrc.
ENDIF.
* Jetzt sind 2-asynchrone Prozesse unterwegs,
* damit der eigentliche JOB auch noch etwas zu tun bekommt
* rufen wir den FB auch noch direkt auf
CALL FUNCTION 'Z_DUMMY_RFC'
EXPORTING
langu = 'F'
IMPORTING
t100 = wa_t100.
APPEND wa_t100 TO it_t100.
* Warte bis keine Tasks mehr in Tabelle
WAIT UNTIL it_tasks IS INITIAL.
* Ergebnis ausgeben :
LOOP AT it_t100 INTO wa_t100.
WRITE : / wa_t100-sprsl,
wa_t100-arbgb,
wa_t100-msgnr,
wa_t100-text.
ENDLOOP.
ENDFORM. " starte_rfc
*&---------------------------------------------------------------------*
*& Form ende_rfc
*&---------------------------------------------------------------------*
* Diese Routine wird aus dem Baustein gerufen !
FORM ende_rfc USING taskname.
DATA wa_t100 TYPE t100.
* Hole die Rückgabe aus dem WP
RECEIVE RESULTS FROM FUNCTION 'Z_DUMMY_RFC'
IMPORTING t100 = wa_t100
EXCEPTIONS
communication_failure = 1
system_failure = 2.
* WRITE : / taskname. "<<< geht nicht, kommt nciht raus !
* Ergebnis in globale Tabelle zurückliefern
APPEND wa_t100 TO it_t100.
* Lösche die Task aus der Tasktabelle
DELETE it_tasks WHERE name = taskname.
ENDFORM. "ende_rfc
Code: Alles auswählen.
* copy plan_id
PERFORM plan_id USING gt_in_plan
CHANGING gt_out_plan.
LOOP AT gt_out_plan ASSIGNING <fs_plan>.
* number of all shipping order
PERFORM pl_soko USING gt_in_ship
CHANGING <fs_plan>.
* number of all resources
PERFORM pl_res USING gt_in_res
CHANGING <fs_plan>.
* number of all resources assigned to a tour
PERFORM pl_res_ass USING gt_in_res
CHANGING <fs_plan>.
* number of all resources with tours having violation
PERFORM pl_res_vio USING gt_in_res
CHANGING <fs_plan>.
...
...
ENDLOOP.
Code: Alles auswählen.
DATA: ls_out_plan TYPE zplan,
lv_taskindex(8) TYPE n.
FIELD-SYMBOLS: <fs_plan> TYPE zplan.
LOOP AT gt_out_plan ASSIGNING <fs_plan>.
IF para IS INITIAL.
* calculate planning data syn
CALL FUNCTION 'ZCALC_PLANNING'
EXPORTING
s_in_plan = <fs_plan>
IMPORTING
s_out_plan = ls_out_plan
TABLES
t_ship = gt_in_ship
t_res = gt_in_res
t_tour = gt_in_tour
t_tourdoc = gt_in_tourdoc
t_stop = gt_in_stop
t_soko = gt_in_soko.
ELSE.
ADD 1 TO gv_running.
ADD 1 TO lv_taskindex.
* calculate planning data asyn
CALL FUNCTION 'ZCALC_PLANNING'
STARTING NEW TASK lv_taskindex
DESTINATION IN GROUP srv_grp
PERFORMING come_back ON END OF TASK
EXPORTING
s_in_plan = <fs_plan>
TABLES
t_ship = gt_in_ship
t_res = gt_in_res
t_tour = gt_in_tour
t_tourdoc = gt_in_tourdoc
t_stop = gt_in_stop
t_soko = gt_in_soko.
* max. number of processes is active => wait
WAIT UNTIL gv_running < max_jobs.
ENDIF.
ENDLOOP.
WAIT UNTIL gv_running IS INITIAL.
FORM come_back USING taskname.
DATA: lv_plan TYPE zplan.
RECEIVE RESULTS FROM FUNCTION 'ZCALC_PLANNING'
IMPORTING s_out_plan = lv_plan
EXCEPTIONS
communication_failure = 1
system_failure = 2
OTHERS = 3.
* Anzahl der genutzten Tasks um 1 reduzieren
SUBTRACT 1 FROM gv_running.
IF sy-subrc = 1.
MESSAGE s013(/lot/vl) WITH taskname.
ELSE.
MESSAGE s014(/lot/vl) WITH taskname.
ENDIF.
ENDFORM. " come_back