Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Zeileninhalt direkt aus Parameter erzeugen (https://www.delphipraxis.net/199802-zeileninhalt-direkt-aus-parameter-erzeugen.html)

FediDelPr 20. Feb 2019 22:17

Datenbank: ACCESS • Version: 2016 • Zugriff über: ADO

Zeileninhalt direkt aus Parameter erzeugen
 
Hallo SQL Cracks,

ich möchte folgenden Ausdruck vereinfachen:

Delphi-Quellcode:
SELECT DISTINCT Parent FROM Hierarchie h1a WHERE (h1a.Parent = :ParamInteger1)


Ziel ist eine Tabelle die lediglich je eine Zeile/Spalte also ein Feld enthält,
wobei der Inhalt gleich dem Parameter ist.

Der Ausdruck wird nachher mit UNION mit weiteren Zeilen ergänzt.

Sicher ganz einfach.

hoika 21. Feb 2019 00:01

AW: Zeileninhalt direkt aus Parameter erzeugen
 
Halo,
so wie Du beschreibst, sollte die Abfrage doch genau das liefern?

Wo ist denn das Problem?

FediDelPr 21. Feb 2019 00:56

AW: Zeileninhalt direkt aus Parameter erzeugen
 
Das Problem ist vielleicht mehr akademischer Art.

Ich suche gerne nach möglichst einfachen, leicht verständlichen Lösungen.

Dieser Ausdruck kommt wegen etwa 10 UNION immer wieder vor.

Jasocul 21. Feb 2019 07:27

AW: Zeileninhalt direkt aus Parameter erzeugen
 
Meinst du sowas:
Code:
select :ParamInteger1
Bei MS-SQL kann man das machen. Wie es in Access ist, musst du ausprobieren.

mkinzler 21. Feb 2019 07:47

AW: Zeileninhalt direkt aus Parameter erzeugen
 
Oder
SQL-Code:
SELECT :ParamInteger1 as Parent FROM Hierarchie;

FediDelPr 21. Feb 2019 10:15

AW: Zeileninhalt direkt aus Parameter erzeugen
 
Variante Jasocul, die kürzeste, funktioniert tatsächlich.

Ich war vermutlich bis anhin über den Eintrag von Parametern im ADOQueryx gestolpert.
Wie und wann diese Einträge genau funktionieren ist mir noch nicht klar.
Mein Eindruck: manchmal bleiben alte Relikte hängen.
Werde ich noch anschauen müssen oder jemand hilft mir auf die Sprünge.


Variante mkinzler

Diese wird grundsätzlich akzeptiert, liefert aber für für jede Zeile der Tabelle dasselbe Resultat.
Leider lässt sich aus irgendeinem Grund DISTINCT nicht anwenden.

FediDelPr 21. Feb 2019 14:51

AW: Zeileninhalt direkt aus Parameter erzeugen
 
Ja so einfach scheint's nun doch wieder nicht zu sein:

Beim Einbinden in weiteren SELECT wird doch eine Tabelle oder Abfrage verlangt.

Dann wird's komplizierter / instabiler:
Auch der einfache Ausdruck (SELECT : ParamIntereger1) funktioniert nun nicht mehr, es
erscheint die Fehlermeldung:
Delphi-Quellcode:
    Fehler bei einem aus mehreren Schritten bestehenden OLE DB-Vorgang.
    Prüfen Sie die einzelnen OLE DB-Statuswerte, falls vorhanden.
    Die Daten wurden nicht verarbeitet.
Auch nach Neustart von Delphi und Schliessen/Oeffnen der DB kommt immer noch diese
Fehlermeldung (im Debugmodus).
Aber: Wenn ich das Programm einfach durchlaufen lasse (anstatt Activate = TRUE im Debug-Modus) kommt keine Fehlermeldung und das Resultat wird richtig erzeugt. Eigenartig.

Delphi.Narium 21. Feb 2019 15:42

AW: Zeileninhalt direkt aus Parameter erzeugen
 
Ehrlichgesagt hab' ich nicht kapiert, was Du da so bauen möchtest.

Fangen wir mal beim alten, guten Oracle an. Dort gibt es eine Tabelle Dual, die man für so allerlei "missbrauchen" kann.
SQL-Code:
create table dual (dummy Varchar(1));
insert into dual (dummy) values ('X');
Wenn man nun einen Wert braucht, den es in keiner Tabelle gibt, geht das z. B. mit
SQL-Code:
select sysdate from dual
Sinngemäß entspricht das einem
SQL-Code:
select :ParamInteger1
, wobei diese Select-Syntax ohne from nicht von allen Datenbanken verstanden wird. Es gibt da unterschiedliche Hilfskonstrukte.

Soweit so gut so theoretisch:

Vermutlich möchtest Du sowas:
SQL-Code:
select :Parameter1 from dual
union
select :Parameter2 from dual
union
select :Parameter3 from dual
union
select :Parameter4 from dual
union
select :Parameter5 from dual
union
select :Parameter6 from dual
union
select :Parameter7 from dual
union
select :Parameter8 from dual
union
select :Parameter9 from dual
union
select :Parameter10 from dual
Die per Select geholten Werte existieren nicht in der Datenbank, sondern sollen per Parameter in eine Ergebnismenge "reingewuselt" werden.

Das Ergebnis diese Konstruktes könnte man dann beliebig (per Join, als In-Klausel, where Exists ...) in beliebige Abfragen einbauen.

Suchst Du was in diese Richtung?

Aber: Parameter werden für gewöhnlich nur in der Where-Klausel akzeptiert und nicht als "Selectergebnis" oder für Tabellen-, Spaltennamen, ...

Das oben Skizzierte wird also mit an Sicherheit grenzender Wahrscheinlichkeit scheitern.

jobo 21. Feb 2019 21:36

AW: Zeileninhalt direkt aus Parameter erzeugen
 
Zitat:

Zitat von FediDelPr (Beitrag 1426175)
Variante mkinzler

Diese wird grundsätzlich akzeptiert, liefert aber für für jede Zeile der Tabelle dasselbe Resultat.
Leider lässt sich aus irgendeinem Grund DISTINCT nicht anwenden.

So wie es da steht, ist es auch genau so gedacht. Wenn die Tabelle 10000 Datensätze hat, kommt für jeden der Datensätze der Wert des (gleichen) Parameters zurück.

Du könntest vielleicht wirklich mal verraten, was Du erreichen möchtest. Also nicht: ich brauch 10 Union, sondern wofür Du das einsetzt, welche Werte da drinstehen sollen, warum genau diese Werte, also ganz einfach den Anwendungsfall. Vielleicht gibt es eine Abkürzung für Dein Vorhaben.
- Z.B. eine virtuelle Datenquelle mit definierten Werten?
- ..?
Wenn ja, würde man vielleicht am ehesten eine (temporäre )Tabelle erzeugen und dort per Insert die benötigten Werte eintragen und damit weiterarbeiten.
Falls das in bestehende Objekte eingebunden werden muss, kann man Dimensionen wie User, Session in der Tabelle definieren und diese on the fly mitverwalten.

p80286 21. Feb 2019 22:43

AW: Zeileninhalt direkt aus Parameter erzeugen
 
Delphi-Quellcode:
    Fehler bei einem aus mehreren Schritten bestehenden OLE DB-Vorgang.
    Prüfen Sie die einzelnen OLE DB-Statuswerte, falls vorhanden.
    Die Daten wurden nicht verarbeitet.
Das ist die unnachahmlich effizente Methode von ADO, Dir mitzuteilen, daß Du die Syntax Deiner Abfrage einmal überprüfen solltest.

Gruß
K-H
P.S.
das "SELECT DISTINCT Parent FROM Hierarchie h1a WHERE (h1a.Parent = :ParamInteger1)" bedeutet "Es gibt mindestens einen Datensatz mit Parent=Parameterinteger"


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:42 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