![]() |
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 |
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:
|
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??? |
??
Weiß da wirklich niemand Rat?
|
Vielleicht mit insert?
Der Rechner an dem ich grad' sitze hat kein Delphi installiert und ich kann es nicht überprüfen. |
Zitat:
|
*hmpf* geht das nicht ohne sql?
arbeite mit ner Paradox-Tabelle. und würde das gerne erstmal ohne sql machen :? |
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 !! |
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.
|
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. |
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:
|
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:
..Allerdings tritt dabei der Fehler bei Batchmove.Execute auf:
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; Ü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: |
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 ?
|
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. |
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) |
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. |
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 |
Re: Feld an den Anfang einer Tabelle hinzufügen
Hallo DBman,
Delphi-Quellcode:
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.
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; |
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: |
Re: Feld an den Anfang einer Tabelle hinzufügen
z.B. wie im Code-Beispiel zu TTable.CreateTable in der OH!
|
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: |
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.
|
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). |
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: |
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. |
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:
und da kriege ich die Fehlermeldung , dass die Tabelle(table1) bereits im Gebrauch ist ... aber ich habe die doch geschlossen...
//....
Batchmove.Execute; Table1.Active:=false; Table2.Active:=false; Table2.RenameTable(Table1.TableName); ? :bounce1: ? |
Re: Feld an den Anfang einer Tabelle hinzufügen
Hallo DBman,
Auszug aus der OH: Zitat:
|
Re: Feld an den Anfang einer Tabelle hinzufügen
Auch so geht es nicht:
Delphi-Quellcode:
Kriege wieder den gleichen Fehler dass die Tabelle noch im Gebrauch ist..
//...
Batchmove.Execute; Table1.Active:=false; Table2.Active:=false; alterTabellenName:=Table1.TableName; Table1.RenameTable('aaaa.db'); Table2.RenameTable(alterTabellenName); ? :bounce1: ? |
Re: Feld an den Anfang einer Tabelle hinzufügen
Und welche der beiden Tabellen?
|
Re: Feld an den Anfang einer Tabelle hinzufügen
Wieder Table1 , bzw. die Tabelle die mit Table1 verknüpft ist.
|
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?
|
Re: Feld an den Anfang einer Tabelle hinzufügen
ja da bin ich mir sicher.
ich habe die ja durch
Delphi-Quellcode:
geschlossen.
table1.active:=false
table2.active:=false |
Re: Feld an den Anfang einer Tabelle hinzufügen
Dann weiß ich leider auch nicht weiter. :oops:
|
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? |
Re: Feld an den Anfang einer Tabelle hinzufügen
Zitat:
|
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: |
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