![]() |
Also sollte der SQL-String in der ADOQuery so aussehen:
InsertStr[1] := 'ALTER TABLE Kinder ADD XY NUMERIC'; InsertStr[2] := 'ALTER TABLE .... InsertStr[3] := ... usw. und der Code für den Button sieht so aus, wie bei dir beschrieben. Dann muß ich nur noch die DBEdit-Felder so Formatieren, wie ich sie berauche. Kann ich die DBEdit-Felder schon in mein Programm einbauen obwohl zuerst in der Datenbank selbst die Felder noch gar nicht vorhanden sind? Ich möchte es ja so machen, dass wenn ein User das Programm installiert, er dann zuerst das DB-Update Button klickt damit die Datenbank auf den neuesten Stand ist. Und jetzt kann der User auch schon in die Felder was eintragen, die neu sind. Die Felder sind aber ja schon vorher drinn. Kann ich das so ohneweiters machen, oder gibts da einen konflikt, weil ja die Felder in der Datenbank noch nicht existieren?[/code] |
Hallo m-werk,
damit es nicht so kompliziert wird, würde ich ein kleines Programm schreiben, dass nur die Tabelle anpasst, d.h. die Felder hinzufügt. Das eigentliche Programm sollte dann die bereits angepasste Tabelle voraussetzen. Ansonsten ist deine vorgeschlagene Vorgehensweise korrekt. |
Ich hab jetzt alles so gemacht. Ich hab ein eigenes Programm erstellt. Nun hab ich probleme mit dem Button.
Code:
Es kommt immer die Meldung:
procedure TForm1.Button1Click(Sender: TObject);
var i : string; begin for i := 1 to 4 do begin DataModule2.ADOQuery1.Close; DataModule2.ADOQuery1.SQL.Clear; DataModule2.ADOQuery1.SQL.Add(InsertStr[i]); DataModule2.ADOQuery1.ExecSQL end; FOR-Schleifenvariable muß von ordinalem Typ sein Undefinierter Bezeichner: 'InsertStr' Was hab ich da vergessen? Weiters: Wie kann ich es anstellen, dass das Programm automatisch beim 1. Start des eigentlichen Programmes gestartet wird, und dann nie wieder. Denn wenn einmal die Felder in der DB sind, dann werd ich nicht nochmal das Programm starten. Wie muß ich da vorgehen? |
Hallo m-werk,
du hast ja nur eine Schleife :wink: , und dort steht nur eine Variable und die heißt i. I darf nicht als String, sondern muss als Integer (oder SmallInt) deklariert werden. Dann funktioniert es. Zum Thema automatisches Starten ![]() |
Das mit dem Start ist mir schon bekannt, aber ich möchte ja, dass diese exe-Datei nur beim 1. Start erfolgt. Mit diesem Code erfolgt sie bei Jedem Start.
|
Hallo m-werk,
frag doch in der Schleife nach, ob das Feld existiert:
Code:
Dabei ist FeldName ein Array, der die Namen der neuen Felder enthält und TheTable der Name des Tabellenobjekts, das auf die zu ändernde Tabell zeigt. Dann kann das Programm beliebig oft gestartet werden, ohne etwas kaputt zu machen. Ich würde aber noch eine Meldung ausgeben, wieviele Felder hinzugefügt worden sind.
procedure TForm1.Button1Click(Sender: TObject);
var i : string; begin for i := 1 to 4 do begin if Not DataModule2.TheTable.FindField(FeldName[i]) then begin DataModule2.ADOQuery1.Close; DataModule2.ADOQuery1.SQL.Clear; DataModule2.ADOQuery1.SQL.Add(InsertStr[i]); DataModule2.ADOQuery1.ExecSQL end end end; |
Das ist super. Muß ich gleich, wenn ich wieder mal zeit habe, das ausprobieren.
Eine Frage noch? Was beideutet ARRAY? Wie meinst du das mit ARRAY? |
Hallo m-werk,
genauso wie bei InsertStr. Du kannst es als Variable oder als typisierte Konstante deklarieren. Also z.B.:
Code:
const
FeldName : array[1..4] of String = ('Kinder', 'Geld', 'BlaBla', 'Hallo'); |
Ahh, so etwas ähnliches habe ich bei einer Berechnung gemacht:
Edit1 + Edit2 - Edit3 usw.
Code:
Das was in der Klammer steht, sind die Datenfelder und wo setze ich diesen Code ein?
const
FeldName : array[1..4] of String = ('Kinder', 'Geld', 'BlaBla', 'Hallo'); |
Hallo m-werk,
irgendwo im Sichtbereich der Stelle, an der du darauf zugreifst. Also z.B.:
Code:
Greifst du auch noch an anderen Stellen darauf zu, dann musst du die Deklaration z.B. for die Klassendeklaration der unit schreiben.
procedure TForm1.Button1Click(Sender: TObject);
const FeldName : array[1..4] of String = ('Kinder', 'Geld', 'BlaBla', 'Hallo'); var i : string; begin for i := 1 to 4 do begin if Not DataModule2.TheTable.FindField(FeldName[i]) then begin DataModule2.ADOQuery1.Close; DataModule2.ADOQuery1.SQL.Clear; DataModule2.ADOQuery1.SQL.Add(InsertStr[i]); DataModule2.ADOQuery1.ExecSQL end end end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:56 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