PACKAGE SIZE

Informationen zum PACKAGE SIZE-Zusatz des SELECT-Befehls. In diesem Artikel zeigen wir eine Möglichkeit, die Verarbeitung von Paketen Ereignisgesteuert auszuführen. Sicherlich keine Revolution, aber so geht’s eben auch…

Standard

Um Daten Stück für Stück von der Datenbank zu lesen, ist der PACKAGE SIZE-Zusatz die erste Wahl:

*** Read data
SELECT * FROM vbak
  PACKAGE SIZE 1000
  INTO TABLE lt_vbak
 WHERE auart = iv_auart.
*** Start processing read data
  PERFORM verarbeitung USING lt_vbak.
ENDSELECT.

Erweiterung

Das oben genannte Coding funktioniert natürlich nur, wenn die Datenselektion und die Verarbeitung innerhalb eines Programms statt finden. Kniffeliger wird es dann schon, wenn die Datenbeschaffung in einer Methode ausgeführt wird.

Hier kann man sich aber das Eventhandling zu nutze machen: Wird der Datenbeschaffungsmethode keine “Paketgröße” mitgegeben, so werden alle Daten selektiert und zurück gegeben.

Bei Übergabe einer Paketgröße wird jedoch stückchenweise gelesen und die Daten des Pakets mittels “RAISE EVENT” zur Verfügung gestellt.

Das Ganze kann dann in etwa so aussehen:

Klasse ZCL_DATA

Methode GET_DATA

METHOD get_data. “PUBLIC STATIC METHOD
*———————————————————————
* Schnittstelle:
* Importing: IV_AUART         TYPE AUART        “Verkaufsbelegart
* Importing: IV_PACKAGE_SIZE  TYPE I  DEFAULT 0 “Paketgröße
* Exporting: ET_VBAK          TYPE  VBAK_T      “Tabellentyp VBAK
*———————————————————————


  DATA lt_vbak TYPE vbak_t.
  IF iv_package_size IS INITIAL.
*** Read data complete
    SELECT * FROM vbak
      INTO TABLE et_vbak
     WHERE auart = iv_auart
       AND ernam = sy-uname.
  ELSE.
*** Read data in packets
    SELECT * FROM vbak
      PACKAGE SIZE iv_package_size
      INTO TABLE lt_vbak
     WHERE auart = iv_auart
       AND ernam = sy-uname.
      RAISE EVENT package_read EXPORTING et_vbak = lt_vbak.
    ENDSELECT.
  ENDIF.

ENDMETHOD.

Ereignis PACKAGE_READ

Public, static

Parameters: ET_VBAK TYPE VBAK_T

Verarbeitungsprogramm

In diesem Beispiel wird die statische Methode der Klasse ZL_DATA verwendet, um die Tabelle VBAK zu lesen.

Um das Event PACKAGE_READ der Klasse ZCL_DATA abzufangen, wurde die lokale Klasse ZCL_GET_PACKAGE erzeugt.

Wenn die Datenverarbeitung schon modular aufgebaut war, so ist die Änderung auf paketweise Verarbeitung recht gering.

Hinweis:
Diese Verarbeitungslogik offenbart dann ihre Tücken, sobald die Sätze voneinander abhängen. In diesem Fall könnten das Aufträge sein, die durch Submissionsnummern “verbunden” sind oder sobald alle Aufträge eines Tages zusammen verarbeitet werden sollen.

DATA gt_vbak          TYPE vbak_t.
FIELD-SYMBOLS <vbak>  TYPE vbak.

PARAMETERS p_auart TYPE auart DEFAULT ‘SO’.
PARAMETERS p_psize TYPE i     DEFAULT 0.

*———————————————————————-*
*       CLASS zcl_get_package DEFINITION
*———————————————————————-*

CLASS zcl_get_package DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS get_package FOR EVENT package_read
                               OF zcl_data
                        IMPORTING et_vbak .
ENDCLASS.                    “zcl_get_package DEFINITION

*———————————————————————-*
*       CLASS zcl_get_package IMPLEMENTATION
*———————————————————————-*

CLASS zcl_get_package IMPLEMENTATION.
  METHOD get_package.
    PERFORM print_data USING et_vbak.
    uline.
  ENDMETHOD.                    “get_package
ENDCLASS.                    “zcl_get_package IMPLEMENTATION

START-OF-SELECTION.

  IF p_psize = 0.
*** get data complete
    CALL METHOD zcl_data=>get_data
      EXPORTING
        iv_auart = p_auart
      IMPORTING
        et_vbak  = gt_vbak.
    PERFORM print_data USING gt_vbak.
  ELSE.
*** Set Handler to register event
    SET HANDLER zcl_get_package=>get_package.
*** Get data package by package
    CALL METHOD zcl_data=>get_data
      EXPORTING
        iv_auart        = p_auart
        iv_package_size = p_psize.
  ENDIF.

*&———————————————————————*
*&      Form  print_data
*&———————————————————————*

FORM print_data USING it_vbak TYPE vbak_t.
  LOOP AT it_vbak ASSIGNING <vbak>.
    WRITE: / <vbak>-vbeln.
  ENDLOOP.
ENDFORM.                    “print_data

 

Enno Wulff