Entwickler-Ecke

Datenbanken - Access Tabelle kopieren / ändern (Fehler: Abfrage zu komplex


Bronstein - So 19.11.06 17:37
Titel: Access Tabelle kopieren / ändern (Fehler: Abfrage zu komplex
Ich kopiere eine Access Tabelle.

Delphi-Quelltext
1:
2:
Form1.ADOCommand1.CommandText := 'SELECT * INTO tblKopie FROM tblOrginal';
Form1.ADOCommand1.Execute;


Das funktioniert. Er übernimmt alles korrekt (DatenTyp, Spalten, Daten).
Jetzt möchte ich einen Eintrag ändern dazu mache ich folgendes.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
Form1.AdoQuery1.Active := false;
Form1.AdoQuery1.SQL.Clear;
Form1.AdoQuery1.SQL.Add('Select * From tblKopie Where Name = ' + QuotedStr(Form1.ComboBox5.Text));
Form1.AdoQuery1.Active := true;
Form1.ADOQuery1.Edit;
Form1.ADOQuery1.FieldByName('Anzahl').AsInteger := 5;
Form1.ADOQuery1.Post;


Jetzt bekomme ich beim Befehl Post "Abfrage ist zu komplex".

Was kann ich da machen?

P.S.: Wenn ich die Tabelle manuell in Access kopiere, funktioniert das ändern.


Delete - So 19.11.06 19:33

für was brauchst du das feld "anzahl"?


Bronstein - So 19.11.06 21:09

Das ist halt ein Feld der Tabelle das ich ändern möchte. Es könnte genausogut auch Name oder Ort heißen.


Delete - So 19.11.06 21:50

warum willst du es an dieser stelle ändern? hier hast du doch gar nix zu ändern...

wenn du was ändern willst, in der datenbank, dann geht das mit "update deinetabelle set feld = NeuerWert where feld1 = ..."


JVS - Do 12.11.09 19:09

Hallo,
ich belebe diesen Thread noch mal, denn ich bin auf das gleiche Problem gestoßen.
Die Ursache für den Fehler liegt darin, daß das SQL-Statement zwar die Feldstruktur
der Tabelle korrekt erzeugt und die Daten kopiert, allerdings gehen die Indexinformationen
verloren. Kopiert man die Tabelle innerhalb von ACCESS, werden auch die Indexe mitkopiert.

Die Frage ist also:
wie kopiere ich mittels SQL eine Tabelle incl. ihrer Indexdefinitionen?

JVS


Heraldo - Sa 05.03.11 19:57

Hallo.
Ich bin auch gerade über diesen Fehler gestolpert und hatte eine Lösung gesucht. Dann fiel es mir aber wieder ein:
Bei ADO/Access werden beim Post alle Datenfelder verglichen. Die interne SQL-Anweisung muss man sich wie folgt vorstellen
"UPDATE ... WHERE FELD1=Wert2 and FELD2=Wert2...". Erlaubt sind bei Jet 3.51 40 Felder, bei Jet 4.0 99 Felder. Siehe auch http://support.microsoft.com/kb/192716/
Im Delphi kann man 'Update Criteria' überschreiben, um nur PrimaryKey zu vergleichen. Allerdings nur temporär. Deshalb zum Beispiel in Dataset.BeforePost:

uses AdoInt;
procedure TMyDataModule.BeforePostSetUpdateCriteria(DataSet: TDataSet);
begin
TADODataSet(DataSet).Properties['Update Criteria'].Value := adCriteriaKey;
end;

Gruß, Harald
--
http://omdn.officemanager.de/