 
 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_parallelCode: 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.