AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte EasyLINQ, eine generische Liste die einfache SQL Befehle ausführt

EasyLINQ, eine generische Liste die einfache SQL Befehle ausführt

Ein Thema von Daniela.S · begonnen am 6. Sep 2011 · letzter Beitrag vom 4. Sep 2014
Antwort Antwort
Seite 1 von 3  1 23   
Benutzerbild von Daniela.S
Daniela.S
Registriert seit: 1. Mär 2008
Hallo liebe DP-ler,

oft braucht man Objektlisten, die gefiltert, sortiert oder gruppiert werden müssen. Unter Delphi Prism bzw. .net gibt es LINQ, das man in solchen Fällen sicher zu schätzen weiss. Leider gibt es unter Delphi selbst nichts dergleichen. Darum habe ich einmal etwas in diese Richtung erstellt. Aus Zeitgründen sicher noch nicht perfekt, aber es arbeitet soweit zufriedenstellend...


Welche SQL-Befehle werden unterstützt?
  • SELECT (optional)
  • TOP(n) Limitiert die Liste auf die ersten n Objekte
  • DISTINCT field Gruppiert die Liste
  • CALC(x) Berechnet den Ausdruck x (bsp. Feld1=Feld2*5+(Feld3/2))
  • WHERE (x) Filtern (<,>,=,<=,>=, zusätzlich. Upper, Lower, Like (% Wildcard), kombinierbar mit OR; AND; XOR)
  • ORDER BY Feld1, Feld2,... Sortierreihenfolge (inkl. ASC/DESC)
  • GROUP BY Feld1, Feld2 Gruppiert die Liste (wie distinct)
  • UPDATE SET (Feld1=Wert1, Feld2=Wert2) Schreibt neue Werte in die Felder



Zur Funktionsweise:
Die Liste kann Klassen oder Records verwalten. Records haben derzeit die Limitierung, dass in die Werte nicht geschrieben werden kann. Somit funktionieren CALC und UPDATE nicht. Eine Exception wird ausgelöst, wenn versucht wird einen der Befehle in Verbindung mit Records zu nutzen. Enumeration wird unterstützt, daher auch "for in" möglich. Handhabung also wie TList<T>.

Durch den Befehl "Execute()" wird das Kommando abgesetzt und eine neues Objekt als Lookup-Liste zurückgegeben. Löschen von Objekten ist in einer Lookup-Liste nicht möglich.

Zur Berechnung von Werten habe ich eine Calculator Klasse eingebunden. Mit ihr lassen sich einfache Rechenoperationen durchführen und deren Ergebnisse wieder in Properties von Klassen zurückschreiben. Unterstützt werden die Operatoren - + / * ^ ( ) sin cos tan sqr log cot sec csc

Was gilt es zu beachten?
  • Ausdrücke müssen in Klammer gesetzt werden... zB. where (a=b) and (c=d) oder update set (a=b, c=d)
  • Für Delphi 2010 & XE

Neues Update:
  • UPDATE Befehl um Werte in Properties schreiben zu können
  • Parser ein wenig überarbeitet
  • Unterstützt Unterklassen
  • Der zweite "Where" Ausdruck kann ein Feld sein
  • Umbenannt, damit es nicht heisst ich sei anmaßend
  • Mit Delphi 2010 getestet
  • Records in der Klasse können gelesen werden

Update, Version 1.3, 30.1.2013

Endlich bin ich mit einigen Projekten auf XE3 umgestiegen, daher auch ein Update dieser Klasse.
  • Kompatibel mit XE3
  • Kompatibel mit 64 Bit
  • Funktion "Where" hinzugefügt
  • Funktion "OrderBy" hinzugefügt
  • Funktion "Distinct" hinzugefügt
  • Funktion "Move" hinzugefügt

Update, Version 1.4, 15.8.2014

Element Operators
  • First, gibt das erste Element zurück
  • Last, gibt das letzte Element zurück

Custom Sequence Operators
  • Combine( TEasyLINQ<T> ), kombinieren von zwei Listen (kopiert die Elemente der übergebenen Liste)

Partitioning Operators
  • Take( n ), gibt die ersten n Elemente zurück
  • Skip( n ), überspringt die ersten n Elemente und gibt alle anderen zurück
  • Odd, gibt alle Elemente mit ungleicher Position (1,3,5...) zurück
  • Even, gibt alle Elemente mit gleicher Position (2,4,6...) zurück

Generation Operators
  • Range( form, to ), Auswahl eines Bereiches von Elementen
  • Repeat( index, n ), Wiederholt das Element mit Index n-mal

Aggregate Operators
  • Aggregate( field ), berechnet das Produkt aller Element von "field"
  • Average( field ), berechnet den Durchschnittswert aller Element von "field"
  • Min( field ), gibt den kleinsten Wert aller Element von "field" zurück
  • Max( field ), gibt den größten Wert aller Element von "field" zurück
  • Sum( field ), berechnet die Summe aller Element von "field"
Update, Version 1.41, 4.9.2014
  • Bug fix: In GetCMD wurden beim Like Command 6 Zeichen gelöscht, anstatt nur 5
Im Laufe der Zeit wird sich sicher noch die eine oder andere Funktion ergeben. Mit dem Parser bin ich noch nicht so ganz glücklich, hier lässt sich auf jeden Fall noch einiges optimieren. Derzeit müssen Ausdrücke in Klammern gesetzt werden, das vereinfacht das Parsen.

Beispiel:
Delphi-Quellcode:
  ClassLinq := TLinq<TMyClass>.Create;
  {...}
  TempLinq := ClassLinq.Execute( 'ORDER BY LastName, FirstName' );
  for item in TempLinq do Memo1.Lines.Add( item.ToString );
  TempLinq.Free;
  {...}
  ClassLinq.Free


Einige SQL-Beispiele aus der beiliegenden Demo:
Delphi-Quellcode:
SELECT WHERE (City="Vienna")
SELECT ORDER BY City,Value
SELECT ORDER BY City,Value DESC
SELECT TOP(3) WHERE (UPPER(Lastname) like "%A%") ORDER BY MySubText.Text
SELECT CALC(value=(value*32+4)/2) ORDER BY value
SELECT TOP(3) WHERE (LOWER(Firstname)="kurt") OR (LOWER(Firstname)="edmund")
SELECT GROUP BY City ORDER BY LastName
SELECT WHERE (MySubText.Text="Sub3") OR (FirstName="Kurt")
UPDATE SET (Firstname="Max", Lastname="Mustermann") WHERE (City="Linz") OR (MySubText.Text="Sub4")
UPDATE SET (Value=CALC(23*2-4)) WHERE (City="Vienna")






Ideen und Wünsche für Erweiterungen und Verbesserungen sind gerne willkommen...

liebe Grüße,
Daniela
Angehängte Dateien
Dateityp: zip EasyLinq.zip (150,1 KB, 47x aufgerufen)
Dateityp: zip EasyLinq1.3.zip (198,9 KB, 30x aufgerufen)
Dateityp: zip EasyLINQ1.4.zip (22,7 KB, 12x aufgerufen)
Dateityp: zip EasyLINQ1.41.zip (22,7 KB, 17x aufgerufen)

Geändert von Daniela.S ( 4. Sep 2014 um 13:00 Uhr) Grund: Update
 
Benutzerbild von Stevie
Stevie

 
Delphi 10.1 Berlin Enterprise
 
#2
  Alt 6. Sep 2011, 15:00
Klingt interessant, werde es mir später mal anschauen. Ich arbeite auch seit einiger Zeit an einer Linq ähnlichen Sache für Delphi (unter Zuhilfenahme der http://code.google.com/p/delphi-coll), die sich dann so etwas ähnliches bietet wie ADO Entity framework/Linq-to-SQL.
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von Daniela.S
Daniela.S

 
Delphi XE4 Enterprise
 
#3
  Alt 6. Sep 2011, 15:04
jössas, so viel Zeit habe ich gar nicht. Ich hab das in drei Stunden zusammengebastelt. Im Moment habe ich leider wenig Zeit und solche Sortier- und Gruppiergeschichten halten mich immer unnötig auf. Daher diese kleine (wirklich kleine) Klasse
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

 
Delphi 10.3 Rio
 
#4
  Alt 6. Sep 2011, 15:31
Was ist denn mit DeHL? Ich habe es noch nicht ausprobiert, aber es liest sich zumindest interessant.
Detlef
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

 
Delphi 10.1 Berlin Enterprise
 
#5
  Alt 6. Sep 2011, 15:55
Was ist denn mit DeHL? Ich habe es noch nicht ausprobiert, aber es liest sich zumindest interessant.
Delphi Coll ist ein Subset von DeHL. DeHL war vielen Leuten (inklusive mir) zu "fett". Somit hat Alex dann die Collection Sachen rausgenommen und als separate Lib veröffentlicht. Außerdem ist, egal, ob DeHL oder Coll, beides nur Linq-To-Objects. Nix mit SQL. An der Stelle setzt ja mein Konzept an.
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

 
Delphi 10.3 Rio
 
#6
  Alt 6. Sep 2011, 15:56
Ahso. Ja denn.
Detlef
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

 
Delphi XE3 Enterprise
 
#7
  Alt 6. Sep 2011, 16:23
Die Komponente ist eine gute Idee. Vielleicht gerade weil sie klein und überschaubar sit.

Grüße in die Runde
Martin Schaefer
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

 
Delphi XE3 Ultimate
 
#8
  Alt 6. Sep 2011, 19:15
Die Idee ist super!
Werde ich mir demnächst mal gern mit anschauen.

PS: Eine native Linq-Lösung hätte ich mir für XE2 erhofft. (Die tatsächlichen Neuerungen interessieren mich persönlich erst mal weniger.)
  Mit Zitat antworten Zitat
Benutzerbild von Daniela.S
Daniela.S

 
Delphi XE4 Enterprise
 
#9
  Alt 6. Sep 2011, 19:29
Das Problem ist oft, dass die Bibliotheken wahnsinnig überladen sind und teilweise eine hohe Einarbeitungszeit benötigen. Auch sind manche Lösungen recht kompliziert. Dann einen Fehler zu suchen dauert wiederum. Deshalb habe ich es bewusst aufs wesentliche reduziert.

Eine Funktion, die einfache Standard-SQL Befehle versteht, die Objekte danach ausrichtet und als Liste wieder zurückgibt. Man muss sich also nicht wieder in etwas einarbeiten. Es soll auch keinesfalls ein Ersatz für eine Datenbank sein.




Hätte mir auch Linq gewünscht. Vielleicht mit XE3 oder XEⁿ
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

 
Delphi 10.1 Berlin Enterprise
 
#10
  Alt 6. Sep 2011, 21:05
Hätte mir auch Linq gewünscht. Vielleicht mit XE3 oder XEⁿ
Würde mich positiv überraschen, wenn sie die notwendigen und grundlegenden Dinge einbauen würden (würde auch ein Rewrite des dcc32 erfordern, der afaik aber geplant ist?)
Und außerdem kranken die Generics aktuell immernoch an fehlerhafter type inference, wie ich heute wieder feststellen musste, die aber grundlegend für Features wie Linq notwendig ist.

Barry schrieb schon an einigen Stellen, welche Probleme sie mit Lambdas aktuell haben, z.B. hier.
Stefan
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf