Kleine dynamische Datenbank im Interface-Stil

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Wegen dem SelectRowByEntry. Die Funktion sucht immer ab der aktuellen
Zeile plus eins. Da fällt mir aber gerade ein, dass dann die erste Zeile nie
gefunden werden kann.

Na das werde ich dann mal morgen verbessern vielleicht mit einem
optionalen Parameter. Aber das mit der LinkedList ist eine gute Idee. Dann
gebe ich eine Liste zurück mit allen Indices, wo der Suchbegriff gefunden
wurde.

Bis morgen dann.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Ich wollte gerade das mit der Suchergebnis-in-LinkedList-Geschichte zu Ende
bringen, da hab ich einen Bug gefunden.
Man kann in einem Interface als Parameter einer Funktion keine LinkedList
angeben.

Also das geht nicht:

Code: Alles auswählen

Interface Test
  Methode(hallo.l())
EndInterface
Während das hier geht:

Code: Alles auswählen

Procedure Test_Methode(hallo.l())
EndProcedure
Also widme ich mich erstmal den Wildcards. :)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

So, es ist vollbracht. Die Änderungen im Überblick:
  • Changed: Alle SelectRowByEntry()-Funktionen beginnen die Suche
    auf der aktuellen Zeile. Also vorher immer FirstRow() benutzen, wenn es
    nicht anders gewünscht ist
  • Changed: SelectRowByEntryS() funktioniert jetzt auch mit Wildcards,
    wenn der optionale Parameter mask auf #True gesetzt wird.
  • Added: SelectRowByEntryD() wählt auf Wunsch alle Doubles aus, die in
    einem bestimmten Bereich liegen, den man mit dem Parameter range
    angeben kann. Praktisch wegen den Ungenauigkeiten bei
    Fließkommazahlen
  • Added: Alle DB_ListByEntry()-Funktionen funktionieren wie die
    SelectRowByEntry()-Funktionen, erwarten aber eine LinkedList des Typs l,
    in die alle Indices geschrieben werden, wo der Suchparameter zutrifft.
    Leider kann ich die Funktionen nicht ins Interface mitaufnehmen, weil dort
    keine LinkedLists angenommen werden. Bug?
Der neue Code wie immer im ersten Post
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Vielleicht beim nächstem Update zusätzlich als Zip anbieten, 1225 Zeilen
kopieren ist nicht so das Wahre :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

NicTheQuick hat geschrieben:So, es ist vollbracht.
Super! Den ersten 'Extremtest' (scannen meiner C-Partition und eintragen
der gefundenen Dateien) hat Deine 'DB' schon mal klaglos überstanden ;-)
Morgen geht's an die Suchfunktionen :D

Vielen Dank für Deine Mühen! :allright:
ts-soft hat geschrieben:1225 Zeilen kopieren ist nicht so das Wahre
Weichei! ;-)

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Kiffi hat geschrieben:
ts-soft hat geschrieben:t;]1225 Zeilen kopieren ist nicht so das Wahre
Weichei! ;-)

Grüße ... Kiffi
Ne, kaputte Maus :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Funktioniert bisher alles sehr zufriedenstellend :allright:

ich habe mir mal erlaubt, ein optionales Flag 'MatchCase' einzubauen,
damit DB_ListByEntryS() Treffer unabhängig von der Groß- und
Kleinschreibung des Suchbegriffes zurückliefert.

folgende kleine Änderungen sind dafür nötig:

Im Interface:

Code: Alles auswählen

SelectRowByEntryS(Col.l, Entry.s, mask.l = #False, MatchCase.l = #False)
In DB_SelectRowByEntryS()

Code: Alles auswählen

Procedure.l DB_SelectRowByEntryS(*DB.DB_Struc, Col.l, Entry.s, mask.l = #False, MatchCase.l = #False) ;Wählt eine Zeile aus

	[...]
          Case 's'
            If mask
              If MatchCase
                If CompareWithWildcards(*vEntry\s, Entry) : Break : EndIf
              Else
                If CompareWithWildcards(LCase(*vEntry\s), LCase(Entry)) : Break : EndIf
              EndIf
            Else
              If MatchCase
                If *vEntry\s = Entry : Break : EndIf
              Else
                If LCase(*vEntry\s) = LCase(Entry) : Break : EndIf
              EndIf
            EndIf

	[...]

EndProcedure
in DB_ListByEntryS()

Code: Alles auswählen

Procedure.l DB_ListByEntryS(*DB.DB_Struc, List.l(), Col.l, Entry.s, mask.l = #False, MatchCase.l = #False)

	[...]

  While *DBI\SelectRowByEntryS(Col, Entry, mask, MatchCase)

	[...]

EndProcedure
Aufruf wie folgt:

Code: Alles auswählen

DB_ListByEntryS(*DB, Found(), 3, "*.ZIP", #True, #True)  ; findet nur *.ZIP-Dateien

DB_ListByEntryS(*DB, Found(), 3, "*.zip", #True, #True)  ; findet nur *.zip-Dateien

DB_ListByEntryS(*DB, Found(), 3, "*.zip", #True, #False) ; findet *.zip, *.ZIP, *.ZiP, *.zIP, ...
Danke & Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

@Kiffi:
Das mit dem MatchCase ist eine gute Idee. Das hatte ich auch noch
im Hinterkopf. Ich werde meinen Code, wenn ich mehr Zeit habe nach deiner
Idee umstellen und wieder in den ersten Post setzen.

@ts-soft:
Ein ZIP für eine kleine "Text-Datei" ist etwas übertrieben. Dann lade ich die
Datei lieber irgendwo hoch und gib einen Link dazu an. Leider kann ich das
dann immer nur zu Hause machen und nicht an der UNI. Da hab ich kein
FTP-Programm installiert. Aber vielleicht wäre es ja an der Zeit das mal zu
tun. :wink:

Ansonsten Danke für die Tests. Ich hab mich über das positive Feedback
gefreut. Für Vorschläge und Verbesserungen bin ich wie immer offen. Also
nur her damit! :)

@Kiffi nochmal: Wenn du weißt, dass du viele Datensätze speichern willst,
könnte das ganze noch schneller werden, wenn du die Konstante
#DB_ChunkRows erhöst. Die Rows werden nämlich immer Blockweise

allokiert um den Speicher nicht zu oft verschieben zu müssen, wer's noch
nicht gemerkt hat. :wink:
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

NicTheQuick hat geschrieben: @ts-soft:
Ein ZIP für eine kleine "Text-Datei" ist etwas übertrieben. Dann lade ich die
Datei lieber irgendwo hoch und gib einen Link dazu an.
Als Zip wirds aber immer gedownloadet :wink: . *.pb wird mir als Text angezeigt :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

Rechte Maustaste, speichern unter... Naja, weisst du bestimmt, aber sowas zu zippen finde ich auch übertrieben, wiegt doch kaum mehr als ne normale Webseite.
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Antworten