Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema Userform
BildScreenshot zu Userform Userform-Seite mit Beispielarbeitsmappe aufrufen

Speichern in DB nicht mögl.

Betrifft: Speichern in DB nicht mögl. von: Ronald Wälty
Geschrieben am: 21.10.2020 16:40:20

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

Betrifft: AW: Speichern in DB nicht mögl.
von: Dieter Klemke
Geschrieben am: 21.10.2020 20:55:05

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

Betrifft: AW: Speichern in DB nicht mögl.
von: Ronald Wälty
Geschrieben am: 21.10.2020 21:46:14

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

Betrifft: AW: Speichern in DB nicht mögl.
von: Dieter Klemke
Geschrieben am: 22.10.2020 14:57:48

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

Betrifft: AW: Speichern in DB nicht mögl.
von: Ronald Wälty
Geschrieben am: 22.10.2020 22:16:31

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

Betrifft: AW: Speichern in DB nicht mögl. - Lösung
von: Ronald Wälty
Geschrieben am: 23.10.2020 07:35:44

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

Beiträge aus dem Excel-Forum zum Thema "Speichern in DB nicht mögl."