Holen von Daten aus einem Remote-System

Mithilfe des Funktionsbausteins RFC_READ_TABLE können relativ problemlos Daten aus einem entfernten System geholt werden. Enthält die Tabelle jedoch ausser Character-Feldern auch Felder vom Typ Integer, decimals oder Floating-Point, dann gibt es Probleme. Wir zeigen Ihnen hier kurz, wie Sie das Problem einfach umgehen können.

Wenn Sie sich Daten aus einem entfernten System per Remote-Function-Call (RFC) besorgen möchten, dann nehmen Sie am einfachsten den Baustein RFC_READ_TABLE.

Sie können noch die Selektion einschränken und bestimmen, welche Felder aus der Tabelle übergeben werden sollen. Sie erhalten dann die Daten inklusive Beschreibung der Datenbanktabelle.

Wenn die Datenbanktabelle Felder vom Typ P, D, F oder I enthält, dann werden diese Felder nicht korrekt übergeben, da beim RFC eigentlich nur Felder vom Typ C übergeben werden können.

Als Lösung bieten sich drei Möglichkeiten an:

  1. Sie lesen die Daten in eine genügend breite Tabelle, die nur aus einem Character-Feld besteht. Danach weisen sie anhand der Feldinformationen mit Offset- und Längenangaben die Felder der eigentlichen Struktur zu.
  2. Sie schreiben sich einen eigenen RFC-Funktionsbaustein, der die Daten korrekt einliest. Der Vorteil hierbei ist, dass Sie direkt Einfluß auf die Where-Bedingung haben und diese nicht umständlich codieren müssen.
  3. Sie definieren sich eine Struktur, die nur aus Character-Feldern besteht, jedoch die selben Feldnamen enthält, wie die Datenbanktabelle.

Zu Lösung drei können Sie das folgende Programnm verwenden, um die Datendefinition ins Programm aufzunehmen. Es ermittelt die Felder einer Datenbanktabelle und erstellt daraus eine TYPES-Anweisung mit allen Feldern in der richtigen Länge im C-Format.

REPORT  zz_rfc_types.
DATA gt_dd03l TYPE STANDARD TABLE OF dd03l.
FIELD-SYMBOLS <dd03l> TYPE dd03l.
DATA gv_name(80).

PARAMETERS p_tabl TYPE tabelle DEFAULT ‚VBAP‘.

START-OF-SELECTION.

  SELECT * FROM dd03l INTO TABLE gt_dd03l
   WHERE tabname = p_tabl.

  SORT gt_dd03l BY position.

  WRITE: / ‚TYPES: BEGIN OF TY_RFC_‘ NO-GAP, p_tabl NO-GAP, ‚,‘.
  LOOP AT gt_dd03l ASSIGNING <dd03l>.
    gv_name = <dd03l>-leng.
    SHIFT gv_name LEFT DELETING LEADING ‚0‘.
    CONCATENATE <dd03l>-fieldname ‚(‚ gv_name ‚)‘ INTO gv_name.
    WRITE: /10 gv_name, AT 36 ‚TYPE C,‘.
  ENDLOOP.
  WRITE: / ‚       END OF TY_RFC_‘ NO-GAP, p_tabl NO-GAP, ‚.‘.

Die Ausgabe können Sie dann mithilfe STRG-Y und STRG-C in Ihr Coding übernehmen:

TYPES: BEGIN OF TY_RFC_VBAP                          ,   
         MANDT(3)                  TYPE C,               
         VBELN(10)                 TYPE C,               
         POSNR(6)                  TYPE C,               
         MATNR(18)                 TYPE C,               
         MATWA(18)                 TYPE C,               
         PMATN(18)                 TYPE C,               
         CHARG(10)                 TYPE C,               
         MATKL(9)                  TYPE C,               
         ARKTX(40)                 TYPE C,               
         PSTYV(4)                  TYPE C,               
         POSAR(1)                  TYPE C,               
         LFREL(1)                  TYPE C,               
         FKREL(1)                  TYPE C,               
         UEPOS(6)                  TYPE C,               
         GRPOS(6)                  TYPE C,               
         ABGRU(2)                  TYPE C,               
         PRODH(18)                 TYPE C,               
         ZWERT(13)                 TYPE C,               
         ZMENG(13)                 TYPE C,               
         ZIEME(3)                  TYPE C,               

Hier noch ein kurzes Beispiel zum Einsatz in Ihren Programmen:

DATA gt_rfc_vbap         TYPE STANDARD TABLE OF ty_rfc_vbap.
DATA gt_vbap             TYPE STANDARD TABLE OF vbap.
FIELD-SYMBOLS <rfc_vbap> TYPE ty_rfc_vbap.
FIELD-SYMBOLS <vbap>     TYPE vbap.
DATA gv_message          TYPE text80.
DATA gt_opt              TYPE STANDARD TABLE OF rfc_db_opt.
DATA gt_fld              TYPE STANDARD TABLE OF rfc_db_fld.

CALL FUNCTION ‚RFC_READ_TABLE‘
  DESTINATION ‚SAP3‘
  EXPORTING
    query_table           = ‚VBAP‘
  TABLES
    OPTIONS               = gt_opt
    fields                = gt_fld
    data                  = gt_rfc_vbap
  EXCEPTIONS
    table_not_available   = 1
    table_without_data    = 2
    option_not_valid      = 3
    field_not_valid       = 4
    not_authorized        = 5
    data_buffer_exceeded  = 6
    system_failure        = 7  MESSAGE gv_message
    communication_failure = 8  MESSAGE gv_message
    OTHERS                = 9.
IF sy-subrc <> 0.
  WRITE: / ‚Fehler bei Aufruf RFC_READ_TABLE:‘, sy-subrc, gv_message.
ELSE.
  LOOP AT gt_rfc_vbap ASSIGNING <rfc_vbap>.
    APPEND INITIAL LINE TO gt_vbap ASSIGNING <vbap>.
    MOVE-CORRESPONDING <rfc_vbap> TO <vbap>.
  ENDLOOP.
ENDIF.

TIPP:
Bei RFC-Aufrufen können Sie die beiden Ausnahmen „SYSTEM_FAILURE“ und „COMMUNICATION_FAILURE“ angeben. Dahinter noch eine Textvariable und Sie erhalten bei Kommunikationsproblemen detailierte Informationen!

 

Enno Wulff
follow me