Autor Beitrag
Der Jan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

Win2k prof, WinXP prof, Linux
D6 Prof, BCB4 Std, BCB6 Ent, BDS 2006 Ent
BeitragVerfasst: Fr 16.12.05 15:44 
Hallo,

diese Frage hat ziemlich direkt mit diesem Thread www.delphi-forum.de/...r=asc&highlight= von mir zu tun...

Wie kann ich den Name einer Spalte aus einer Variablen generieren? Es geht darum das ich in einer Tabelle eine Menge Spalten anlegen muß, die alle ähnlich heißen, also möchte ich das ganze in eine Procedure packen:

ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
CREATE TABLE RATEN_NEU(
  ID: INT,
  BEGINN: DATE,
  ENDE: DATE
)


Jetzt wird eine Schleife durchlaufen und in dieser zähle ich eine Variable "I" hoch und würde dann gerne etwas schreiben wie:

ausblenden SQL-Anweisung
1:
ALTER TABLE RATEN_NEU ADD (Rate + I) NUMERIC 15,2					


So das die Spalten dann heißen Rate1, Rate2 usw.

Geht das bzw. wie ist der Syntax dafür?

_________________
Gruß, Jan
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Fr 16.12.05 16:04 
Du musst Dir den SQL-Befehl als String zusammenbasteln und dann an den Server übertragen. Ich kenne die Syntax nicht genau, aber ich mache das immer so (weil ich faul bin):
Du hast bestimmt eine Art Profiler oder einen SQL-Monitor, der alles aufzeichnet, was an SQL-Befehlen zum Server geht.

Daneben hast Du bestimmt ein Admin-Tool für deinen Server, mit dem man Tabellen anlegen kann.

Lege eine Tabelle an und schaue in den SQL-Monitor.
Füge eine Spalte hinzu und schau nochmal hin.

Nun weist du, wie der SQL-Befehl aussehen muss.

_________________
Na denn, dann. Bis dann, denn.
Der Jan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

Win2k prof, WinXP prof, Linux
D6 Prof, BCB4 Std, BCB6 Ent, BDS 2006 Ent
BeitragVerfasst: Fr 16.12.05 16:11 
Ähm, nee...

Ich weiss ja, wie der Befehl auszusehen hat. Es geht darum, daß der Spaltenname in jedem Schleifendurchlauf geändert wird. Es müssen paar hundert spalten angelegt werden und ich bin zu faul, das alles manuell zu machen.

Wie kann ich denn einen zusammengebauten Befehl (der ja dann irgendwo in einer Variablen stehen muß) direkt an den Server schicken?

_________________
Gruß, Jan
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Fr 16.12.05 19:24 
Welche Datenbank verwendest Du denn? Seit Version 1.5 kann Firebird Strings als SQL ausführen. Du baust den String also in einer Procedure zusammen und führst den String glaube mit  EXECUTE STATEMENT 'String';.
Ich glaube, die Syntax stimmt gerade nicht, hab das mal in einer Entwickler-Ausgabe gelesen, ich schau grad mal nach.

//EDIT: Habs gefunden, es war EXECUTE STATEMENT
Lake
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78


D6 prof., Delphi 10.2 Tokyo
BeitragVerfasst: Fr 16.12.05 19:34 
setze doch einen String zusammen, den Du dann an die TQuery übergibst. Vorher kannst Du prüfen ob das Feld schon existiert.

ausblenden Delphi-Quelltext
1:
sSQL := concat('ALTER TABLE RATEN_NEU ADD Rate',IntToStr(I),' NUMERIC 15,2');					
Robert.Wachtel
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: Fr 16.12.05 19:41 
Ganz abgesehen von Deinem ursprünglichen Anliegen würde ich Dein Datenbankdesign mal gründlich überdenken.

Normalisierung
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Fr 16.12.05 20:02 
user profile iconRobert.Wachtel hat folgendes geschrieben:
Ganz abgesehen von Deinem ursprünglichen Anliegen würde ich Dein Datenbankdesign mal gründlich überdenken.


Dem kann man nur zustimmen. 8)

user profile iconDer Jan hat folgendes geschrieben:
Es geht darum das ich in einer Tabelle eine Menge Spalten anlegen muß, die alle ähnlich heißen, also möchte ich das ganze in eine Procedure packen:


Geht es etwa nur um das Anlegen der Spalten ? :shock: Wenn dies per Programm gehen soll, dann sind definitiv zu viele Spalten da und die DB ist völlig falsch angelegt. Was soll denn da noch alles kommen, wenn tatsächlich Daten gespeichert werden ? :shock:

_________________
Gruß
Hansa
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Fr 16.12.05 20:07 
So wie ich das verstanden habe, muss er eine Pivot-Tabelle bzw. Crosstable erstellen, aber das kann "Der Jan" selber am Besten erklären. Dessenungeachtet wäre mit der Erstellung der ca. 80 Spalten jetzt schon läääängst fertig (das konnte ich mir nicht verkneifen).

_________________
Na denn, dann. Bis dann, denn.
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Fr 16.12.05 20:20 
user profile iconalzaimar hat folgendes geschrieben:
Dessenungeachtet wäre mit der Erstellung der ca. 80 Spalten jetzt schon läääängst fertig (das konnte ich mir nicht verkneifen).


So siehts aus, aber es geht so wohl nicht :

user profile iconDer Jan hat folgendes geschrieben:
Es müssen paar hundert spalten angelegt werden und ich bin zu faul, das alles manuell zu machen.


Ich habe das dumpfe Gefühl, daß hier DB-Felder mit Datensätzen evenzuell verwechselt werden und ein Admin Tool ein Fremdwort darstellt. :lol:

_________________
Gruß
Hansa
Der Jan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

Win2k prof, WinXP prof, Linux
D6 Prof, BCB4 Std, BCB6 Ent, BDS 2006 Ent
BeitragVerfasst: Di 20.12.05 11:26 
Hallo,

also erstmal danke für die Antworten.
"EXECUTE STATEMENT" ist in der Tat genau das, was ich gesucht habe.

Um auf die anderen Sachen einzugehen bzw. Spekulationen ein Ende zu setzen: :)


user profile iconhansa hat folgendes geschrieben:

Ich habe das dumpfe Gefühl, daß hier DB-Felder mit Datensätzen evenzuell verwechselt werden und ein Admin Tool ein Fremdwort darstellt. :lol:


Absolut nicht. Ich arbeite in der Regel mit IBExpert und weiß schon, was was ist :wink:

user profile iconRobert.Wachtel hat folgendes geschrieben:
Ganz abgesehen von Deinem ursprünglichen Anliegen würde ich Dein Datenbankdesign mal gründlich überdenken.

[url=de.wikipedia.org/wik...Normalisierung[/url]


Das dumme ist, das es nicht "mein" Datenbankdesign ist. Wir hatten hier eine DB mit Inventar. Darin sind natürlich auch Leasing-, Raten- und Mietverträge gespeichert. Mit den zu zahlenden Raten etc. Das Problem ist, das jetzt ein neues Inventarprogramm benutzt werden soll und die alte DB (deren Design zugegeben nicht sehr toll ist, aber auch nicht von mir :) ) irgendwie importiert werden muß. Die Möglichkeiten des Imports in das neue Programm sind auch nicht so arg komfortabel und so muß ich wohl oder übel eine Zwischenlösung stricken. Dazu gehört auch, das z.B. die einzelnen Raten so besch***** abgelegt werden, anders krieg ich das nicht importiert.

_________________
Gruß, Jan