Deswegen kann man mit Transaktion RZ12 RFC-Servergruppen definieren, die genau sowas verhindern - so sie denn sinnvoll eingestellt werden... .DeathAndPain hat geschrieben:Den SAP-Server mit massiv paralleler Verarbeitung dicht zu machen, so dass derweil kein anderer Benutzer mehr sinnvoll darauf arbeiten kann, halte ich sowieso nicht für einen sinnvollen Ansatz.
Das sehe ich genauso, aber dabei geht es ja auch um das Ändern von Daten. Ändern sollte man (fast) immer nur mit SAP-Standardmitteln machen, da man nicht wissen kann, was es da noch alles an Konsistenzabhängigkeiten gibt und sich im Übrigen auch keine Fehler erlauben kann. Lesen von Daten ist da bedeutend unkritischer. Zum einen kann man über gelesene Werte nicht wirklich diskutieren - die sind richtig (im Sinne des Programms), denn es sind die Werte, die in der Datenbank stehen. Und wenn man da einen Fehler macht (egal ob Interpretationsfehler oder einen simplen Programmierfehler), dann hat man einen Bug in seinem eigenen Programm und dessen Werteausgabe, zerschießt damit aber nicht die Konsistenz der Datenbank. Im übrigen ist dabei auch gesichert, dass man sich nicht mit Verbucherpuffern und Sperrkonzepten des Standards ins Gehege kommt. Im ganz großen Stil Daten schreiben tut man ja auch nur selten. Das ist normalerweise nicht der Engpass bei der Performance. Aber große Datenmengen mit den Fubas des Standards zu lesen kann ein Programm bis zur Unbrauchbarkeit langsam machen.Sinnvoll sind FuBas, die ganze Funktionen abbilden, wie „Anlegen eines Materialstammsatzes“ oder so, denn das ist von Hand in der Tat nicht trivial, das Ändern eines Stammsatzes noch weniger. Da erzeugt man schnell Datenschiefstände, die man nicht wieder aus dem System bekommt.
Willst du unserem OP mit seinem Wissensstand ( oder von mir aus auch mit deinem Wissensstand bei diesem nicht gerade trivialen Thema ) allen Ernstes empfehlen eine Bedarf-Bestandsliste nachzuprogrammieren oder selbständig aus den DB-Tabellen zusammenzuklauben anstatt sich des bewährten SAP-FB zu bedienen?DeathAndPain hat geschrieben:...Aber große Datenmengen mit den Fubas des Standards zu lesen kann ein Programm bis zur Unbrauchbarkeit langsam machen.
Folgende Benutzer bedankten sich beim Autor ralf.wenzel für den Beitrag:
DeathAndPain
ralf.wenzel hat geschrieben:Welche Alternative gibt es, wenn die FuBas zu langsam sind?
Ralf
Danke Wolfgang,wreichelt hat geschrieben:Hi,
es gibt zum einen den OSS-Hinweis 862337 - Order report performance: Parallel import
darüber hinaus könnte auch das was sein:
SAP hat den Bericht RMMD07DB geliefert, der auch einen ähnlichen Zweck erfüllt und dessen Ausgabe der Standardbildschirm von SAP MD07 ist.
Gruß Wolfgang
Code: Alles auswählen.
*&---------------------------------------------------------------------*
*& Report ZPARALLEL
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zparallel NO STANDARD PAGE HEADING.
***********************************************************************
LOAD-OF-PROGRAM.
***********************************************************************
TYPES: BEGIN OF t_data,
key TYPE char1, " This is the key, needed later to find the right entry to store result. This can also be a material or customer number
time TYPE i, " Just needed in the demo to get different runtimes
o_class TYPE REF TO zcl_parallel_demo, " Store the instances
END OF t_data.
* Some global variables to make the test report easier to read...
##needed
##no_text
DATA: g_group TYPE rzllitab-classname
VALUE 'parallel_generators', " Logon group of RZ12
g_wp_available TYPE i, " Number of available dialog processes
g_snd_jobs TYPE i VALUE 1, " Jobs started
g_rcv_jobs TYPE i VALUE 1. " Jobs finished
##needed
DATA: git_data TYPE STANDARD TABLE OF t_data.
***********************************************************************
INITIALIZATION.
***********************************************************************
SELECTION-SCREEN BEGIN OF BLOCK s_alpha WITH FRAME TITLE TEXT-t01.
PARAMETERS: pa_ser RADIOBUTTON GROUP radi DEFAULT 'X',
pa_par RADIOBUTTON GROUP radi.
SELECTION-SCREEN END OF BLOCK s_alpha.
***********************************************************************
START-OF-SELECTION.
***********************************************************************
GET TIME STAMP FIELD DATA(l_time).
WRITE / l_time.
PERFORM initialize.
PERFORM do_simulation.
GET TIME STAMP FIELD DATA(l_time2).
WRITE / l_time2.
DATA(seconds) = cl_abap_tstmp=>subtract(
tstmp1 = l_time2
tstmp2 = l_time ).
WRITE / seconds.
***********************************************************************
END-OF-SELECTION.
***********************************************************************
WRITE : / 'Report ends...'(003).
***********************************************************************
* S u b r o u t i n e s
***********************************************************************
FORM initialize.
* Fill ITAB with 5 values (which run in the end in parallel...)
git_data = VALUE #( ( key = 'A' time = 3 )
( key = 'B' time = 1 )
( key = 'C' time = 2 )
( key = 'D' time = 10 )
( key = 'E' time = 2 ) ).
ENDFORM. "initialize
***********************************************************************
FORM do_simulation.
***********************************************************************
IF pa_ser EQ abap_true.
PERFORM do_simulation_serial.
ELSE.
PERFORM do_simulation_parallel.
ENDIF.
COMMIT WORK AND WAIT.
ENDFORM. "do_simulation
***********************************************************************
FORM do_simulation_serial.
***********************************************************************
* Loop over the itab and run the worker method one after the other...
WRITE: / 'No of serial jobs:', lines( git_data ).
LOOP AT git_data ASSIGNING FIELD-SYMBOL(<fs>).
CREATE OBJECT <fs>-o_class.
<fs>-o_class->worker( pi_time = <fs>-time ).
ENDLOOP.
ENDFORM. "do_simulation_serial
***********************************************************************
FORM do_simulation_parallel.
***********************************************************************
DATA l_msg TYPE char80 VALUE space.
* Initialize the "Parallel Background Tasks" enviroment
CALL FUNCTION 'SPBT_INITIALIZE'
EXPORTING
group_name = g_group
IMPORTING
free_pbt_wps = g_wp_available.
WRITE: / 'No of max. parallel jobs:', g_wp_available.
* Loop the itab (3 values) and run the worker method parallel in seperate tasks
LOOP AT git_data ASSIGNING FIELD-SYMBOL(<fs>).
CALL FUNCTION 'Z_RFC_PARALLEL'
STARTING NEW TASK <fs>-key " will be taskname in return_info
DESTINATION IN GROUP g_group
PERFORMING z_rfc_parallel_return ON END OF TASK
EXPORTING
pi_time = <fs>-time
EXCEPTIONS
communication_failure = 1 MESSAGE l_msg
system_failure = 2 MESSAGE l_msg
resource_failure = 3 .
IF sy-subrc NE 0.
WRITE: / l_msg.
EXIT.
ENDIF.
ADD 1 TO g_snd_jobs. " Increment no. of started jobs
ENDLOOP.
* Continue, after all started jobs are finished.
WAIT UNTIL g_rcv_jobs >= g_snd_jobs.
ENDFORM. "do_simulation_parallel
##perf_no_type
***********************************************************************
FORM z_rfc_parallel_return USING taskname. "do not use 'type xxxx' here.
***********************************************************************
DATA: l_string TYPE string,
l_msg TYPE char80 VALUE space.
* Import the FM export parameters (here: serialized instance)
RECEIVE RESULTS FROM FUNCTION 'Z_RFC_PARALLEL'
IMPORTING pe_string = l_string
EXCEPTIONS
communication_failure = 1 MESSAGE l_msg
system_failure = 2 MESSAGE l_msg
resource_failure = 3 .
IF sy-subrc EQ 0.
ADD 1 TO g_rcv_jobs. " Increment no. of received jobs
READ TABLE git_data WITH KEY key = taskname ASSIGNING FIELD-SYMBOL(<fs>).
IF sy-subrc EQ 0.
CALL TRANSFORMATION id " Deserialize string to instance
SOURCE XML l_string
RESULT model = <fs>-o_class.
ELSE.
WRITE: / l_msg.
EXIT.
ENDIF.
ENDIF.
ENDFORM. "do_simulation_parallel
Code: Alles auswählen.
FUNCTION z_rfc_parallel.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*" IMPORTING
*" VALUE(PI_TIME) TYPE I
*" EXPORTING
*" VALUE(PE_STRING) TYPE STRING
*"----------------------------------------------------------------------
data:
ls_logtable TYPE zlog.
DATA(lo_myclass) = NEW zcl_parallel_demo( ).
lo_myclass->worker( pi_time = pi_time ).
ls_logtable-pname = 'Z_RFC_PARALLEL'.
ls_logtable-datum = sy-datlo.
ls_logtable-uzeit = sy-timlo.
IF zcl_parallel_demo=>table IS INITIAL.
ls_logtable-text = 'NICHT GEFÜLLT'.
ls_logtable-lfnum = 1.
SELECT *
FROM sflight
INTO TABLE zcl_parallel_demo=>table.
ELSE.
ls_logtable-text = 'GEFÜLLT'.
ls_logtable-lfnum = 2.
ENDIF.
MODIFY zlog FROM ls_logtable.
* Serialize instance to string.
CALL TRANSFORMATION id
SOURCE model = lo_myclass
RESULT XML pe_string.
ENDFUNCTION.