Logische Operatoren und binäre Zahlen

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

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

Logische Operatoren und binäre Zahlen

Beitrag von Barney (Specialist / 104 / 20 / 9 ) »
Hallo, ich glaube, ich habe mal wieder ein Brett vorm Kopf.

Ich habe eine Steuertabelle mit acht Spalten, wo jede Spalte nur 0 oder 1 als Inhalt haben kann. Da ich nicht immer einzelne Konstellationen separat abfragen wollte, kam mir die Idee, alle Spalten zusammen als binäre Zahl zu interpretieren. So kann ich mit einfachen Mustern abfragen, ob eine bestimmte Konstellation gegeben ist.

Beispiel: Die Tabelle für Lagertyp xyz die Werte 00000110 = 6 wegen 1*2^2 + 1*2^1. Das hätte den Vorteil, dass ich alle zusammen mit IF WERT = 6 abfragen kann, oder einzelne Schalter mit dem entsprechenden UND-Operator: wenn ich wissen will, dass die drittletzte Spalte = 1 ist: 6 (00000110) und 4 (00000100) = 4 (00000100).

Ich habe auch nun eine Routine, die aus den acht Spalten meine Zahl ermittelt, so dass ich als Ergebnis von 00000110 6 bekomme.

Soweit, so gut. Nun kann es sein, dass derselbe Lagertyp eine zwei Regel hat (zum Beispiel: 00000111 = 7). Diese beiden Regeln sollen nun mit ODER verknüpft werden.

Also: 6 ODER 7 = 7.

Als Operatoren kommen ja meines Wissens nur BIT-AND und BIT-OR in Frage. Dazu muss ich meine Werte als Datentyp X oder noch besser XSTRING vorliegen haben. Beides sind aber hexadezimale Daten.

Wie konvertiere ich nun korrekterweise meine dezimale Zahl (wenn sie in einem Charcterfeld drinsteht), vernüftigerweise in das Format XSTRING?

Das hier ist offensichtlich falsch, denn hier übertrage nur die Ziffern (Dezimal 63 --> Hex 63 ist nicht dasselbe)

Code: Alles auswählen.

DATA lf_xs TYPE xstring.
DATA lf_xs2 TYPE xstring.
DATA lf_erg TYPE xstring.
DATA lf_test(4) TYPE c.

lf_test = '65'.
lf_xs2 = '63'.

NEW-PAGE.

MOVE lf_test TO lf_xs.
WRITE lf_xs.
WRITE /.

lf_erg = lf_xs BIT-AND lf_xs2.

WRITE lf_erg.
WRITE /.
Statt des erwarteten Ergebnis 1 erhalte ich 61 (was für 63H AND 65H auch stimmt). Also wie konvertiere ich lf_test nach lf_xs, so dass lf_xs nachher 41H ist? Und wie konvertiere ich später das Ergebnis lf_erg zurück?

Danke im Voraus...

Tot ziens

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


Re: Logische Operatoren und binäre Zahlen

Beitrag von Barney (Specialist / 104 / 20 / 9 ) »
Nachtrag: möglicherweise ist XTRING als Typ auch falsch, aber was wäre denn der richtige Datentyp?

Re: Logische Operatoren und binäre Zahlen

Beitrag von ewx (Top Expert / 4786 / 294 / 629 ) »

Code: Alles auswählen.

REPORT demo_data_set_get_bit .

* set bit

DATA hex(3) TYPE x.

SET BIT: 09 OF hex TO 1,
         10 OF hex TO 0,
         11 OF hex TO 1,
         12 OF hex TO 1,
         13 OF hex TO 0,
         14 OF hex TO 1,
         15 OF hex TO 0,
         16 OF hex TO 1.

WRITE hex.

ULINE.

* get bit

DATA: hex1(1) TYPE x VALUE 'B5',
      b(1) TYPE n.

DO 8 TIMES.
  GET BIT sy-index OF hex1 INTO b.
  WRITE b NO-GAP.
ENDDO.
Allerdings glaube ich, dass du es dir damit unnötig kompliziert machst. Die "Muster" musst du ja auch irgendwie definieren.
da ist es doch einfacher, die einzelnen Zustände abzufragen.
Zudem möchte ich hinterher nicht dein Programm korrigieren müssen, in dem du "irgendwelche" Regeln mit "6" abfragst.

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
Barney


Re: Logische Operatoren und binäre Zahlen

Beitrag von Barney (Specialist / 104 / 20 / 9 ) »
Hi, erstmal vielen Dank. Zu Deiner Nachbemerkung: Du hast vollkommen recht - wenn ich das auf der grünen Wiese entwicklen müsste, würde ich das auch so nicht konzipieren.

Ich habe aber hier einen Moloch geerbt, der hier den gesamten Materialfluss über die Tabelle steuert. Heute werden aus den 1 und 0 sozusangen nur "WAHR" oder "FALSCH" ermittelt, dass heißt, man kann im Materialfluss immer nur links oder rechts unterscheiden. Jetzt haben wir eine Anforderung, wo man zwischen links, recht und gradeaus entscheiden muss und da kommt die bestehende Logik in Schwulitäten. Also muss ich die Logik etwas aufbohren, ohne gleich alles andere zu gefährden. Deswegen will ich an der Stelle, wo aus den 1 und 0 "WAHR" oder "FALSCH" wird, eine Methode einfügen, die auch andere Werte als "WAHR" oder "FALSCH" zulässt. Dadurch lasse ich komplette Logik ungetastet und muß nur in der bestehenden Steuertabelle für den betreffenden Lagertyp eine Zeile hinzufügen für den zusätzlichen Wert.

Das alles ist nicht optimal, aber leider haben wir keine Zeit, die bestehende Lösung neu zu konzipieren und vernünftig aufzusetzen.

Mittlerweile habe ich festgestellt, dass auch über Integer geht:

Code: Alles auswählen.

DATA lf_x TYPE x.
DATA lf_x2 TYPE x.
DATA lf_erg TYPE x.
DATA lf_test(4) TYPE c.
data lf_zahl type i.

lf_test = '65'.
move lf_test to lf_zahl.
move lf_zahl to lf_x.
lf_zahl  = '63'.
move lf_zahl to lf_x2.


NEW-PAGE.

*move lf_test TO lf_x.
WRITE lf_x.
WRITE /.

lf_erg = lf_x BIT-AND lf_x2.
*lf_erg =  bit-and lf_x2.

WRITE lf_erg.
WRITE /.

Seite 1 von 1

Vergleichbare Themen

3
Antw.
423
Views
Leerzeichen mit Operatoren CA und NA finden?
von Alexity » 08.08.2019 13:07 • Verfasst in ABAP® für Anfänger
4
Antw.
2375
Views
Berechnungsformeln mit variablen Operatoren verwenden
von isp » 16.07.2014 10:09 • Verfasst in ABAP® Core
2
Antw.
1063
Views
logische DB: Knotentypen T, S, C, A
von Gast » 07.01.2005 12:05 • Verfasst in ABAP® Core
5
Antw.
1938
Views
Logische Ausdrücke
von Namp » 17.02.2006 10:09 • Verfasst in SAP - Allgemeines
9
Antw.
8487
Views
Logische Datenbanken - ADA
von Luny » 23.11.2009 15:16 • Verfasst in ABAP® für Anfänger

Ü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.