Mega-Inner Join

Ein “Inner Join” über mehrere Tabellen, der auch noch Sinn macht: Er liest ein oder mehrere Merkmale aus einer Kundenauftragskonfiguration.

Das folgende Programm liest die Konfiguration eines Kundenauftrags. Obwohl die Variantenkonfiguration mittels der Klassifizierung angelegt und designed wird, werden die Daten in anderen Tabellen gespeichert.

Die Verwendung ist allerdings mit Vorsicht zu geniessen, da evtl. einzelne Werte erst aus anderen Konfigurationsdaten hergeleitet werden und gar nicht abgespeichert werden.

Verwenden Sie gegebenenfalls den Funktionsbaustein VC_I_GET_CONFIGURATION um die komplette Konfiguration einer Auftragsposition zu lesen. INSTANCE ist VBAP-CUOBJ.

Bitte beachten Sie, dass es zwei Coding-Varianten gibt!

Coding 1 – Objektschlüssel

REPORT zzconf01 .

DATA:
  l_objkey TYPE ibobjkey,
  lv_datts TYPE ib_valfr,
  BEGIN OF ls_erg,
    atwrt TYPE atwrt,
    atflv TYPE atflv,
    atnam TYPE atnam,
    anzdz TYPE anzdz,
    atbez TYPE atbez,
  END OF ls_erg,
  lt_erg  like ls_erg occurs 0.

*** Selektionsbild
PARAMETERS:
  p_vbeln TYPE vbeln_va DEFAULT ‘123456’,
  p_posnr TYPE posnr DEFAULT ‘000010’.
SELECT-OPTIONS:
  s_atnam FOR ls_erg-atnam.

START-OF-SELECTION.

*** Objektschlüssel erzeugen
 CONCATENATE p_vbeln p_posnr INTO l_objkey.

*** Tagesdatum in Zeitstempel konvertieren
  CONVERT DATE sy-datum
          TIME sy-uzeit
          INTO TIME STAMP lv_datts TIME ZONE sy-zonlo.

*** Werte lesen
 SELECT ibsymbol~atwrt
        ibsymbol~atflv
        cabn~atnam
        cabn~anzdz
        cabnt~atbez
   FROM ibsymbol
  INNER JOIN ibinvalues 
          ON ibinvalues~symbol_id = ibsymbol~symbol_id
  INNER JOIN ibin    ON ibin~in_recno        = ibinvalues~in_recno
  INNER JOIN ibinown ON ibinown~instance     = ibin~instance
  INNER JOIN cabn    ON cabn~atinn           = ibsymbol~atinn
  INNER JOIN cabnt   ON cabnt~atinn          = cabn~atinn
   INTO TABLE lt_erg
  WHERE ibinown~objkey = l_objkey
    AND ibinown~inttyp = ‘0001’     “Auftragsposition
    and cabn~atnam     in s_atnam
    AND cabnt~spras    = sy-langu
    AND ibin~valfr    <= lv_datts
    AND ibin~valto    >= lv_datts.

*** Werte ausgeben
LOOP AT lt_erg into ls_erg.

  WRITE: / ls_erg-atbez, ls_erg-atnam.
  IF ls_erg-atflv IS INITIAL.
    WRITE ls_erg-atwrt.
  ELSE.
    WRITE  ls_erg-atflv EXPONENT 0 DECIMALS ls_erg-anzdz.
  ENDIF.

ENDLOOP.

Coding 2 – Instanz über VBAP ermitteln

Selektionsbild und Vorbereitungen wie bei Coding 1.

*** Select des Wertes aus der Konfiguration
*** Werte lesen
  SELECT ibsymbol~atwrt   “Wert Character
         ibsymbol~atflv   “Wert numerisch (auch Datum!)
         cabn~atnam       “Merkmalsname
         cabn~anzdz       “Anzahl Dezimalstellen
         cabnt~atbez      “Bezeichnung
    FROM ibsymbol
   INNER JOIN ibinvalues   ON ibinvalues~symbol_id = ibsymbol~symbol_id
   INNER JOIN ibin         ON ibin~in_recno        = ibinvalues~in_recno
   INNER JOIN ibinown      ON ibinown~instance     = ibin~instance
   INNER JOIN vbap         ON ibinown~instance     = vbap~cuobj
   INNER JOIN cabn         ON cabn~atinn           = ibsymbol~atinn
   INNER JOIN cabnt        ON cabnt~atinn          = cabn~atinn
    INTO TABLE lt_erg
   WHERE vbap~vbeln  = p_vbeln
     AND vbap~posnr  = p_posnr
     AND cabn~atnam  IN s_atnam
     AND cabnt~spras = sy-langu
     AND ibin~valfr <= lv_datts
     AND ibin~valto >= lv_datts.

  IF sy-subrc = 0.
*** Werte ausgeben
    SORT lt_erg BY atnam.
    LOOP AT lt_erg INTO ls_erg.
      WRITE: / ls_erg-atnam,
               ls_erg-atwrt,
               ls_erg-atflv EXPONENT 0 DECIMALS ls_erg-anzdz NO-ZERO.
    ENDLOOP.
  ENDIF.

Enno Wulff