Feld einer Tabellenstruktur auslesen

Benutzeroberflächen in SAP®-Systemen.
11 Beiträge • Seite 1 von 1
11 Beiträge Seite 1 von 1

Feld einer Tabellenstruktur auslesen

Beitrag von f.weissenberger (ForumUser / 12 / 3 / 0 ) » 02.01.2020 07:50
Hallo Zusammen,

ich möchte gerne ein Feld auslesen.

Mit einem SELECT würde ich das so gestalten:

Code: Alles auswählen.

Select single * from smeinh
  where matnr = t_main-matnr.

was jedoch nicht funktioniert.

Über die SE11 habe ich herausgefunden dass meine "Tabelle" SMEINH gar keine Tabelle sondern nur eine Sturktur der Tabelle MEINH ist.

Irgendwie mit READ soll das funktionierten, ich hab aber noch nicht rausgefunden wie... So jedenfalls nicht:

Code: Alles auswählen.

FORM AUSLESEN.

TABLES: SMEINH.

  read table smeinh.

  t_avor-gewicht = smeinh-brgew.

ENDFORM.

Ein Fehler wird zwar nicht angezeigt, jedoch wird auch kein Wert ausgelesen.

Kann mir das jemand erklären? (Please don't blame on me, bin neu in dem Umfeld ^^)


Re: Feld einer Tabellenstruktur auslesen

Beitrag von Tron (Top Expert / 1168 / 22 / 263 ) » 02.01.2020 09:50
Moin.
Manchmal nicht ganz einfach, die Tabelle zu "erraten", so man versucht die Feldnamen der Oberfläche zu ermitteln,um auf die Tabelle zu kommen. Man kann natürlich versuchen, über den Verwendungsnachweis auf den Tabellennamen zu kommen. Falls ich so gar keine Idee hätte, welche Tabelle dahinter steckt, kann man mit letztendlich mit einem SQL-Trace dahinter kommen.
Ich tippe mal auf Tabelle MARA(-brgew).
gruß Jens
<:: XING-Gruppe Tricktresor::>
Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen –
Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

Re: Feld einer Tabellenstruktur auslesen

Beitrag von jocoder (Specialist / 196 / 3 / 53 ) » 02.01.2020 10:40
Mit der TABLES-Anweisung deklarierst du die Struktur SMEINH nur als Schnittstellenarbeitsbereich. D.h., im Arbeitsspeicher werden nur ein paar Byte reserviert (Initialwerte) und bei Abschluss der Transaktion wieder freigegeben.
Diese Struktur wird weder durch die TABLES-Anweisung noch durch die READ TABLE-Anweisung mit Werten befüllt.
Wie Tron beschrieben hatte, musst du die Tabelle suchen, das SELECT-Statement ausführen und dann erst sind Werte vorhanden.

Re: Feld einer Tabellenstruktur auslesen

Beitrag von wreichelt (Expert / 806 / 19 / 137 ) » 02.01.2020 10:52
Hallo,
ich würde es über die Tabelle MARM lesen.

Gruß Wolfgang

Folgende Benutzer bedankten sich beim Autor wreichelt für den Beitrag:
f.weissenberger


Re: Feld einer Tabellenstruktur auslesen

Beitrag von DeathAndPain (Top Expert / 1389 / 149 / 324 ) » 02.01.2020 16:47
An dieser Stelle noch ein paar Worte zu den Grundlagen. Eine "Struktur" ist keine Tabelle, richtig, insofern kann man daraus auch nichts "lesen", weder mit SELECT noch mit irgendeinem anderen Befehl.

Eine Struktur ist eine Feldleiste, eine Gruppierung von Feldern. Im Prinzip musst Du Dir eine Struktur vorstellen wie einen TYPES-Befehl, nur dass der Datentyp nicht lokal in Deinem Programm definiert ist, sondern global in der Datenbank. Damit kannst Du in jedem Programm einfach per

Code: Alles auswählen.

DATA meinestruktur TYPE strukturname.
ein Feld dieses Typs definieren und musst nicht händisch alle Felder aufzählen mit:

Code: Alles auswählen.

DATA: BEGIN OF meinestruktur,
        feld1 TYPE typ1,
        feld2 TYPE typ2,
        ...
        feld8 TYPE typ8,
      END OF meinestruktur.
Das dient nicht nur dazu, Schreibarbeit zu sparen, sondern erlaubt es Dir auch, diesen Typ z.B. als Parametertyp von Funktionsbausteinen zu verwenden.

Von daher ist Deine Frage nicht, wie man aus solch Struktur liest, sondern wo die von Dir gesuchten Daten in Wahrheit stehen. An dieser Stelle musst Du Dich entweder in einem Dynpro (Bildschirmbild), wo der gesuchte Wert angezeigt wird, mti F1 darauf und dann über die technischen Detailinformationen oder aber über die SE11 durchhangeln, bis Du die richtige Tabelle dafür gefunden hast.

Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
f.weissenberger


Re: Feld einer Tabellenstruktur auslesen

Beitrag von f.weissenberger (ForumUser / 12 / 3 / 0 ) » 03.01.2020 08:29
wreichelt hat geschrieben:
02.01.2020 10:52
Hallo,
ich würde es über die Tabelle MARM lesen.

Gruß Wolfgang
Super, hier liegen meine Daten die ich brauche, danke!

Re: Feld einer Tabellenstruktur auslesen

Beitrag von f.weissenberger (ForumUser / 12 / 3 / 0 ) » 03.01.2020 08:34
Danke für eure ganzen Antworten, hat mir schonmal weitergeholfen.

Jetzt habe ich das ganze folgendermaßen gemacht:

Code: Alles auswählen.

FORM GEWICHT_ERMITTELN.

TABLES: MARM.

DATA: gew1 type float, "Gewicht Fertigungsmaterial/Produkt
      gew2 like gew1,  "Gewicht Ladungsträger
      gew3 like gew1.  "Gewicht Gebinde

if marm-brgew NE '' AND marm-brgew NE '0'.
  Select single * from marm
    where matnr = t_avor-matnr and meinh = 'LE'.

  t_avor-gewicht = marm-brgew.

else.
    Select single * from mara
    where matnr = t_avor-matnr.

   (hier stehen noch ein paar Selects und Rechnungen, das funktioniert alles)

    t_avor-gewicht = gew1 + gew2 + gew3.

endif.

ENDFORM.

Problem ist jetzt nur, dass sobald ein Wert in meiner ganzen Liste auf die sich das hier bezieht irgendwo marm-brgew = 0 ist, dann wird der "else" Fall für alle Einträge ausgeführt.

Wie bekomme ich das hin, dass das quasi pro Zeile passiert? Also wenn marm-brgew = 250 dann IF und nur bei den Einträgen bei denen marm-brgew = 0 dann der else fall?

Re: Feld einer Tabellenstruktur auslesen

Beitrag von jocoder (Specialist / 196 / 3 / 53 ) » 03.01.2020 08:55

Code: Alles auswählen.

FORM GEWICHT_ERMITTELN.

TABLES: MARM.

DATA: gew1 type float, "Gewicht Fertigungsmaterial/Produkt
      gew2 like gew1,  "Gewicht Ladungsträger
      gew3 like gew1.  "Gewicht Gebinde
  Select single * from marm
    where matnr = t_avor-matnr and meinh = 'LE'.  
if marm-brgew NE 0.

  t_avor-gewicht = marm-brgew.

else.
    Select single * from mara
    where matnr = t_avor-matnr.

   (hier stehen noch ein paar Selects und Rechnungen, das funktioniert alles)

    t_avor-gewicht = gew1 + gew2 + gew3.

endif.

ENDFORM.
Der Vergleich, da es sich bei BRGEW um eine Dezimalzahl handelt, kann wie hier einfacher gestaltet werden.

Folgende Benutzer bedankten sich beim Autor jocoder für den Beitrag:
f.weissenberger


Re: Feld einer Tabellenstruktur auslesen

Beitrag von f.weissenberger (ForumUser / 12 / 3 / 0 ) » 03.01.2020 11:43
jocoder hat geschrieben:
03.01.2020 08:55

Code: Alles auswählen.

FORM GEWICHT_ERMITTELN.

TABLES: MARM.

DATA: gew1 type float, "Gewicht Fertigungsmaterial/Produkt
      gew2 like gew1,  "Gewicht Ladungsträger
      gew3 like gew1.  "Gewicht Gebinde
  Select single * from marm
    where matnr = t_avor-matnr and meinh = 'LE'.  
if marm-brgew NE 0.

  t_avor-gewicht = marm-brgew.

else.
    Select single * from mara
    where matnr = t_avor-matnr.

   (hier stehen noch ein paar Selects und Rechnungen, das funktioniert alles)

    t_avor-gewicht = gew1 + gew2 + gew3.

endif.

ENDFORM.
Der Vergleich, da es sich bei BRGEW um eine Dezimalzahl handelt, kann wie hier einfacher gestaltet werden.

Genau so, wie ich es brauch! Danke !

Re: Feld einer Tabellenstruktur auslesen

Beitrag von DeathAndPain (Top Expert / 1389 / 149 / 324 ) » 03.01.2020 11:44
Trotzdem gefällt mir der ganze Code nicht. Er folgt einem antiquierten und schlechtem Programmierstil.

Den TABLES-Befehl sollte man heutzutage nur noch in Ausnahmefällen verwenden, nicht aber, wenn man einfach nur ein Feld braucht (Felder deklariert man mit DATA). In einigen Sonderfällen braucht man ihn tatsächlich noch, weil unter bestimmten Umständen durch ihn nützliche Werte "vom Himmel fallen" können, aber die sind dann global, so dass der TABLES immer am Anfang und nicht in einer Formroutine stecken sollte. In Deinem Fall hättest Du eine ordentliche Workarea definieren und DATA WA_MARM TYPE MARM. schreiben können, gefolgt von SELECT SINGLE * INTO WA_MARM FROM MARM. Womit wir freilich schon zum nächsten Punkt kommen, dem unnötigen Verwenden von SELECT *. Damit überträgst Du die gesamte Tabellenzeile aus der Datenbank, obgleich Du bei Licht betrachtet nur die Spalte BRGEW daraus benötigst. Zum einen macht das Dein Programm langsamer und die Last auf der Datenbank größer (unnötiger Datentransport), zum anderen macht es Dein Programm auch schlechter für Leute lesbar, die nach Dir kommen (Dich selbst in ein paar Monaten eingeschlossen), denn bei einem SELECT * sieht man nicht, welche Daten Du eigentlich brauchst. Bei Deiner kleinen Form mag das nicht so schlimm sein, aber ich rate Dir, es Dir gleich richtig anzugewöhnen, denn bei komplexeren Programmen ist man als Leser, der das verstehen soll, für jede derartige Hilfe dankbar.

Besser wäre also gewesen (anstelle der Workarea auf die ganze Tabelle):

Code: Alles auswählen.

DATA BRGEW TYPE MARM-BRGEW.
SELECT SINGLE BRGEW INTO BRGEW FROM MARM
 WHERE...
zu schreiben.
if marm-brgew NE 0.
kann man sicherlich machen, noch anschaulicher für den Leser ist freilich

Code: Alles auswählen.

if marm-brgew IS NOT INITIAL.
Dann brauchst Du Dir auch keine Gedanken über den genauen Datentyp von MARM-BRGEW zu machen.

Und schließlich fehlt Deiner FORM die Schnittstellendefinition. Offenbar ist t_avor global definiert, was ganz hässlich ist, da man dann nicht erkennen kann, welche Werte in Deine FORM reingehen und welche herauskommen. Du solltest Deine FORM mit

Code: Alles auswählen.

FORM GEWICHT_ERMITTELN CHANGING AVOR TYPE type_of_t_avor.
definieren, wobei Du natürlich anstelle von type_of_t_avor den richtigen Datentyp einer Zeile von t_avor angibst. In der Form arbeitest Du dann nur mit dem Feld avor. Dann sieht man beim PERFORM GEWICHT_ERMITTELN CHANGING t_avor, was in die FORM rein- und rausgeht, und nach Ausführung der FORM hat sich im aufrufenden Programm nicht auf wundersame (d.h. schwer nachvollziehbare) Weise der Inhalt von t_avor verändert.

Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
jocoder


Re: Feld einer Tabellenstruktur auslesen

Beitrag von jocoder (Specialist / 196 / 3 / 53 ) » 03.01.2020 12:20
Kann mich meinem Vorgänger nur anschließen.
Anstatt die Variablen gew1, gew2 und gew3 zu nennen, können diese aussagekräftigere
Namen bekommen. In Zukunft weiß so jeder was sich hinter der Variable verbirgt.

So sieht es doch gleich viel besser aus oder?

Code: Alles auswählen.

FORM gewicht_ermitteln CHANGING avor TYPE type_of_t_avor.

  DATA: gew_produkt type float,
        gew_ladungstraeger like gew_produkt, 
        gew_gebinde like gew_produkt. 

  SELECT SINGLE brgew FROM marm
    WHERE matnr = avor-matnr AND meinh = 'LE'.
 
  IF marm-brgew IS NOT INITIAL.
    avor-gewicht = marm-brgew.
  ELSE.
    SELECT SINGLE * FROM mara
    WHERE matnr = avor-matnr.

   (hier stehen noch ein paar Selects und Rechnungen, das funktioniert alles)

    avor-gewicht = gew_produkt + gew_ladungstraeger + gew_gebinde.

  ENDIF.

ENDFORM.
Vielleicht kannst du SELECT SINGLE * FROM mara optimieren, dass tatsächlich nur die benötigten
Felder gelesen werden.

Seite 1 von 1

Vergleichbare Themen

Feld bzw. String auslesen
von robin1at » 08.06.2006 08:07
wert aus Feld auslesen
von bibo » 06.04.2006 13:55
ein Feld aus der ? Tabelle auslesen
von HH_ABAP » 28.01.2019 16:05
Prozessauftrag - Feld ein-/auslesen
von KleinerEisbaer » 27.09.2007 11:53
Feld einer Tabelle auslesen
von Alexity » 16.09.2019 13:44