Office Forum
www.Office-Loesung.de
Access :: Excel :: Outlook :: PowerPoint :: Word :: Office :: Wieder Online ---> provisorisches Office Forum <-
ADO-Library sowie Memo-Felder in SQL Server 2005
zurück: Tastaturlayout ändern unter access weiter: Function: Abfrage in externen DB ausführen Combifeld füllen Unbeantwortete Beiträge anzeigen
Neues Thema eröffnen   Neue Antwort erstellen     Status: Tutorial Facebook-Likes Diese Seite Freunden empfehlen
Zu Browser-Favoriten hinzufügen
Autor Nachricht
Bitsqueezer
Office-VBA-Programmierer


Verfasst am:
05. Aug 2009, 16:59
Rufname:

ADO-Library sowie Memo-Felder in SQL Server 2005 - ADO-Library sowie Memo-Felder in SQL Server 2005

Nach oben
       Version: Office 2003

Hallo zusammen,

derzeit bin ich gerade mit einer Access-Datenbank, deren Backend auf einem SQL Server 2000 läuft, auf einen SQL Server 2005 umgezogen.

Mit dem SQL Server 2000 war die Verwendung von "Text/NText"-Feldern (Äquivalent zu Memo-Feldern in Access) kein Problem. Doch seit dem Umstieg auf den SQL Server 2005 hagelt es nur noch ODBC-Abstürze. Dazu genügt es bereits, wenn man aus dem Navigationsfenster eine verlinkte Tabelle per Doppelklick öffnet und einfach geöffnet stehenläßt. Da Access nach einer gewissen Zeit automatisch die angezeigten Datensätze aktualisiert, kommt es dann von Zeit zu Zeit (wenn auch noch eine Reihe anderer Benutzer auf der gleichen Datenbank mit dem gleichen Frontend arbeiten) zu unerklärlichen ODBC-Fehlern (die man auch mit dem Err-Objekt von Access leider nicht abfangen kann).

Dies macht sich so bemerkbar, daß nach dem Auftreten des Fehlers alle Spalten und Zeilen der geöffneten Tabelle nur noch "#Name?" anzeigen und auch viele andere Tabellen dann nicht mehr zu öffnen sind. Wartet man eine Weile, kann es sein, daß es plötzlich wieder geht.

Ich habe mit allen möglichen Refresh-Intervallen herumexperimentiert, SQL-Dumps von Access erstellt (wenig aussagekräftig) und tagelang das Netz nach Lösungen durchforstet, leider keine Problemlösung in Sicht.

Nach einigem Suchen habe ich ein paar Hinweise auf Memo-Felder entdeckt und festgestellt, daß das oben beschriebene Problem in der Tat nur bei den velinkten Tabellen auftritt, die ein oder mehrere Memo-Felder enthalten. Dabei gelten generell für Access alle Felder mit länger als 255 Zeichen als Memo-Felder, also auch z.B. ein Datentyp "ntext(400)".
Tips, die Memofelder an das Ende einer Abfrage zu verlegen, waren nicht von Erfolg gekrönt, bis ich dann auf diesen Knowledgebase-Artikel von Microsoft gestoßen bin:

PRB: 80020009 Error When Retrieving Data from SQL

Dort wird zuletzt beschrieben, man solle doch "einfach" den überlangen Text in einzelne 255-Zeichen-Strings zerschneiden und in eine Extra-Tabelle speichern. Leider ohne jegliche Beispiele.

Also habe ich mich an die Realisierung gemacht, deswegen dieser Artikel hier. Die angehängte Beispieldatei ist nur für die Verwendung mit einem MS SQL Server 2005 sinnvoll - mit SQL Server 2000 geht es auch ohne diesen Umstand und wie es mit SQL Server 2008 aussieht, weiß ich leider nicht.

Im VBA-Code der Beispieldatei sind die Create-Befehle enthalten, um die notwendigen Tabellen auf einem SQL Server anzulegen (in modMemo und im Code des Demoformulars).

Die Funktionsweise: Es gibt zwei Tabellen, "tblMemo" und "tblMemoParts", die erste enthält eine durchlaufende ID für das Memofeld, die zweite die einzelnen Segmente des Memofeldes.

Wird ein Memofeld in einer beliebigen Tabelle gebraucht, legt man nun lediglich eine Spalte für die MemoID an. Im Formular wird dann eine ungebundene Textbox eingestellt (geht sowohl für Endlos- wie auch Einzelformulare), die mit der Funktion
Code:
=fnReadMemo(Nz([MemoID];0))
einen entsprechenden Memotext für die jeweilige Zeile ausgibt. Da es sich um ein ungebundenes Feld mit einer Funktion handelt, kann das Feld aber nicht editiert werden - was aber, wenn im Endlosformular editiert werden soll? Zu diesem Zweck legt man einen Doubleclick-Event auf das ungebundene Textelement und ruft darüber, wie in der Demodatenbank gezeigt, ein zweites Formular auf. Dieses lädt automatisch anhand der MemoID den Memostring in ein Textfeld, das man nun beliebig bearbeiten kann. Mit Klick auf "Save" wird der Memostring dann wieder in Segmente zerlegt und gespeichert, außerdem eine neue ID zurückgegeben, die wiederum im ursprünglichen Formular (normalerweise in einem versteckten Feld, hier zur Demo offen angezeigt) gespeichert wird, damit auch ein Dirty-Status erfolgt. Ein Undo ist allerdings leider nicht möglich.

Die Tabelle tblMemo enthält auch die ersten 255 Zeichen des Memostrings als Kurztext. Man kann also alternativ zu der oben gezeigten Lösung statt dem ungebundenen Textfeld ein gebundenes nehmen und die MemoID der gewünschten Tabelle mit der tblMemo joinen, um den Kurztext stattdessen anzuzeigen. Auch in diesem Fall muß allerdings sichergestellt werden, daß das Feld hier nicht editiert werden kann (Enabled=Yes, Locked=Yes), sonst würde der Kurztext verändert werden und nicht mehr zum langen Text (in tblMemoParts) passen.
Das EditDescription-Formular müßte in diesem Fall eventuell noch etwas angepaßt werden.
Vorteil der zweiten Methode ist, daß die Anzeige sehr viel schneller geht, da nicht für jede Zeile eines Endlosformulars eine Funktion aufgerufen werden muß, was immer mit einer deutlich sichtbaren Verzögerung einher geht. Dafür gibt es bei dieser Methode auch nur die ersten 255 Zeichen zu sehen, was aber wahrscheinlich für viele Anzeigelisten auch ausreicht. Denn mit einem Doppelklick auf das Feld kann man ja immer noch den langen Text ansehen/editieren.

Für jedes weitere Memofeld in der gleichen Tabelle muß entsprechend eine weitere MemoID-Spalte angelegt werden.

Im Modul "modMemo" ist ebenfalls noch eine Prozedur enthalten, die eine bestehende Tabelle in das neue Format umwandelt, indem ein anzugebendes Memofeld in Segmente aufgesplittet und als Ausgabe die erzeugte MemoID in eine anzugebende MemoID-Spalte der gleichen Tabelle schreibt (die man natürlich vorher mit SQL Server Datentyp "int" anlegen muß).
Die Memo-Spalte wird dabei nicht verändert, am Ende sollte jede Zeile eine MemoID enthalten. Jeder neue Start dieser Prozedur schreibt nur noch in die Zeilen, die noch keine MemoID in der angegebenen Spalte enthalten.

Ist alles korrekt umgewandelt, kann man die Memo-Spalte aus der Tabelle löschen (selbstverständlich, wie üblich vorher Backup durchführen...).

Neben der Memo-Geschichte habe ich noch meine aktuelle ADO-Library eingefügt, die die Arbeit mit direkten SQL-Server-Zugriffen im Code deutlich vereinfacht, weil man mit einfachen Funktionsaufrufen, die an die Syntax der D-Funktionen (DMax, DCount, ...) angelehnt ist, schnell auf die Daten mit ADO zugreifen kann, ohne über den umständlichen und langsamen DAO/ODBC-Weg zu gehen.

Unter anderem ist dort eine Prozedur namens "RefreshLinkedTables" enthalten, mit der man jederzeit ohne weitere Assistenten oder sonstige Setups beliebige SQL-Server-Datenbanktabellen in Access verlinken kann. Je nach verwendeten Einstellungen kann man das sowohl mit SQL-Server- wie auch Windows-Authentifizierung erledigen (letzteres habe ich aber nie näher getestet, ist aber in den Kommentaren enthalten).
Das ist besonders hilfreich, wenn man häufiger Änderungen an Tabellen auf dem Server durchführt, die dann auch in Access reflektiert werden müssen.

Wenn jemand eine bessere Idee hat, wie man Memo-Felder unter SQL Server 2005 mit Access (2007) zum Laufen bringen kann, bin ich immer für Ideen offen. Oder wenn jemand weiß, wie man diese ODBC-Fehler auch ohne diesen Umstand beseitigen kann.

Die Codes dürfen beliebig in eigenen Anwendungen verwendet werden, solange der Modulkopf unverändert bleibt.

Viel Spaß damit und Gruß

Christian



SplitMemo.zip
 Beschreibung:
Zeigt die Verwendung von Memo-Feldern in Access mit SQL Server 2005, ohne dort überlange Textfelder zu verwenden.Enthält außerdem eine ADO-VBA-Library.

Download
 Dateiname:  SplitMemo.zip
 Dateigröße:  145.18 KB
 Heruntergeladen:  324 mal

Willi Wipp
Moderator


Verfasst am:
30. Apr 2010, 02:47
Rufname:
Wohnort: Raum Wiesbaden


AW: ADO-Library sowie Memo-Felder in SQL Server 2005 - AW: ADO-Library sowie Memo-Felder in SQL Server 2005

Nach oben
       Version: Office 2003

{Dieser Beitrag nimmt das Thema aus den unbeantworteten Themen heraus}
Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind
GMT + 1 Stunde

Diese Seite Freunden empfehlen

Seite 1 von 1
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen

Verwandte Themen
Forum / Themen   Antworten   Autor   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge Access Tabellen & Abfragen: Feldwert ergänzen per SQL 16 grub 2243 27. Jul 2005, 16:50
Willi Wipp Feldwert ergänzen per SQL
Keine neuen Beiträge Access Tabellen & Abfragen: [SQL] GROUP BY mit mehreren Untergruppen? 1 marcos_ 1650 07. Apr 2005, 11:05
marcos_ [SQL] GROUP BY mit mehreren Untergruppen?
Keine neuen Beiträge Access Tabellen & Abfragen: SQL - Anzahl Ergebnissätze begrenzen, z.B erste 1000 Sätze 2 Spoldo 18401 17. März 2005, 17:25
Spoldo SQL - Anzahl Ergebnissätze begrenzen, z.B erste 1000 Sätze
Keine neuen Beiträge Access Tabellen & Abfragen: Access ändert meine SQL Strings 1 Nil 608 24. Feb 2005, 13:25
lothi Access ändert meine SQL Strings
Keine neuen Beiträge Access Tabellen & Abfragen: Zeitspanne bei Datumswerten mit SQL filtern...? 3 DoMe 4372 15. Feb 2005, 17:57
Willi Wipp Zeitspanne bei Datumswerten mit SQL filtern...?
Keine neuen Beiträge Access Tabellen & Abfragen: Zwei Datenfelder dividieren? (SQL) 8 marcos 7019 04. Feb 2005, 12:13
marcos Zwei Datenfelder dividieren? (SQL)
Keine neuen Beiträge Access Tabellen & Abfragen: SQL Gruppierung -AXP 2 nepokat 601 03. Feb 2005, 08:46
nepokat SQL Gruppierung -AXP
Keine neuen Beiträge Access Tabellen & Abfragen: Firebird embedded Server und Access 0 futzi007 810 11. Jan 2005, 18:06
futzi007 Firebird embedded Server und Access
Keine neuen Beiträge Access Tabellen & Abfragen: Access SQL auskommentieren 2 excalibur 7156 21. Nov 2004, 20:24
excalibur1 Access SQL auskommentieren
Keine neuen Beiträge Access Tabellen & Abfragen: SQL Abfrage mit 2 Where??? 2 NewNewbie 1858 18. Nov 2004, 16:40
NewNewbie SQL Abfrage mit 2 Where???
Keine neuen Beiträge Access Tabellen & Abfragen: Wenn-Dann-Sonst in SQL??? mit SQL-String :-) 11 SCHNEEMANN 7515 20. Okt 2004, 16:33
SCHNEEMANN Wenn-Dann-Sonst in SQL??? mit SQL-String :-)
Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten. Access Tabellen & Abfragen: Wenn-Dann-Sonst in SQL??? 2 SCHNEEMANN 998 18. Okt 2004, 17:26
Willi Wipp Wenn-Dann-Sonst in SQL???
 

----> Diese Seite Freunden empfehlen <------ Impressum - Besuchen Sie auch: Microsoft Project