AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Aufgaben mit LiveBindings und Delphi-DB's erledigen

Ein Thema von Harry Stahl · begonnen am 2. Mai 2016 · letzter Beitrag vom 10. Mai 2016
Antwort Antwort
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#1

AW: Aufgaben mit LiveBindings und Delphi-DB's erledigen

  Alt 4. Mai 2016, 08:34
Wie setzt du denn den Filter? Ich mach das immer wie folgt und das Grid aktualisiert sich ohne das ich reinklicken muss:

Delphi-Quellcode:
//ggf.: ClientDataset.Filtered:=false;
ClientDataset.Filter:='irgendwas';
ClientDataset.Filtered:=true;

Bei deinem dritten Sternchen, hab ich die Intention nicht ganz verstanden, aber du kannst den Filterstring ja beliebeig formulieren, fast wie eine Where-Bedingung in einem SQL-Statement.

NameOFField1 = 'TTab*' Or NameOFField2 = 'TTab*' or NameOFField3 = 'TTab*'
Ralph

Geändert von Jumpy ( 4. Mai 2016 um 08:36 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.479 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Aufgaben mit LiveBindings und Delphi-DB's erledigen

  Alt 4. Mai 2016, 18:32
Wie setzt du denn den Filter? Ich mach das immer wie folgt und das Grid aktualisiert sich ohne das ich reinklicken muss:

Delphi-Quellcode:
//ggf.: ClientDataset.Filtered:=false;
ClientDataset.Filter:='irgendwas';
ClientDataset.Filtered:=true;
Ja mach ich jetzt auch so. Dann funktioniert das auch. Allerdings reagiere ich nun direkt auf das OnChange-Event des Edits, zuvor hatte ich den Edit.Text über LiveBindings mit einer Expression verbunden, vielleicht gibt es da ein Problem.

Bei deinem dritten Sternchen, hab ich die Intention nicht ganz verstanden, aber du kannst den Filterstring ja beliebeig formulieren, fast wie eine Where-Bedingung in einem SQL-Statement.

NameOFField1 = 'TTab*' Or NameOFField2 = 'TTab*' or NameOFField3 = 'TTab*'
Um mehrere Felder zu berücksichten, muss ich

Delphi-Quellcode:

qf := QuotedStr (bnFind.Text+'*');

cds1.Filter := 'QuellDaten = ' + qf + ' OR ' +
               'ZielDaten = ' + qf + ' OR ' +
               'AusnahmeKomp = ' + qf + ' OR ' +
               'Wert = ' + qf;
eingeben.

Schön wäre es, wenn es ein "SearchInAnyField"-Platzhalter gäbe, so das dass ich nicht jedes einzelne Feld hier angeben muss.

Weiterer Punkt: Ist hier tatsächlich die Beschränkung gegeben, dass man nur nach

grid*

filtern kann,

aber nicht nach

*grid*?

Mit der ersten Variante wird z.B. bei der Eingabe von "grid" der gesuchte Text nicht gefunden, wenn der mit "TGrid" beginnt, die zweite Variante wird aber anscheinend nicht unterstützt.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Aufgaben mit LiveBindings und Delphi-DB's erledigen

  Alt 4. Mai 2016, 19:04
@Harry

Du kennst die Methode Delphi-Referenz durchsuchenTDataSet.OnFilterRecord?

Das kombiniert mit dem Bei Google suchenSpecification Pattern macht es sehr schlank
Delphi-Quellcode:
procedure TWhatever.DataSetOnFilterRecord( Dataset: TDataSet; var Accept: Boolean );
begin
  Accept := CurrentFilter.IsSatisfiedBy( DataSet );
end;
Delphi-Quellcode:
DataSetSpecifications = class
  class function IsInAnyField( aStr: string ): ISpecification<TDataSet>;
  // usw.
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.479 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Aufgaben mit LiveBindings und Delphi-DB's erledigen

  Alt 4. Mai 2016, 19:33
Danke für den Hinweis. Nein, kannte ich noch nicht (mal kurz gesehen).

Aber verstehe ich das richtig, hier wird mir eine Datenmenge als Ergebnis meines Filters gegeben, die ich nun akzeptieren kann oder nicht.

D.h. ich kann nur weiter einschränken, aber nicht den Filter erweitern, oder?

Ich möchte erreichen, dass statt "TGrid" auch schon "grid" akzeptiert wird als ein valides Ergebnis des Filters, wenn ich z.B. auf ein TStringGrid treffe.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Aufgaben mit LiveBindings und Delphi-DB's erledigen

  Alt 4. Mai 2016, 20:10
Ähm, du kannst dir die Specifications definieren und zusammenbauen wie du möchtest und das immer wieder wie du möchtest
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.479 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Aufgaben mit LiveBindings und Delphi-DB's erledigen

  Alt 4. Mai 2016, 22:16
Ok, das Event (OnFilterRecord) behalte ich mal in Reserve. Momentan kann ich es wie gewünscht per "Like" lösen, wobei man das in Zusammenhang mit "%" nutzen muss.

Der folgende Filter liefert mir wie gewünscht eine Suche über alle Felder, für den Begriff "grid" alle Einträge zurück, der ihn als Teil enthält (zusätzlich wird noch ein StandardFilter berücksichtigt [FrameWorkFilter], wenn der nicht Leer ist):

Delphi-Quellcode:
procedure TF_ConvertList.bnFindChange(Sender: TObject);
var
  find, AllFieldsFilter: String;
  L: Integer;
begin
  cds1.Filtered := False;

  if bnfind.Text <> 'then begin
    find := QuotedStr ('%'+ bnFind.Text+'%'); //<-- "%" mit Like, "*" für PartialRight-Suche
   
    for L := 0 to cds1.FieldCount-1 do begin
      if L = cds1.FieldCount-1 then begin
        AllFieldsFilter := AllFieldsFilter + cds1.FieldList[L].FieldName + ' like ' + find;
      end else begin
        AllFieldsFilter := AllFieldsFilter + cds1.FieldList[L].FieldName + ' like ' + find + ' OR ';
      end;
    end;

    if FrameWorkFilter <> 'then begin
      cds1.Filter := FrameWorkFilter + ' and (' + AllFieldsFilter + ')';
    end else begin
      cds1.Filter := AllFieldsFilter;
    end;
  end else begin
    cds1.Filter := FrameWorkFilter;
  end;

  cds1.Filtered := (bnFind.Text <> '') or (FrameWorkFilter <> '');
end;
vgl. Resultat der Suche im anliegenden Screenshot. Einen Platzhalter für Feldnamen, der für alle Felder steht, scheint es ja nicht zu geben (Hinweis, ich verwende hier nur das ClientDataset mit dem Datasource, ohne eine Datenbank dahinter).

Insgesamt scheint sich ja da eine erfreuliche Bandbreite an Möglichkeiten aufzutun.
Angehängte Grafiken
Dateityp: jpg Result.jpg (100,6 KB, 19x aufgerufen)

Geändert von Harry Stahl ( 4. Mai 2016 um 22:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.303 Beiträge
 
Delphi 12 Athens
 
#7

AW: Aufgaben mit LiveBindings und Delphi-DB's erledigen

  Alt 6. Mai 2016, 07:59
Hallo Harry...
Warum willst du dich in der Datenstruktur an das DataSet, DataSource, DB sensitive Controls Gedöns pressen lassen? Imho holst du dir mehr Flöhe in den Pelz als notwendig.
Persönlich habe ich mich davon komplett verabschiedet...und ein Klotz am Bein ist weg.
Mein Vorgehen:
1. Für die Daten des Programmes existieren einfache Datenobjekte (TPerson z.B.)
2. Diese werden in generischen Listen gehalten.
3. Das Füllen der Listen übernimmt eine Datenschicht welche als Interface implementiert ist. Beispiel: Data.FillList(PersonList: TPersonList)
4. Wenn die Listen gefüllt sind, werden die Daten in einem beliebigen Control dargestellt. Das Objekt hängt an dem jeweiligem Eintrag dran.

Vorteile:
1. Der Programmlogik ist es völlig wurscht wo die Daten herkommen...sie arbeitet mit den Objekten.
2. Die Datenschicht ist austauschbar... (Herkunft der Daten z.B. aus XML oder verschiedenen DBMS)
3. Die Daten können an verschiedene Controls übergeben werden. Du bist nicht auf die VCL beschränkt. Imho auch über LiveBindings.

Je nach Größe und Aufwand kann man sich das ORM (Datenschicht) selbst zusammenstellen (meine bevorzugte Variante) oder es mit einem verfügbarem Framework erledigen lassen.

Zu Filter + Sortierung:
* Sortieren der generischen Listen über Comparer
* Filtern über Neuaufbau der Anzeige über die Kriterien.
* Ableitung der Liste die ähnlich dem Comparer einen Filter erhält / übergeben bekommt. Über einen Getter gibst du die "gefilterte" Liste zurück.

...sieh es als Denkanstoß.

...ein schönes Wochenende.

Geändert von haentschman ( 6. Mai 2016 um 09:27 Uhr)
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.366 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Aufgaben mit LiveBindings und Delphi-DB's erledigen

  Alt 6. Mai 2016, 08:34
ergänzend zu haentschman: Da Du dich mit Datenbanken erst anfängst zu befassen (lt. deinem anderen Thread): Ich würde vermeiden die Datenmenge in einem Dataset nach eigener Willkür zu sortieren - das macht einfach keinen Sinn (wegen mir: Keine Regel ohne Ausnahme) nur damit in der Anzeige eine bestimmte Reihenfolge einzuhalten ist. Dazu gibt es zum einen Datenbankmechanismen (Index, Filter) oder die "bessere" Alternative über eine Datenbankzugriffsschicht bei der die Oberfläche unabhängig von irgend welchen Datenbankmöglichkeiten bestimmen kann wie die Datensätze angezeigt werden

Keine Frage: Die Lernkurve ist steiler, aber der Schritt Zeit in ein ORM zu investieren ist gut angelegt..

Grüße
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.479 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Aufgaben mit LiveBindings und Delphi-DB's erledigen

  Alt 6. Mai 2016, 19:09
Hallo Harry...
Warum willst du dich in der Datenstruktur an das DataSet, DataSource, DB sensitive Controls Gedöns pressen lassen? Imho holst du dir mehr Flöhe in den Pelz als notwendig.
Persönlich habe ich mich davon komplett verabschiedet...und ein Klotz am Bein ist weg.
Mein Vorgehen:
1. Für die Daten des Programmes existieren einfache Datenobjekte (TPerson z.B.)
2. Diese werden in generischen Listen gehalten.
3. Das Füllen der Listen übernimmt eine Datenschicht welche als Interface implementiert ist. Beispiel: Data.FillList(PersonList: TPersonList)
4. Wenn die Listen gefüllt sind, werden die Daten in einem beliebigen Control dargestellt. Das Objekt hängt an dem jeweiligem Eintrag dran.
Mal abgesehen davon, dass ich da einfach auch eine Wissenslücke schließen will, scheint es mir so, dass einige der vorgefertigten Datenbank-Komponenten recht hilfreich sein könnten.

Bislang habe ich das überall so gemacht, wie Du es hier beschrieben hast. Jedoch muss da immer viel händisch regeln und es hat mich einfach beeindruckt, wie einfach man mit dem ClientDataset filtern oder sortieren kann. Für kleine Datenmengen scheint das eine einfache, kompakte Sache zu sein.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.303 Beiträge
 
Delphi 12 Athens
 
#10

AW: Aufgaben mit LiveBindings und Delphi-DB's erledigen

  Alt 7. Mai 2016, 05:58
Moin...
Zitat:
...scheint das eine einfache, kompakte Sache...
Gegenargumente:
* iteriere durch die Datenmenge... sagen wir um etwas zu suchen und zu berechnen. Was macht das Grid? Aushängen / Einhängen...Arbeit Extra.
* nur VCL
* im Vergleich zu generischen Listen schnarch langsam (ggf. Eventorgien)
* ClientDataSet war mal (ist noch?) verbuggt
* mit ClientDataset geht noch... aber füge mal einer Datenmenge die aus der DB geholt wird 2 Felder für die Anzeige hinzu oder ändere die Anzeige. (Beispiel: in der DB steht nur der Index für einen Wert, der Klartext in einem String Array. In der Anzeige willst du aber Klartext. (Feldtypen passen nicht)... Leerfelder dazuholen und extra füllen ist die Devise... = Basteln
* versuche mal in einer numerischen Spalte in Abhängigkeit vom Wert eine unterschiedliche Anzahl von Nachkommastellen darzustellen. Das geht nur über selbst Zeichnen. Da fängt die Bastelei schon wieder an.
* wenn du dann noch im Grid editieren willst, hast du verloren. (Da gabs gerade etwas dazu)
* du bist auf die Optik der DB Controls angewiesen... teilweise verstaubte W95 Optik. Teilweise keine konsistente Darstellung der DB Controls.
* (Query - Edit, Post etc.) besser saubere SQL als nicht zu wissen was wirklich mit welchem Overhead in der Komponente passiert.
* Verwaltung der SQL Statements extern...also nicht in der Komponente verteilt über die Anwendung.
* wenn man mal mit der Bastelei angefangen hat wird der Code u.U. immer schlechter wartbar, weil man an verschiedenen Stellen nachhelfen muß.
* man kann nicht eben mal sagen... "Das Grid mag ich nicht mehr. Ich mach das jetzt mit Edits..." (Austauschbarkeit der GUI Schicht)

Zitat:
Jedoch muss da immer viel händisch regeln
... kannst du das näher erklären? Ich finde das ORM deutlich übersichtlicher da eine strickte Trennung zwischen der DB Schicht und der Logik herscht.
Zitat:
wie einfach man mit dem ClientDataset filtern oder sortieren kann
... imho ist das Sortieren nicht (unbedingt) die Aufgabe der Datenmenge sondern die der Anzeige (Spaltensortierung). Eine vernünftige Vorsortierung aus der DB ist u.U. auch durchaus hilfreich. Die Datenmenge ist beispielsweise nach ID sortiert, die Anzeige nach der Farbe der Unterhosen...

Fazit:
Ich habe gerade ein Projekt wo unbedingt DB Grids gefordert sind. Was ich, um die Darstellung zu gewährleisten, teilweise für Verrenkungen machen muß... Je komplexer die Anforderung umso größer die Bastelei. Für meinen Geschmack ist es ein Rückschritt in Technologie aus den 90ern.

...letztendlich bleibt es meine Meinung. Ein schönes Wochenende.

Geändert von haentschman ( 7. Mai 2016 um 06:14 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 17:09 Uhr.
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