Frage

Ich bin Entsendung wirklich diesen aus Verzweiflung nach einer Antwort herum viel gesucht und ein paar anderen Dinge ohne Erfolg versucht.

Ich habe eine Access-Datenbank, wo ich vor kurzem die Tabellen zu SQL 2005 migriert haben, Access als Front-End für die Benutzer funktionieren weiterhin Formulare, Berichte und Abfragen bereitstellt.

Da jedoch so eingerichtet werden, auf dem Access FE / SQL zu bewegen, haben die Benutzer wurde berichtet, dass manchmal , wenn sie einen neuen Datensatz eingeben, sie in ein Unterformular klicken (Speichern des Datensatzes) oder klicken sie auf das Menü speichern selbst, springt er auf einem vorhandenen Datensatz. Der neue Datensatz gespeichert wurde, aber aus irgendeinem Grunde Access-Switches zu einem anderen Datensatz, da es erfrischt. Der Benutzer hat dann zu schließen, um die gespeicherte Datensatz finden, und sie weiter zu bearbeiten.

  

Szenario : Ein Benutzer ein Angebot eintritt und füllt alle Kursdetails, Kunde,   Datum, usw., klickt dann in dem Line-Elementen Formular ein Produkt (oder Klicks speichern im Menü) hinzuzufügen, und plötzlich   das Angebotsformular (und Line-Element Formulars) wird die Details einiger zufälliges Zitat zeigt. Das zufällige Zitat könnte neueres Datum sein, oder von Jahren, und hat nichts gemein mit dem Zitat sie eintraten.

Dieses seltsame Verhalten tritt nur einen neuen Rekord auf Einfügen, nie einen vorhandenen Datensatz zur Bearbeitung. Benutzer sagen mir, dass es passiert ‚ häufiger ‘, wenn sie gehen, um einen neuen (Zitat, Kunden, was auch immer) hinzuzufügen, nachdem die Datenbank zu öffnen.

Ich habe bemerkt, es nur auf Formen geschieht, die subforms haben, so mein erster Gedanke ist, dass es mit Access Senden durch die Unterformulardaten zu tun hatte, bevor die Formulardaten gespeichert werden, eine PK Verletzung verursacht. Aber dies scheint nicht zu passieren: Es gibt keine Fehler auf dem SQL-Server, und der Datensatz erfolgreich gespeichert. die der Benutzer sein Hauptformular Datensatz zu speichern, bevor subform Aufzeichnungen hinzugefügt (d auf einem Zitat, zwingt sie, das Angebot zu speichern, bevor sie Positionen hinzufügen) funktionierte nicht, es verursacht nur den Sprung (manchmal) auf abgewehrt.

Es ist nicht vba auf den speichern oder zu aktuellen läuft, habe ich Haltepunkte auf alle Event-Handler gesetzt, wie es springt und kein vba ausgeführt wird. Einige der ‚Sprung‘ Formen haben keine vba auf dem Formular. Aber alle haben subforms. Ich vermute, es hat mit Satzsperren zu tun.

Der Server die Tabellen ausgeführt wird, SQL Server 2005, die Benutzer mit einer Mischung aus Access 2000 und 2003, vor allem XP SP3 mit einem paar alten Win2k Kästen. Sie werden mit der Replikation Merge und ein paar Benutzer ausgeführt werden repliziert SSEE2005 Ausgaben und abonnieren Sie den Hauptserver. Die meisten Benutzer werden nicht repliziert, nur über ODBC oder SQL Native Client-Verbindungen direkt mit dem Server verbinden. Aber ich habe festgestellt, dass dies für alle Benutzer geschieht, in der Regel ein- oder zweimal am Tag, und es hat sich vor mir passiert ist. So ist es kein Problem Benutzer.

Der schlimmste Teil über dieses Verhalten ist, dass es nur einen Teil der Zeit passiert, und ich habe es nicht geschafft, ein Szenario zu finden, wird immer weil es geschehen.

Wenn jemand etwas Ähnliches erlebt hat, lassen Sie es mich wissen, wie Sie es aussortiert, oder sogar würde Vorschläge willkommen.

Update: (1/10/09) Problem, dank David Fenton gelöst. Einstellen der Form zu Dateneingabemodus (Form.DataEntry = true) vor dem Öffnen Datensätze hinzuzufügen ist in der Tat das Springen zu verhindern. Client meldet keine Probleme überhaupt, da ich dies vor einer Woche geändert.

War es hilfreich?

Lösung

Ein Client meldet gelegentlich ähnliche Probleme. Es begann sofort, nachdem sie mit Mergereplikation gestartet.

Ich habe in der Microsoft Access-Produktgruppe sowie meine Kolleginnen Access und SQL Server MVPs mehrere Kontakte informiert.

Bitte senden Sie uns Ihre E-Mail-Adresse, so kann ich das auf meine Kontakte in Microsoft weiterleiten, wie ich annehmen würde, sie würden Sie direkt kontaktieren. tony bei granite.ab.ca

BTW ausgezeichnete Fehlersuche und detaillierte Beschreibung des Problems.

Andere Tipps

Es klingt definitiv wie ein Record-Locking Problem. Verwenden Sie automatische Nummerierung als PK? Haben Sie versucht, zwei Computer eine Aufzeichnung auf der gleichen Form zugleich das Hinzufügen (was bedeutet, einer von ihnen wird das Insert-Ereignis ausgelöst, während der andere einen neuen Datensatz auf dem Formular hinzugefügt hat, aber immer noch bearbeitet)?

Könnten Sie in einer Art und Weise überprüfen oder eine andere, wenn der PK des eingefügten Datensatz nach Einfügung in der Tabelle bleibt ähnlich den angegebenen PK vor dem Einsetzen (durch Zugabe von beispielsweise einig ‚debug.print des um Ihren Code)?

könnte ein Szenario 2 anstehende Einsätze von der Maschine der gleiche PK, die zweiten wird dann automatisch geändert bei Einsatzzeit, was in Ihrer Form verliert den ‚aktiven‘ Rekord gegeben worden.

Ich frage mich, über das Szenario, in dem Sie ein Formular verwenden, um Datensätze hinzuzufügen, die alle anderen Datensätze für den Benutzer zu springen hat.

Das heißt, ich glaube nicht die gleiche Form in mit Aufzeichnungen zu bearbeiten, wie verwendet wird, um sie zu erstellen.

Stattdessen verwende ich einen ungebundenen Dialog all erforderlichen Felder zu sammeln, den Datensatz in SQL einzufügen, öffnen Sie dann die Hauptbearbeitungsform auf diese einzelne Datensatz (kein Formular mit dem ganzen Tisch auf den Datensatz navigiert, die gerade hinzugefügt wurden) .

Beachten Sie, dass in einem Hauptformular / subform Szenario, einen Datensatz im Unterformular erstellen, wenn das übergeordnete Formular nicht gespeichert ist bewirkt, dass der übergeordneten Datensatz gespeichert werden. Vielleicht haben Sie überprüfen möchten, ob es einen Code in den Insert und Update Ereignisse des Hauptformulars ist, die eine erneute Abfrage des Hauptformulars auf dem Einsatz eines neuen Datensatzes (ausgelöst durch die Bearbeitung des Unterformular) verursachen würde.

Aber ich würde vorschlagen, nach wie vor, dass die beste Architektur, diese Art von möglichem Szenario zu vermeiden, ist durch nur einzelne Datensätze geladen, so gibt es keinen anderen Datensatz zu springen. Das würde begrenzt sicherlich die Möglichkeiten, wo der Benutzer könnte am Ende, wenn das Problem auftritt.

Ich habe Verhalten ‚wie‘ gesehen, wenn es mehrere Möglichkeiten, das Gleiche zu tun. (Das heißt der Tabulatortaste aus der Textbox Auslösen des Lost-Focus-vs Klicken auf eine Schaltfläche) So stellen Sie sicher, dass dies nicht der Fall, wenn Sie nicht bereits haben.

Dieses Problem wird durch die Mergereplikation Trigger mitgenutzt. In diesem Trigger (dieses Problem strart von SQL 2005 Server, in SQL 2000 Server nicht Probleme nake) Replikation einige Daten in der Replikation Tabellen einfügen mit Identitäten und Zugriff bekommen diese Anzahl von Identität statt wirklicher Form indentity Einsatz. Ich habe gelesen, dass der Zugang Verwendung @@ IDENTITY insetad von SCOPE_IDENTITY und das ist Problem. Um dies zu vermeiden, sollten Sie merge Auslöser in Art und Weise ändern, dass in Insert-Trigger auf begining Sie aktuellen Wert von @@ identity in variable und am Ende des Trigger Einfügewert in temporärer Tabelle als Identität mit Startwert speichern, was in den Variablen geschrieben wird. dies wird @@ iddentity korrigieren und Zugang wird richtigen Wert erhalten.

bei den Trigger beginnen  ERKLÄREN @identity int  DEKLARIEREN @strsql VARCHAR (128)  set @identity = @@ IDENTITY Ende ar so etwas wie  set @ strSQL = 'select Identität (int,' + CAST (@identity als VARCHAR (15)) + '1) als ID in #temp'  exec (@strsql) et das und es sollte zwischen platziert werden     wenn @@ error <> 0         goto AUSFALL
und     Rückkehr

Problem in acces wird erace nicht nur Form, sondern direkt in ODBC-Link-Tabelle zu.

Ich suche Art und Weise, wie diese hinzufügen automatisch Replikationstrigger (hauptsächlich einfügen) fusionieren.

Das ist Fehler in Access und SQL Komunikation. Zugang Identität neuen Rekord von @@ IDENTITY und bei der Aufnahme eingegeben haben sie Daten nachladen basierend auf dem Wert von @@ IDENTITY-Wert von SQL. In SQL 200 merge Trigger eingefügt und Acces usualy Arbeit ok. Von SQL 2005 merge Trigger hat einen Teil, in dem Datum in irgendeiner Mergereplikation Tabelle eingetragen werden, die Identität und Änderungswert von @IDDENTITY hat, dass die neu eingegebenen rcord von Access bilden.

Eine Lösung ist, all merege Insert-Trigger chanege @IDDENTITY auf Anfang davon in variabel und am Ende des Triggereinsatz dumy Datensatz in #temp Tabelle als Identitätsspalte mit Startwert der Variable gespeichert previosly zu speichern.

Diese Lösung, die ich irgendwo im Netz gefunden, als vor Woche habe ich mit diesem Problem zu betroffen war. Ich bewege Datenbank von SQL 200 2008 SQL und dann fand ich dieses Problem mit Identität in Access. Ich vermute, dass die Replikation, weil, wenn ich eines der Zeichnung alle Entfernen starten gut funktionieren, aber nach Neuer sie wieder gelöscht.

Ich benutze dies für die Lösung von Problem (takem von irgendwo auf netto).

am Anfang des Verschmelzungs Insert-Trigger

ERKLÄREN @identity int

ERKLÄREN @strsql varchar (128)

gesetzt @identity = @@ IDENTITY

und am Ende des Insert-Trigger merge

gesetzt @ strsql = 'wählen Identität (int,' + CAST (@identity als varchar (15)) + '1) als ID in #temp'

exec (@strsql)

letzter Code sollte an der Stelle des / * einfügen Ende an dieser Stelle * / in Mergereplikation-Code platziert wird

if @@ error <> 0

goto FEHLER

/ * Einsatzende an dieser Stelle * /

zurück

Aber ich bin Suche nach einem Weg für alles, was automatisch zu tun fusionieren Trigger bestehende auf die Veröffentlichung und auf alle bestehenden fusionieren Trigger für bestehende und zukünftige Abonnements.

0I haben diese gefunden

http://jagbarcelo.blogspot.com/search/label/identity

, aber ich weiß nicht, kann ich es verwenden, um auf SQL 2008.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top