Funktionsbaustein für einfache Abfrage

Getting started ... Alles für einen gelungenen Start.
9 Beiträge • Seite 1 von 1
9 Beiträge Seite 1 von 1

Funktionsbaustein für einfache Abfrage

Beitrag von Mueller.D (ForumUser / 2 / 0 / 0 ) »
Hallo,
ich bin absoluter Neuling und habe eine Frage. Aktuell arbeite ich das BC400 durch und möchte einen Funktionsbaustein erstellen.

Meine "Projekt" ist wie folgt:
Ich habe eine Tabelle mit Spalte ID und Spalte Name.
Der Funktionsbaustein soll schauen ob eine ID + Name in der Tabelle stimmt und dann einfach ture, oder false zurück gibt.
Ich hätte das mit einem Select Single gemacht, da es für mich schon genug ist, wenn er nch dem ersten Wert aufhört.

Wirklich weit bin ich noch nicht, deshalb wäre ich um Hilfe Dankbar.
Falls jemand den Code dafür posten kann, dann wäre ich um eine kleine Beschreibung dankbar, damit ich es nachvollziehen kann.

Danke für eure Hilfe!

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Funktionsbaustein für einfache Abfrage

Beitrag von a-dead-trousers (Top Expert / 4271 / 213 / 1140 ) »
Du sollst ja auch was lernen:
Laut Hilfe/Beschreibung von SELECT liefert der Befehl, wenn nichts gefunden wurde, einen sog. Returncode zurück.
Diesen musst du nur prüfen und im Fehlerfall ein True (= 'X', 'Y', 'J' oder '1' je nach Wunsch) oder False (= ' ', 'N' oder '0') zurückliefern.
(In ABAP gibt es leider keinen echten boolschen Datentyp daher die Krücken mit 'X'/' ', 'J'/'N', 'Y'/'N', '1'/'0')
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Funktionsbaustein für einfache Abfrage

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »
Ich hätte das mit einem Select Single gemacht, da es für mich schon genug ist, wenn er nch dem ersten Wert aufhört.
Vollkommen richtig. Die Frage, die Dich womöglich umtreibt (und die ich persönlich auch so ganz spannend finde), ist, was man selektieren soll, wenn man inhaltlich gar nichts aus der Tabelle braucht, sondern - wie in Deinem Fall - nur die Existenz einer Zeile klären möchte.

Die einfachste, aber auch schlechteste Antwort wäre * zu lesen. Dann holt man alle Spalten, von denen man nicht eine einzige braucht, aus der Datenbank und bewegt damit sinnlos Daten.

Man kann SELECT COUNT( * ) machen. Dann ist der Stern nur formal und man bekommt die Anzahl der passenden Zeilen (0 oder eben nicht 0) zurück. Gefällt mir aber auch nicht wirklich, weil die Datenbank dann nach der ersten Fundstelle weitersucht und zählt, obwohl das in Deiner (durchaus alltäglichen) Fragestellung ja gar nicht relevant ist.

Was ich in solch Fall immer mache, ist mir ein lokales Feld vom Typ MANDT zu definieren. (Kann man IMHO sogar als globales Feld vertreten, wenn man das öfter im Code braucht, da der Inhalt trivial ist, so dass dies nicht die Verständlichkeit des Codes beeinträchtigt.) MANDT ist ein kleines Characterfeld, das in so ziemlich jeder Tabelle existiert. Dann mache ich einen

SELECT SINGLE mandt INTO mandt FROM yourtable WHERE...

und prüfe dann wie von a-dead-trousers angeregt den SY-SUBRC.

Ich würde aber gerne die Frage in die Runde geben, ob meine geschilderten theoretischen Überlegungen zur Performance, die ich nie nachgemessen habe, hinhauen und/oder ob es noch performantere Ansätze gibt.
(In ABAP gibt es leider keinen echten boolschen Datentyp daher die Krücken mit 'X'/' ', 'J'/'N', 'Y'/'N', '1'/'0')
Also inhaltlich gibt es den schon, und er heißt BOOLEAN_FLG. Jedenfalls gilt in ABAP eigentlich überall der Grundsatz, dass 'X' = true und SPACE = false ist. So sind auch die Konstanten ABAP_TRUE und APAB_FALSE definiert, und auch z.B. bei Checkboxen, Radiobuttons, Markierspalten in Table Controls usw. handhabt ABAP das so. Ich weiß, dass es diverse andere bool-ähnliche Datentypen gibt, die mit anderen Werten wie den von Dir genannten hantieren, aber für mich ist sowas ein sinnfreies Abweichen vom Standard.

Re: Funktionsbaustein für einfache Abfrage

Beitrag von a-dead-trousers (Top Expert / 4271 / 213 / 1140 ) »
DeathAndPain hat geschrieben:Also inhaltlich gibt es den schon, und er heißt BOOLEAN_FLG. Jedenfalls gilt in ABAP eigentlich überall der Grundsatz, dass 'X' = true und SPACE = false ist. So sind auch die Konstanten ABAP_TRUE und APAB_FALSE definiert, und auch z.B. bei Checkboxen, Radiobuttons, Markierspalten in Table Controls usw. handhabt ABAP das so. Ich weiß, dass es diverse andere bool-ähnliche Datentypen gibt, die mit anderen Werten wie den von Dir genannten hantieren, aber für mich ist sowas ein sinnfreies Abweichen vom Standard.
Die Y/N bzw. J/N tauchen zugegebenermaßen nur sehr selten auf (z.B. POPUP_TO_CONFIRM) aber 1/0 ist auch an vielen Stellen im Standard in Verwendung (z.B. SCREEN oder in GUI-Controls)
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Funktionsbaustein für einfache Abfrage

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »
a-dead-trousers hat geschrieben:Die Y/N bzw. J/N tauchen zugegebenermaßen nur sehr selten auf (z.B. POPUP_TO_CONFIRM)
POPUP_TO_CONFIRM liefert die Nummer der gedrückten Schaltfläche zurück, also '1', '2' oder 'A', falls man einen Cancel-Button eingeblendet und genutzt hat oder der Anwender einfach das Popup-Fenster mit dem Kreuz in der Ecke geschlossen hat. Das ist also kein boolescher Wert.
a-dead-trousers hat geschrieben:aber 1/0 ist auch an vielen Stellen im Standard in Verwendung (z.B. SCREEN oder in GUI-Controls)
Ja, das stimmt. Finde ich sehr unglücklich, besonders weil es dennoch Characterfelder sind. Das machen sich auch die wenigsten Programmierer klar; man sieht ständig

Code: Alles auswählen.

SCREEN-ACTIVE = 0.
anstatt

Code: Alles auswählen.

SCREEN-ACTIVE = '0'.
was zu einer unnötigen Typkonvertierung im Hintergrund führt. Nicht schlimm, aber zeigt halt, dass der Programmierer sich der Umstände nicht bewusst war.

Analog dazu coden die meisten auch

Code: Alles auswählen.

LEAVE TO SCREEN 0.
mit den gleichen Konsequenzen. An der Stelle hätte die SAP es sogar verhindern können, indem sie die typgerechte Versorgung des Parameters gefordert hätte (wohingegen Zuweisungen immer automatisch konvertieren, was besser auch so bleiben sollte). Wenn die SAP das beim LEAVE-Befehl syntaktisch durchgesetzt hätte, dann hätte mich mal interessiert, wie viele Nasen heuer LEAVE TO SCREEN CONV #( 0 ) gecodet hätten. :-D

Re: Funktionsbaustein für einfache Abfrage

Beitrag von Daniel (Specialist / 314 / 68 / 44 ) »
DeathAndPain hat geschrieben:Ja, das stimmt. Finde ich sehr unglücklich, besonders weil es dennoch Characterfelder sind. Das machen sich auch die wenigsten Programmierer klar; man sieht ständig

Code: Alles auswählen.

SCREEN-ACTIVE = 0.
anstatt

Code: Alles auswählen.

SCREEN-ACTIVE = '0'.
was zu einer unnötigen Typkonvertierung im Hintergrund führt. Nicht schlimm, aber zeigt halt, dass der Programmierer sich der Umstände nicht bewusst war.
Bei SCREEN-ACTIVE ist es harmlos.
In diesem Fall nicht:

Code: Alles auswählen.

IF MKPF-BLDAT LE 20151231.
Typischer Fehler wenn sich ein Programmierer nicht über
Datentypen im Klaren ist.

Re: Funktionsbaustein für einfache Abfrage

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »
Hehe ja. Wobei, entweder man weiß, wie Datümer intern repräsentiert werden, oder man weiß es nicht (dann wird man auch nicht mit YYYYMMDD antreten). Es halb zu wissen ist ganz schlecht - und ein Programmierer, der sowas codet, wird ganz schnell merken, dass sein Kram nicht funktioniert.

Re: Funktionsbaustein für einfache Abfrage

Beitrag von Daniel (Specialist / 314 / 68 / 44 ) »
Das war ein Beispiel aus dem echten Leben.
Und es hat keiner gemerkt. Nur die Anwender
waren verwirrt ...

Re: Funktionsbaustein für einfache Abfrage

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »

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


Seite 1 von 1

Vergleichbare Themen

3
Antw.
4782
Views
Einfache ALV Ausgabe
von erzoo24 » 01.07.2015 10:43 • Verfasst in ABAP® für Anfänger
1
Antw.
6997
Views
Einfache Linie in SAPScript
von the » 27.04.2007 11:19 • Verfasst in ABAP® für Anfänger
5
Antw.
385
Views
VBA RFC einfache Daten abholen
von zero88 » 10.05.2022 15:42 • Verfasst in ABAP® für Anfänger
28
Antw.
12945
Views
Einfache Frage: RFBIBL00 vs. CT vs. ???
von ralf.wenzel » 30.08.2007 11:40 • Verfasst in ABAP® Core
0
Antw.
5151
Views
ALV Kapselung für einfache Tabellen
von Thomas R. » 11.08.2005 12:02 • Verfasst in Tips + Tricks & FAQs

Aktuelle Forenbeiträge

Zugriff auf Daten via Webdav
vor einer Stunde von msfox 2 / 37
Interne Tabelle
vor 18 Stunden von sap_enthusiast 3 / 163
Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 71

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

Zugriff auf Daten via Webdav
vor einer Stunde von msfox 2 / 37
Interne Tabelle
vor 18 Stunden von sap_enthusiast 3 / 163
Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 71

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 71
Group Items auf einer Filterbar
vor einer Woche von Bright4.5 1 / 111
tRFC Transaktionen SM58
vor 4 Wochen von A6272 1 / 141