# Access-Datenbank in visual basic 6.0 einbinden



## bsellmair (17. März 2008)

hallo, 
ich bin recht neu in dem gebiet und deshalb dürfte vielen von euch die antwort auf meine frage recht simpel erscheinen...
ich habe eine bestehende access-datenbank mit 3 tabellen.
mit hilfe des form-designers habe ich in visual basic 6.0 ein formular erstellt. 

mein problem lautet nun folgendermaßen:
im formular habe ich dropdownfelder (kombinationsfelder), mit deren hilfe ich auf schnelle art und weise die artikelnummern aus der datenbank zugreifen will, d.h. konkret wie kann ich in meinem formular die spalte "ArtNr" aus der tabelle "Artikel" von der Access-Datenbank für das kombinationsfeld hinterlegen 

Ich wäre euch äußerst dankbar, wenn ihr mir die lösung für mein problem mit den entsprechenden deklarationen und die AddItem-Einträge speziell auf mich zugeschnitten präsentieren könntet. 
(dazu noch folgende angaben: 
- der pfad der DB lautet "c:\Access\dbproddev.mdb"
- die namen der spalte und tabelle wie schon erwähnt "ArtNr" und "Artikel"  
- das kombinationsfeld habe ich "ComboArtNr1" genannt)


Schon mal im Voraus danke, Bernhard


----------



## ronaldh (18. März 2008)

Hallo,

zunächst mal Willkommen im Forum! Vermutlich wird Dir niemand Dein Programm schreiben, dass musst Du schon selbst machen. Jedoch helfen Dir alle gern, wenn Du Detail-Probleme hast.

Dieser Tipp hilft Dir erstmal grundsätzlich weiter, um den Zugriff auf Deine Datenbank zu realisieren. Damit solltest Du weiter kommen. 

Ansonsten noch der kleine Hinweis, dass wir hier auch auf korrekte Groß- und Kleinschreibung achten (dass hast Du mit den Nutzungsbedingungen für das Forum akzeptiert). Dadurch wird es auch anderen leichter, Deinen Text zu lesen.

Grüsse
ronaldh


----------



## bsellmair (18. März 2008)

Hallo ronaldh,

Zunächst einmal bitte ich um Entschuldigung, dass ich meinen Post lediglich in Kleinschreibung verfasst habe, ich war leider zeitlichen Engpässen unterworfen.

Des Weiteren erschien mir die Lösung, dass mir ein erfahrenerer Programmierer, als ich es bin, am Einfachsten, die entsprechenden Codepassagen speziell für meine Belange angibt. Was natürlich auch in meinem Sinne ist, dass mir jemand ein gutes Beispiel für Datenbankverknüpfungen nennt. 
Aus diesem Grund bin ich dir äußerst dankbar, dass du ein besseres Beispiel gefunden hast als ich es bis jetzt getan habe. Ich habe den Code bis jetzt lediglich kurz überflogen, dennoch er macht einen verständlichen Eindruck auf mich. Sollte ich noch Fragen dazu haben, so hoffe ich, dass ich mich diesbezüglich an dich (und alle anderen im Forum) wenden kann. 

Womit wir schon beim 1. Punkt wären...
- Entspricht in von dir genannten Beispiel die "With"-Funktion im Sub "GetValues" meinem füllen des Kombinationsfeldes mit den Daten der Datenbank?
Kann ich es auf diese Weise implementieren oder spricht etwas dagegen?

Vielen Dank im Voraus und nochmals Entschuldigung,
Bernhard


----------



## ronaldh (18. März 2008)

Hallöle,

ja, die GetValues-Prozedur füllt die Form mit den Daten. Statt der With-Schleife könnte man im Beispiel auch schreiben:


```
Form1.txtVName.Text = GetText(Rs.Fields("VName"))
      Form1.txtNName.Text = GetText(Rs.Fields("NName"))
      'usw.
```

Deshalb nimmt man da eine With-Schleife, da der Code dadurch übersichtlicher wird.

Grüsse
ronaldh


----------



## bsellmair (18. März 2008)

Aaaah dankeschön ronaldh!

Damit hast du mir schon ERHEBLICH weitergeholfen! 

Doch 2 Sachen hätte ich noch:

1. Wieso kommt im Beispiel keine Deklaration "Dim ... As Workspace" vor? Und was bezweckt eben diese

2. Im Beispiel heißt es in einer Kommentarzeile anfangs:
' Es muss ein Verweis auf 'Microsoft ActiveX Data Objects 2.5 Library' gesetzt werden.
Wieso finde ich die Option in VB 6.0 nicht? Ich finde im Menü "Weitere Steuerelemente" lediglich den Eintrag "Microsoft ActiveX Upload Control" und um diese kann es sich ja kaum handeln.

Beste Grüße,
Bernhard


----------



## ronaldh (18. März 2008)

Zu 1.:

Wie, Dim ... as WorkSpace? Das verstehe ich nicht. Wozu sollte das gut sein?

Zu 2.:
Unter Projekt/Verweise findest Du den entsprechenden Verweis. Dies muss natürlich nicht zwangsläufig die Version 2.5 sein, Du hast auf Deinem Rechner mit Sicherheit neuere Versionen drauf (2.7 oder 2.8). Im Zweifelsfall solltest Du da die neueste Version nehmen.

Grüsse
ronaldh


----------



## bsellmair (18. März 2008)

Wunderbar, hab den entsprechenden Verweis gefunden! Dankeschön!!

Zum Thema Workspace: hier ein Beispiel
Ich habe eigentlich auf ungewöhnlich vielen Seiten meiner Recherche so eine Deklaration wie in diesem Beispiel entdeckt. 

Meiner Meinung nach wird damit die Datenbank als Arbeitsbereich deklariert und von dort aus kann sie ebenfalls geöffnet, abgerufen und bearbeitet werden aber Genaueres weiß ich darüber nicht, drum die Frage was der Unterschied zwischen der Methode deinem Beispiel und der in meinem Beispiel ist.

Grüße Bernhard


----------



## ronaldh (18. März 2008)

Im Grunde lädst Du Dir damit MS-Access direkt in Dein VB-Programm, während Du mit dem in ActiveVB genannten Beispiel direkt auf die Datenbank zugreifst. Mit Excel macht man das auf diese Weise, um direkt auf Excel-Tabellen zugreifen zu können.

Bei Access ist es aber eindeutig eleganter, direkt auf die Datenbank zu gehen, und nicht den Umweg über Access zu nehmen. Das ist nicht nur erheblich schneller, es hat auch den Vorteil, dass Dein Programm auch auf Rechnern läuft, auf denen MS-Office mit Access nicht installiert ist (das geht sonst nicht). 

Access ist bis zu einem gewissen Grade SQL-fähig, so dass man bei direktem Zugriff wesentlich flexibler ist.

Aus diesem Grund hatte ich zunächst nicht verstanden, was Du willst, weil diese Vorgehensweise doch eher unüblich ist.

Wie gesagt, beim Zugriff auf eine Excel-Tabelle hast Du nicht viel andere Möglichkeiten, aber bei Access ist das nicht so sinnvoll.

Grüsse
ronaldh


----------



## bsellmair (18. März 2008)

Deine Hilfe hat mich meinem Ziel schon um Einiges näher gebracht. 
Vielen Dank fürs Erste!

Grüsse, 
Bernhard


----------



## ronaldh (18. März 2008)

Prima, freut mich!

Alles Gute
ronaldh


----------



## bsellmair (28. März 2008)

Hello Again

Bin jetzt schon um einiges weiter, mein nächstes Problem ist jetzt folgendes:
Ich lade meine Datenbank per 

```
Private Sub UserForm_Activate
```
 ins VBA.

Es Funktioniert soweit wunderbar.
Habe allerdings mehrere Fenster in meinem Programm. Deshalb lädt er sie beim Aufruf eines Unterfensters per .Show doppelt und es kommt zu einem Fehler. Es ist nicht möglich, die Datenbank gleich wieder zu closen, da ich sie sofort im nächsten Sub wieder 
benötige. 

Welche Möglichkeiten habe ich nun?! Ich möchte verständlicherweise keinen eigenen Button dafür anlegen. Kann ich dem Programm nun evtl. sagen, es soll das Sub nur bei einer bestimmten UserForm ausführen? Oder die Prozedur des Subs in einem Modul ablegen und per Call klugerweise abrufen? Wenn ja wie

Hier mein Sub als Auszug:

```
Private Sub UserForm_Activate()


'Füllen der Comboboxes mit Datenbankinhalten
Set con = New ADODB.Connection
con.CursorLocation = adUseClient
con.Provider = "Microsoft.Jet.Oledb.4.0"
con.Open "Data Source=c:\Access\DB.mdb"
    
    
rec.Open "SELECT Agruppe from Artikel group by Agruppe", con, adOpenKeyset, adLockOptimistic

ComboArtGr1.Clear
ComboArtGr2.Clear
ComboArtGr3.Clear

rec.MoveFirst
While Not rec.EOF
ComboArtGr1.AddItem rec![Agruppe]
ComboArtGr2.AddItem rec![Agruppe]
ComboArtGr3.AddItem rec![Agruppe]

rec.MoveNext
Wend


End Sub
```

Bitte Euch um Hilfe!!

Vielen Dank, Bernhard


----------



## Alex F. (28. März 2008)

nimm die Funktion ins Form_Load Ereignis dann sollte sie nicht immer wieder aufgerufen werden.
Solltest du mit vba arbeiten dann definiere dir eine Static variable die du auf 1 setzt sobald deine Conneciton offen ist, dann brauchst du sie nicht nochmal zu öffnen.

Grüsse bb


----------



## bsellmair (28. März 2008)

Tut mir Leid aber ich kann mir nicht vorstellen wie das genau ablaufen soll...
Kommt dann meine komplette Prozedur von meiner jetzigen UserForm_Activate, sowie die Show-, Load- und Unload-Befehle ins Form_Load Ereignis

Grüße, Bernhard


----------



## ronaldh (28. März 2008)

Der Unterschied zwischen Form_Load und Form_Activate ist der, dass Form_Load nur einmal aufgerufen wird, wenn die Form in den Speicher geladen wird. Form_Activate wird dagegen jedesmal aufgerufen, wenn die Form aktiv wird, also den Focus erhält. Das heißt, selbst wenn nur eine simple Messagebox angezeigt wird (dadurch verliert die Form den Focus), und die Messagebox wieder beendet wird, tritt Form_Activate in Aktion.

Form-Activate sollte man weitgehend vermeiden, da es häufig zu unvorhergesehenen Aktionen führt.

Grüsse
ronaldh


----------

