AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Selektierte Datenätze in neue Abfrage
Thema durchsuchen
Ansicht
Themen-Optionen

Selektierte Datenätze in neue Abfrage

Ein Thema von TKanne · begonnen am 25. Mai 2011 · letzter Beitrag vom 26. Mai 2011
Antwort Antwort
Seite 1 von 2  1 2      
TKanne

Registriert seit: 6. Aug 2007
Ort: Berlin
24 Beiträge
 
Delphi 11 Alexandria
 
#1

Selektierte Datenätze in neue Abfrage

  Alt 25. Mai 2011, 20:55
Datenbank: MySQL • Version: 5 • Zugriff über: ADO
Hallo zusammen,

ich habe hier nun schon lange mitgelesen und konnte auch schon etliche Probleme durch Durchstöbern des Forums lösen.
Nun komme ich aber irgendwie nicht weiter.

Folgendes Problem:

Ich habe eine Anwendung mit einem DBGrid, das per ADO mit einer MySQL-Datenbank verbunden ist (ob ADO / MySQL nun die ideale Kombination ist, ist ein anderes Thema).

Per Tastendruck kann der Anwender einen oder mehrere Datensätze selektieren:

Code:
procedure Tfrm1.dbgrid1KeyPress(Sender: TObject;
  var Key: Char);
begin
  case Ord(Key) of
    77, 109:
      begin
        dbgrid1.SelectedRows.CurrentRowSelected := not dbgrid1.SelectedRows.CurrentRowSelected;
        dbgrid1.DataSource.DataSet.Next;
      end;
    13:
      // etwas anderes ...
  end;
end;
Dann kann man sich per Funktion nur die selektierten anzeigen lassen.
Soweit, so gut. Das klappt auch alles.

Nun sollen aus den selektierten Datensätzen eine neue Datenbankabfrage in einem neuen DBGrid erzeugt werden, wobei hierbei zusätzlich noch eine weitere Tabelle hinzuge-JOIN-t werden.

Hat jemand irgend eine Idee, wie man das am elegantesten lösen kann?
Ich dreh mich momentan gedanklich irgendwie im Kreis...

Vielen Dank schon mal für eure Hilfe,

TKanne
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

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

AW: Selektierte Datenätze in neue Abfrage

  Alt 25. Mai 2011, 21:06
Hallo...

tja, da wird dir nix anderes übrig bleiben als dein SQL in der Schleife über die Datensätze zusammenzusetzen.
Quasi...
- mit dem ersten "Selected" das "where" + deine Bedingung eröffnen
- mit jedem weiteren "Selected" ein "and" + deine Bedingung
- mit Eof dann das "order by" etc. dranhängen.
  Mit Zitat antworten Zitat
Jumpy

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

AW: Selektierte Datenätze in neue Abfrage

  Alt 25. Mai 2011, 21:10
Ich würde die PrimärSchlüssel der selektierten Datensätze in einen String packen mit Klammern drum. Nenn den jetzt mal "Auswahl".

Dann einer neuen / oder ruhig auch der alten Query das neue SQL-Statement zuweisen

Query1.SQL.Text:='Select * From Ursprungstabelle u'
Query1.SQL.Text:='Left Join bla b on blabla'
Query1.SQL.Text:='Left Join blub bl on blubblub'
.
.
.
Query1.SQL.Text:='where u.ID in ('+Auswahl+')'
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

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

AW: Selektierte Datenätze in neue Abfrage

  Alt 25. Mai 2011, 21:19
um die "Auswahl" zu erzeugen mußt du auch über die Datenmenge laufen. Da kannst du es gleich da zusammensetzen. Der nächste Vorteil wäre, daß du dabei auch mit Parametern arbeiten kannst...
Anhängen, Parameter setzen
  Mit Zitat antworten Zitat
TKanne

Registriert seit: 6. Aug 2007
Ort: Berlin
24 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Selektierte Datenätze in neue Abfrage

  Alt 25. Mai 2011, 21:22
Hallo,

danke für die schnellen Antworten.

@haentschman:
So etwas ähnliches hatte ich mir auch schon überlegt: Where (ID = X) OR (ID = Y) OR ...

Bei vielen selektierten Datensätzen könnte die WHERE-Klausel jedoch ziemlich lang werden. Gibt es da irgendwo ein Limit?

Ich hatte gedacht, man kann das evtl. irgendwie eleganter lösen mit TBookmark oder so.

@Jumpy:
OK, das wird dann auf jeden Fall etwas Kürzer als die OR-Verknüpfung.
Auch hier allerdings die Frage: Darf 'Auswahl' eine beliebige Länge haben?
  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
 
#6

AW: Selektierte Datenätze in neue Abfrage

  Alt 25. Mai 2011, 21:24
Am elegantesten geht es, wenn du eine temp. Tabelle anlegst und bei jedem Auswählen eines Datensatzes diesen in die temp. Tab einfügst bzw. auch wieder löschst (nur den PK)

Das ist für den User gefühlt die schnellste Art
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
TKanne

Registriert seit: 6. Aug 2007
Ort: Berlin
24 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Selektierte Datenätze in neue Abfrage

  Alt 25. Mai 2011, 21:29
Hmm, das mit der Temp-Tabelle wäre evtl. auch eine Variante, allerdings in diesem Fall ungünstig, da ich nur zu Auswertungen auf eine 'fremde' Datenbank zugreife und dort nur Leserechte habe.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#8

AW: Selektierte Datenätze in neue Abfrage

  Alt 25. Mai 2011, 21:45
Ich würde mich allen anschließen.

Code:
where [] in (...)
ist sicher eine einfache und preiswerte Möglichkeit.

Code:
[temptable]
bietet sich vor allem wegen der Performance an. Das hängt aber auch stark mit den erreichbaren Ausführungsplänen und Mengengerüsten zusammen. Weiß nicht, was der mySQL Optimizer alles kann.
Es muss nicht mal unbedingt "temp" sein. Eine permanente, userspezifische Tabelle könnte nicht nur die gewünschten Subselects liefern, sondern bspw. die letzten 10 Selektionen speichern....

P.S.: nur Leserechte passen natürlich eher zur ersten Variante
Gruß, Jo

Geändert von jobo (25. Mai 2011 um 21:47 Uhr) Grund: Sekundenschlaf
  Mit Zitat antworten Zitat
TKanne

Registriert seit: 6. Aug 2007
Ort: Berlin
24 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Selektierte Datenätze in neue Abfrage

  Alt 25. Mai 2011, 22:05
Hallo,

danke für Eure Vorschläge.

So, ich habe es jetzt mit der
Code:
where [] in (...)
Variante gemacht.

Funktioniert erst einmal soweit, zumindest mit 1342 selektierten Datensätzen, und die Select-Zeit ist auch akzeptabel, zumindest wenn man temporär das Dataset auf DisableControls setzt.
Allerdings bin ich mir noch etwas unsicher, das es ab einer gewissen Anzahl evtl. zu Problemen kommen kann.

Das war ja im Prinzip auch mein Ansatz, hatte nur gedacht, das wäre etwas laienhaft und es gäbe eine elegantere Lösung.

Aber die Temp-Tabellen-Version bzw. das speichern der Selektion in einer speziellen Tabelle werde ich mir mal für ein anderes Projekt merken.

Also Vielen Dank erst einmal,
TKanne
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#10

AW: Selektierte Datenätze in neue Abfrage

  Alt 25. Mai 2011, 22:09
Zu "where.. in.." sollte es je nach DB Version Limits geben (Doku, ..).
Welcher normale Benutzer selektiert aber per Klick mehr als 1000 Sätze?
Hier würde ich notfalls in der Anwendung ein Limit setzen oder auch in der Benutzerunterstützung. "select all" dürfte es dann nicht geben.
Gruß, Jo
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 00:15 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