Autor Beitrag
Anwender
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 62
Erhaltene Danke: 9



BeitragVerfasst: So 08.11.15 10:06 
Hallo,

ja, eigentlich dachte ich gestern Abend die Lösung gefunden zu haben und dann hier niemanden mehr bemühen zu müssen. :x
Aber jetzt doch:
In unserem kleinen Verein haben wir unsere Dokumente in Papp-Mappen organisiert und ich möchte dafür ne (nach Spalten ) sortierbare Inhalts-Liste als Programm erstellen.(bisher gibt's nur ne Papierliste)

Manche Mappen (1,2,3...214....223) enthalten aber aus Sparsamkeitsgründen mehrere Dokumente. (doof, ich weiß; und das soll auch noch so bleiben(!grml))


[Hinweis zum u.g. Beispiel: Wenn ich diese (ja, ich weiß, die Mappen beginnen im Beispiel bei 214 ... der Index aber bei Eins. ..., Die Dokumenten-Titel sind real auch anders/detaillierter/länger.
Wenn ich die Mappen hier bei 1, 2,3 beginnen lasse, dachte ich, hab ich nacher Probleme beim Übertragen einer Lösung auf mein Projekt.
Ist nämlich irgendwie doch kompliziert, da sich Unterlisten wie 3a,3b,3c etc. dabei befinden.)
(MS-Word: "Liste mit mehreren Ebenen")]

Ok, Ihr empfindet vielleicht das Problem nicht als so groß. Aber ich habe keine Informatik studiert :D
Ich muß das alles zu Fuß.

So:
Hab die Papierliste erstmal in Excel übertragen, damit man das später überhaupt digital (.csv) verarbeiten kann.
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
    bisheriger_Index   Mappennumer   Dokumententitel
    1   214   Herbert
    2   215   Manfred
    3a   216   Caroline
    3b   216   Ottilie
    3c   216   Sandra
    4   217   Kleo
    5   218   Antje
    6a   219   Dörte
    6b   219   Mike
    7   220   Wilfried
    8   221   Jens
    9a   222   Arne
    9b   222   Johannes
    9c   222   Mehmed
    10   223   Ingo


Ja, jetzt würde ich gerne statt nur 1,2,3a,3b,3c einen fortlaufenden index verwenden, den man schnell suchen/zugreifen kann (z.B: integer) - gerne auch in ein anderes ArrayFeld - nur, dann geht der Zusammenhang verloren, daß a,b,c alle in Mappe 3 sind.

Wenn man die Lsite benutzerdefiniert sortiern lassen will, brauche ich diesen extra Index = quasi sowas wie nen PrimaryKey.

In Excel hatte ich das testweise gelöst, indem ich in Spalte 4 noch 5 Nullen vor den Index gesetzt hab. 000001,000002,000003a, ...etc. und *ZACK!* war es wieder zuverlässig sortierbar.(dann z.B. nach Spalte D)
Funzt aber nur in Excel. Für Delphi bleiben die Buchstaben hinter den Zahlen. ...
und das zu Erkennen ginge nur mit ner Menge Code.
Hatte schon die Idee, ich lege noch ne (Array-)Spalte an, in der ich die Mappennummer vermerke, aber dann geht die interne Reihenfolge verloren. Lege ich dann noch ne weitere Spalte an nur mit Buchstaben geht der Bezug zur Mappennummer verloren und wird nur noch komplizierter.

Vielleicht kann man das ja noch eleganter lösen.

Wenn da einer ne Idee hat, wäre ich dankbar.
Ich grüble da schon 2 Tage rum.
Einloggen, um Attachments anzusehen!
_________________
neu hier
ub60
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 762
Erhaltene Danke: 127



BeitragVerfasst: So 08.11.15 12:48 
user profile iconAnwender hat folgendes geschrieben Zum zitierten Posting springen:
Hatte schon die Idee, ich lege noch ne (Array-)Spalte an, in der ich die Mappennummer vermerke, ...

Die Idee ist doch ganz gut.
Wie sortierst Du denn? Hoffentlich nicht mit den Arrays? Hier bieten sich Datenbanken (z.B. SQLite) an. Dort könnte man einfach sortieren mit "SELECT * FROM Tabelle ORDER BY Mappe, Buchstabe".

ub60
GuaAck
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 376
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: So 08.11.15 19:07 
Hallo,

wenn es ein kleiner Vrein ist, dann geht es auc mit Arrays und man braucht keine Datenbank.

Wie wäre den folgende Lösung:
ausblenden Delphi-Quelltext
1:
lfdnr := strtoint(leftstr(originalnr, length(originalnr)-1))*1000+ord (rightstr(originalnr,1));					

originalnr wäre z. B. 3b, dass würde dann zu 3097.

Gruß GuaAck

Moderiert von user profile iconTh69: Delphi-Tags hinzugefügt
Anwender Threadstarter
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 62
Erhaltene Danke: 9



BeitragVerfasst: So 08.11.15 21:45 
Danke Euch beiden.

Mhh, ja, mit ner Datenbank hatte ich auch überlegt.
Wobei ich dann wegen vermuteter Einfachheit dann SQlite3 mit Wrapper versuchen würde, wobei ich es bisher nicht geschafft habe, außer dem Compilieren des dem Wrapper beigelegten Programms www.itwriting.com/blog/?page_id=659 irgendwas daran zu verändern oder gar eigenen Code umzusetzen. Die Syntax für den Wrapper ist darin noch etwas unübersichtlich.
(bin auch froh, daß ich mir den für unter Delphi5 lauffähig gefrickelt hab)

Firebird käme wohl auch noch in Frage, weil's idealerweise portable (ohne Einträge im System) sein soll. Aber ich glaube, da müßte man sich noch mehr einarbeiten. Hab's biser nich zum Laufen gekriegt.

Zudem steht mir hier nur mein (altes, aber geliebtes & gekauftes) Delphi 5 zur Verfügung. (ja, TurboDelphi Free könnte ich auch runterladen, allerdings sind die Quellen dafür eher unsicher)

So wäre die Lösung von GuaAck mit größeren Indexzahlen zu arbeiten naheliegender.
Allerdings hatte ich die Befürchtung daß man bei ein paar Tausend Dokumenten schnell in sehr große Zahlen (für die Mappen) kommen könnte.
OK, mehr als Hundert Dokumente je Mappe und >10.000 Mappen werden es wohl nicht.

Von daher werd' ich vermutlich letztere umsetzen.

v.a. aber auch, weil ich gerade den sqlite Wrapper nich mit eigenem Code zum Laufen kriege.

_________________
neu hier
GuaAck
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 376
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: Mo 09.11.15 21:46 
100000*100 =1 Mio. Wenn Du dann je Eintrag auf 1 kB kommst, dann hat Dein Array 1 GB. Das kann ja heute sogar ein betagter PC.

Eine Suche geht schnell, 1 Mio mal vergleichen..., da braucht kaum einen pfiffigen Algorithmus. Sortieren kann etwas dauern, gängige Algorithem tauschen dauernd zwei Einträge aus oder speichern sie um. Wenn da immer 1 kB umgespeichert wird, dann dauert das auch bei modernen PCs etwas Zeit. Einfach probieren, ggf. Zwischenliste mit Zeigern einrichten.

Ich habe übrigens nichts gegen eine Datenbank. Ich hatte mal MySQL benutzt, das ging sehr gut, auch der Zugriff von Delphi aus. Im Internet hatte ich dazu eine Demo gefunden und angepasst. Die Demo habe ich bestimmt noch, melde Dich ggf. MySQL ist eine leistungsfähige Datenbank, ich hatte damals ein TeraByte-Projekt im Blick. Für kleinere Anwendungen störte mich, dass man MySQL als Server installiert haben muss. Da ist die Array-Lösung einfacher.

Ich habe eine eigene "Array-Datenbank" mit ca. 5000 Personen mit einigen Angaben. Suche (primitiv FOR i := 0 to imax....) lief schon auf meinem Athlon800 (Bauj. 2000) ohne nennenswerte Verzögerung.

Wird gehen, viel Erfolg,
Gruß
GuaAck
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Di 10.11.15 10:04 
user profile iconAnwender hat folgendes geschrieben Zum zitierten Posting springen:
Wobei ich dann wegen vermuteter Einfachheit dann SQlite3 mit Wrapper versuchen würde, wobei ich es bisher nicht geschafft habe, außer dem Compilieren des dem Wrapper beigelegten Programms www.itwriting.com/blog/?page_id=659 irgendwas daran zu verändern oder gar eigenen Code umzusetzen.

Der Wrapper ist super und hat bei mir nie Probleme gemacht. SQLite ist auf jeden Fall das Mittel der Wahl, denn es benötigt keine eigene Installation.


Ansonsten würde ich so vorgehen:
1. Alle Indizes durchlaufen, vorne die Zahl abschneiden (z.B. von vorne beginnend testen, ob es sich um eine Zahl handelt). Die Zahlen und die Buchstaben in eigene Arrays packen.

2. Das Array mit den Zahlen sortieren (z.B. mit BubbleSort, ist ein 5-Zeiler). Dabei immer schön das Buchstaben-Array mit umordnen.

3. Das Array nochmal mit BubbleSort sortieren, diesesmal die Buchstaben vergleichen und nur tauschen, wenn die Zahlen gleich sind.

So hast du keine "magischen Nummern", so dass dir dann bei mehr als 1000 Einträgen alles um die Ohren fliegt. Der Code ist vermutlich mit 20 Zeilen erledigt. Effizienz-technisch lässt sich natürlich einiges machen, ist aber bei wenigen Einträgen garnicht nötig.

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)

Für diesen Beitrag haben gedankt: Anwender