Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hallo zusammen,

ich habe folgendes Problem.

Vorgeschichte, warum die alte Lösung nicht mehr genommen werden kann:

Ich habe diverse Artikel, die angekreuzt werden, ob Sie benutzt werden oder nicht. Dieses Ankreuzen wird in Oracle mit einer "0" bzw. einer "1" in einem Number-Feld gesichert.

Aus diesen Angekreuzten Artikeln ergeben sich bestimmte Ausgabe-Kombinationen in einem Layoutprogramm.

Dazu habe ich zuvor die Nullen und Einsen (also eine Binärzahl) zusammengefasst und mit BIN_TO_NUM in eine Number umgerechnet. Diese Number wird - wie der Name sagt - ebenfalls in einem Numberfeld gesichert.

Mit Hilfe der gleichen Dezimalzahlen sehe ich dann, welche Kombinationen zusammengefasst werden können (gleiche Dezimalzahl = gleiche Ausgabe).

Das hat auch wunderbar funktioniert.

Nur leider haben wir jetzt einen Kanidaten der mehr als 126 Artikel benutzt und damit das in Oracle verfügbare Number-Feld ausreizt.

Da ich keinen Datentypen gefunden habe, der größer ist, haben meine Kollegen und ich beschlossen ein Varchar zu nehmen und die Null-Eins-Kombinationen als String zu vergleichen.

Also "011101" wird z.B. mit "110100" verglichen.

Das funktioniert auch so weit ganz gut.

Nun hänge ich an was anderem.

Die kleinstmögliche Kombination (also ein Layoutdokument, in dem alle Artikel auf alle Fälle vorkommen), wird mit Hilfe der errechneten Dezimalzahlen und einem Bubblesort errechnet.

Da ich ja jetzt keine Zahlen mehr habe (benutzen kann), habe ich folgende Frage:

Gibt es ein Pendant zu einem Bubbelsort mit einem solchen Stringvergleich?

Oder gibt es eine andere Möglichkeit mit Hilfe der Nullen und Einsen eine eindeutige Zahl zu ermitteln?

Ich hab schon an Quersummen gedacht, aber das funktioniert nicht eindeutig... :(

Klotzkopp, ich zähl auf dich ;)

(und auf alle anderen kreativen Köpfe hier natürlich auch :))

Geschrieben

Interessante Art und Weise sowas zu speichern, hab ich auch noch nicht gesehen :)

Hast du mal dran gedacht das ganze neu anzufassen und von Grund auf die Struktur her neu anzupassen und in eine normalisierte Struktur zu bringen?

Geschrieben

Nein, dazu haben wir keine Entwicklungszeit.

Ich hätts ja gern einfach in ein größeres Zahlenfeld gepackt, aber das kennt Oracle nicht.

Oder halt mit Java auslagern.

Dazu fehlt mir aber das Technische KnowHow. Hab zwar mal was nachgeschaut,aber ich hab dazu einfach zu viele Fragen, als das ich das damit machen könnte.

Hier in dem Oracle Buch gibts auch keine Strings-Vergleichs Funktionen. Naja, das BIN_TO_NUM stand ja auch nicht da drin.

Vielleicht was dazu wer Rat?

Geschrieben

Ich habe das Problem noch nichts ganz verstanden. Du hast also eine Menge dieser Strings, und willst diese Menge auf möglichst wenige reduzieren, so dass trotzdem eine Oder-Verknüpfung aller Elemente dasselbe Ergebnis liefert?

Und du hast einen Algorithmus, der das für Zahlen tut? Warum kannst du den nicht auf die Strings anwenden?

Geschrieben

Also ich habe (nachdem ich mir die Nullen und Einsen so wie ich sie brauche zusammenklamüsert habe), insgesamt maximal 10 Strings, die den Aufbau einer Binärzahl haben. Ich kann sie ja wie oben beschrieben nicht umrechnen, weil der Datentyp die Zahlen nicht mehr aufnehmen kann.

Nun müsste ich aber trotzdem irgendwie eindeutig herausbekommen, welcher dieser Binärzahlen nach dem Umrechnen die kleinste von allen wäre, ohne diese BIN_TO_NUM Funktion (die ist eingebaut).

Nur hab ich nicht wirklich eine Idee wie das eindeutig funktionieren könnte ohen umrechnen.

Ich hab schon an Trennen gedacht und die einzelnen Blöcke umrechnen; aber ich hab nen Fall gehabt, wo es nicht eindeutig war. (Schreibtischtest)

Ich hab auch keine String-Funktion in meinen Büchern gefunden, die das kann: nämlich umrechnen und das Ergebnis in einem String sichern. Quasi ein BIN_TO_VARCHAR. Oder besser ein BIN_TO_CLOB. Aber dann hab ich ein anderes Problem, was ich schon im Datenbankforum gepostet habe... :(

Irgendwie hängts an Oracle, dass meine Ideen nicht funktionieren :floet:

Geschrieben

Ich hab schon an Trennen gedacht und die einzelnen Blöcke umrechnen; aber ich hab nen Fall gehabt, wo es nicht eindeutig war. (Schreibtischtest)

Also ich hab das Problem nicht wirklich verstanden, aber das müsste schon so funktionieren. Du teilst den String z.B. in zwei Hälften und wandelst beide in Dezimalzahlen um.

Wie hast du denn nun verglichen das es nicht eindeutig war? Ich würde sagen wenn du nun die einzelnen Blöcke vergleichst dann sollte es gehen.

Bsp:

01011100 => 0101 1100 => 5 12

01100101 => 0110 1011 => 6 11

wenn du nun zuerst die 5 mit der 6 und dann die 12 mit der 11 vergleichst sollte es eindeutig sein, oder nicht?

Geschrieben

Ja, ok, das hatte ich nicht gemacht.

Ich hatte dann einfach die Zahlen addiert die da rauskamen und die Gesamtsumme verglichen...

*jetzt grad überlegt wie sie das in den Bubblesort am dümmsten packt*

Nur hab ich ein Problem, wann ich am besten Trennen sollte :rolleyes:

Die Anzahl der eingesetzten Artikel ist ja unterschiedlich.

Von nur einem bis zu 500 ist alles dabei...

Geschrieben
Nun müsste ich aber trotzdem irgendwie eindeutig herausbekommen, welcher dieser Binärzahlen nach dem Umrechnen die kleinste von allen wäre, ohne diese BIN_TO_NUM Funktion (die ist eingebaut).
Hast du mal versucht, einfach die Strings selbst in einer "kleiner-als"-Relation zu vergleichen? Wenn da ein lexikalischer Vergleich gemacht wird, sollte das doch genau das sein, was du brauchst. Viele Programmiersprachen können das.
Geschrieben

@klotzkopp

Also einfach den Bubblesort so belassen (der fragt ja nach "kleiner als"-Geschichten)?

Also zwei Variablen, die Strings aufnehmen und dann fragen

if var1 < var2 then

...

end if; ?

Hmmm... ist ein Versuch Wert.

Da Oracle immer nur Fehler schmeisst hab ich mich da nicht rangetraut.

Ich versuchs mal :)

Geschrieben

Wäre es nicht eventuell einfacher (vielleicht nicht ganz so sauber) ein neues Number-Feld aufzunehmen und alles was über den 126. Artikel hinausgeht dort abzulegen?

Du könntest dann bei bis zu 126 Artikeln das alte Verfahren belassen und wenn das 2. Number-Feld nicht leer ist in einem Zwischenschritt die beiden Felder verknüpfen und diese binäre Zahl wieder mit der alten Funktion umwandeln, oder habe ich da einen Denkfehler?

Das Problem bleibt natürlich bestehen, falls es wieder einen Kandidaten gibt, der über diese Grenze hinauswächst ;-)

VarChar kommt aber auch irgendwann an eine Grenze, oder nicht? (Bin leider nicht der Oracle-Experte)

Ihr solltet eventuell mal abschätzen, wann Ihr die Grenzen der Felder wieder erreichen könntet, also bei VarChar bzw. 2. Number-Feld, falls dier beschriebene Weg eine Alternative wäre.

  • 4 Wochen später...
Geschrieben

Hallo, vieleicht ist das Probem schon gelöst?!

Aber du hast doch einen normalen Varchar der nur aus "0" oder "1" besteht?!

Das macht dann z.B. 0110100101.

Bau dir doch einfach eine kleine Funktion der du diesen Varchar übergibst und die dir dann einen Zahlenwert liefert...

Bsp: 110100101 -> 1x2^8+1x2^7+0x2^6+1x2^5+0x2^4+0x2^3+1x2^2+0x2^1+1x2^0

->256+128+0+32+0+0+4+0+1 -> 421

Das ist eindeutig. Diese Zahl kann nur bei der Kombination 110100101 auftauchen. Das ist doch dann nur ganz normale Binär->Dezimal Umrechnung. Vorraussetzung ist allerdings, dass du immer wieder von dem selben Feld aus anfängst. Diese Zahlen die du dann bekommst kannst du ganz normal in den Bubblesort reinpacken.

Cas

Geschrieben

Richtig Guybrush ;)

Aber ich hab das jetzt alles in einen großen String gepackt, damit kann ich 4000 Artikel aufnehmen.

Das sollte reichen.

Den Sort brauchen wir zum Glück nicht mehr da dich Anforderung daran aufgelöst wurde :)

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...