AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Unterschiedliche Datensätze selektieren

Unterschiedliche Datensätze selektieren

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

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

Unterschiedliche Datensätze selektieren

  Alt 9. Dez 2014, 08:03
Datenbank: Interbase • Version: 3 • Zugriff über: Server
Guten Tag Delphianer,
ich möchte aus einer Tabelle einzelne Datensätze selektieren.

Z. B. befinden sich in einer Tabelle die Datensätze:

Key Artikelnummer Artikelanme
1 Artikel1 Irgendetwas
2 Artikel56 Nochwas
3 Artikel89 Anderer Artikel
4 Artikel100 Zuerst
5 Artikel899 Immer
6 Artikel34456 Verschieden
7 Artikel111 Nicht den
8 Artikel000 Dies und das
usw.

Ich möchte nun z. B. die Datensätze 1, 3, 4, 6, 7, 118 zusammen auswählen
um sie mit Fastreport auszudrucken.

Aber wie selektiere ich nun diese Datensätze?
Mit select * from artikel where ??? kann ich die Datensätze ja nicht filtern.

Ich könnte der Tabelle eine neue Spalte "drucken J/N" hinzufügen und dann
auf dieses Feld abfragen where drucken = J .

Aber vielleicht kennt noch jemand eine andere Lösung?

Mit 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
 
#2

AW: Unterschiedliche Datensätze selektieren

  Alt 9. Dez 2014, 08:16
  1. Temporäre Tabelle mit den ausgewählten IDs füllen und dann damit die Abfrage gestalten
  2. ClientDataSet mit den ausgewählten IDs füllen und dann per MasterDetail-Verbindung nur die markierten Sätze verwenden
  3. ClientDataSet mit den kompletten ausgewählten Sätzen füllen und die dem Report geben
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
43.017 Beiträge
 
Delphi 12 Athens
 
#3

AW: Unterschiedliche Datensätze selektieren

  Alt 9. Dez 2014, 08:28
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?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 9. Dez 2014 um 08:39 Uhr)
  Mit Zitat antworten Zitat
HPB

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

AW: Unterschiedliche Datensätze selektieren

  Alt 9. Dez 2014, 08: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
43.017 Beiträge
 
Delphi 12 Athens
 
#5

AW: Unterschiedliche Datensätze selektieren

  Alt 9. Dez 2014, 09: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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
HPB

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

AW: Unterschiedliche Datensätze selektieren

  Alt 9. Dez 2014, 09: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
 
#7

AW: Unterschiedliche Datensätze selektieren

  Alt 9. Dez 2014, 10: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
43.017 Beiträge
 
Delphi 12 Athens
 
#8

AW: Unterschiedliche Datensätze selektieren

  Alt 9. Dez 2014, 10: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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 9. Dez 2014 um 10: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
 
#9

AW: Unterschiedliche Datensätze selektieren

  Alt 9. Dez 2014, 13: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
 
#10

AW: Unterschiedliche Datensätze selektieren

  Alt 9. Dez 2014, 15: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
Antwort Antwort
Seite 1 von 2  1 2   

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 06:39 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