Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Unterschiedliche Datensätze selektieren (https://www.delphipraxis.net/183064-unterschiedliche-datensaetze-selektieren.html)

HPB 9. Dez 2014 07:03

Datenbank: Interbase • Version: 3 • Zugriff über: Server

Unterschiedliche Datensätze selektieren
 
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
Delphi-Quellcode:
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
Delphi-Quellcode:
where drucken = J
.

Aber vielleicht kennt noch jemand eine andere Lösung?

Mit Gruß

HPB

Sir Rufo 9. Dez 2014 07:16

AW: Unterschiedliche Datensätze selektieren
 
  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

himitsu 9. Dez 2014 07:28

AW: Unterschiedliche Datensätze selektieren
 
SQL-Code:
WHERE Key IN (1, 3, 4, 6, 7, 118)
oder denke ich da jetzt zu falsch? :gruebel:

Wie entscheidest du eigentlich was gedruckt werden soll, also wo kommen die Keys her?

HPB 9. Dez 2014 07:58

AW: Unterschiedliche Datensätze selektieren
 
Zitat:

Zitat von himitsu (Beitrag 1282711)
SQL-Code:
WHERE Key IN (1, 3, 4, 6, 7, 118)
oder denke ich da jetzt zu falsch? :gruebel:

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
SQL-Code:
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

himitsu 9. Dez 2014 08:16

AW: Unterschiedliche Datensätze selektieren
 
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

Delphi-Quellcode:
Query.SQL := '... WHERE Key IN (' + KommaListe + ')'

oder
Delphi-Quellcode:
Query.SQL := '... WHERE Key IN (&KommaListe)';
Query.MacroByName('KommaListe').Value := KommaListe;

HPB 9. Dez 2014 08:26

AW: Unterschiedliche Datensätze selektieren
 
Zitat:

Zitat von himitsu (Beitrag 1282717)
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

Delphi-Quellcode:
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

Sir Rufo 9. Dez 2014 09:01

AW: Unterschiedliche Datensätze selektieren
 
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
    SQL-Code:
    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).

himitsu 9. Dez 2014 09:32

AW: Unterschiedliche Datensätze selektieren
 
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, :cry:
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

Sir Rufo 9. Dez 2014 12:27

AW: Unterschiedliche Datensätze selektieren
 
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.

HPB 9. Dez 2014 14:36

AW: Unterschiedliche Datensätze selektieren
 
Zitat:

Zitat von Sir Rufo (Beitrag 1282754)
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:00 Uhr.
Seite 1 von 2  1 2      

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