AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Unterschiedliche Datensätze selektieren
Thema durchsuchen
Ansicht
Themen-Optionen

Unterschiedliche Datensätze selektieren

Ein Thema von HPB · begonnen am 9. Dez 2014 · letzter Beitrag vom 9. Dez 2014
Antwort Antwort
HPB

Registriert seit: 2. Jun 2008
365 Beiträge
 
Delphi XE7 Professional
 
#1

AW: Unterschiedliche Datensätze selektieren

  Alt 9. Dez 2014, 07:58
WHERE Key IN (1, 3, 4, 6, 7, 118) oder denke ich da jetzt zu falsch?

Wie entscheidest du eigentlich was gedruckt werden soll, also wo kommen die Keys her?
Danke an Euch beiden.
Den Vorschlag von Sir Rufo werde ich noch testen.

Zu himutsu:
Ich stelle die Daten in einem VirtualStringTree mit einer CheckBox dar.
Nun kann ich jeden zu druckenden DS aktivieren (CheckBox = Checked)
Im Node des VirtualStringTree ist der PrimaryKey der Tabelle mit hinterlegt.
Dein Vorschlag mit WHERE Key IN (1, 3, 4, 6, 7, 118) sieht doch sehr viel versprechend aus. Muss ich aber noch prüfen.
Vielen Dank nochmals
HPB
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.399 Beiträge
 
Delphi 12 Athens
 
#2

AW: Unterschiedliche Datensätze selektieren

  Alt 9. Dez 2014, 08:16
Selektierte Items durchgehen und die IDs mit Komma in einem String zusammenhängen.
Alternativ die IDs in eine Liste/Array und dann eine Funktions, welche die Einträge (Integer/String) mit Kommas zu einem Strig verbindet.
z.B. eine TStringList -> Add(IntToStr(Key)) > CommaText

Query.SQL := '... WHERE Key IN (' + KommaListe + ')'
oder
Delphi-Quellcode:
Query.SQL := '... WHERE Key IN (&KommaListe)';
Query.MacroByName('KommaListe').Value := KommaListe;
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
HPB

Registriert seit: 2. Jun 2008
365 Beiträge
 
Delphi XE7 Professional
 
#3

AW: Unterschiedliche Datensätze selektieren

  Alt 9. Dez 2014, 08:26
Selektierte Items durchgehen und die IDs mit Komma in einem String zusammenhängen.
Alternativ die IDs in eine Liste/Array und dann eine Funktions, welche die Einträge (Integer/String) mit Kommas zu einem Strig verbindet.
z.B. eine TStringList -> Add(IntToStr(Key)) > CommaText

Query.SQL := '... WHERE Key IN (' + KommaListe + ')'
oder
Delphi-Quellcode:
Query.SQL := '... WHERE Key IN (&KommaListe)';
Query.MacroByName('KommaListe').Value := KommaListe;
Danke himitsu,
ich habe es gerade mal ausprobiert.
Mit dem SQL-Befehl:
Delphi-Quellcode:
select * from ksopreise
where ksoid IN (323933, 94970, 504926)
bekomme ich das korrekte Ergebnis.
Es ist gelöst!

Gruß
HPB
  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
 
#4

AW: Unterschiedliche Datensätze selektieren

  Alt 9. Dez 2014, 09:01
Diese Lösung hat natürlich so sein Geschmäcke, da man hier ein Statement zusammenbaut. Änderungen an der Datenbank ziehen plötzlich an zig verschiedenen Stellen (einmal eingeführt wird das an zig Stellen so benutzt) Änderungen mit sich.

Man tut sich keinen Gefallen damit, auch wenn es jetzt so schön schnell und einfach aussieht.

Gerade beim FastReport kann man mit dem UserDataset doch so schöne Dinge bauen:
  • Eine Liste mit den ID-Werten erstellen
  • Eine statische Abfrage nach den Werten SELECT f1, f2, f3 FROM foo WHERE id=:id
  • Das UserDataset benötigt die Anzahl (von der Liste der IDs) und die Feldnamen (von der Abfrage) und ein paar Events (First, Prior, Next) für das Iterieren sowie das Abfragen der Werte (GetValue).
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 himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.399 Beiträge
 
Delphi 12 Athens
 
#5

AW: Unterschiedliche Datensätze selektieren

  Alt 9. Dez 2014, 09:32
Zitat:
Diese Lösung hat natürlich so sein Geschmäcke, da man hier ein Statement zusammenbaut.
Als Lösung würde ich mir auch wünschen, wenn die Zugriffskomponenten/Parameter auch mit Arrays umgehen könnten,
denn Variablen/Parameter innerhalb der DB bekommen sowas ja auch hin.

Delphi-Quellcode:
var meineIDs: TArray<Integer>; // TIntegerDynArray / array of Integer

Query.SQL := '... WHERE Key IN :meineIDs';
Query.ParamByName('meineIDs').Value := meineIDs; // eventuell über DynArrayToVariant
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 9. Dez 2014 um 09:37 Uhr)
  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: Unterschiedliche Datensätze selektieren

  Alt 9. Dez 2014, 12:27
Auch Datenbanken mögen es da gerne typsicher. Da wäre eben der Weg über eine temporäre Tabelle möglich.

Auch wenn ich mich wiederhole, gerade für Reports bietet es sich an, das Beschaffen und Ausgeben der Datensätze zu trennen.

Selektierte Datensätze in ein ClientDataset, die Daten (XML oder Binär) mit der Information was das denn bitteschön ist an den Reporter mit dem/den gewünschten Report/s.
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
HPB

Registriert seit: 2. Jun 2008
365 Beiträge
 
Delphi XE7 Professional
 
#7

AW: Unterschiedliche Datensätze selektieren

  Alt 9. Dez 2014, 14:36
Auch Datenbanken mögen es da gerne typsicher. Da wäre eben der Weg über eine temporäre Tabelle möglich.

Auch wenn ich mich wiederhole, gerade für Reports bietet es sich an, ....
Selbstverständlich ist Deine Argumentation nachvollziebar und auch sinnvoll Sir Rufo!
Ich trenne prinzipiell auch die Beschaffung und die Bereitstellung der Daten zur Änderung.
Die Daten für den Report hole ich über eine IBQuery und sie ist auch nur
zur Anzeige der selben gültig. Daten werden damit nicht geändert.
Ich habe einfach nicht gewusst, dass und wie ich den IN-Operator
auch in einer SQL-Anweisung anwenden kann.

Vielen Dank für Deine Ausführungen
HPB
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#8

AW: Unterschiedliche Datensätze selektieren

  Alt 9. Dez 2014, 16:01
Diese Lösung hat natürlich so sein Geschmäcke, da man hier ein Statement zusammenbaut. Änderungen an der Datenbank ziehen plötzlich an zig verschiedenen Stellen (einmal eingeführt wird das an zig Stellen so benutzt) Änderungen mit sich.
Also Records anhand der ID zu lesen ist so mit das unveränderlichste, was ich kenne. "Geschmäckle" hat es imho nur, wenn man den Automatismus ansetzt:"Huch, eine Query wird gebaut! Gefahr! SQL-Injection! Iiiehh!". Dagegen ist zunächst nichts einzuwenden. Zunächst, denn...
... nun ist das aber mindestens in ORM gang und gäbe, und eine IN-Selektion über Integer-Werte über eine selbstgebaute Funktion zu erstellen ist doch gefahrlos möglich. Das geht in jedem Fall schneller, als sich von hinten durch die Brust ins Auge eine extrem unperformante Lösung auszudenken.

Leider wurde beim 'IN' Operator die Parametrierungsmöglichkeit vergessen. Also macht man da eine Ausnahme: Man wird weder geteert noch gefedert und ausgelacht aus nicht.

Zitat:
Eine statische Abfrage nach den Werten SELECT f1, f2, f3 FROM foo WHERE id=:id
Wo ist bei dieser Abfrage der konzeptionelle Unterschied zu einer IN-Abfrage? Ach, der Datentype? Und wenn der Name 'id' verändert wird?

Selektierte Datensätze in ein ClientDataset, die Daten (XML oder Binär) mit der Information was das denn bitteschön ist an den Reporter mit dem/den gewünschten Report/s.
Wieso kein TDataset? Verstehe ich nicht. Da mach ich doch wieder Klimmzüge.

Dataset mit Parametrierung des Reports (und dieses eine Mal ein SELECT mit IN zusammengebaut). Fertig. Das ganze an den Report geflanscht und schon kann es losgehen. Das mit dem "XML oder Binär" habe ich nicht verstanden.

@mjustin: Das stimmt, da kommt es auf das RDBMS an. ich glaube, beim SQL-Server gibt es kein Limit. Aber wenn der Benutzer 100000 IDs ausgewählt hat, hat er selbst Schuld... Ich weiß, ein kleiner Button 'SELECT ALL' und -wupps- hat man den Salat.

Geändert von Dejan Vu ( 9. Dez 2014 um 16:04 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 09:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz