Autor Beitrag
UliTs
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Win 95, Win 2000, Win XP*
xBase++, Delphi 6
BeitragVerfasst: Mi 28.09.16 13:50 
Hallo allerseits,

ich schreibe gerade ein Delphiprogramm mit Hilfe von Firedac. Die Datenbank ist ADS und die Datenstruktur DBF/NTX in einem DataDictionary zusammengefasst.
Bei einer Tabelle kann ich in meinem Programm keine Änderungen vornehmen. Es kommt beim Post die Fehlermeldung:

[FireDAC][DApt]-400. Update-Anweisung updated [0] anstelle von [1] Datensatz. Mögliche Ursachen: Aktualisierungstabelle hat keinen Primärschlüssel oder Zeilenbezeichner, Datensatz wurde von einem anderen Benutzer geändert/gelöscht.

Den Datensatz gibt es definitiv. Hat jemand eine Idee, was falsch sein könnte?
UliTs Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Win 95, Win 2000, Win XP*
xBase++, Delphi 6
BeitragVerfasst: Do 29.09.16 22:20 
Weiss jemand, wo man sonst Hilfe bei diesem Problem bekommen kann?
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2274
Erhaltene Danke: 419

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Fr 30.09.16 06:44 
Guten Morgen UliTs,

ohne zu wissen wie dein Post Aufruf im Ganzen aussieht, können wir nur spekulieren. :nixweiss:
Und was deinen Primärschlüssel angeht, ist es ganz sicher, dass er, sofern die Tabelle per Hand erstellt wurde, auch entsprechend festgelegt ist?
Oder sofern du es per SQL ausgeführt hast, sieht die Anweisung in etwa so aus?

ausblenden SQL-Anweisung
1:
CREATE TABLE t_tabelle(id INTEGER PRIMARY KEY AUTOINCREMENT, ...) ...					

Für den Fall dass die Anweisung folgendermaßen aussehen sollte, so ist die "id" nicht als Primärschlüssel gekennzeichnet

ausblenden SQL-Anweisung
1:
CREATE TABLE t_tabelle(id INTEGER NOT NULL AUTOINCREMENT, ...)					

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)

Für diesen Beitrag haben gedankt: UliTs
UliTs Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Win 95, Win 2000, Win XP*
xBase++, Delphi 6
BeitragVerfasst: Fr 30.09.16 08:41 
Hallo Frühlingsrolle,

vielen Dank für Deine Antwort. Hier mein Postaufruf (ist ein Testaufruf):

ausblenden Delphi-Quelltext
1:
2:
3:
    FDQueryEditKunde.Edit;
    FDQueryEditKundeKDNNAME.Value := 'OHO';
    FDQueryEditKunde.Post;

Das Anlegen eines Primarykeys direkt in der Tabelle ist sicher eine elegante und vermutlich auch die beste Lösung. Leider handelt es sich bei den Tabellen aber um DBF-NTX Tabellen und zu allem Überfluss darf ich die Struktur bei diesen auch nicht ändern ...
Gibt es eine andere Möglichkeit, wie ich FireDAC einen Primary Key mitteilen kann?

Uli

P.S.
Wie hast Du die SQL-Anweisung so schön formatiert? Geht das auch mit Delphi-Anweisungen? -> Danke, JoelH


Zuletzt bearbeitet von UliTs am Fr 30.09.16 10:57, insgesamt 1-mal bearbeitet
JoelH
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 798
Erhaltene Danke: 17

Win10
Delphi XE7/Tokyo Prof.
BeitragVerfasst: Fr 30.09.16 10:10 
user profile iconUliTs hat folgendes geschrieben Zum zitierten Posting springen:

P.S.
Wie hast Du die SQL-Anweisung so schön formatiert? Geht das auch mit Delphi-Anweisungen?


Es gibt verschiedene Code-Tags damit kann man im Forum Code von der Forensoftware formatieren lassen.
Siehe: www.entwickler-ecke....ml&sub=,19,27,32

_________________
mfg. Joel

Für diesen Beitrag haben gedankt: UliTs
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2274
Erhaltene Danke: 419

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Fr 30.09.16 10:26 
Gerne doch.
Was mir auffällt ist, dass du zwei verschiedene Queries verwendest, nämlich:
- FDQueryEditKunde
- FDQueryEditKundeKDNNAME
Das macht insofern nicht viel Sinn, wenn du die eine editierbar machst und der anderen einen Wert versuchst zuzuweisen.
Vielleicht ist es auch nur ein Tippfehler oder ein Copy/Paste Missgeschick.
Ich würde es so schreiben:

ausblenden SQL-Anweisung
1:
2:
3:
FDQueryEditKunde.Edit;
FDQueryEditKunde.FieldsByName('KDNAME').AsString := 'OHO';
FDQueryEditKunde.Post;


Ich habe mit FireDac noch nie gearbeitet, es kann aber sein, dass du zusätzlich eine Option zum Updaten festlegen musst.

Und wenn du den Primärschlüssel und/oder andere Felder ganz ohne SQL Anweisung erstellen willst, so kannst du in der Query/Table in der Eigenschaft Fields dies festlegen, sowohl den Namen als auch den Typ der Felder, und was sonst noch alles dazu gehört.

Bezüglich der Code-Tags:
ausblenden Quelltext
1:
[delphi]begin methode(); end;[/delphi]					

ausblenden Delphi-Quelltext
1:
begin methode(); end;					

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)

Für diesen Beitrag haben gedankt: UliTs
UliTs Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Win 95, Win 2000, Win XP*
xBase++, Delphi 6
BeitragVerfasst: Fr 30.09.16 11:46 
Danke an beide :-) .

Frühlingsrolle, der Quelltext war so schon richtig, da FDQueryEditKundeKDNNAME ein Feld aus FDQueryEditKunde ist. Die Methode FDQueryEditKunde.FieldsByName gibt es bei FireDac nicht.

Aber der Hinweis auf die Felder hat mich zum Ziel :idea: gebracht:
Da gibt es die Eigenschaft "ProviderFlags". Und da habe ich bei allen Feldern, die nicht zum Schlüssel gehören, pfInWhere auf False gesetzt. Danach hat es geklappt! :!: :D

Eventuell geht es noch eleganter mit pfInKey. Dafür muß aber im DatenmengenProvider der UpdateMode von upWhereAll auf upWhereKeyOnly geändert werden. Da ich bisher noch nicht mit dem DatenmengenProvider gearbeitet habe, weiss ich noch nicht, wie ich diesen einbinden muß.