Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Artikelgruppe aus Artikelnummer *schnell* ermitteln (https://www.delphipraxis.net/196927-artikelgruppe-aus-artikelnummer-%2Aschnell%2A-ermitteln.html)

BlueStarHH 1. Jul 2018 13:57

Artikelgruppe aus Artikelnummer *schnell* ermitteln
 
Wir haben hier Artikelnummnern rein aus Zahlen wie z.B.

5462155
76543887

Diese beginnen immer mit einer unterschiedlich langen Artikelgruppennummer. Zur Verdeutlichung *hier* durch einen Bindestrich abgegrenzt:

54-62155
5655-43887
64373-1

Zu einer Artikelnummer möchte ich nun die Artikelgruppennummer zusammen mit der Artikelgruppe ermitteln. Dazu gibt es diese Artikelgruppenliste:

...
52 Toner schwarz
53 Toner blau
54 Toner rot
...
5654 Papier A5
5655 Papier A4
...
64373 Klebefilm

5462155 wäre also ein "Toner rot". Da die Artikelnummer mit 54 beginnt.

Die Artikelgruppennummer ist immer eindeutig. Es gibt keine Überschneidungen.

Wie bekommt man das schnell hin, ohne jeden einzelnen Eintrag aus der Artikelgruppenliste mit der Artikelnummer abzugleichen?

Manchmal hilft es auch es nochmal aufzuschreiben, denn während ich das hier schreibe hat mich das und etwas googlen auf einen "Trie". Als Lösung geführt:
https://de.wikipedia.org/wiki/Trie Zitat im Abschnitt "Anwendungen":
Präfixanfragen der Art „Welche Zeichenketten in S beginnen mit dem Muster M?“

Das scheint hier also die Lösung zu sein. Gibt es da für Delphi schon etwas fertiges?

blawen 1. Jul 2018 15:04

AW: Artikelgruppe aus Artikelnummer *schnell* ermitteln
 
Zitat:

Zitat von BlueStarHH (Beitrag 1406231)
Die Artikelgruppennummer ist immer eindeutig. Es gibt keine Überschneidungen.

Wenn es wirklich jeweils eindeutig ist, würde ich mit Delphi-Referenz durchsuchenPos oder Delphi-Referenz durchsuchenposex arbeiten.

Ich habe bei mir z.B. die Situation, dass ich einen eingescannten Barcode (1D / 2D) identifizieren muss und daraus definierte Werte extrahieren muss (Seriennummer, Chargennummer, etc.).
Zu diesem Zweck registriere ich einen neuen Barcodetypen einmalig und identifiziere diese danach anhand meines definierten "Daumenabdruckes" (Anzahl Zeilen und Zeichen, Erkennungsmuster, etc.)

BlueStarHH 1. Jul 2018 15:24

AW: Artikelgruppe aus Artikelnummer *schnell* ermitteln
 
Zitat:

Zitat von blawen (Beitrag 1406237)
Zitat:

Zitat von BlueStarHH (Beitrag 1406231)
Die Artikelgruppennummer ist immer eindeutig. Es gibt keine Überschneidungen.

Wenn es wirklich jeweils eindeutig ist, würde ich mit Delphi-Referenz durchsuchenPos oder Delphi-Referenz durchsuchenposex arbeiten.

Danke, aber das ist zu langsam. Denn damit müsste ich im schlimmsten Fall bei jeder Artikelnummer die gesamte Liste aller Artikelgruppen durchgehen, wenn erst der letzte Eintrag in der Artikelgruppen-Liste ein Treffer ist. Wie gesagt geht es bei der Fragestellung nicht darum, es irgendwie sondern möglichst schnell hinzubekommen, da diese Suche sehr oft ausgeführt wird und die Liste sehr lang ist. Ziel ist es, dass der User in der GUI bei der Suche keinerlei Wartezeit wahrnimmt.

mkinzler 1. Jul 2018 15:28

AW: Artikelgruppe aus Artikelnummer *schnell* ermitteln
 
Ich würde das durch ein geeignetes Datenbankmodell lösen.

KodeZwerg 1. Jul 2018 15:36

AW: Artikelgruppe aus Artikelnummer *schnell* ermitteln
 
Wenn Zahlen tatsächlich Unique sind, egal in welcher Kombination, vielleicht einfach drei verschiedene DB abfragen mit jeweils anderem Trenner, eine der drei sollte ja dann als "Positiv" rauskommen, oder versteh ich da was falsch?

blawen 1. Jul 2018 15:41

AW: Artikelgruppe aus Artikelnummer *schnell* ermitteln
 
Zitat:

Zitat von BlueStarHH (Beitrag 1406238)
Zitat:

Zitat von blawen (Beitrag 1406237)
Zitat:

Zitat von BlueStarHH (Beitrag 1406231)
Die Artikelgruppennummer ist immer eindeutig. Es gibt keine Überschneidungen.

Wenn es wirklich jeweils eindeutig ist, würde ich mit Delphi-Referenz durchsuchenPos oder Delphi-Referenz durchsuchenposex arbeiten.

Danke, aber das ist zu langsam. Denn damit müsste ich im schlimmsten Fall bei jeder Artikelnummer die gesamte Liste aller Artikelgruppen durchgehen, wenn erst der letzte Eintrag in der Artikelgruppen-Liste ein Treffer ist. Wie gesagt geht es bei der Fragestellung nicht darum, es irgendwie sondern möglichst schnell hinzubekommen, da diese Suche sehr oft ausgeführt wird und die Liste sehr lang ist. Ziel ist es, dass der User in der GUI bei der Suche keinerlei Wartezeit wahrnimmt.

Wenn Du den Barcode anhand von offensichtlichen Merkmalen einschränkst (ein-/mehrzeilig, Anzahl Zeichen 1. Zeile/Gesamt,...) reduziert sich die "Wartezeit" erheblich, in meinem Anwendungsfall stelle ich keine Verzögerung fest.
In meinem konkreten Fall muss ich z.B. beim einen Barcode die Chargennummer auslesen, beim nächsten die Cargen-/Serien- und IMEI-Nummer, gleichzeitig muss der Code auch einem Artikel zugeordnet werden können. Die Merkmale habe ich in der Datenbank abgelegt und lese sie beim Programmstart in den Speicher.

TigerLilly 1. Jul 2018 21:30

AW: Artikelgruppe aus Artikelnummer *schnell* ermitteln
 
Ich würde mir eine Tabelle machen, wo du - einmalig - Artikelnummer + Artikelgruppe ablegst. Oder auch ein neues Feld in der Artikel-Tabelle. Dann kannst du das abrufen + musst nichts ermitteln.

Wenn du lustig bist, machst du einen Trigger, der dir das aktuell hält.

CCRDude 2. Jul 2018 06:17

AW: Artikelgruppe aus Artikelnummer *schnell* ermitteln
 
Zitat:

Zitat von BlueStarHH (Beitrag 1406231)
Das scheint hier also die Lösung zu sein. Gibt es da für Delphi schon etwas fertiges?

Es gibt diverse fertige Aho-Corasick-Implementierungen in Delphi. AC ist ein Algorithm für die Suche nach mehreren Strings gleichzeitig. Ist der Suchbaum einmal aufgebaut, ist die Suche in einer Artikelnummer ziemlich schnell, da jedes Zeichen nur einmal verglichen (und der zugehörige Pfad im Baum gefunden) werden muss. Und da sich Artikelgruppen nicht oft ändern dürften, müsste der Baum nur selten neu gebaut werden.

(edit sagt, dass AC natürlich schon Overkill ist, weil es auch nach Position 0 noch sucht... aber eine fertige getestete Implementierung ist halt auch was wert, alternativ könntest Du die entsprechenden Pfade im Baum einfach weglassen)

jobo 2. Jul 2018 10:18

AW: Artikelgruppe aus Artikelnummer *schnell* ermitteln
 
Zitat:

Zitat von TigerLilly (Beitrag 1406258)
Ich würde mir eine Tabelle machen, wo du - einmalig - Artikelnummer + Artikelgruppe ablegst. Oder auch ein neues Feld in der Artikel-Tabelle. Dann kannst du das abrufen + musst nichts ermitteln.

Wenn du lustig bist, machst du einen Trigger, der dir das aktuell hält.

Würde ich auch bevorzugen! Und ggF. mal mit Sorgfalt an einen Umbau/Anpassung des DM denken, wie es mkinzler vorschlägt.

Ansonsten, ist das wirklich eindeutig?
Zitat:

52 Toner schwarz
53 Toner blau
54 Toner rot
...
5654 Papier A5
5655 Papier A4
...
64373 Klebefilm

5462155 wäre also ein "Toner rot". Da die Artikelnummer mit 54 beginnt.
Habt Ihr nur 100 (bzw. 99) Artikelgruppen? Oder wechselt ihr irgendwo die Stellenanzahl?
Das würde noch mehr für eine Modellverbesserung sprechen.

p80286 2. Jul 2018 10:37

AW: Artikelgruppe aus Artikelnummer *schnell* ermitteln
 
Das erinnert mich an Telefonnummern, bei denen man ja auch nach einer unterschiedlichen Ziffernanzahl auf unterschiedlichen Organisationsebenen landet.
Dementsprechend würde ich einen Suchbaum aufbauen,
und bei Gelegenheit die Artikelnummern überholen.

Gruß
K-H

jaenicke 3. Jul 2018 08:15

AW: Artikelgruppe aus Artikelnummer *schnell* ermitteln
 
Zitat:

Zitat von jobo (Beitrag 1406287)
Habt Ihr nur 100 (bzw. 99) Artikelgruppen? Oder wechselt ihr irgendwo die Stellenanzahl?

Ja, das stand doch schon oben im Eingangspost.

Ist eine Speichertabelle mit Index auf der Nummer der Artikelgruppe wirklich zu langsam? Ich meine bei bis zu fünfstelligen Artikelgruppen muss dort fünfmal der Index gefragt werden.

Wir haben dafür aber auch schon einen Parserbaum aufgesetzt, so wie in dem Wiki auch beschrieben. Das brauchten wir zum Parsen von Skripten, darüber haben wir die binäre Implementierung einer Funktion gefunden. Wie das geht ist dort ja beschrieben... man registriert die Artikelgruppen indem man zeichenweise durch die Knoten geht und alle fehlenden Knoten anlegt. Und dann geht man zeichenweise durch die Artikelnummer und schaut, ob passende Knoten existeren. So findet man dann den Knoten, an dem die passende Artikelgruppe hängt.
Das muss man aber dann schon sehr gut implementieren, damit das schneller geht als andere einfachere Lösungen.

Die Unit mit meiner generischen Implementierung ist gerade einmal 140 Zeilen lang. Es ist auch nicht weiter schwer. Leider gehört mir der Quelltext nicht (habe ich für meinen Arbeitgeber geschrieben), sonst würde ich den gern posten.

jobo 3. Jul 2018 09:49

AW: Artikelgruppe aus Artikelnummer *schnell* ermitteln
 
Zitat:

Zitat von jaenicke (Beitrag 1406412)
Zitat:

Zitat von jobo (Beitrag 1406287)
Habt Ihr nur 100 (bzw. 99) Artikelgruppen? Oder wechselt ihr irgendwo die Stellenanzahl?

Ja, das stand doch schon oben im Eingangspost.
..

Wir haben dafür aber auch schon einen Parserbaum aufgesetzt, ...

Ja, du hast Recht. Ich habe wahrscheinlich meinen Augen nicht getraut.

Eine algorithmische Lösung scheint mir jedenfalls nur sinnvoll, wenn absehbar lange und viel mit dem System gearbeitet werden muss, ohne Chance auf Modelländerung. Die Hilfstabelle mit redundanter Datenhaltung und getriggerter Pflege wäre mein Ansatz.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz