Binary search SY-SUBRC = 4 obwohl Eintrag vorhanden (HEX identisch)

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
21 Beiträge • Seite 1 von 2 (current) Nächste
21 Beiträge Seite 1 von 2 (current) Nächste

Binary search SY-SUBRC = 4 obwohl Eintrag vorhanden (HEX identisch)

Beitrag von Romaniac (Specialist / 198 / 57 / 26 ) »
Hallo zusammen,

Ich habe ein Programm geändert das eine Exceldatei hochlädt und dann Zyklen ändert, in einem Unterprogramm prüfe ich die enthaltenen Kostenstellen auf Existenz. Soweit so gut, aber beim Lesen der internen Tabelle kann ABAP keinen Eintrag finden obwohl er vorhanden ist.

Ich lese die CSKS mit komplettem Schlüssel und for all Entries der Uploaddatei-Kostenstellen in eine interne Tabelle mit genau einer Spalte KOSTL, danach sortiere ich die Tabelle. Beim loop über den upload prüfe ich die Existenz der Kostenstelle mit einem READ TABLE BINARY Search, wegen den paar Einträgen wollte ich jetzt keine sorted table anlegen. Und dieser Zugriff findet nichts obwohl die Kostenstelle einthalten ist.

Lesen CSKS
Lesen_CSKS.jpg

Lesen LT_CSKS
Lesen_LT_CSKS.jpg

Tabelle:
LT_CSKS.jpg
Wie man in der internen Tabelle sehen kann, ist die Sortierung scheinbar nicht aufsteigend wegen unterschiedlicher Stringlängen (Z6AF* kommt vor Z6AE*), aber ich war immer der Meinung ein SORT und der folgende BINARY SEARCH verstehen sich miteinander?


Was habe ich hier falsch gemacht? ( --> ich verwende jetzt eine sorted table )

Danke und Gruß,

Wolfgang
Zuletzt geändert von Romaniac am 31.01.2024 15:11, insgesamt 1-mal geändert.
Geht nicht gibts nicht

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


Re: Binary search SY-SUBRC = 4 obwohl Eintrag vorhanden (HEX identisch)

Beitrag von Romaniac (Specialist / 198 / 57 / 26 ) »
Hier noch der Stringvergleich Wert interner Tabelle <> Lesezugriff:
Vergleich Strings.jpg
Geht nicht gibts nicht

Re: Binary search SY-SUBRC = 4 obwohl Eintrag vorhanden (HEX identisch)

Beitrag von a-dead-trousers (Top Expert / 4287 / 214 / 1142 ) »
Ohne jetzt den Rest deines Programms gesehen zu haben: Da fehlt entweder ein SORT in ABAP oder ein ORDER BY in HANA (im Select-Statement)
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: Binary search SY-SUBRC = 4 obwohl Eintrag vorhanden (HEX identisch)

Beitrag von Romaniac (Specialist / 198 / 57 / 26 ) »
Sorry, der Sort ist natürlich vorhanden, hatte ich im Screenshot unterschlagen:
Lesen_CSKS.jpg
Geht nicht gibts nicht

Re: Binary search SY-SUBRC = 4 obwohl Eintrag vorhanden (HEX identisch)

Beitrag von qyurryus (Specialist / 107 / 81 / 45 ) »
Allgemeine Empfehlung (mag ein "Hot Take" sein): von Verwendung von BINARY SEARCH in den meisten Fällen absehen - Grund: siehste hier. Das macht dein Leben unnötig kompliziert, wenn eine SORTED TABLE das selbe erreicht.

Zweite Empfehlung: beim Sortieren immer explizit das Sortierkriterium und Sortierrichtung angeben. Vor allem bei Inline-Deklarierten Tabellen wie hier ist das Verhalten des SORTs sonst intransparent.
Hier wäre das also

Code: Alles auswählen.

SORT lt_csks BY kostl ASCENDING.

Re: Binary search SY-SUBRC = 4 obwohl Eintrag vorhanden (HEX identisch)

Beitrag von Romaniac (Specialist / 198 / 57 / 26 ) »
Danke Dir,

der binary ist bei mir jetzt eh gestorben. Mit der sorted table musst halt auch eine Tabelle anlegen und kannst die Inline-Deklaration beim Select Statement nicht nutzen. (mein aktueller Stand)

Gruß Wolfgang
Geht nicht gibts nicht

Re: Binary search SY-SUBRC = 4 obwohl Eintrag vorhanden (HEX identisch)

Beitrag von black_adept (Top Expert / 3950 / 105 / 886 ) »
Binary Search ist schon ok, wenn die Tabelle sortiert vorliegt. Aber deine Tabelle ist nicht - wie du ja schon selber gesagt hast - nicht sortiert. Ich glaube nicht, dass das irgendwas mit Stringlängen zu tun hat. Hast du mal im Debugger geschaut, ob tatsächlich in der Zeile 484 die Sortierung falsch läuft (und nicht nachher noch mal was an der Reihenfolge geändert wird )? Denn so was habe ich bisher noch nicht gesehen.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Binary search SY-SUBRC = 4 obwohl Eintrag vorhanden (HEX identisch)

Beitrag von Romaniac (Specialist / 198 / 57 / 26 ) »
Hallo Stefan,

Hier der Quellcode der fehlerhaften Version, meine Vermutung ist jetzt, dass es an der Anweisung "for all entries" liegen müsste, der Inhalt ist vor und nach dem Sort identisch:
Binary_search.jpg
Vor und nach dem Sort:
Sort.jpg
Wenn ich allerdings in einem Testprogramm mit Select-Option Z6A* Kostenstellen lese, sind die korrekt sortiert:
Sort_testprogramm.jpg
Testprogramm:
Geht nicht gibts nicht

Re: Binary search SY-SUBRC = 4 obwohl Eintrag vorhanden (HEX identisch)

Beitrag von Romaniac (Specialist / 198 / 57 / 26 ) »
Testprogramm.jpg
Geht nicht gibts nicht

Re: Binary search SY-SUBRC = 4 obwohl Eintrag vorhanden (HEX identisch)

Beitrag von msfox (Specialist / 311 / 50 / 64 ) »
Warum macht man hier eigentlich ein SORT und nimmt nicht "ORDER BY" schon beim SELECT? Da bekommt man die Daten schon von der DB sortiert.

Re: Binary search SY-SUBRC = 4 obwohl Eintrag vorhanden (HEX identisch)

Beitrag von Romaniac (Specialist / 198 / 57 / 26 ) »
Ist korrekt. Erklärt aber nicht warum der sort hier nicht funktioniert.
Geht nicht gibts nicht

Re: Binary search SY-SUBRC = 4 obwohl Eintrag vorhanden (HEX identisch)

Beitrag von qyurryus (Specialist / 107 / 81 / 45 ) »
Hatte ich in meinem vorigen Beitrag schon geschrieben.
Schreib deinen Sort Befehl komplett aus.

Wenn du das Sortierkriterium weglässt wird implizit mit dem Primary Key der Tabelle sortiert. Deine Tabelle ist aber inline deklariert und warhscheinlich so ohne Key (?).

Re: Binary search SY-SUBRC = 4 obwohl Eintrag vorhanden (HEX identisch)

Beitrag von Romaniac (Specialist / 198 / 57 / 26 ) »
Das ist auch meine Vermutung. Nur hätte ich das eben nicht erwartet weil das bisher immer funktioniert hat, wenn die Tabelle eh nur eine Spalte hat und der sort per Default immer ascending ist sollte das auch reichen dachte ich. Bisher :-)
Geht nicht gibts nicht

Re: Binary search SY-SUBRC = 4 obwohl Eintrag vorhanden (HEX identisch)

Beitrag von msfox (Specialist / 311 / 50 / 64 ) »
Warum müssen die Entwickler an jeder Codezeile und jedem Befehl sparen...?
Für mich ist es lesbarer, wenn man sieht was der Quellcode macht und nicht noch überlegen muss, was da wirklich passiert. Daher gebe ich immer die Attribute + ASCENDING oder DESCENDING an.

OT:
Ich entwickle jetzt seit 15 Jahren ABAP. Nach und nach hat die SAP immer neue Befehle (z.B. Inlinedeklaration, FOR etc.) eingefügt. Nicht immer verwende ich diese, da mir nicht alle geläufig sind bzw. sich viele durch Strg + Leertaste nicht auswählen lassen. Dafür setzte sich aber andere Entwickler hin und fangen plötzlich an, meinen Quellcode auf die neue Syntax umzustellen, nur um ein paar Zeilen zu sparen. Das hat zur Folge, dass es z.T. unlesbarer wird und beim Debuggen schwieriger wird.

Re: Binary search SY-SUBRC = 4 obwohl Eintrag vorhanden (HEX identisch)

Beitrag von Romaniac (Specialist / 198 / 57 / 26 ) »
Ich entwickle ABAP seit 29 Jahren, den binary verwende ich selbst gar nicht mehr, er stand aber so in dem Programm. Ich baue aber nicht das ganze Programm um wenn ich nur an bestimmten Stellen was ändern muss darum lies ich sort und binary search stehen. Hat ja vorher (seit es ABAP gibt) auch funktioniert.

Ich vermute es liegt an der Inline Declaration weil die Tabelle dann wohl keinen Primärschlüssel hat, in der Hilfe steht auch auch, dass der Sort mit Sortierschlüssel angegeben werden sollte:
Es wird empfohlen, wenn möglich einen expliziten Sortierschlüssel hinter BY anzugeben. Die implizite Sortierung nach dem primären Tabellenschlüssel, der bei Standardtabellen selbst wieder implizit als Standardschlüssel definiert sein kann, macht ein Programm schwerer verständlich und sorgt unter Umständen für überraschendes Verhalten.
Ich verwende die neueren Anweisungen / Inline Declaration schon wenn der Code trotzdem lesbar und debugging möglich bleibt ( VALUE #() und CORRESPONDING #() zum Beispiel sind doch elegante Ausdrücke mit viel Macht )

Aber: Wieder was gelernt :-)

Folgende Benutzer bedankten sich beim Autor Romaniac für den Beitrag (Insgesamt 2):
msfoxMurdock

Geht nicht gibts nicht

Vergleichbare Themen

5
Antw.
23571
Views
Prüfen ob Eintrag in DB Tabelle schon vorhanden
von clinke » 10.10.2006 08:56 • Verfasst in ABAP® für Anfänger
1
Antw.
4543
Views
Select-Abfrage ob Eintrag vorhanden oder nicht
von Danny » 27.01.2005 08:04 • Verfasst in ABAP® Core
2
Antw.
2220
Views
sy-subrc oder syst-subrc?
von genua » 31.10.2007 11:55 • Verfasst in ABAP® für Anfänger
6
Antw.
603
Views
BINARY MODE zu PDF Datei konvertieren
von ABAPlerv » 16.12.2022 11:14 • Verfasst in ABAP® für Anfänger
1
Antw.
761
Views
Float Werte im Excel sind nicht identisch.
von Mykola » 22.11.2017 10:12 • Verfasst in ABAP® Core

Über diesen Beitrag



Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

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.