Mailinglisten-Archive |
Hi, altbekanntes Problem von Access. Gibt auch genügend Webseiten darüber. Der Hintergrund ist folgender: Du hast eine Tabelle mit einem Primärindex, der als auto_increment eingestellt ist. Das verhält sich ähnlich (nicht genauso) wie das AutoWert-Feld in Access. Wenn du einer Access-Tabelle einen neuen Datensatz beginnst, so vergibt die Tabelle den AutoWert bereits, bevor der Datensatz in irgendeiner Weise abgespeichert wurde. Das ID-Feld hat also bereits einen Wert, solange der Datensatz noch "schwebend" ist. Bei einem SQL-Server geht das nicht, denn die Spalte mit dem auto_increment-Primärindex würde ja erst gefüllt, wenn der Datensatz auf dem Server gespeichert wird! Im entsprechenden schwebenden Buffer in Access ist also das ID-Feld während der Eingabe 0. Jetzt will aber Access nach dem Abspeichern eines Datensatzes diesen nochmal neu einlesen, um z.B. durch Default-Werte in der Tabelle geänderte Daten zu aktualisieren. Access benutzt dafür den Primärschlüssel. Dieser ist aber, wie wir wissen, auf der Access-Seite 0 gewesen, während der SQL-Server bereits das auto_increment angewendet hat! Folglich kriegt Access eine leere Menge zurück. Laut Microsoft-Dokumentation (da im Zusammenhang mit dem MSSQL-Server) soll Access dann probieren, den Datensatz anhand der anderen Felder eindeutig zu ermitteln. Ich konnte das allerdings noch nie sehen. Umgekehrt steht in der mySQL-Doku, dass mySQL den Syntax SELECT * FROM Table WHERE MyIndexColumn IS NULL unterstützt, da so Access die letzte angefügte Zeile ermitteln würde. Ich habe da noch nicht weiter experimentiert, aber ich vermute, Access fragt nach SELECT * FROM Table WHERE myIndexColumn = 0, und das geht halt schief, s.o.! Als Workaround für diese dumme Sache habe ich folgende Lösung genommen: Ich habe eine DATETIME-Spalte erzeugt, die ich zum Primärindex mache. Die Autoincrement-Spalte behält einen UNIQUE-Index. Dann verknüpfe ich die Tabelle in Access. In meinen Forms muss ich jetzt nur noch bei Form_BeforeInsert ein Me.MyDateColumn = Now hinzufügen, und es geht! Jetzt kann man sogar auf dem mySQl-Server wieder die Autoincrement-Spalte zum Primärindex machen, davon bekommt Access ja nichts mit. Diese Lösung hat 2 Nachteile: Zum einen muss man diese Umstellung immer wieder machen, sobald man die Tabellen neu verknüpft oder updated (dafür kann man allerdings eine SQL-Pass-Throug-Abfrage schreiben). Zum anderen darf es nicht passieren, dass der Benutzer innerhalb einer Sekunde mehrere Datensätze erzeugt oder zwei Clients zeitgleich einen Datensatz erzeugen. Um letzteres zu beheben könnte man neben der DATETIME-Spalte noch eine Spalte für die Benutzer-Kennung oder IP-Adresse dazufügen und diese dann mit in den Primärindex aufnehmen. Oder man bastelt sich eine alternative Now-Funktion, die für verschieden User z.B unterschiedliche Jahrzehnte liefert. Ich hoffe, ich konnte dir damit helfen... Jan Wallinger Herbert EI410 wrote: > > Hallo miteinander > > Wer kann mir weiterhelfen? > > > MySQL version 3.22.27 läuft auf Linux 6.3 mit Apache Webserver > > MyODBC Version 2.50.32 Für Win NT oder Win 95 als Datenbankschnittstelle > > zu zur Windows Ebene > > > > Gibt es bekannte Probleme um mit Access 2000 über die ODBC-Schnittstelle > > auf Mysql zuzugreifen, bei mir treten folgende Probleme auf: > > > > Wenn ich die Tabelle in Access verbinde, werden zwar alle Feldname korrekt > > angezeigt, in den Datenfeldern steht jedoch nur #Gelöscht > > in einem Feld mit einem Auto-Inkrement unter Mysql wird überhautp nichts > > angezeigt. > > > > Erzeuge ich in Access aus der verbunden MySQL Datei ein Formular, werden > > die Datenfelder im ersten und im letzten Datensatz mit den korrekten > > Werten, so wie sin in der MySQL Datenbank stehen, angezeigt. Alle > > dazwischen liegenden Felder zeigen nur wieder den Eintrag #Gelöscht. > > > > Wenn ich einen Datensatz unter Access verändere und ihn abpeichern will, > > bekomme ich eine SQL Syntax-Fehlermeldung, obwohl ich unter Access selbst > > keine SQL - Query's absetzen kann, macht alles Access automatisch. > > > > Wenn ich aus den gleichen Datengrundlagen Reports generiere und diese > > ausdrucke, werden alle Datenfelder mit den korrekten Daten ausgedruckt, > > bis auf das Feld mit dem Auto-Inkrement, diese Feld enthält in dem > > Ausdruck keinen Wert. > > > > > > Mit freundlichen Grüßen > > > > Herbert Wallinger > > Produktentwicklung EI4 > > The Draexlmaier Group > > Landshuter Str. 100 > > D-84137 Vilsbiburg > > Phone: +49 (0) 87 41 / 47 5727 > > mobile: 01 70 / 6 12 10 76 > > fax: +49 (0) 87 41 / 47 5915 > > mailto:Wallinger.Herbert_(at)_draexlmaier.de > > http://www.draexlmaier.de > > > > > > --- > *** Weitere Infos zur Mailingliste und MySQL unter www.4t2.com/mysql --- *** Weitere Infos zur Mailingliste und MySQL unter www.4t2.com/mysql
php::bar PHP Wiki - Listenarchive