Parallele Workprozesse

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV

Parallele Workprozesse

Postby Stephan4417 » Fri Dec 16, 2005 12:02 pm

Hallo,
ich würde gerne 2 Programme/Vorgänge gleichzeitig ablaufen lassen. Dazu habe ich im SAP-Programm RFREDSLOADGEN den Funktionsbaustein SPTA_PARA_PROCESS_START_2 gefunden , der das wohl als asynchronen RFC realisiert.
Ist das die einzige Möglichkeit, oder gibts vielleicht noch eine Einfachere? Der FuBau ist zwar dokumentiert, ich bräuchte aber doch ein kleines Bespiel, um da durchzublicken! Hat das mal jemand beispielhaft für 2 parallele Forms oder mit 2 parallel laufenden Programmen probiert?
Das Beispielprogramm SPTA_PARA_DEMO_1 der Funktionsgruppe SPTA nutzt mir leider nichts, da nur ein Funktionsbaustein parallel laufen gelassen wird. Ich würde gerne bestimmen, was bzw. welcher FuBau/Vorgang/Programm jeweils in den 2 Prozessen abläuft!
Gruß,
Smeagol.
Stephan4417
.
.
 
Posts: 1
Joined: Fri Dec 16, 2005 12:02 pm

Postby Max1050 » Fri Jun 15, 2007 10:19 am

Hi zsm,
ich stehe bald vor dem selben Problem, daher wollte ich wissen ob hier wirklich keiner eine idee hat? Meine Aufgabe wird es sein mehrere Prozesse parallel ablaufen zu lassen. Diese Prozesse führen Berechnungen anhand Datenbanktabellen durch. Es sind mehrer Berechnungen zu verschiedenen Tabellen. Ev. soll man dann auch noch son Feld angeben können auf welchen Server ...

Habt ihr Rat?
thx im voraus
mfg dawns
Max1050
...
...
 
Posts: 118
Joined: Tue Nov 14, 2006 11:20 am

Postby Salma1291 » Fri Jun 15, 2007 3:29 pm

Hallo,

aus den Angaben werden ich nicht ganz schlau,
willst Du verschiedene Programme im Batch parallel starten - dann kannst Du das mit Jobs realisieren FB: JOB_OPEN, JOB_SUBMIT, JOB_CLOSE.

oder willst Du asynchrone RFC' starten unter der Kontrolle Deines Programmes, dann musst Du RFC-FB's schreiben und
CALL FUNCTION 'XXXX' STARTING NEW TASK
PERFORMING <call_back> AT END OF TASK benutzen

oder asynchron ohne Kontrolle durch Dein Programm,
CALL FUNCTION 'XXXX' IN BACKGROUND TASK.

Gruss Edwin
Salma1291
...
...
 
Posts: 197
Joined: Tue Feb 27, 2007 6:26 pm

Postby Salma1291 » Fri Jun 15, 2007 3:29 pm

Hallo,

aus den Angaben werden ich nicht ganz schlau,
willst Du verschiedene Programme im Batch parallel starten - dann kannst Du das mit Jobs realisieren FB: JOB_OPEN, JOB_SUBMIT, JOB_CLOSE.

oder willst Du asynchrone RFC' starten unter der Kontrolle Deines Programmes, dann musst Du RFC-FB's schreiben und
CALL FUNCTION 'XXXX' STARTING NEW TASK
PERFORMING <call_back> AT END OF TASK benutzen

oder asynchron ohne Kontrolle durch Dein Programm,
CALL FUNCTION 'XXXX' IN BACKGROUND TASK.

Gruss Edwin
*edit
UUPS - da habe ich wohl die Message 2-mal abgeschickt
Salma1291
...
...
 
Posts: 197
Joined: Tue Feb 27, 2007 6:26 pm

Postby Max1050 » Mon Jun 18, 2007 11:39 am

nein jobs nicht, die gibts ja schon, sap-standard.
die letzten dinge hörten sich gut an: asynchrone bearbeitung.

weiß du beispielprogramme oder hast ev. beispielsource?
Max1050
...
...
 
Posts: 118
Joined: Tue Nov 14, 2006 11:20 am

Postby Salma1291 » Mon Jun 18, 2007 3:49 pm

Hi,
ein kleines Beispiel :
läuft unter R4.7 / ERP2004 / ERP2005
FB: Z_DUMMY_RFC - muss RFC-fähig sein
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. FUNCTION Z_DUMMY_RFC.
  2. *"----------------------------------------------------------------------
  3. *"*"Lokale Schnittstelle:
  4. *"  IMPORTING
  5. *"     VALUE&#40;LANGU&#41; TYPE  SPRAS
  6. *"  EXPORTING
  7. *"     VALUE&#40;T100&#41; TYPE  T100
  8. *"----------------------------------------------------------------------
  9.  
  10. * Damit das Ganze etws länger dauert
  11. * lese den ganzen Schrott
  12. select  * from t100
  13.           into t100
  14.           where sprsl = langu.
  15. * Da der FB einen Dialogprozess belegt
  16. * unterliegt er auch der Zeitsteuerung &#40;TIMEOUT&#41;
  17. * damit es nicht zu einem Abbruch kommt
  18. * kann ein
  19. WAIT up to 10 seconds.
  20. * eingebaut werden
  21. * Aber Achtung die Benutzer/ADMIN werden nicht erfreut sein
  22. * wenn dauernd DIA-Prozesseb elegt werden !
  23.  
  24. * Keine Write !
  25.  
  26.  
GeSHi ©

Jetzt noch das zugehörige Programm Z_DUMMY_RFC
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. *&---------------------------------------------------------------------*
  2. *& Report  Z_DUMMY_RFC                                                 *
  3. *&                                                                     *
  4. *&---------------------------------------------------------------------*
  5. *& Startet 2 WP parallell                                              *
  6. *& der eigene Prozess wird auch mit einer Aufgabe betraut              *
  7. *& liest T100                                                          *
  8. *&---------------------------------------------------------------------*
  9.  
  10. REPORT  z_dummy_rfc MESSAGE-ID zdum.
  11.  
  12. TYPES : BEGIN OF ty_task,
  13.            name&#40;8&#41; TYPE c.
  14. TYPES : END  OF ty_task.
  15.  
  16. DATA new_taskname&#40;8&#41; TYPE c.
  17.  
  18. DATA it_tasks TYPE TABLE  OF ty_task.
  19. FIELD-SYMBOLS <fs_task> TYPE ty_task.
  20. DATA  wa_task           TYPE ty_task.
  21.  
  22. DATA it_t100 TYPE TABLE OF t100.
  23.  
  24.   PERFORM starte_rfc.
  25.  
  26. *&---------------------------------------------------------------------*
  27. *&      Form  starte_rfc
  28. *&---------------------------------------------------------------------*
  29. FORM starte_rfc .
  30.   DATA wa_t100 TYPE t100.
  31.  
  32. * Hier sollte jetzt zuerst eine Verarbeitung
  33. * für die Ermittlung der zu verarbeitenden Pakete stehen
  34. * und ein Loop statt der einzelnen Aufrufe
  35. * Aber ! das System prüft ob es überhaupt freie WP
  36. * und die Belastung nicht so hoch wird, ausserdem
  37. * dürfen höchstens 5 Prozesse gestartet werden &#40;ERP2004&#41;
  38.  
  39. * 1.Task
  40.   new_taskname = 'SPRAS=E'.
  41.  
  42.   CALL FUNCTION 'Z_DUMMY_RFC'
  43.     STARTING NEW TASK new_taskname
  44.     PERFORMING ende_rfc ON END OF TASK
  45.     EXPORTING
  46.       langu         = 'E'
  47. * Importing geht hier nich, wird in end_rfc übergeben !
  48. *    IMPORTING
  49. *      T100          =
  50.     EXCEPTIONS
  51.          communication_failure = 1
  52.          system_failure        = 2
  53.          RESOURCE_FAILURE      = 3.
  54.  
  55.   IF sy-subrc EQ 0.
  56.     wa_task-name = new_taskname.
  57.     APPEND wa_task TO it_tasks.
  58.   ELSE.
  59.     MESSAGE e000 WITH 'ERROR:' sy-subrc.
  60.   ENDIF.
  61.  
  62. * 2.Task
  63.   new_taskname = 'SPRAS=D'.
  64.  
  65.   CALL FUNCTION 'Z_DUMMY_RFC'
  66.     STARTING NEW TASK new_taskname
  67.     PERFORMING ende_rfc ON END OF TASK
  68.     EXPORTING
  69.       langu         = 'D'
  70. * Importing geht hier nich, wird in end_rfc übergeben !
  71. *    IMPORTING
  72. *      T100          =
  73.     EXCEPTIONS
  74.          communication_failure = 1
  75.          system_failure        = 2
  76.          RESOURCE_FAILURE      = 3.
  77.  
  78.   .
  79.   IF sy-subrc EQ 0.
  80.     wa_task-name = new_taskname.
  81.     APPEND wa_task TO it_tasks.
  82.   ELSE.
  83.     MESSAGE e000 WITH 'ERROR:' sy-subrc.
  84.   ENDIF.
  85.  
  86. * Jetzt sind 2-asynchrone Prozesse unterwegs,
  87. * damit der eigentliche JOB auch noch etwas zu tun bekommt
  88. * rufen wir den FB auch noch direkt auf
  89.   CALL FUNCTION 'Z_DUMMY_RFC'
  90.     EXPORTING
  91.       langu = 'F'
  92.     IMPORTING
  93.       t100  = wa_t100.
  94.  
  95.   APPEND wa_t100 TO it_t100.
  96.  
  97. * Warte bis keine Tasks mehr in Tabelle
  98.   WAIT UNTIL it_tasks IS INITIAL.
  99.  
  100. * Ergebnis ausgeben :
  101.   LOOP AT it_t100 INTO wa_t100.
  102.     WRITE : / wa_t100-sprsl,
  103.               wa_t100-arbgb,
  104.               wa_t100-msgnr,
  105.               wa_t100-text.
  106.  
  107.  
  108. ENDFORM.                    " starte_rfc
  109.  
  110. *&---------------------------------------------------------------------*
  111. *&      Form  ende_rfc
  112. *&---------------------------------------------------------------------*
  113. * Diese Routine wird aus dem Baustein gerufen !
  114. FORM ende_rfc USING taskname.
  115.   DATA wa_t100 TYPE t100.
  116. * Hole die Rückgabe aus dem WP
  117.   RECEIVE RESULTS FROM FUNCTION 'Z_DUMMY_RFC'
  118.      IMPORTING  t100 = wa_t100
  119.      EXCEPTIONS
  120.         communication_failure = 1
  121.         system_failure        = 2.
  122.  
  123. *  WRITE : / taskname.    "<<< geht nicht, kommt nciht raus !
  124. * Ergebnis in globale Tabelle zurückliefern
  125.   APPEND wa_t100 TO it_t100.
  126.  
  127. * Lösche die Task aus der Tasktabelle
  128.   DELETE it_tasks WHERE name = taskname.
  129. ENDFORM.                    "ende_rfc
  130.  
GeSHi ©


Siehe auch die Hilfe zu CALL FUNCTION STARTING NEW TASK !

Der Einsatz sollte gut überlegt sein, bei Kunden, die sehr viel
Batchverarbeitung haben, wird ein Teil der Arbeit auf Dialogprozesse verteilt,
das ist dann auch gewollt, bei viel Dialogbetrieb -> Vorsicht, da DIA-WP für lange Zeit belegt werden.

Gruss Edwin
Salma1291
...
...
 
Posts: 197
Joined: Tue Feb 27, 2007 6:26 pm

Postby Max1050 » Mon Jul 09, 2007 10:27 am

danke sehr :).
hmmm ich hätte da noch eine frage zur umsetzung:
meine aufgabe besteht ja nun darin meine gesamten berechnungen/prozesse parallel laufen zu lassen. damit ihr einen überblick bekommt:

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. * copy plan_id
  2.   PERFORM plan_id USING    gt_in_plan
  3.                   CHANGING gt_out_plan.
  4.  
  5.   LOOP AT gt_out_plan ASSIGNING <fs_plan>.
  6. *   number of all shipping order
  7.     PERFORM pl_soko USING    gt_in_ship
  8.                     CHANGING <fs_plan>.
  9.  
  10. *   number of all resources
  11.     PERFORM pl_res USING    gt_in_res
  12.                    CHANGING <fs_plan>.
  13.  
  14. *   number of all resources assigned to a tour
  15.     PERFORM pl_res_ass USING    gt_in_res
  16.                        CHANGING <fs_plan>.
  17.  
  18. *   number of all resources with tours having violation
  19.     PERFORM pl_res_vio USING    gt_in_res
  20.                        CHANGING <fs_plan>.
  21. ...
  22. ...
  23.  
GeSHi ©


zuerst fülle ich meine ausgabetabelle mit ids/keys. dann loope ich über diese ids (siehe obigen sourceausschnitt) und führe dann zu diesen ids ensprechende weitere operationen aus.
da ich mir das ganze noch nich so richtig vorstellen kann, frage ich euch: wie setzte ich nun die parallele verarbeitung am besten um?
ich hab überhaupt keinen plan :P

ideen/fragen allerdings schon... :
- müsste ich nun alle forms in funktionsbausteine umschreiben und dann im loop einfach ne prozessvariable und ne tasknamenvariable hochzählen?
- dann bräucht ich aber für jedes form ein eigenes "ende-rfc" also commit_back, da ich ja immer andere rückgabewerte habe oder?
- oder sogar alle berechnungen zu dieser ausgabetabelle/zu diesem loop in einen funktionsbaustein?

oder wie würdet ihr das umsetzen?
thx im voraus
mfg dawns[/code]
Max1050
...
...
 
Posts: 118
Joined: Tue Nov 14, 2006 11:20 am

Postby Max1050 » Mon Jul 09, 2007 3:23 pm

so hab mich ma hingesetzt und eine lösung gefunden:

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.  
  2.   DATA: ls_out_plan       TYPE zplan,
  3.              lv_taskindex&#40;8&#41; TYPE n.
  4.   FIELD-SYMBOLS: <fs_plan> TYPE zplan.
  5.  
  6. LOOP AT gt_out_plan ASSIGNING <fs_plan>.
  7.     IF para IS INITIAL.
  8. *     calculate planning data syn
  9.       CALL FUNCTION 'ZCALC_PLANNING'
  10.         EXPORTING
  11.           s_in_plan  = <fs_plan>
  12.         IMPORTING
  13.           s_out_plan = ls_out_plan
  14.         TABLES
  15.           t_ship     = gt_in_ship
  16.           t_res      = gt_in_res
  17.           t_tour     = gt_in_tour
  18.           t_tourdoc  = gt_in_tourdoc
  19.           t_stop     = gt_in_stop
  20.           t_soko     = gt_in_soko.
  21.     ELSE.
  22.       ADD 1 TO gv_running.
  23.       ADD 1 TO lv_taskindex.
  24.  
  25. *     calculate planning data asyn
  26.       CALL FUNCTION 'ZCALC_PLANNING'
  27.         STARTING NEW TASK lv_taskindex
  28.         DESTINATION IN GROUP srv_grp
  29.         PERFORMING come_back ON END OF TASK
  30.         EXPORTING
  31.           s_in_plan = <fs_plan>
  32.         TABLES
  33.           t_ship    = gt_in_ship
  34.           t_res     = gt_in_res
  35.           t_tour    = gt_in_tour
  36.           t_tourdoc = gt_in_tourdoc
  37.           t_stop    = gt_in_stop
  38.           t_soko    = gt_in_soko.
  39.  
  40. *     max. number of processes is active => wait
  41.       WAIT UNTIL gv_running < max_jobs.
  42.     ENDIF.
  43.   WAIT UNTIL gv_running IS INITIAL.
  44.  
  45.  
  46. FORM come_back USING taskname.
  47.   DATA: lv_plan TYPE zplan.
  48.   RECEIVE RESULTS FROM FUNCTION 'ZCALC_PLANNING'
  49.         IMPORTING s_out_plan    = lv_plan
  50.         EXCEPTIONS
  51.            communication_failure = 1
  52.            system_failure        = 2
  53.            OTHERS                = 3.
  54. * Anzahl der genutzten Tasks um 1 reduzieren
  55.   SUBTRACT 1 FROM gv_running.
  56.   IF sy-subrc = 1.
  57.     MESSAGE s013&#40;/lot/vl&#41; WITH taskname.
  58.   ELSE.
  59.     MESSAGE s014&#40;/lot/vl&#41; WITH taskname.
  60.   ENDIF.
  61. ENDFORM.                    " come_back
  62.  
GeSHi ©


im come_back ist der sy-ucomm immer auf 2 -> fehler -> workarea ist nicht gefüllt.... habt ihr eine idee warum?

thx im voraus
mfg dawns
Max1050
...
...
 
Posts: 118
Joined: Tue Nov 14, 2006 11:20 am

Postby Salma1291 » Mon Jul 09, 2007 4:12 pm

Hallo,
sy-ucomm ? Meinst Du vielleicht sy-subrc ?
Beim Call Function solltest Du noch die Exceptions aufnehmen ,
communication_failure/system_failure/RESOURCE_FAILURE.
Tritt der Fehler vielleicht schon beim Call auf ?
Ist Deine Servergruppe richtig definiert ?
Hast Du es mal ohne den Destination Zusatz versucht ?

Fragen über Fragen :wink:

Gruss Edwin
Salma1291
...
...
 
Posts: 197
Joined: Tue Feb 27, 2007 6:26 pm

Postby Max1050 » Tue Jul 10, 2007 8:31 am

Hi,
hehe, das doch gut :)
hab deine fragen abgearbeitet:
1) ja hatte mich verschrieben: sy-subrc
2) Habe Exceptions nun so wie du vorgeschlagen hast im "Call Function..." sowie im "RECEIVE RESULTS..." eingebaut.
3) nein: sy-subrc = 0
4) habe ich gar nicht definiert, was muss da rein :P?
5) Habe den die servergruppe komplett weggelassen, sprich "CALL FUNCTION 'SPBT_INITIALIZE'" sowie den destination zusatz, allerdings bekomme ich beim "RECEIVE RESULTS FROM FUNCTION..." immer noch den rückgabe wert 2 für "system failure" und somit keine ausgefüllte workarea.

Wenn ich den Funktionsbaustein aber ohne die parallele Verarbeiutng laufen lasse, funktioniert er...

Habt ihr noch mehr Ideen worans liegen könnte?

edit: wundert mich das das keiner wusste...
Mein herausgefundene Lösung: Funktionsbaustein muss remotefähig sein ;)
Max1050
...
...
 
Posts: 118
Joined: Tue Nov 14, 2006 11:20 am


Return to ABAP® Core

Who is online

Users browsing this forum: No registered users and 7 guests