Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:35 Uhr.
Seite 1 von 2  1 2      

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