Access Formular als Postgres Frontend erzeugt falsche Daten

Moderator: ModerationP

Access Formular als Postgres Frontend erzeugt falsche Daten

Beitragvon Matthias182 » 13. Nov 2020, 07:01

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:
1. 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.
2. 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.
3. In der Postgres taucht dieser Datensatz nirgendwo auf. Dort sehe ich einen neuen Satz mit der richtigen (nächsten) ID und leeren ID.
4. 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
Matthias182
 

Re: Access Formular als Postgres Frontend erzeugt falsche Da

Beitragvon Bitsqueezer » 13. Nov 2020, 12:16

Hallo,

PostgresSQL ist nicht so mein Thema, die Datenbank kenne ich nur vom Namen, mehr oder weniger.

Ich würde als erstes statt einer Tabelleneinbindung eine Abfrage auf dem Server generieren und dann mit der Abfrage verlinken. Hierbei sollte Access Dich meistens auch nach einem Primary Key fragen, den Du dann als das ID-Feld angibst, das natürlich Bestandteil der Abfrage sein muß (aber nicht im Formular vorkommen muß, das ist ohne Bedeutung, ich würde es trotzdem als Textbox mit einbinden, die man vor dem Ausliefern unsichtbar schalten kann, so kann man schnell mal eben die Werte überprüfen).

Auf dem Server muß die ID natürlich als Primary Key definiert werden, dann ist auf jeden Fall ein Duplikat der gleichen ID in einem neuen Datensatz ausgeschlossen.

Bei den übrigen Feldern sollte es auch mind. ein Feld geben, das als NOT NULL deklariert ist und keinen Default-Wert besitzt, um zu verhindern, daß Daten automatisch eingetragen werden. Der Benutzer muß dann in jedem Fall Daten angeben, bevor der Datensatz gespeichert werden kann.

Darüber hinaus würde ich dann erst mal mit der Abfrage selbst testen, also die verlinkte Abfrage in Access öffnen und hier versuchen, neue Daten zu erfassen. Hast Du hier die gleichen Probleme, würde ich mal von einem Problem mit dem Treiber ausgehen und schauen, ob es eine Alternative oder neuere Version gibt.

Wenn hier alles geht, dann ist es ein Problem in Deinem Formular, da wäre dann zu prüfen, ob es Code gibt, der hier dazwischenfunkt.

Die Anbindung ist dann auch noch die Frage: Verwendest Du DAO/verlinkte Tabellen/Abfragen oder bindest Du das Formular direkt per ADO-Recordset?

Bei einer AutoID geht Access für gewöhnlich so vor: Sobald das erste Zeichen in irgendein Feld eingegeben wird, wird die nächsthöhere ID gezogen, die dann "weg" ist. Kein anderer Benutzer bekommt diese ID mehr zugewiesen und auch der aktuelle Benutzer kann ESC drücken für Undo, wenn er dann wieder anfängt, gibt es eine neue ID. Das funktioniert so mit Access-AutoID-Feldern, ebenso, wenn das Backend z.B. SQL Server mit einem IDENTITY-Feld ist.

Datenbanken wie Oracle und wohl auch PostgresSQL kennen kein IDENTITY-Feld, verwenden stattdessen Sequenzen, die in einer eigenen Tabelle gespeichert werden und deren nächste Zahl einem herkömmlichen Zahlenfeld zugewiesen wird. Für den Treiber, der das ganze nach DAO übersetzt, sollte das im Verhalten genauso sein wie die AutoID/IDENTITY-Felder, aber das hängt natürlich vom Treiberhersteller ab. Da mußt Du Dich im Zweifelsfall bei dem Treiberhersteller bzw. in PostgresSQL-Foren schlau machen. Hier in diesem Forum kenne ich ansonsten nur Nouba, der viel damit gemacht hat, aber der auch schon länger nicht mehr hier war.

Vielleicht findet sich ja sonst noch jemand.

Gruß

Christian
Bitsqueezer
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 7911
Registriert: 21. Jun 2007, 12:17

Re: Access Formular als Postgres Frontend erzeugt falsche Da

Beitragvon Gast » 18. Nov 2020, 08:09

Hallo Christian,

danke für deine Antwort, ich bin den Vorschlägen soweit möglich mal gefolgt.

Das Anlegen einer einfachen Abfrage auf die Tabelle führt zum gleichen Ergebnis. Beim erzeugen eines Reports entsteht ein Duplikat. Nach Drücken von F5 wird der neue Satz angezeigt.

Ich habe auch bereits eine andere Version des ODBC Treibers ausprobiert aber ebenfalls ohne Besserung.

Das Thema DAO/ADO verstehe ich nur bedingt. Ich nutze kein VBA und nehme daher an, dass Access die Auswahl irgendwo implizit im Hintergrund trifft. Kann ich das irgendwie beeinflussen?


Viele Grüße
Matthias
Gast
 

Re: Access Formular als Postgres Frontend erzeugt falsche Da

Beitragvon Bitsqueezer » 18. Nov 2020, 09:35

Hallo,

Access verwendet normalerweise grundsätzlich DAO für alle eigenen Aufgaben, die nicht programmiert wurden.

Die nicht mehr existierende ADP-Version, die nur mit SQL Server als Backend arbeitete, hat grundsätzlich ADO eingesetzt.

Von daher können bis heute Formulare/Reports auch mit ADO umgehen. Wenn man ADO verwenden möchte, muß man aber programmiertechnisch eingreifen, z.B. ein zuvor in VBA erstelltes ADO-Recordset dem Formular-Recordset zuweisen. Dann können Formulare weitestgehend selbständig mit dem ADO-Recordset arbeiten wie mit DAO.

Wie gesagt, für Details zu dem Postgres-Problem müßtest Du dann schon in einem passenden Forum für diese Datenbank nachfragen.

Gruß

Christian
Bitsqueezer
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 7911
Registriert: 21. Jun 2007, 12:17


Zurück zu Access Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast