AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

sql

Ein Thema von Klaus D. · begonnen am 29. Nov 2003 · letzter Beitrag vom 7. Dez 2003
Antwort Antwort
Seite 2 von 3     12 3      
Klaus D.

Registriert seit: 27. Okt 2003
Ort: 03238 Finsterwalde
124 Beiträge
 
Delphi 6 Professional
 
#11

Re: sql

  Alt 2. Dez 2003, 19:44
Gruß
ja das ist ja richtig ,mache ich in der "ARC32" von ADS(oder zu Laufzeit).
ich meine das ja so, daß ich doch der Query2 die MasterSource,Schlüssel und IndexName mitteilen muß.
So war es jedenfalls mit den Tables.

wenn ich in der Query(2) nur eine einfache SELECT Abfrage mache ohne irgendwelche Filter über "1"Tabelle
bekomme ich ja auch keine Probleme mit den verknüpfungsangaben im Objektinspektor.
Sobald ich aber die Abfrage über mehrere Tabellen mache und versuche die Angaben
(MasterSource,oder IndexName)im Objektinspektor zu machen bekomme ich einen Indexfehler
Tschö Klaus

ich glaube da muß ich irgendwie selber hinter kommen kann man halt schlecht erklären,
Danke und Tschüß Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#12

Re: sql

  Alt 2. Dez 2003, 22:38
ok. Jetzt glaube ich zu verstehen, was Du meinst. Das ist keine referentielle Integrität. Eher eine parameterabhängige Query. Machst Du so:

Query1:
SQL-Code:
         SELECT MA.id_Motorart
                 ,MA.Motorart
                 ,TS.id_Typenschild
-- ,TS.sid_Motorart -- unnötig, da gleich MA.id_Motorart
-- ,sid_Fabrikat -- dto. FB.id_Fabrikat
                 ,TS.Typ -- auf Deinem Plan nicht zu sehen aus welcher Tabelle
                 ,TS.Drehzahl -- dto. (eventuell Tabellen-Präfix berichtigen)
                 ,TS.Motornummer -- dto.
                 ,TS.Leistung_KW -- dto.
                 ,FB.id_Fabrikat
                 ,FB.Fabrikat
           FROM tbl_Motorart MA
     INNER JOIN tbl_Typenschild TS
             ON TS.sid_Motorart = MA.id_Motorart
     INNER JOIN tbl_Fabrikat FB
             ON FB.id_Fabrikat = MA.sid_Fabrikat

     WHERE (TS.Typ like :p1) -- Tabellenpräfixe checken und ggF. anpassen
        OR (TS.Fabrikat like :p1)
        OR (TS.Drehzahl like :p1)
        OR (TS.Motornummer like :p1)
        OR (TS.Leistung_KW like :p1)
Query2:
SQL-Code:
         SELECT WD.id_Wickeldaten
                ,WA.id_Wicklungsart
                ,WA.Wicklungsart
- ,UndWasImmerDuSonstNochSoBrauchst

          FROM tbl_Wickeldaten WD
    INNER JOIN tbl_WicklungsArt WA
            ON WA.id_WicklungsArt = WD.sid_WicklungsArt
         WHERE WD.sid_TypenSchild = :id_TypenSchild
-- ^<--- der DoppelPunkt macht's!
Der Doppelpunkt vor dem "id_Typenschild" macht daraus einen Parameter. Der wird nun folgendermaßen aus der 1. Query immer dann mit einem frischen Wert versorgt, wenn dort ein anderer Datensatz gewählt wird:

Auf Formular gehören 2 TDataSources. Die eine im ObjektInspektor (Eigenschaft DataSet) an die 1. Query, die andere an die 2. Query hängen. Wieder im OI die Eigenschaft DataSource der 2. Query auf 1. DataSource (Die mit 1.Query verbunden ist) setzen.

Fertig. Muß gehen. Eigentlich. Probiermal.
Gruß
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
Klaus D.

Registriert seit: 27. Okt 2003
Ort: 03238 Finsterwalde
124 Beiträge
 
Delphi 6 Professional
 
#13

Re: sql

  Alt 2. Dez 2003, 23:05
Morgen Leuselator
Der Doppelpunkt macht es.hab ich noch nirgends gesehen.
in meinem SQL-Buch stand auch nichts dazu, habe mir aber am Sonntag ein umfassenderes Werk bei Ebay ersteigert. mal schauen ob ich da weiter komme.
Danke noch mal.Tschö Klaus

PS.ist schon der Hammer wie ein wildfremde Leute helfen !
  Mit Zitat antworten Zitat
Klaus D.

Registriert seit: 27. Okt 2003
Ort: 03238 Finsterwalde
124 Beiträge
 
Delphi 6 Professional
 
#14

Re: sql

  Alt 3. Dez 2003, 22:14
Gruß
Habe mich mit der Sache beschäftigt...sieht gut.
habe zwar noch ein Problem aber ich versuche es erst einmal alleine.
zu folgenden Codes habe ich aber noch eine Fräge:
Code:
 *SELECT* WD.id_Wickeldaten
* * * * * * * * ,WA.id_Wicklungsart
* * * * * * * * ,WA.Wicklungsart
-* * * * * * * *,UndWasImmerDuSonstNochSoBrauchst
* * * * * FROM tbl_Wickeldaten WD
* * INNER JOIN tbl_WicklungsArt WA
* * * * * * ON WA.id_WicklungsArt = WD.sid_WicklungsArt
* * * * *WHERE WD.sid_TypenSchild = :id_TypenSchild
--* * * * * * * * * * * * * * * * * ^<--- der DoppelPunkt macht's!
1:wieso brauche ich für "id_Typenschild" in der letzten Zeile keinen Tabellenpräfix.
2:unter welchen Stichpunkten muß ich suchen um etwas in der OH oder irgend einen SQL-Buch
zu diesem Thema zu finden wie heißt der Operator(= in der SQL-Sprache ?
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#15

Re: sql

  Alt 4. Dez 2003, 00:11
Für :id_Typenschild brauchst du keinen Tabellennamen, weil es keine Spalte, sondern eine Variable ist.

Schlag in deinem Buch mal unter Bind-Variable oder in der OH unter "Params property (TQuery)" nach.
In der OH ist dort auch gleich ein Code-Beispiel.

Hoffe es hat dir geholfen.
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#16

Re: sql

  Alt 4. Dez 2003, 02:17
Also ergänzend zum vorangegangenen Posting:

Der Doppelpunkt hat mit SQL herzlich wenig zu tun, er kennzeichnet einen Parameter für ein Delphi-TDataSet und soll Dir als Delphianer nur das Leben ein bisserl erleichtern.

Die TDataSet-Komponente "parst" (liest/durchsucht) Deinen SQL-Text und wenn sie auf einen Doppelpunkt stößt, interpretiert sie das darauf Folgende als Parameternamen (wie eine benamste Variable halt) und versucht dann, diesen Parameter-Platzhalter durch einen Wert zu ersetzen, bevor sie den SQL-Text auf die Datenbank losläßt (Die könnte mit dem Doppelpunkt/Parametername-Konstrukt nämlich nichts anfangen).

Da wir die 2. Query über die 1. DataSource an die 1. Query gebunden haben und dort ein Feld mit dem Namen "id_..." existiert, welches genauso heißt wie unser Doppelpunkt-Parameter, nimmt Dir die TQuery-Komponente Arbeit ab, indem Sie den Parameter in der 2. Query durch den entsprechenden Feldwert aus der 1. Query immer dann ersetzt, wenn dort ein Wechsel des Datensatzes vorgenommen wird.

Das gleiche Ergebnis würdest Du erzielen, wenn Du auf jeden Datensatzwechsel der 1. Query (Ereignis OnScroll) "von Hand" reagieren würdest und in der OnScroll-Routine der 1. Query folgendes tätest:
1. Schliessen 2. Query,
2. Löschen des SQL-Textes der 2. Query
3. denselben neu generieren (letzte Zeile dort:
Code:
Query2.SQL.Add('where sid_BlaBlaBla = '+IntToStr(Query1.FieldByName('id_BlaBlaBla').AsInteger));
4. 2. Query wieder öffnen

Du siehst, das die Doppelpunktvariante um einiges bequemer ist.

Ausserdem ist der Doppelpunkt so neu für Dich nicht - schau Dir mal Deine ursprünglichen Querys an - dort verwendest Du :p1 - das ist nix anderes als eine Variable Namens "p1", die Du dann später mit dem Wert des Edits füllst.

Gruß
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#17

Re: sql

  Alt 4. Dez 2003, 12:29
Ich hoffe das wird jetzt nich OT, aber Bind-variablen sind Bestandteil von SQL (wenigstens der Implementierungen in den "großen" DBs).

als Beispiel - Oracle anonym. Block:
SQL-Code:
DECLARE
   xyz VARCHAR2(20);
   CURSOR test_Cur(i_Name IN VARCHAR2) IS
      SELECT *
      FROM scott.emp t
      WHERE t.ename = i_Name;

   test_Rec test_Cur%ROWTYPE;
BEGIN
   xyz := 'SMITH';
   OPEN test_Cur(xyz);
   FETCH test_Cur
      INTO test_Rec;
   CLOSE test_Cur;
END;
oder
SQL-Code:
DECLARE
   xyz VARCHAR2(20);
   test_Rec scott.emp%ROWTYPE;
BEGIN
   xyz := 'SMITH';
   EXECUTE IMMEDIATE 'SELECT *' || chr(10) ||
                     'FROM scott.emp t' || chr(10) ||
                     'WHERE t.ename = :i_Name'
      INTO test_Rec
      USING xyz;
END;
Im Statement-Cache taucht das auf:
(genau das gleiche wenn ich Bind-variablen in einer Delphi-Query verwende)
SELECT * FROM SCOTT.EMP T WHERE T.ENAME = :b1
  Mit Zitat antworten Zitat
Benutzerbild von Garby
Garby

Registriert seit: 17. Mär 2003
Ort: Tirol
199 Beiträge
 
Delphi 2005 Professional
 
#18

Re: sql

  Alt 4. Dez 2003, 12:56
Hallo,

@George: Du hast vollkommen recht. Wenn der DB-Server keine Variablen unterstützen würde, müsste er bei jedem erneuten Ausführung des Statements neu Parsen und den Ausführungsplan neu erstellen.
Ich glaube aber Leuselator meint das Verlinken zweier DataSets mittels TDataSet.DataSource. Da kann seine Aussage durchaus stimmen.
Walter
Wenn zwei dasselbe tun, ist es noch lange nicht dasselbe
(Adelphi)
  Mit Zitat antworten Zitat
Klaus D.

Registriert seit: 27. Okt 2003
Ort: 03238 Finsterwalde
124 Beiträge
 
Delphi 6 Professional
 
#19

Re: sql

  Alt 4. Dez 2003, 20:07
Hey
der Begriff Bind-Variable ist egal wo ich suche unbekannt.
Trotzdem Danke
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#20

Re: sql

  Alt 4. Dez 2003, 22:45
Wird vielleicht nur un Oracle so genannt, ich kenn's halt nur so.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 08:12 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