# ADO Access im Netzwerk



## Joi1981 (6. Juli 2009)

Hallo Leute,

ich übe mich derzeit in der Datenbankprogrammierung.

Ich verwende ADO in Verbindung mit einer Access-Datenbank.

Die Datenbankdatei liegt auf einem freigegebenen Netzlaufwerk.

Ich kann Problemlos komplexe Datensätze anlegen, ändern, löschen und mit den SQL-Strings sortieren.

Das ganze funktioniert auch genauso wie ich es mir vorstelle.

Als Einzelplatzlösung wäre meine Anwendung also "fehlerfrei".

ABER:

Wenn die Datenbank von mehreren Benutzern im Netzwerk über mein Programm verwendet wird kommt es ab- und an vor das ich böse ADO-Fehler bekomme weil z.B. der Datensatz in Benutzung ist oder gerade verändert wird oder von einem anderen Benutzer verändert wurde.

Die ganze Sache mit BOF und EOF, den Cursor und Zugriffstypen ist mir bekannt.

Aber wie erreiche ich es da wenn:

Benutzer A: sich ein Recordset mit allen Datensätzen der Tabelle 1 lädt.

Benutzer B: sich das selbe Recordset lädt

Benutzer A: den zweiten Datensatz ändert (.update)

Benutzer B: in den zweiten Datensatz hineingeht, diesen wieder verändert und die Änderungen speichert (.update)

Wenn nun Benutzer A nochmals eine Änderung speichert oder sich das Recordset mit Requery oder Resync aktualisiert wird ein Fehler ausgelöst das der Datensatz entweder nicht gefunden wurde oder momentan in Benutzung ist.

Gibt es ein Standard "Rezept" für den Umgang mit ADO/ACCESS im Netzwerk?

Bin für jede Hilfe dankbar!!

Grüße
Jochen


----------



## ANI (30. Juli 2009)

Hallo Jochen,
nach meines Erachtens kann es nur Einen geben (würde jetzt Highländer sagen), der auf einen Datensatz zugreifen kann. Wenn ich einen Datensatz bearbeiten möchte und mein Nachbar will den gleichen Datensatz bearbeiten, werde ich von ADO (MS Access) exklusiv behandelt und mein Nachbar hat erst wieder Zugriff, wenn ich den Datensatz durch Speichern (Update) frei gebe. Sonst wäre Deine Bearbeitung des Datensatzes sinnlos, wenn jeder Deine Daten sofort wieder verändern würde. 

Nur einer kann gleichzeitig einen Datensatz öffnen und bearbeiten. Finde ich auch sehr sinnvoll.

Solltest Du noch weitere Fragen haben, stehe ich Dir gerne zur Seite.

Gruß Andreas


----------



## Joi1981 (1. August 2009)

Hallo Andreas!

Besten Dank für Deine Antwort - Gerne nehme ich Dein Angebot an 

Ich möchte mein Programm mit einem Datenfilter ausstatten,
mit dem der Benutzer verschiedene Kriterien einschränken kann.

So ein einfacher SQL String ist ja nicht schwierig, aber was wenn wirklich viele Filteroptionen berücksichtigt werden müssen?
In meinem konkreten Fall bedeutet dies das der Filter verschiedene Check- und Optionsfelder, sowie Suche- und Eingabefelder enthält.
Muss ich mein Recordset, das zunächst ALLE Datensätze enthält für jede Option und Abhängigkeit neu filtern und klonen bis die letzte Variable abgefragt ist, oder kann man da einen "Monster-Langen" sql-String zaubern, der dies alles in einem Rutsch filtert.

Mein Programm filtert Aufträge. Ich möchte also zum Beispiel alle Datensätze haben mit Status "3", Datum "tt.mm.yyyy", Auslieferung "tt.mm.yyyy", Produktgruppe "1", Status "Aktiv". Die Tabelle "Auftrag" enthält all diese Informationen und noch weitere. Doch wie bekomme ich das alles sauber gefiltert, ohne jede einzelne Filteroption einzeln abzufragen?

Hast Du einen Lösungsansatz oder ein kleines Beispiel für mich?

Vielen Dank für Deine Unterstützung!

Gruß
Jochen


----------



## ANI (2. August 2009)

Hallo Jochen,

in der WHERE-Klausel kannst Du alles Mögliche unterbringen. 
z.B.

db.execute "Select * from tabelle where Datum = 'tt.mm.yyyy' and Auslieferung= 'tt.mm.yyyy' and Produktgruppe= 1 and Status= 'Aktiv'"

db.execute "Select * from tabelle where Datum ='" & sDatum & "' and Auslieferung= '" & sAuslieferung & "' and Produktgruppe = 1 and Status= 'Aktiv'"

sDatum und sAuslieferung sind Variablen, denen Du einen Wert zuordnen kannst.

Durch sDatum = cint("tt.mm.yyyy") wandelst Du das Datum in eine Integer-Zahl um, mit dem die Datenbank besser zurecht kommt.

Zwischen den SQL-String "" keine Anführungszeichen " verwenden, nur Hochkomma '. Sonst ist der String als SQL nicht lesbar.

Ich hoffe, Du kannst damit etwas anfangen. 

Gruß Andreas


----------



## Joi1981 (2. August 2009)

Hallo Andreas,

vielen Dank für den Denkanstoß.Das ist schonmal ein Ansatz.

Ich habe bisher aber nicht mit  "execute" sondern mit:
"recordset.Open SQLAnweisung, db".. usw... gearbeitet.
Ist die Abfrage über "execute" also besser?

Und noch eine Frage:
Wenn ich z.B. alle Aufträge eines vorgegebenen Zeitraums haben möchte, also z.B. alle vom 01.01.2009 - 31.01.2009 > gibts da auch eine elegante Lösung innerhalb der sql-Anweisung, oder muss ich die Tage zwischen den zwei Datums ermitteln und dann in ein Array schreiben das dann abgearbeitet wird?

Schönen Sonntag!

Gruß
Jochen


----------



## ANI (13. August 2009)

Hallo Jochen,
bin zur Zeit in Berlin und habe deshalb nur wenig Zeit, um ins Netz zu gehen.

Hier noch mal ein Tip:
SELECT * FROM Bestellungen WHERE Bestelldatum Between #1-1-95# And #6-30-95#;

Dieser Hinweis müsste Dir weiterhelfen.

Gruß Andreas


----------



## Joi1981 (13. August 2009)

Hi Andreas!

Vielen Dank für diesen wertvollen Tipp. Genau das hab ich gesucht 

Ich glaube ich denke einfach zu kompliziert. Ich wusste garnicht das es "between" gibt.

Ich denke ich kann künftige Probleme mit sollchen sql-kommandos gut lösen.
Hast Du vielleicht ne Seite für mich, wo man sich einen Überblick über alle sql-kommandos verschaffen kann und idealerweise auch die Syntax dieser Anweisungen beschrieben wird?

Viel Spass in Berlin!

Gruß
Jochen


----------



## ANI (23. August 2009)

Hey Jochen,

eine spezielle Seite habe ich nicht. Jahrelange Forschung und MS Access-Hilfe (VBA) hat mir das Wissen vermittelt. 

Sehr hilfreich ist diese Seite.
http://www.vbarchiv.net/home/index.php

Ansonsten alles ausprobieren, was man glaubt, wie es funktionieren soll.
Übung macht den Meister. Bei mir hat es geholfen.

Für weitere Fragen stehe ich Dir gerne zur Verfügung.

Gruß Andreas


----------



## Joi1981 (23. August 2009)

Hi Andreas,

danke für den Tipp und die Antwort.

Dann werde ich mich mal ans Werk machen.... 

Besten Dank nochmal für Deine Unterstützung.

Gruß
Jochen


----------



## Joi1981 (30. August 2009)

Hallo Andreas,

Deine Tipps haben mit schon sehr weiterholfen.

Bin momentan am basteln wie ich am besten einen korrekten SQL-String aus verschiedenen Abhängigkeiten (Check- und Optionsboxen, sowie Eingabefeldern) erstelle.

Aber noch schnell eine andere Frage.

Ich habe in meiner Datenbank (Access) ein Memo-Feld in das ich größeren Text schreibe.

Funktioniert auch ganz gut. Nur einen Schönheitsfehler hat das ganze.
Wenn ich das Memo-Feld in ein Textfeld einlese, werden die Zeilenumbrüche:
vbnewline od. vbcrlf, od. vbcl od. vbclf in viereckige Sonderzeichen umgewandelt, was dann natürlich nicht mehr so schön aussieht. Ich kann die Sonderzeichen zwar im Change Ereignis der Textbox mit Text1.Text = Replace(Text1.Text, vbcrlf, " " entfernen, aber dann schreibt er dann ganzen Text hintereinander, eben ohne die Zeilenumbrüche.

Kannst Du mir helfen? Liegt es am Datenfeld der DB oder muss ich beim hineinschreiben in die DB schon etwas beachten?

Besten Dank im Voraus!

Gruß
Jochen


----------



## Klaus1704 (3. September 2009)

Hallo Jochen,
die MultiLine-Eigenschaft der Textbox auf True setzen oder eine Richttextbox nehmen.
Das sollte helfen.

Gruß
Klaus


----------



## Joi1981 (7. September 2009)

Hallo Klaus,

danke für den Tipp. Hat geklappt 

Besten Dank!

Gruß
Jochen


----------



## Joi1981 (10. September 2009)

Hallo nochmal Klaus,

kannst Du mir auch sagen, wie ich diese "Sonderzeichen"-Vierecke aus dem Datagrid herausbekomme? Das Datagrid enthält eine Spalte die ein Memo-Feld der Accesss-Datei zeigt in dem auch Zeilenumbrüche (vbcrlf) vorhanden sind. Die Zeilenumbrüche werden im Grid ebenfalls als "Vierecke" dargestellt.

Danke, Gruß
Jochen


----------



## Joi1981 (14. September 2009)

Hallo Leute,

hab die Lösung jetzt selbst gefunden.

Das ganze funktioniert über Column(s).MultiLine bzw. Wordwrap (true/false).
Und dann noch RowHeigh einstellen, damit die zweite Zeile nicht abgeschnitten dargestellt wird.

Gruß
Jochen


----------

