AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Automatische Felder in der Access-DB erzeugen
Thema durchsuchen
Ansicht
Themen-Optionen

Automatische Felder in der Access-DB erzeugen

Ein Thema von m-werk · begonnen am 9. Sep 2002 · letzter Beitrag vom 1. Okt 2002
Antwort Antwort
Seite 4 von 4   « Erste     234   
m-werk

Registriert seit: 14. Jun 2002
215 Beiträge
 
Delphi 2009 Architect
 
#31
  Alt 25. Sep 2002, 20:21
Hi, ich hab bemerkt, dass ich das aber nicht einfach so erweitern kann.

Ich habe zuerst 4 Felder in die Datenbank eingefügt. Das hat prima geklapt.

Nun aber habe ich den Code um 1 Feld erweitert. Das klapt aber nicht.

Code:
procedure TKundendaten.Button3Click(Sender: TObject);
const
   FeldName : array[1..5] of String = ('Rueckzahlung', 'Kreditwaehrung', 'Zinssatz1', 'Zinssatzgebunden', 'Aufschlag');
   InsertStr : array[1..5] of String =
               ('ALTER TABLE Finanzierung ADD Rueckzahlung CHAR(30)',
                'ALTER TABLE Finanzierung ADD Kreditwaehrung CHAR(10)',
                'ALTER TABLE Finanzierung ADD Zinssatz1 CHAR(10)',
                'ALTER TABLE Finanzierung ADD Zinssatzgebunden CHAR(10)',
                'ALTER TABLE Finanzierung ADD Aufschlag FLOAT');
   var i : Integer;
begin
  for i := 1 to 5 do
  begin
    if DM.ADOSFinanzierung.FindField(FeldName[i])=NIL then
    begin
       DM.QueryFinanzierung.Close;
       DM.QueryFinanzierung.SQL.Clear;
       DM.QueryFinanzierung.SQL.Add(InsertStr[i]);
       DM.QueryFinanzierung.ExecSQL
     end;
   end;
end;
Wenn ich im Programm nun den Button anklicke, kommt folgende Fehlermeldung:

Feld 'Rueckzahlung' ist bereits in der Tabelle 'Finanzierung' vorhanden.

Kann man das umgehen, so dass wenn man den Button drückt diese Meldung nicht mehr kommt?
Es kann ja sein, dass einige User einigemale auf den Button klicken.
Da soll einfach nichts geschehen, wenn schon die Felder in der DB stehen.

Und wenn welche dazukommen, dann sollen die einfach dazukommen. Die anderen sollen dabei nicht angegriffen werden.
Grüße, m-werk
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#32
  Alt 25. Sep 2002, 22:13
Hallo m-werk,

das ist verwunderlich, weil wir ja extra die Abfrage FindField benutzen, um ein Feld nicht mehrfach hinzuzufügen.

Ich könnte mir aber vostellen, dass es da ein Problem gibt, weil ja die ADOFinanzierung Tabelle geöffnet ist, und du dann versuchst ein Feld hinzuzufügen. Versuche doch einmal:

Code:
    if DM.ADOSFinanzierung.FindField(FeldName[i])=NIL then
    begin
       DM.ADOSFinanzierung.Close;
       DM.QueryFinanzierung.Close;
       DM.QueryFinanzierung.SQL.Clear;
       DM.QueryFinanzierung.SQL.Add(InsertStr[i]);
       DM.QueryFinanzierung.ExecSQL;
       DM.ADOSFinanzierung.Open;
     end;
Als zweite mögliche Ursache könnte ich mir vorstellen, dass es ein Problem gibt, wenn du die Felder der bereits bestehende Tabelle über den Feldeditor hinzugefügt hast. Es könnte sein, dass FindField dann die neuen Felder nicht findet. Ich meine mich erinnern zu können, dass das bei FieldByName auch so ist, dass die nicht eingefügten Felder nicht gefunden werden, obwohl sie ja in der zugrundeliegenden Datenmenge enthalten sind.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#33
  Alt 25. Sep 2002, 22:41
Hallo m-werk,

ich glaube ich habe den Fehler gefunden. Die Tabelle muss natürlich für die Abfrage FindField geöffnet sein, darf aber dann für das Hinzufügen der Felder nicht geöffnet sein, also:

In der Schleife:
Code:
    DM.ADOSFinanzierung.Open;
    if DM.ADOSFinanzierung.FindField(FeldName[i])=NIL then
    begin
       DM.ADOSFinanzierung.Close;
       DM.QueryFinanzierung.Close;
       DM.QueryFinanzierung.SQL.Clear;
       DM.QueryFinanzierung.SQL.Add(InsertStr[i]);
       DM.QueryFinanzierung.ExecSQL;
     end;
So hat es bei mir funktioniert. Übrigens ist die o.g. Annahme richtig, dass die alten Felder nicht über den Feldeditor hinzugefügt worden sein dürfen. Das heißt also, dass du ggf. doch ein zweites "Update" Programm erstellen musst.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
m-werk

Registriert seit: 14. Jun 2002
215 Beiträge
 
Delphi 2009 Architect
 
#34
  Alt 26. Sep 2002, 19:14
Hi, ich habe jetzt den code so erstellt, wie oben beschrieben.

LEIDER hab ich noch immer das gleiche problem.

Wenn die Felder in der Datenbank nicht existieren, dann werden sie mit dem klick hinzugefügt. Das klapt zur Zeit prima. Aber wenn ich nochmals den Button anklicke, dann kommt wieder die Fehlermeldung, die ich oben schon genannt habe.

Weiters wollte ich dann im Formular ein Edit einbauen, dass auf die neuen Datenfelder zugreifen soll. Das hat nicht funktioniert. Ich habe die DataSource zugeordnet, dann wollte ich das Feld zuordnen aber es scheint kein neues Feld auf.
Ich kann diese nicht zuordnen, obwohl diese in der Datenbank schon existieren.

Was ist da los?
Grüße, m-werk
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#35
  Alt 26. Sep 2002, 20:25
Hallo m-werk,

ich vermute, du hast die "alten" Felder der Tabelle über den Feldeditor in das Programm eingefügt. Ist das so?
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
m-werk

Registriert seit: 14. Jun 2002
215 Beiträge
 
Delphi 2009 Architect
 
#36
  Alt 26. Sep 2002, 20:49
Hi, wie meinst du damit?

Ich habe die Felder, welche ich eingefügt habe mit dem Code, der oben beschrieben ist, eingefügt.

Ich habe dann die ADOSFinanzierung mit doppelklick geöffnet und wollte dann 'Felder hinzufügen' anklicken, da kam die Meldung:

Fehler bei der Authentifizierung.

Ich hab keine Ahnung, was dass wieder heißt.

Sonst hab ich nichts gemacht.
Grüße, m-werk
  Mit Zitat antworten Zitat
m-werk

Registriert seit: 14. Jun 2002
215 Beiträge
 
Delphi 2009 Architect
 
#37
  Alt 30. Sep 2002, 17:33
Hi Leute, hat keiner von euch eine Idee, wie Ich das obrige Problem lösen kann?

Wäre euch zu dank verpflichtet, wenn ihr mir helfen könnt!
Grüße, m-werk
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#38
  Alt 30. Sep 2002, 21:38
Hallo m-werk,

was ich meine ist folgendes. Du hast ja bereits ein Programm, was auf die Tabelle ADOSFinanzierung mit der alten Struktur zugreift. Diese alten Felder hast du wahrscheinlich über einen Doppelklick auf das Tabellensymbol als TField - Objekte eingefügt. Wenn du jetzt neue Felder hinzufügst, werden diese zunächst korrekt der Tabelle hinzugefügt. Das Programm, was ich oben beschrieben habe nutzt die Funktion FindField, um festzustellen, ob die "neuen" Felder in der Tabelle gefunden werden können. Das Problem ist aber, dass dadurch, dass die alten Felder bereits hinzugefügt wurden, die Funktion FindField die neuen Felder nicht sehen kann.

Ein Authentisierungsfehler tritt normalerweise auf, wenn du auf die Tabelle nicht zugreifen kannst, z.B. weil das Passwort nicht stimmt.

Deshalb war mein Vorschlag, ein kleines Programm zu schreiben, bei dem noch keine Felder über den Feldeditor eingefügt wurden. Das Programm hat nur die Tabelle und einen Button, der die ALTER TABLE Statements ausführt. Das sollte dann funktionieren.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
m-werk

Registriert seit: 14. Jun 2002
215 Beiträge
 
Delphi 2009 Architect
 
#39
  Alt 1. Okt 2002, 19:55
Hi, ich glaub jetzt hab ich die Ursache für den Fehler gefunden.

Bei mir ist es so, dass ich bei der ConnectionString im Objektinspektor nichts drinn stehen habe. Das heist, ich kann, wenn ich im Programmiermodus bin, nichts neues erstellen.

Ich rufe erst die Connectionstring beim start des Programmes auf. Ich habe das deshalb gemacht, da ich den Path von der Datenbank in die Registry schreibe und von dortaus auch ablese. (Das hat so seine Gründe).
Und ein Passwort habe ich ja auch in der Connectionstring.

So sieht der Code aus:
Code:
procedure TDM.DataModuleCreate(Sender: TObject);
var REG:TRegistry;
    a:string;
begin
  REG:=Tregistry.create;
  try
    REG.RootKey := HKEY_CURRENT_USER;
    REG.Access := KEY_READ;
    if REG.OpenKeyReadOnly('Software\AriusDB\SettingsDB') then
    begin
      try
        a:=REG.ReadString('DBPath');
        if not DirectoryExists(a) then
        begin
          MessageBox(0,PChar(SysErrorMessage(GetLastError)+#13#13+'Datenbank wurde nicht gefunden! Wert: '+IntToStr(GetLastError)),'Fehler!',MB_ICONERROR or MB_OK);
        end;
      except
        MessageBox(0,PChar(SysErrorMessage(GetLastError)+#13#13+'Datenbank wurde nicht gefunden! Wert: '+IntToStr(GetLastError)),'Fehler!',MB_ICONERROR or MB_OK);
      end;
    end
    else
    begin
      MessageBox(0,PChar(SysErrorMessage(GetLastError)+#13#13+'Datenbank wurde nicht gefunden! Wert: '+IntToStr(GetLastError)),'Fehler!',MB_ICONERROR or MB_OK);
    end;
  finally
    FreeAndNil(REG);
  end;
  ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=' +
                          a + '\Kundendaten.mdb;Mode=ReadWrite;Extended Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password=passwort;'+
                         'Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;' +
                         'Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don''t Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False';
  ADOConnection1.Connected := TRUE;
  DM.ADOSHaupt.Open; DM.ADOSKinder.Open; DM.ADOSGeschaeft.Open; DM.ADOSFinanzierung.Open;
  DM.ADOSHaushalt.Open; DM.ADOSAnlageprofiel.Open; DM.ADOSEmpfehlung.Open; DM.ADODataSet1.Open;
  DM.ADODataSet2.Open;
end;
Kann ich das auch anders machen, so dass ich im Programmiermodus auch aktuell bin?
Grüße, m-werk
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 4   « Erste     234   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz