AGB  ·  Datenschutz  ·  Impressum  







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

SetRange und SQL

Ein Thema von TheSaint · begonnen am 3. Okt 2005 · letzter Beitrag vom 4. Okt 2005
Antwort Antwort
Seite 1 von 2  1 2      
TheSaint

Registriert seit: 29. Aug 2005
18 Beiträge
 
#1

SetRange und SQL

  Alt 3. Okt 2005, 15:58
Datenbank: BDE • Zugriff über: TTable
Hallo Datenbankspezis!

Kann man ein SetRange auch durch ein SQL-Statement abbilden?
Ich möchte von Paradox auf den SQL-Server umsteigen, aber ungern meine Zugriffsklasse umschreiben.

Danke
TheSaint
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: SetRange und SQL

  Alt 3. Okt 2005, 16:01
Was verstehst du unter SetRange? Codeschnipsel? Etwas genauer?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
TheSaint

Registriert seit: 29. Aug 2005
18 Beiträge
 
#3

Re: SetRange und SQL

  Alt 3. Okt 2005, 16:07
Z.B.:
Table1.Setrange([],[]);

Die Bedeutung von SetRange steht auch in der Hilfe. Code habe ich jetzt nicht zur Hand. Ist ja eigentlich auch keine Codingfrage, sondern eher eine Designfrage.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: SetRange und SQL

  Alt 3. Okt 2005, 16:42
Hallo,

sicher kannst du SetRange in SQL nachbilden. Hier am Beispiel eines compound key:

Delphi-Quellcode:
with Table do begin
  IndexName := 'BYNAME';
  SetRange([Nachname, VornameVon], [Nachname, VornameBis]);
end;
SQL-Code:
SELECT * FROM personen
WHERE nachname = :nachname AND vorname BETWEEN :von AND :bis
ORDER BY nachname, vorname
Grüße vom marabu
  Mit Zitat antworten Zitat
TheSaint

Registriert seit: 29. Aug 2005
18 Beiträge
 
#5

Re: SetRange und SQL

  Alt 4. Okt 2005, 09:34
Hallo,

danke für die Antwort. Vielleicht kannst Du mir nochmal helfen. Wie würde das SQL-Statement bei diesem SetRange ausschauen?

Delphi-Quellcode:
with Table do begin
  IndexName := 'BYNAME';
  SetRange([NachnameVon, VornameVon], [NachnameBis, VornameBis]);
end;
Danke
TheSaint
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: SetRange und SQL

  Alt 4. Okt 2005, 10:01
Hallo,

das passende SQL Statement steht schon in meinem vorigen Beitrag. Bleibt die Frage, warum du das nicht erkennst. Ist dir die Parameterangabe fremd, oder SQL überhaupt? Wie kann ich dir helfen?

Freundliche Grüße vom marabu
  Mit Zitat antworten Zitat
TheSaint

Registriert seit: 29. Aug 2005
18 Beiträge
 
#7

Re: SetRange und SQL

  Alt 4. Okt 2005, 10:25
Hallo!

Nein, ist mir nicht fremd. Vielleicht mache ich mal ein konkretes Beispiel.
Ich habe eine Tabelle mit 2 Spalten und 2 Zeilen. Beide mit dem Datentyp int.

Tabelle:
Col1 Col2
----------
1 1
2 0

Jetzt mach ich darüber ein Setrange:
table1.SetRange([1,1],[2,1]); Als Ergebnismenge bekomme ich zwei Datensätze, also die komplette Tabelle.

Nun mache ich das mit SQL:
Delphi-Quellcode:
SELECT * FROM Tabelle
WHERE (Col1 between 1 AND 2) AND (Col2 between 1 AND 1)
ORDER BY Col1, Col2
Hier bekomme ich eine Zeile als Ergebnis geliefert.

SetRange und das SQL-Statement liefern hier also unterschiedliche Ergebnisse.
Bleibt die Frage, ob ich einen Fehler in meiner Umsetzung habe, oder die SQL-Anweisung dafür nicht geeignet ist.

Danke
TheSaint
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: SetRange und SQL

  Alt 4. Okt 2005, 11:09
Damit du einen Range in einer Paradox-Tabelle selektieren kannst, musst du einen Sekundärindex definieren. In deinem Beispiel benötigst du also einen compound key (COL1, COL2). Wenn du SetRange([1,1], [2,1]) ausführst, dann wird effektiv SetRange([1], [2]) ausgeführt, da sich der Start- und Endwert für das Indexfeld COL1 unterscheiden. Nach meiner Erinnerung akzeptiert SetRange() nur beim letzten angegebenen Indexfeld abweichende Werte, was an der Implementierung über einen Sekundärindex liegt. Insofern wäre die korrekte Umsetzung nach SQL diese:

SQL-Code:
SELECT * FROM Tabelle
WHERE Col1 BETWEEN 1 AND 2
ORDER BY Col1, Col2
Ich habe jetzt erst entdeckt, dass du mein Beispiel für SetRange() in deiner Frage abgewandelt hattest - meine hier gegebene Erklärung gilt natürlich analog.

marabu
  Mit Zitat antworten Zitat
TheSaint

Registriert seit: 29. Aug 2005
18 Beiträge
 
#9

Re: SetRange und SQL

  Alt 4. Okt 2005, 11:27
Es ist mir schon klar, dass man einen Index braucht, um Setrange aufrufen zu können.

Zitat:
Wenn du SetRange([1,1], [2,1]) ausführst, dann wird effektiv SetRange([1], [2]) ausgeführt, da sich der Start- und Endwert für das Indexfeld COL1 unterscheiden.
Nein, das kann nicht sein. Ändere mal die kleine Beispieltabelle wie folgt ab:
Col1 Col2
----------
1 0
2 1
Also, einfach nur 0 und 1 vertauschen und den Setrange ausführen
SetRange([1,1], [2,1]) Nun bekommst Du einen Datensatz in der Ergebnismenge. Also werden auch gleiche Werte im letzten Indexfeld ausgewertet. Irgendwie schein die Sortierung eine Rolle zu spielen.

TheSaint
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: SetRange und SQL

  Alt 4. Okt 2005, 12:35
Deine Beispiele haben mich überzeugt. Wenn also bei der Auswertung der Indexfelder durch SetRange() keine Abhängigkeiten existieren, dann musst du bei der Übertragung der einzelnen Ranges nach SQL nur darauf achten, dass die BETWEEN Ausdrücke disjunktiv (OR) verkettet werden. Dein letztes Beispiel sieht dann so aus:

SQL-Code:
SELECT * FROM Tabelle
WHERE (Col1 between 1 AND 2) OR (Col2 between 1 AND 1)
ORDER BY Col1, Col2

/* oder besser so: */

SELECT * FROM Tabelle
WHERE (Col1 between 1 AND 2) OR (Col2 = 1)
ORDER BY Col1, Col2
Gut, dass du bei meiner falschen Erinnerung hartnäckig geblieben bist.

marabu
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 01:55 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