Access - SQL Server über ODBC

04/02/2014 - 23:07 von Wilfried Baumann | Report spam
Folgende Frage an die geschàtzen Access Experten:

Client Server Anwendung

SQL-Server 2005 (wird demnàchst auf Server 2011 gezogen)
Frontend: Access 2010 oder 2003 auf manchen Rechnern
ODBC, Connection String:
"ODBC;DRIVER={SQL Server};SERVER=<<Servername>>;DATABASE=<<DB-Name>>;Trusted_Connection=Yes;"

Neuester ODBC Treiber ist installiert

Es gibt ein Listenformular (1 Datensatz = 1 Zeile) und ein Detailformular (1 Datensatz = 1 Seite). vom Listenformular kann man auf Knopfdruck in das Detailformular wechseln.

Die maßgebliche Tabelle hat ca 150.000 Datensàtze.

Ich arbeite mit einer sehr àhnlichen Architektur auch mit Datenbanken die weniger Sàtze haben, was eigentlich keine Probleme dieser Art bereitet.

Im Listen-Form beim Drücken des Knopfes um ins Detailform zu springen:
'-
Private Sub cmdErfassung_Click()
DoCmd.OpenForm "frm_Erfassung"
Call Forms("frm_Erfassung").SetTo(Me.ID_Geo, "" & strWhere_pub)
End Sub
'-

Detail-Form (frm_Erfassung):
'-
Public Sub SetTo(lngID As Long, Optional strWhere As String = "")
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim i As Integer
If Len(Trim(strWhere)) > 0 Then
strWhere_pub = strWhere
Me.cmdRemoveFilter.Enabled = True
Set db = CurrentDb()
Me.RecordSource = _
"select * from tbl_sql_<<Tablename>> where " & strWhere & " and is_deleted<>True order by ID"
Else
Me.RecordSource = "SELECT * FROM tbl_sql_<<Tablename>> WHERE is_deleted<>True ORDER BY ID;"
End If
'--
'For i = 1 To 1000
' Debug.Print "."
'Next
'--
DoEvents
Set rst = Me.RecordsetClone
rst.FindFirst "ID = " & lngID
If rst.NoMatch Then
MsgBox "No entry found.", vbInformation
Else
Me.Bookmark = rst.Bookmark
End If
Set rst = Nothing
End Sub
'-

Jetzt das Problem:

Wenn man aus dem Listenformular von einer hohen Datensatznummer auf das Detailformular wechselt, dann landet man oft fàlschlich bei Nummern zwischen ca 25000 und 27000.
Es gibt aber Tage wo es keinerlei Probleme gibt (vielleicht abhàngig von der Netzwerksauslastung?).

Ein erster Gedanke war, dass beim Aufruf von Me.RecordSource = "..." das Laden des Recordsets begonnen wird, was aber bei der Anzahl von Datensàtzen natürlich einige Zeit dauert. Der Code wartet aber nicht darauf, dass das Recordset fertig geladen ist, sondern setzt fort und dadurch kommt es zum beschriebenen Folgeproblem. Wobei trotzdem "rst.NoMatch" nicht erfüllt ist. Nur das Positionieren scheitert.

Um das zu Testen habe ich - wie man sieht - das sehr plumpe "For i = 1 To 1000 ..." eingefügt. Meine Idee war, dass sich das zeitliche Verhalten dann àndern müsste. Aber auch das hat kein besseres Ergebnis gebracht. Natürlich würde ich sowas in einer Produktiv-Datenbank nicht verwenden, das war nur als Diagnose gedacht.

Meine Fragen:

Woran könnte es liegen? Wie könnte man es verbessern?
Ist diese Art der Client Server Konstruktion untypisch?
Für den Anwender ist es praktisch, dass man im Detail formular vor und zurück Blàttern kann, und dass das Formular nicht auf einen Satz gefiltert ist.
Bessere Vorschlàge? Alternativen? Literaturverweise?
Arbeitet jemand mit Access Projects statt mir Access-mdbs?
Gibt es jemand aus dem Raum Wien-Umgebung, der viel Erfahrung hat im Bereich Access Client Server mit SQL-Server, der Beratung machen möchte?
Es scheint hier nicht sehr viel Frequenz zu sein, seid ihr in bestimmten Foren aktiv?

Vielen Dank im voraus, jegliche konstruktive Kritik ist willkommen.

LG, W
 

Lesen sie die antworten

#1 Wilfried Baumann
07/02/2014 - 02:05 | Warnen spam
 
Lieber Ulrich,

Danke für deine Nachricht und die Informationen.
Ich hàtte aber trotzdem gerne gebundene, nicht schreibgeschütze Formulare.
Pass-through-queries sind ja schreibgeschützt.
Wie würdest du da vorgehen?

Danke im Voraus, LG, W

Ähnliche fragen