Autor Beitrag
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Di 01.10.13 08:07 
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.
ausblenden 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:
//FALL 1:
:

      DecodeDate(Date, liJahr, liDummy1, liDummy2);
      for i := 2005 to liJahr do
      begin
        with AddFieldDef do
        begin
          Name := Trim(IntToStr(i));
          DataType := ftFloat;
        end;
     end;
:
//FALL 2:
:
      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.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Di 01.10.13 14:50 
user profile iconWasWeißDennIch hat folgendes geschrieben Zum zitierten Posting springen:
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.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: 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?

Für diesen Beitrag haben gedankt: Tranx
Tranx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Di 01.10.13 16:06 
user profile iconWasWeißDennIch hat folgendes geschrieben Zum zitierten Posting springen:
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:

ausblenden 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:
ausblenden 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.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.