Entwickler-Ecke
Datenbanken - Neue Tabelle erzeugen mit Jahreszahlen als Feldnamen
Tranx - Di 01.10.13 08:07
Titel: Neue Tabelle erzeugen mit Jahreszahlen als Feldnamen
Hallo Leute,
habe mal wieder einen merkwürdigen Effekt:
Ich will eine Tabelle erzeugen, die Jahre als Feldnamen benutzt, z.B. für Rechnungssummen einzelner Jahre.
Die Tabelle wird auch erzeugt (Es ist eine Tabelle in einer ACCESS-Datenbank), jedoch statt der Feldnamenbezeichnung 2005, 2006 ... 2013 stehen dann die Feldnamen x005, x006, ... x013. Wie kann ich Delphi überlisten, damit die Zahle als Feldnamen da stehen?
Ich kann zwar durch Vorstellen von 'J' oder 'JAHR' .... die Zahl letztendlich ordnungsgemäß erzeugen (im Fall 2 stehen dann die Felder J2005, J2006, ... J2013), aber dann habe ich mehr Arbeit beim Übertragen der Werte aus einer Abfrage, in der die Felder als Jahreszahlen erscheinen in diese Tabelle, wo dann abgefragt werden muss, ob die Feldbezeichnung eine Zahl ist, und dann entsprechend der neue Feldname um das Präfix (J, JAHR....) ergänzt werden muss.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| :
DecodeDate(Date, liJahr, liDummy1, liDummy2); for i := 2005 to liJahr do begin with AddFieldDef do begin Name := Trim(IntToStr(i)); DataType := ftFloat; end; end; : : DecodeDate(Date, liJahr, liDummy1, liDummy2); for i := 2005 to liJahr do begin with AddFieldDef do begin Name := 'J' + Trim(IntToStr(i)); DataType := ftFloat; end; end; : |
Für Hilfen bin ich dankbar.
WasWeißDennIch - Di 01.10.13 08:19
Wahrscheinlich sind reine Zahlenangaben als Feldbezeichner unzulässig. Abgesehen davon halte ich das Vorgehen an sich bereits für fragwürdig, da es der Normalisierung zuwiderläuft. Das hat dann den Effekt, das zum Hinzufügen eines Jahres die Tabellenstruktur geändert werden muss. Wie wäre es stattdessen mit einer weiteren Tabelle für die Jahre? Die zugehörigen Daten bekommen dann den PK dieser Tabelle als Fremdschlüssel.
Tranx - Di 01.10.13 14:50
WasWeißDennIch hat folgendes geschrieben : |
Wahrscheinlich sind reine Zahlenangaben als Feldbezeichner unzulässig. Abgesehen davon halte ich das Vorgehen an sich bereits für fragwürdig, da es der Normalisierung zuwiderläuft. Das hat dann den Effekt, das zum Hinzufügen eines Jahres die Tabellenstruktur geändert werden muss. Wie wäre es stattdessen mit einer weiteren Tabelle für die Jahre? Die zugehörigen Daten bekommen dann den PK dieser Tabelle als Fremdschlüssel. |
Ich erzeuge die Tabelle komplett neu, daher ist die vorherige Struktur völlig egal. Und die Zahlen im Feldnamen stammen aus einer Kreuztabelle. Es geht auf Access-Seite auf jeden Fall, Zahlen als Feldnahmen zu verwenden, zumal sie auch noch ein Vorteil haben, dass sie einfach über eine Schleife abgearbeitet werden können, aber wenn es Delphi nicht schafft, egal, dann muss ich eben den Umweg gehen. Zum Schluss landet das Ganze eh in Excel. Es geht nur um eine Zwischenspeicehrung von Daten in einer Access-Tabelle, die über Delphi einfacher angesteuert werden kann, als gleich in eine Excel-Datei. Und ich habe diesen WEg gewählt, weil ich dann einfacher aus der Abfrage in Acces (Kreuztabellenabfrage) eine richtige Tabelle mit der Möglichkeit der Sortierung nach einzelnen Feldern (z.B. den Daten des Jahres 2013) erstellen kann. Die Kreuztabelle selber kann leider nach den Spaltenfeldern nicht sortiert werden.
WasWeißDennIch - Di 01.10.13 15:05
OK, das ist etwas anderes. Was ist denn, wenn Du es mit einem DDL-Statement versuchst, bekommst Du dann die gewünschen Feldnamen?
Tranx - Di 01.10.13 16:06
WasWeißDennIch hat folgendes geschrieben : |
OK, das ist etwas anderes. Was ist denn, wenn Du es mit einem DDL-Statement versuchst, bekommst Du dann die gewünschen Feldnamen? |
Danke für den Hinweis, ich habe es jetzt so gelöst:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.ErzeugeTabelle; var loTabelle: TTable; begin try loTabelle := TTable.Create(Form1); loTabelle.DatabaseName := 'AUSWERTDB'; loTabelle.TableName := 'KdNr_Jahr'; loTabelle.Active := False; loTabelle.DeleteTable; finally try qryKdNrJahr.Active := True; qryKdNrJahr.Active := False; except end; end; end; |
Die Tabelle muss ich vorher löschen, bevor ich die SQL aufrufen kann, daher die zweigeteilte Vorgehensweise.
Die zweite Try .. Except .. End - Struktur war notwendig, weil das Aufrugen der TQuery einen Fehler : Fehler bei der Erzeugung des Cursor-Handles zeigte. Keine blasse Ahnung was hier mit Cursor-Handle gemeint ist.
Die SQL-Abfrage in qryKdNrJahr lautet:
Delphi-Quelltext
1: 2:
| SELECT AR_Jahr.* INTO KDNR_JAHR FROM AR_Jahr |
Die Tabelle ist KDNR_Jahr und die Abfrage AR_Jahr.
Somit erledigt ACCESS die ganze Arbeit. Was sicher auch, da es sich bei den Datenbanken um im Netz liegende Datenbanken handelt, das Ganze deutlich beschleunigt.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!