Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Access Formular als Postgres Frontend erzeugt falsche Daten

Begonnen von Matthias182, November 23, 2020, 09:30:28

⏪ vorheriges - nächstes ⏩

Matthias182

Guten Morgen zusammen,

ich nutze aktuell Access 2010, um über dort erstellte Formulare Daten in eine Postgres Datenbank einzutragen. Aus meiner Sicht ist das Konstrukt sehr simpel. Ich habe in der Postgres eine Tabelle erzeugt mit verschiedenen Spalten, davon eine Spalte als ID (Primärschlüssel), die automatisch einen neuen Wert für jeden Datensatz generiert auf Basis einer Sequence in der Datenbank. Das funktioniert dort auch problemlos, wenn ich wenn ich die Daten dort bearbeite.

Die Tabelle habe ich per ODBC mit Access verknüpft und dort ein einfaches Formular erstellt, aber dabei die Spalte ID ausgeblendet. Um mir das Ganze deutlicher zu machen habe ich das gleiche Formular noch mal erstellt, diesmal mit der ID Spalte, um zu sehen, was dort passiert. Das Verhalten ist bei beiden Formularen gleich.

Wenn ich dort nun Daten eintrage, passiert folgendes:

Ich positioniere am Ende auf die Zeile für einen neuen Datensatz und fülle im Formular die erste Spalte des neuen Satzes mit einem Wert aus. Die anderen Felder lasse ich leer.
Ich verlasse mit der Maus den neuen Datensatz, so dass dieser geschrieben wird. In diesem Moment werden die übrigen Felder des neuen Datensatzes mit Werten eines anderen Satzes gefüllt. Auch die ID wird übernommen und ich habe im Formular faktisch ein Duplikat erzeugt.
In der Postgres taucht dieser Datensatz nirgendwo auf. Dort sehe ich einen neuen Satz mit der richtigen (nächsten) ID und leeren Feldern.
Drücke ich F5 um das Fomular zu aktualisieren, verschwindet das Duplikat und der neue Satz taucht in dem Formular auf.

Habt ihr eine Idee wie ich das Problem lösen oder zumindest weiter eingrenzen kann?


Danke und Gruß
Matthias

PhilS

Zitat von: Matthias182 am November 23, 2020, 09:30:28Ich verlasse mit der Maus den neuen Datensatz, so dass dieser geschrieben wird. In diesem Moment werden die übrigen Felder des neuen Datensatzes mit Werten eines anderen Satzes gefüllt. Auch die ID wird übernommen und ich habe im Formular faktisch ein Duplikat erzeugt.
In der Postgres taucht dieser Datensatz nirgendwo auf. Dort sehe ich einen neuen Satz mit der richtigen (nächsten) ID und leeren Feldern.
Drücke ich F5 um das Fomular zu aktualisieren, verschwindet das Duplikat und der neue Satz taucht in dem Formular auf.
Access ermittelt die Daten eines Datenssatzes aus einer ODBC-Datenquelle anhand des Primärschlüssels.

Du solltest prüfen, ob der Primärschlüssel mit dem richtigen Datentyp in Access erkannt wurde.

Die Sequence kann sicherlich Probleme machen, weil Access nicht damit rechnet, dass sich der Wert automatisch beim ersten Speichern eines neuen Datensatzes ändert. Eine gute Lösung habe ich ad-hoc nicht parat.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Matthias182

Du vermutest also, dass ein Problem mit dem PK der Tabelle ist. Das könnte sein.

Ich habe mal geschaut, in Access wird das Feld der verknüpften Tabelle als 'Number' erkannt. In der Datenbank selber habe ich es als 'Serial' definiert.

Macht es eventuell Sinn zu versuchen auf einen zusammengesetzten Primärschlüssel zu schwenken. Obwohl mit das ad-hoc gerade schwerfällt einen zu definieren auf Basis der Daten, die ich dort speiche.

PhilS

Zitat von: Matthias182 am November 23, 2020, 10:59:42Ich habe mal geschaut, in Access wird das Feld der verknüpften Tabelle als 'Number' erkannt. In der Datenbank selber habe ich es als 'Serial' definiert.

Macht es eventuell Sinn zu versuchen auf einen zusammengesetzten Primärschlüssel zu schwenken.
Serial ist leider nur "syntaktischer Zucker" und erstellt einen Integer-Typ, der automatisch mit dem nextval der Sequence gefüllt wird. - Über ODBC, von aussen (für Access) ist das scheinbar, anders als z.B. das Identity-Attribut beim SQL Server, aus der Tabellendefinition nicht erkennbar. - Da liegt dein Problem.

Ein zusammengesetzter Primärschlüssel würde nur dann helfen, wenn du damit die Sequence los werden kannst.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

PhilS

Zitat von: PhilS am November 23, 2020, 13:07:59Serial ist leider nur "syntaktischer Zucker" und erstellt einen Integer-Typ, der automatisch mit dem nextval der Sequence gefüllt wird. - Über ODBC, von aussen (für Access) ist das scheinbar, anders als z.B. das Identity-Attribut beim SQL Server, aus der Tabellendefinition nicht erkennbar. - Da liegt dein Problem.
HAH!
Setz mal in der PostgreSQL-ODBC-Configuration der DSN auf Page 2, Extra Opts: 0x2

Zitat aus psqlODBC Configuration Options:
Extra Opts: combination of the following bits.
  0x2: Fake MS SQL Server so that MS Access recognizes PostgreSQL's serial type as AutoNumber type.

Danach musst du die Tabellen neu nach Access verknüpfen, damit sich dies entsprechend auswirkt.!
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Matthias182

HAMMER!

Das scheint tatsächlich zu funktionieren. Erste Tests funktionieren.

Das hätte ich so nie gefunden. Danke dir!


Gruß
Matthias