Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Feld an den Anfang einer Tabelle hinzufügen (https://www.delphipraxis.net/6158-feld-den-anfang-einer-tabelle-hinzufuegen.html)

DBman 1. Jul 2003 15:48


Feld an den Anfang einer Tabelle hinzufügen
 
Ich wüsste gerne nochmal , wie man an den ANFANG einer Tabelle ein Spalte hinzufügen kann.

Über TTable.Fields.Add(Feldname :TField) wird ja an das ENDE der Tabelle hinzugefügt...

Vielleicht kann mir bei der Gelegenheit ja noch mal kurz sagen warum man manchmal eigentlich auf die eigenschaft TTable.Fields.Fields zugreifen muss....?
Irgendwie sehe ich den sinn da nich ganz drin , wenn man ne
Tabelle hat :

NAME ORT PLZ TEL

Und dann TTable.Fields[2] anspricht so ist ja die Spalte PLZ gemeint.
Aber was soll das jetzt mit Fields[2].Fields..... hm naja :shock: e

r_kerber 1. Jul 2003 17:56

Warum nimmst Du nicht Table.FieldByName['PLZ'].Value.... Dann Bist Du von der Reiehnfolge unabhängig. Ansonsten kannst Du auch von TField die Eigenschaft Index nutzen. Auszug aus der OH:
Zitat:

Ändern der Position eines Feldes in der Datenmenge durch Ändern von Index. Das Ändern des Indexwertes wirkt sich auf die Reihenfolge aus, in der Felder im Datengitter angezeigt werden, aber nicht auf die Position der Felder in physikalischen Datenbanktabellen.

DBman 1. Jul 2003 18:20

Ja aber 1. meine Frage war:
Wie kann einer Pararodox Datenbank eine neue 1.Spalte hinzufügen.
Ich möchte diese Spalte als erste Spalte haben , also nicht im Fields.Add an das Ende angehängt haben???

DBman 2. Jul 2003 19:03

??
 
Weiß da wirklich niemand Rat?

Marco Haffner 2. Jul 2003 19:11

Vielleicht mit insert?
Der Rechner an dem ich grad' sitze hat kein Delphi installiert und ich kann es nicht überprüfen.

r_kerber 2. Jul 2003 20:28

Zitat:

Zitat von Marco Haffner
Vielleicht mit insert?

Ne, das gibt's nicht. Man kann es eventuell über ein SQL-Statement (ALTER TABLE) erreichen, wird aber nicht von allen Datenbanken unterstützt. Eine die dies kann ist Informix.

DBman 2. Jul 2003 21:58

*hmpf* geht das nicht ohne sql?
arbeite mit ner Paradox-Tabelle.
und würde das gerne erstmal ohne sql machen :?

JoelH 3. Jul 2003 05:26

hmm,
 
also mal zuerst was zu SQL, dass ist das A und O der Datenbankprogrammierung, lern es lieber früher als später, wenn du wirklich mit DBs arbeiten willst !

Und dann versteh ich dein Problem nicht ganz, ich kenne zwar Paradox nicht aber ich denke mal es ist trotzdem schon eine relationale DB, da ist es doch total wurscht wo die Spalte , theoretisch, liegt, es ist doch einfach eine Frage des SELECT Querys (wieder SQL, lerns !) in welcher Reihenfolge du den Kram wieder ausliest !!

r_kerber 3. Jul 2003 06:26

Man kann auch in einem Grid die Reihenfolge der angezeigten Spalten festlegen, unabhängig von der Reihenfolge in der Datenbank und/oder im SQL-Select.

DBman 3. Jul 2003 11:11

Nein , das muss schon die 1. Spalte sein , weil ich alte DBF-Dateien in Paradox konvertiere und die erste Spalte der Paradox Tabelle vom Typ Zähler sein soll.

Bei Paradox Tabellen ist es so , dass man den PrimärIndex über die ersten Spalten setzen muss , d.h. man muss mit der 1.Spalte anfangen zu indizieren sonst geht es nicht.

Ja natürlich ist sql das a und o , aber da will ich im Moment noch nich ran.

r_kerber 3. Jul 2003 11:24

Dann fällt mir nur ein, dies in der Datenbank Oberfläche zu ttun, die bei Delphi mit ausgeliefert wird. Oder eben Paradox in die Tonne treten. :mrgreen:

DBman 3. Jul 2003 12:13

Nein ich will das ja nicht in der Datenbankoberfläche machen das soll ja automatisiert werden und Paradox trete ich auch nich in die Tonne....
Habe mir dazu folgendes überlegt:

Ich könnte eine neue Tabelle erzeugen mit der 1.Spalte "Zaehler" , Typ AutoInc.

Dann füge ich den Inhalt von Table1 dieser neuen Table2 hinzu , so dass ich eine neue Tabelle habe mit der 1. Spalte Zaehler.

Delphi-Quellcode:
begin
 with Table2 do
 begin
 Active := false;

 DatabaseName := 'STM';
 TableType := ttParadox;
 TableName := 'mitZaehler';

  { Dann die Felder in der Tabelle beschreiben }
  with FieldDefs do begin
    Clear;
      with AddFieldDef do begin
        Name := 'Zaehler';
        DataType := ftAutoInc;     //Erzeugen eines Zählerfeldes
        Required := True;
       end;
  end;
   CreateTable;

 end;
table2.AddIndex('','Zaehler',[ixPrimary]);
table1.open;
table2.open;
 Batchmove.Mode:=batAppend;
 Batchmove.Execute;          ///<-- Hier tritt der Fehler auf
table1.close;
table2.close;
..Allerdings tritt dabei der Fehler bei Batchmove.Execute auf:
Übersetzungsfehler , Wert liegt nicht im gültigen Bereich...

Ich könnte mir nur vorstellen , dass rumgemeckert wird , weil die Zaehlerspalte ja quasi leer ist( obwohl AutoInc füllt sich doch dann eigentlich automatisch oder?)

Hm vielleicht weiss ja jemand weshalb der Fehler da kommt.. :bounce2:

JoelH 4. Jul 2003 13:26

hmm,
 
was ich jetzt noch immer nicht verstehe, wenn du doch von dbf => Paradox gehst dann ist es doch wurscht wie die Felder in der Paradox angeordnet sind, denn du kannst sie ja beschreiben wie du willst in dem du sie beim INSERT via Name ansprichst !? Oder überseh ich grad was, ausser dass du SQL nicht verwenden willst ?

DBman 5. Jul 2003 17:47

wie denn beim insert?

Also meine Tabelle sieht so aus :
NAME TEL ORT

und ich will dass sie so aussieht :

ZAEHLER NAME TEL ORT


Wenn du mir den Delphibefehl dazu sagen kannst um das zu bewerkstelligen bin ich glücklich :mrgreen:

Das muss aber im Code passieren , ich will das nicht mit der Datenbankoberfläche manuell machen.

JoelH 5. Jul 2003 19:11

hmm,
 
also bei einem SQL Statement ist es doch wurscht ob du machst

INSERT INTO tabelle (xyz, abc, edk, kzw) VALUES (1,2,3,4)

oder

INSERT INTO tabelle (kzw, xyz, abc, edk ) VALUES (4,1,2,3)

MrSpock 5. Jul 2003 20:58

Hallo DBman,

dein Code ist gut. Du musst nur noch bei der BatchMove Komponente den MappingsArray füllen. Dort legst du fest, welche Spalten der neuen Tabelle zu welcher Spalte der alten Tabelle zugeordnet wird. Mappings kannst du entweder zur Designtime oder zur Laufzeit setzen. Wenn du es zur Laufzeit füllst, kannst du es einfach über eine Schleife erreichen, die über die Feldnamen läuft.

DBman 7. Jul 2003 14:59

Re: Feld an den Anfang einer Tabelle hinzufügen
 
Hm.. so ganz hab ich das noch nicht verstanden wie ich das mit dem Mappings-Array machen soll.
Da kann man ja eintragen welche Spalte welcher Spalte in der neuen Tabelle entsprechen soll.Aber was bringt mir das da jetzt?

Also konkret:
Tabelle1 : Ich habe ja die tabelle NAME ORT PLZ vorliegen.
Tabelle2 : und möchte dass der 2. Tabelle ZAEHLER , die erste tabelle hinten dran gehängt wird , so dass dann die tabelle lautet :

ZAEHLER NAME ORT PLZ

Aber was hab ich dann von dem Mappings Array? Mit dem Code den ich da gepostet hatte gabs jedenfalls Fehler..
Hm.
:roll:
Über Antworten wäre ich wie immer sehr dankbar

MrSpock 7. Jul 2003 15:25

Re: Feld an den Anfang einer Tabelle hinzufügen
 
Hallo DBman,

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
   i   : Integer;
   fldName : String;
begin
   Table1.Open;
   BatchMove1.Mappings.Clear;
   for i := 0 to Table1.FieldCount -1 do
   begin
      fldName := Table1.Fields[i].FieldName;
      BatchMove1.Mappings.Add(fldName +'=' +fldName);
   end;
   Table1.Close;
end;
Mit dem oben gezeigten Code füllst du den Mappingsarray. Das erste Feld (Zähler) erhält keine Daten aus der alten Tabelle, sondern wird automatisch gefüllt.

DBman 9. Jul 2003 13:13

Re: Feld an den Anfang einer Tabelle hinzufügen
 
Hallo Mr.Spock,
mit deinem Code habe ich aber auch noch Probleme:

Ich erhalte den Fehler , dass die Felder gar nicht vorhanden sind.
(also jetzt NAME , ORT ..usw...).

Aber die existieren in der anderen Tabelle ja auch noch gar nich die Felder...

wie mache ich das denn jetz nu?
:freak:
:coder:

r_kerber 9. Jul 2003 13:29

Re: Feld an den Anfang einer Tabelle hinzufügen
 
z.B. wie im Code-Beispiel zu TTable.CreateTable in der OH!

DBman 9. Jul 2003 19:35

Re: Feld an den Anfang einer Tabelle hinzufügen
 
Hä?
Ich will doch die Spalten der anderen Tabelle da automatisch hinzufügen ,
ich will doch nicht extra noch die Spalten ein zweites mal mit createtable erzeugen , und dann die inhalte von tabelle 1 da rein kopieren.. ?!?
Das wird alles viel zu umständlich.

:chat:

r_kerber 9. Jul 2003 20:41

Re: Feld an den Anfang einer Tabelle hinzufügen
 
:wiejetzt: Du willst Tabelle A nach Tabelle B kopieren. Entweder Du erstellst Tabelle B vorher mit allen benötigten Spalten (und den erforderlichen Namen) oder Du erstellst die Tabelle zur Laufzeit mit allen benötigten Spalten.

MrSpock 9. Jul 2003 21:27

Re: Feld an den Anfang einer Tabelle hinzufügen
 
Hallo DBMan,
ich habe das so verstanden, dass du die Originaltabelle nimmst, diese leerst und anschließend über die Datenbank Oberfläche vorne eine ID Feld hinzufügst. Diese Tabelle solltest du dann als Destination angeben.

Grundsätzlich solltest du dir auch mal den Wert der Eigenschaft Mode von TBatchMove anschauen. Nur batCopy erzeugt eine neue Tabelle (aber mit der Struktur der alten Tabelle, dort würde also das ID Feld fehlen).

DBman 12. Jul 2003 13:14

Re: Feld an den Anfang einer Tabelle hinzufügen
 
DARUM geht es doch als einziges.
Ich will nicht über die Datenbankoberfläche dieses eine Feld hinzufügen sondern über den Code....
Aber das kriege ich nicht hin.
Das is auch schon mein einziges Problem (aber scheint ja doch komplizierter zu sein). :spin:

MrSpock 12. Jul 2003 16:48

Re: Feld an den Anfang einer Tabelle hinzufügen
 
Hallo DBman,

sach dat doch gleich... :mrgreen:

Also, wenn du das Feld vorne anfügen willst, war der Code, den du oben gepostest hast ja schon richtig. Du hast in Table2 das Feld Zaehler als erstes Feld eingefügt. Anschließend -und das fehlte in deinem Code noch- kannst du die FieldDefs von Table1 in einer Schleife den FieldDefs von Table2 zuweisen und dann, abschließend, mit Bachmove unter Berücksichtigung des Mapping Arrays die Daten kopieren. Am Ende ggf. noch die Tabellen umbenennen.

DBman 12. Jul 2003 19:05

Re: Feld an den Anfang einer Tabelle hinzufügen
 
Mr Spock ich hab das jetzt so gemacht , das einzige was nur noch nich funktioniert ist das umbennen der Tabelle am Ende:
Delphi-Quellcode:
//....
 Batchmove.Execute;


 Table1.Active:=false;
 Table2.Active:=false;

 Table2.RenameTable(Table1.TableName);
und da kriege ich die Fehlermeldung , dass die Tabelle(table1) bereits im Gebrauch ist ... aber ich habe die doch geschlossen...
? :bounce1: ?

r_kerber 13. Jul 2003 09:01

Re: Feld an den Anfang einer Tabelle hinzufügen
 
Hallo DBman,

Auszug aus der OH:
Zitat:

RenameTable benennt die Tabelle und die zugehörigen Dateien um (für Paradox z.B. DB- und MB-Dateien).
Da für Table1 bereits eine Datei existiert, kannst Du diese Umbennung so nicht durchführen! Versuchs's mal so:
  1. Tabellennamen von Table1 in Variable speichern.
  2. Table1 umbenennen (oder löschen)
  3. Table2 umbenennen

DBman 13. Jul 2003 12:44

Re: Feld an den Anfang einer Tabelle hinzufügen
 
Auch so geht es nicht:
Delphi-Quellcode:
//...
Batchmove.Execute;
 Table1.Active:=false;
 Table2.Active:=false;

   alterTabellenName:=Table1.TableName;
 Table1.RenameTable('aaaa.db');
 Table2.RenameTable(alterTabellenName);
Kriege wieder den gleichen Fehler dass die Tabelle noch im Gebrauch ist..
? :bounce1: ?

r_kerber 13. Jul 2003 12:46

Re: Feld an den Anfang einer Tabelle hinzufügen
 
Und welche der beiden Tabellen?

DBman 13. Jul 2003 12:56

Re: Feld an den Anfang einer Tabelle hinzufügen
 
Wieder Table1 , bzw. die Tabelle die mit Table1 verknüpft ist.

r_kerber 13. Jul 2003 13:10

Re: Feld an den Anfang einer Tabelle hinzufügen
 
Und Du bist Dir ganz sicher, dass Du die Tabellen-Dateien (name.db) nicht durch ein anderes TTable-Object noch in Benutzung hast?

DBman 13. Jul 2003 13:31

Re: Feld an den Anfang einer Tabelle hinzufügen
 
ja da bin ich mir sicher.

ich habe die ja durch
Delphi-Quellcode:
table1.active:=false
        table2.active:=false
geschlossen.

r_kerber 13. Jul 2003 13:49

Re: Feld an den Anfang einer Tabelle hinzufügen
 
Dann weiß ich leider auch nicht weiter. :oops:

MrSpock 13. Jul 2003 13:51

Re: Feld an den Anfang einer Tabelle hinzufügen
 
Hallo DBman,

manchmal tritt der Fehler auf, weil man in der IDE die Tabellen noch geöffnet hat, indem man schon im OI Active auf True gesetzt hat. Ist das auch bei dir der Fall?

r_kerber 13. Jul 2003 13:56

Re: Feld an den Anfang einer Tabelle hinzufügen
 
Zitat:

Zitat von MrSpock
manchmal tritt der Fehler auf, weil man in der IDE die Tabellen noch geöffnet hat, indem man schon im OI Active auf True gesetzt hat.

Stimmt, das hatte ich ganz vergessen. Ist mir auch schon passiert. :oops:

DBman 13. Jul 2003 14:27

Re: Feld an den Anfang einer Tabelle hinzufügen
 
Ja Mr. Spock irgendwie hat mich das schon weitergebracht :)
Aber jetzt wird komischerweise immer noch bei Table2 rumgemeckert , dass die noch im Gebrauch ist..... hm.
Obwohl ich das im OI nicht auf Active gesetzt hatte...

Naja ich probier nochmal n bissel. :firejump:

DBman 13. Jul 2003 15:36

Re: Feld an den Anfang einer Tabelle hinzufügen
 
Nachdem ich im OI Table1.Active auf false gesetzt hatte funktioniert es jetzt endlich.
Der Code zum hinzufügen einer AutoInc Spalte an den Anfang einer Paradox-Tabelle sieht dann so bei mir aus (vielleicht gehts auch noch eleganter , aber so funktionierts bei mir zumindest) :

Delphi-Quellcode:
procedure TForm1.erzeugeClick(Sender: TObject);
var i:Integer;
    alterTabellenName:String;
begin
Table1.Active:=true;         //Table1 geöffnet
 with Table2 do
 begin
 Active := false;            //Table2 geschlossen

 DatabaseName := 'STM';
 TableType := ttParadox;
 TableName := 'mitZaehler.db';

  { Dann die Felder in der Tabelle beschreiben }
  with FieldDefs do begin
    Clear;
      with AddFieldDef do begin
        Name := 'Zaehler';
        DataType := ftAutoInc;
        Required := True;

for i:=0 to Table1.Fields.Count-1 do
                                //Tabellenstruktur übernehmen
      Table2.FieldDefs.Add( Table1.Fields[i].FullName , Table1.Fields[i].DataType,
                           Table1.Fields[i].Size, Table1.Fields[i].Required);

       end;

  end;
   CreateTable;
 end;


 Table1.Active:=false;
 Table2.Active:=false;

 BatchMove.Mappings.Clear;
for i:=0 to Table1.Fields.Count-1 do
    Batchmove.Mappings.Add(Table1.Fields[i].FullName + '=' +  //Mappingsarray füllen
                           Table1.Fields[i].FullName );

          Batchmove.Mode:=batAppend;
          Batchmove.Execute;

 Showmessage('Table2: ' + Table2.TableName);
 Showmessage('Table1: ' + Table1.TableName);
 alterTabellenName:=Table1.TableName;
 Table1.DeleteTable;
 Table2.RenameTable(alterTabellenName);
 Table2.Active:=False;
 Table2.AddIndex('','Zaehler',[ixPrimary]);

 end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz