Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1788to1792
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Speichern in DB nicht mögl.

Speichern in DB nicht mögl.
21.10.2020 16:40:20
Ronald
Hallo an alle!
Ich möchte gerne von einer Userform Informationen einen neuen Eintrag in eine Access-DB machen, was nicht funktioniert. Ich zeige erstmal, wie ich bestehende Daten abrufe, was auch funktioniert:
Option Explicit
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Public Sub Daten_aus_DB_holen()
Dim i As Integer
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\_Privat\HOLZZZWERK\Büro\ _
Holzzzwerk ERP\HOLZZZWERK_ERP.mdb;Persist Security Info=False;"
Set rs = cn.Execute("SELECT * FROM tKunden")
i = 1
Do While Not rs.EOF
lstAuswahlFirma_KV.AddItem rs.Fields("fKdFirmenname")
lstAuswahlNachname_KV.AddItem rs.Fields("fKdNachname")
lstAuswahlVorname_KV.AddItem rs.Fields("fKdVorname")
lstAuswahlOrt_KV.AddItem rs.Fields("fKdOrt")
rs.MoveNext
i = i + 1
Loop
cn.Close
End Sub

Auf dieselbe Art einen Eintrag machen, geht nicht. Ich habe folgenden Code:
Public Sub Daten_In_DB_schreiben()
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim dbpath
Dim x As Long
Dim i As Long
Set cnn = New ADODB.Connection
cnn.Open "provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\_Privat\HOLZZZWERK\Büro\ _
Holzzzwerk ERP\HOLZZZWERK_ERP.mdb"
Set rst = New ADODB.Recordset
With rst
.Source = "SELECT * FROM tKunden"
.Open
.AddNew
.Fields("fKdNummer") = "KD-00003"
.Fields("fKdKategorie") = "Privatkunde"
.Fields("fKdNachname") = txtNachname_KV.Text
.Fields("fKdVorname") = txtVorname_KV.Text
.Fields("fKdOrt") = txtOrt_KV
.Update
End With
rst.Close
cnn.Close
Set rst = Nothing
Set cnn = Nothing
End Sub

Was mich interessieren würde:
1. Wo liegt der Fehler beim Setzen eines neuen Eintrags in die DB?
2. Wie müßte es aussehen, wenn man keinen neuen Eintrag machen möchte, sondern nur aktualisieren?
3. Wo ist es sinnvoll, die Deklarationen zu setzen (... as new ADO.Connection; Recordset, etc.)?
4. Ab wann ist es sinnvoll, diese wieder zu schließen? Sofort oder bei Programmende?
5. Ab wann ist es sinnvoll, diese Objekte auf Nothing zu setzen? Gleich, wie bei 4. ?
6. Wie kann ich hier Quellcode posten, der dann auch angezeigt wird, wie Quellcode im VBA, anstatt als Text?
Danke im Voraus für ein paar Tips und Tricks.
Gruß Ronald

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Speichern in DB nicht mögl.
21.10.2020 20:55:05
Dieter
Hallo Ronald,
versuch es einmal mit dem folgenden Code
   ...
Set rst = New ADODB.Recordset
rst.Open Source:="tKunden", _
ActiveConnection:=cnn, _
CursorType:=adOpenStatic, _
LockType:=adLockPessimistic, _
Options:=adCmdTableDirect
With rst
.AddNew
.Fields("fKdNummer") = "KD-00003"
.Fields("fKdKategorie") = "Privatkunde"
.Fields("fKdNachname") = txtNachname_KV.Text
.Fields("fKdVorname") = txtVorname_KV.Text
.Fields("fKdOrt") = txtOrt_KV
.Update
End With

Ich schlage vor, erst das zu probieren und dann auf deine weiteren Fragen zurückzukommen.
Es ist sicher hilfreich, wenn du eine kleine Testversion deiner Datenbank und dein UserForm-Programm zur Verfügung stellst.
Viele Grüße
Dieter
Anzeige
AW: Speichern in DB nicht mögl.
21.10.2020 21:46:14
Ronald
Danke für den Tip. Ich habe den halben Abend hin- und her probiert und hatte endlich diese Lösung
hier gefunden:
Dim sqlQuery As String
Dim nConnection As New ADODB.Connection
Dim nRecordset As New ADODB.Recordset
nConnection.Open "provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\_Privat\HOLZZZWERK\Büro\Holzzzwerk ERP\HOLZZZWERK_ERP.mdb" & ";JET OLEDB:Database"
sqlQuery = "SELECT * FROM tKunden"
nRecordset.Open Source:=sqlQuery, ActiveConnection:=nConnection, CursorType:=adOpenKeyset, LockType:=adLockOptimistic
With nRecordset
.AddNew
.Fields("fKdNummer") = "KD-00003"
.Fields("fKdKategorie") = "Privatkunde"
.Fields("fKdNachname") = frmMain.txtNachname_KV.Text
.Fields("fKdVorname") = frmMain.txtVorname_KV.Text
.Fields("fKdOrt") = frmMain.txtOrt_KV.Text
.Update
.Close
End With
nConnection.Close
Weißt Du, wie ich nur den Datensatz von beispielsweise "Kundennummer X" laden kann?
Mit SELECT tKunden.fKdNummer beispielsweise würde ich ja nur eine Liste aller Kundennummern
beziehen.
SELECT A.* FROM tKunden as A
WHERE A.fKdNummer = "KD-00002"
Ich weiß nicht, ob ich das richtig gedeutet und abgewandelt habe.
Quelle: https://www.sql-und-xml.de/sql-tutorial/where-auswahl-von-daten-zeilen.html
Gruß Ronald
Anzeige
AW: Speichern in DB nicht mögl.
22.10.2020 14:57:48
Dieter
Hallo Ronald,
ohne Beispieldateien ist mir das zu fummelig.
Ich sende dir in der Anlage aus meinem Demo-Material eine Arbeitsmappe und 2 Access-Datenbanken (eine dient nur als Backup) in gezippter Form mit einigen Aktualisierungsbeispielen.
Die Arbeitsmappe ergänzt beim Öffnen die Menüleiste um das Register "Datenbankzugriff". Von dort aus kannst du die Programme starten.
https://www.herber.de/bbs/user/141022.zip
Viele Grüße
Dieter
AW: Speichern in DB nicht mögl.
22.10.2020 22:16:31
Ronald
Guten Abend Dieter
Vielen Dank für das sehr hilfreiche Excel!!
Die einzige Frage, die ich nun noch habe, ist die, wie ich einen ganz bestimmten Datensatz aus der
DB laden kann. Also ich habe eine Prozedur, die mir alle Kundennummern, Vornamen, Nachnamen und Orte
in insgesamt vier Listboxen lädt. Diese vier Listboxen sind gekoppelt, per Listindex, damit ich einen Eintrag markiere und es mir denselben in allen anderen Listboxen ebenfalls markiert. Funktioniert auch. Das ist übrigens der untenstehende Code, den ich temporär angepaßt (und den originalen Wortlauf auskommentiert) habe, um zu testen. Ich wähle also nun aus diesen rudimentären Datensätzen den Kunden aus, den ich möchte, schaue dann nach, welcher Wert bei der Listbox mit den Kundennummern drin ist und möchte dann eigentlich diesen Wert, also diese Kundennummer als Suchbegriff in der SELECT-Phrase drin haben und nun tatsächlich ALLE Datensätze zu dieser Kundennummer laden. Leider ist etwas an meiner Syntax falsch und nirgends im Netz ist etwas zu finden, obwohl ich sogar mit den Suchbegriffen variiert habe, etc.
Leider habe ich wieder kein Projekt für Dich. Erstens ist es zu vielschichtig und fürs Nachverfolgen
nicht selbsterklärend und zweitens reichen aus meiner Sicht die folgenden paar Zeilen, um zu
verstehen, auf was ich hinaus will.

cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\_Privat\HOLZZZWERK\Büro\ _
Holzzzwerk ERP\HOLZZZWERK_ERP.mdb;Persist Security Info=False;"
strAusgewaehlterDatensatz_KV = "KD-00003"
'Set rs = cn.Execute("SELECT * FROM tKunden") = Originalcode
Set rs = cn.Execute("SELECT * FROM tKunden WHERE fKdNummer=" & strAusgewaehlterDatensatz_KV) _
'Irgendwas ist hier an der Syntax falsch. Leider ist nirgends im Netz zu finden, wie es  _
richtig heißen muß
'nachfolgender Code ist primär in Ordnung, gehört aber zur Abfrage dazu, daher hab ichs mit  _
abgedruckt.
i = 1
Do While Not rs.EOF
frmAuswahl.lstAuswahlKundennummer_KV.AddItem rs.Fields("fKDNummer")
frmAuswahl.lstAuswahlNachname_KV.AddItem rs.Fields("fKdNachname")
frmAuswahl.lstAuswahlVorname_KV.AddItem rs.Fields("fKdVorname")
frmAuswahl.lstAuswahlOrt_KV.AddItem rs.Fields("fKdOrt")
rs.MoveNext
i = i + 1
Loop
cn.Close
Ich bekomme übrigens die Fehlermeldung "Für mindestens einen erforderlichen Parameter wurde kein Wert angegeben". Als Ergänzung sei hier noch gesagt, daß das Datenfeld für Kundennumemr "Kurzer Text" ist. Eine Kundennummer im Format "KD-00003" ist kurz genug für 255 Zeichen, dachte ich.
Würde mich sehr freuen, wenn Du mir hierzu einen Tip geben könntest, wie die Syntax aussehen muß.
Gruß Ronald
Anzeige
AW: Speichern in DB nicht mögl. - Lösung
23.10.2020 07:35:44
Ronald
Hallo Dieter
Ich habe die Lösung gefunden. Und zwar recht simpel. Mein Code war an und für sich gut, nur
haben die kleinen Strichchen gefehlt, mit denen man auch auskommentiert, und zwar als
Ersatz-Anführungsstriche. Dann ging es. Das sieht dann genau so aus:
Set rs = cn.Execute("SELECT * FROM tKunden WHERE fKdNummer='KD-00003'")

Ich war neugierig, ob er ab KD-00003 den Kommentar beginnt, aber Nein, das hat er begriffen,
daß es was anderes ist.
Nochmals vielen Dank für Deine Hilfe und Deine tollen Lösungsansätze. Falls ich im Laufe des
Projekts nochmals Hilfe brauchen sollte, komme ich gerne wieder vorbei.
Wünsche Dir einen schönen Tag!
Gruß Ronald
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige