DBA Cockpit

Aus SAP-Wiki
Zur Navigation springenZur Suche springen

Siehe Neues ABAP (ab Release 7.40).

Siehe Data Browser SE16, SE16N und SE16H

Siehe Dictionary (Transaktion SE11)

Siehe Kategorie:Neues ABAP.

Mit der Transaktion DBACOCKPIT kann man eine SQL-Abfrage anlegen und dabei mehrere SAP-Tabellen in der Abfrage verknüpfen. Der SQL kann in jedem SAP-System angelegt werden und wird nicht transportiert.

Kritische Würdigung DBA Cockpit

Vorteile DBA Cockpit
  • Die SQL-Abfragen können direkt im Entwicklungssystem/Q-System/Produktivsystem angelegt werden und müssen nicht den normalen Transportweg durchlaufen.
  • In der SQL-Abfrage lassen sich mehrere Tabellen verknüpfen und sind somit den Transaktionen SE16 und SE16N überlegen, deren Selektinoen in aller Regel lediglich auf einer SAP-Tabelle beruhen.
  • Der SQL-Code im DBA Cockpit ist ähnlich zum SQL-Code, der in CDS-Views verwendet wird. Mit den SQL-Abfragen im DBA Cockpit lernt man schneller CDS-View-Coding.
  • Ein Select ist im Vergleich zu einem Query deutlich flexibler. So lassen sich z. B. auch Felder joinen, die keinen identischen Datentyp/Feldlänge haben.
  • Im Join lassen sich problemlos (im Gegensatz zum Join im Quickview/Query) Tabellen wieder entfernen
  • Das Coding lässt sich sehr leicht und schnell ändern
  • Coding lässt sich in Texteditoren, Word, PhraseExpress etc. speichern und sehr schnell wieder einfügen


Nachteile DBA Cockpit
  • Das DBA Cockpit generiert keinen Selektionsbildschirm wie in einem klassischen SAP-Report. Wenn man nach vielen einzelnen Where-Werten selektieren will, ist es mühsam dies manuell zu codieren.
  • Die Syntax ist ähnlich, aber doch anders zum klassischen ABAP.
  • Das Coding eines SQL-Codings lässt sich zwar im DBA Cockpit abspeichern, aber die Suche nach vorhandenen SQL-Codings ist wenig komfortabel.
  • Die Ergebnisliste vom DBA Cockpit ist sehr viel einfacher und weniger komfortabel als eine ALV-Liste eines Reports oder einer generierten ALV-Liste von einem Query/Quickview.
  • Kommentare lassen sich nur auf separaten Zeilen einfügen, nicht am Ende einer Codingzeile

Transaktion DBACOCKPIT "SQL Editor"

  • In der Transaktion DBACOCKPIT wählt man den Pfad "Diagnostics - SQL Editor" aus.
  • Unter "Query Name" vergibt man einen beliebigen Namen. Man braucht keinen Namensraum beachten.
  • Im Reiter "Input Query" gibt man den SQL-Code ein.
  • Leerzeilen im Coding und Einrückungen (zur Strukturierung des Codings) sind erlaubt.
  • Tabellen und Felder werden nicht wie in ABAP mit "-" getrennt, sondern mit "."

SQL Editor - Input Query

DBACOCKPIT2.JPG

Result

DBACOCKPIT3.JPG

Beispiele

EKKO, EKPO und EKES (Bestellungen)

Select
ekko.ebeln,
ekpo.ebelp,
ekpo.matnr,
ekes.EINDT

from ekko
join ekpo
  on ekpo.ebeln = ekko.ebeln 
join ekes
  on ekes.ebeln = ekpo.ebeln
 and ekes.ebelp = ekpo.ebelp

where ekko.ebeln = '4500000031' 
  and ekpo.matnr = '30430_E'

KNVP und KNVV (Kundenstamm Partnerrollen)

select
knvp_we.vkorg,
knvp_we.vtweg,
knvp_we.spart,
knvp_we.KUNNR as AG,
knvv.loevm,
knvp_we.parvw as PARVW,
knvp_we.kunn2 as WE,
knvp_mf.parvw AS PARVW2,
knvp_mf.kunn2 as MF

from knvp as knvp_we

inner join knvp as knvp_mf
  ON knvp_mf.kunnr = knvp_we.kunn2

inner join knvv
  ON knvp_we.kunnr  = knvv.kunnr
  and knvp_we.vkorg = knvv.vkorg
  and knvp_we.vtweg = knvv.vtweg
  and knvp_we.spart = knvv.spart

where knvp_we.parvw = 'WE'
  and knvp_we.vkorg = knvp_mf.vkorg

order by knvp_we.vkorg, knvp_mf.kunn2

VBAK und VBAP (Kundenauftrag)

Select
vbak.vbeln,
vbap.posnr

from vbak
join vbap
  on vbap.vbeln = vbak.vbeln 
join ekpo
  on ekpo.ebeln = ekko.ebeln 
join ekes
  on ekes.ebeln = ekpo.ebeln
 and ekes.ebelp = ekpo.ebelp

VBRK und VBRP (Rechnung)

Select
vbrk.vbeln,
vbrp.posnr

from vbrk
join vbrp
 on vbrp.vbeln = vbrk.vbeln

SQL-Syntax Allgemein

Kommentare

Mehrzeilige Kommentare /* .. */
/*  
Dies ist ein Kommentartext.
Der kann auch über mehreren Zeilen gehen.
*/

oder

/* Dies ist ein Kommentartext */
  • Kommentare lassen sich nur auf eine komplette Zeile schreiben
Einzeiliger Kommentar --..
--Einzeiliger Kommentar
  • Der einzeilige Kommentar kann leider nicht ans Ende einer Codingzeile angehängt werden

Punkttrenner "tabelle.feld"

  • Trenner zwischen Tabelle und Feld "-" wird durch "." ersetzt

Aufzählung Select-Felder mit ","

  • Select-Felder werden mit "," aufgeführt

Keine Zielstruktur

  • Es braucht beim SQL-Coding im DBA Cockpit keine Zielstruktur-/Tabelle, da das Ergebnis der SQL-Abfrage auch lediglich ausgegeben wird und nicht in einer internen Tabelle weiterverarbeitet wird

Unicode-Zeichen, z. B. "/Z" umschließen

  • /..-Felder müssen mit Hochkomma ".." umschlossen werden
  • Hat der SAP-Kunde einen eigenen Namensraum, werden einige Tabellen und Felder das "/" haben

Sortierung

  • Eine Sortierung nach Feldern wird mit " ORDER BY" vorgenommen

Groß-/Kleinschreibung

  • Groß-/Kleinschreibung ist wie bei ABAP nicht relevant

Leerzeilen

  • Leerzeilen sind wie bei ABAP erlaubt

Befehlsabschluß ohne Punkt

  • Der SQL-Code endet nicht mit einem Punkt

SQL-Syntax Schlüsselworte

AND NOT EXISTS

SELECT 
 mara.matnr 
 FROM mara
 WHERE mara.attyp = '11'
  AND NOT EXISTS( SELECT  mast.mandt 
                   FROM mast 
                   WHERE mast.matnr = mara.matnr )

Feld LEFT, COUNT und LIKE

select 
  left(ean11,4),
  count(*) 
  from mean 
  WHERE EANTP = 'HE' and ( ean11 like '4060%' 
                        or ean11 like '4061%' )
  group by left(EAN11,4)

Teilfeldzugriff

LEFT

--Die ersten 4 Zeilen vom Feld werden ausgelesen
left(tabelle.feldname,4),

RIGHT

right(lfa1.name1,4) as lfa1_name1,

SUBSTRING

  • Beim Substring kann man wie in ABAP "<feld>+4(3)" einen Teil eines Feldes auslesen
Substring(lfa1.name1,4,3) as lfa1_name1,

SELECT TOP 100, LIKE und ORDER BY

select top 100 
   B.SATNR, 
   B.MATNR,
   A.COLOR,
   A."/Z/SD_PRLINE",
   B.FSH_SEASON_YEAR, 
   B.FSH_SEASON, 
   B.FSH_COLLECTION, 
   B.FSH_THEME, 
   B."/Z/MSTAE",
   B."/Z/MSTDE"
 from mara as A 
    inner join fsh_seasons_mat as B
      on A.matnr = B.matnr
  where B.satnr like '%1015370' 
    and A.color like '%' 
 order by A.COLOR

(SELECT CASE .. WHEN .. THEN .. ELSE) und SUM

SELECT
  aupo.abeln,
  aupo.matnr,
  case
     when aupo.matnr not like 'L%'
       then aupo.pmnge
     else sum(stpo.menge)
  end as Menge
  from aupo 
  left join mast
    on aupo.matnr = mast.matnr
  left join stpo 
    on mast.stlnr = stpo.stlnr
  where aupo.abeln = '0000006542'
  group by aupo.abeln,
           aupo.matnr, 
           aupo.pmnge

JOIN 2 Tabellen mit gleichem Namen AS

select
knvp_we.vkorg,
knvp_we.vtweg,
knvp_we.spart,
knvp_we.KUNNR as AG,
knvv.loevm,
knvp_we.parvw as PARVW,
knvp_we.kunn2 as WE,
knvp_mf.parvw AS PARVW2,
knvp_mf.kunn2 as MF

from knvp as knvp_we

inner join knvp as knvp_mf
  ON knvp_mf.kunnr = knvp_we.kunn2

inner join knvv
  ON knvp_we.kunnr  = knvv.kunnr
  and knvp_we.vkorg = knvv.vkorg
  and knvp_we.vtweg = knvv.vtweg
  and knvp_we.spart = knvv.spart

where knvp_we.kunnr = '0000655174'
  and knvp_we.parvw = 'WE'
  and knvp_mf.parvw = 'MF'
  and knvp_we.vkorg = knvp_mf.vkorg

order by knvp_we.vkorg, knvp_mf.kunn2

Andere Schreibweise vom JOIN

Etwas gewöhnungsbedürftig ist den JOIN implizit im Where-Teil des Selects abzubilden.

Aus meiner Sicht ist das schwer zu lesen und nicht empfehlenswert.

select   a.MATNR,
         a.WERKS,
         a.STAWN as "Comm. Code MARC",
         c.WSTAW as "Comm. Code MAW1",
         b.MTART

 from    marc a,
         mara b,
         maw1 c

 where   a.MATNR=b.MATNR and
         b.MATNR=c.MATNR

 and     b.MTART='ZLOT'

 and     a.STAWN != c.WSTAW;

Web-Links