Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1832to1836
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

Update ADO-Datensatz

Update ADO-Datensatz
19.05.2021 23:26:53
Ronald
Hallo an alle!
Da bin ich wieder :-)
Datzensatz aktualisieren will nicht so recht klappen. Ich bekomme die Fehlermeldung: "Laufzeitfehler 3251: Das aktuelle Recordset unterstützt keine Aktualisierung. Hierbei handelt es sich möglicherweise um eine Einschränkung seitens des Providers oder des gewählten LockTypes.".
HIer hatte ich AdLockOptimistic. Bei AdLockPessimistic kommt die selbe Meldung. Ich habe das Gefühl, daß ich sich ein Fehler eingeschlichen hat, der mit dem
Locktype nichts zu suchen hat.
Erst wird auf Änderung geprüft:

Public Sub e_privKD_auf_Aenderung_pruefen()
If frmMain.txtKundennummer_KV.Text = strKundennummer_KV And frmMain.cboStatus_KV.Value = strStatus_KV And frmMain.txtKundeSeit_KV.Text = strKundeSeit_KV _
And frmMain.txtEintragsdatum_KV.Text = strEintragsdatum_KV And frmMain.txtAenderungsdatum_KV.Text = strAenderungsdatum_KV _
And frmMain.txtDomain_KV.Text = strDomain_KV And frmMain.cboKategorie_KV.Value = strKategorie_KV And frmMain.txtFirmenname_KV.Text = strFirmenname_KV _
And frmMain.txtAnrede_KV.Text = strAnrede_KV And frmMain.txtNachname_KV.Text = strNachname_KV And frmMain.txtVorname_KV.Text = strVorname_KV _
And frmMain.txtVorname2_KV.Text = strVorname2_KV And frmMain.txtUID_KV.Text = strUID_KV And frmMain.txtMwStNr_KV.Text = strMwStNr_KV Then
boolAenderung_Form_KV = False
Else
boolAenderung_Form_KV = True
End If
End Sub
...und dann aktualisiert:

Public Sub f_Update_privKD()
With rs
.Fields("fKdNummer").Value = frmMain.txtKundennummer_KV.Text
.Fields("fKdStatus").Value = frmMain.cboStatus_KV.Value
.Fields("fKdKundeSeit").Value = frmMain.txtKundeSeit_KV.Text
.Fields("fKdEintragsdatum").Value = frmMain.txtAenderungsdatum_KV.Text
.Fields("fKdAenderungsdatum").Value = frmMain.txtAenderungsdatum_KV.Text
.Fields("fKdDomain").Value = frmMain.txtDomain_KV.Text
.Fields("fKdKategorie").Value = frmMain.cboKategorie_KV.Value
.Fields("fKdOrt").Value = frmMain.txtOrt_KV.Text
.Fields("fKdAnrede").Value = frmMain.txtAnrede_KV.Text
.Fields("fKdNachname").Value = frmMain.txtNachname_KV.Text
.Fields("fKdVorname").Value = frmMain.txtVorname_KV.Text
.Fields("fKdVorname2").Value = frmMain.txtVorname2_KV.Text
.Update
End With
End Sub
Danke im Voraus.
Gruß Ronald

22
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Update ADO-Datensatz
20.05.2021 05:53:17
Luschi
hallo Ronald,
ich kann mir nicht vorstellen, daß die beiden Datenfelder "fKdEintragsdatum" und "fKdAenderungsdatum" im Recordset und damit auch in der Datenbank den Datentyp 'TEXT' haben sondern den Datentyp 'DATUM' besitzen.
In den Text-Feldern des Formulars steht immer 'TEXT', egal ob man mit .Text oder mit .Value darauf zugreift - also muß man diese Text-Daten konvertieren ; z.B. so:
.Fields("fKdEintragsdatum").Value = CDate(frmMain.txtAenderungsdatum_KV.Value)
Gruß von Luschi
aus klein-Paris
AW: Update ADO-Datensatz
20.05.2021 09:43:23
Ronald
Grüß Dich Luschi
Danke für Deine Antwort. Damit hast Du natürlich recht und wurde bereits angepaßt. Ich frag mich nur, ob es hier bei der Zuweisung eine Rolle spielt, ob ich:

.Fields("fKdKundeSeit").Value = CDate(frmMain.txtKundeSeit_KV.Text)
oder mit .Value anstelle von .Text am Ende:

.Fields("fKdKundeSeit").Value = CDate(frmMain.txtKundeSeit_KV.Value)
Momentan sieht es so aus:

Public Sub f_Update_privKD()
With rs
'.Fields("fKdNummer").Value = frmMain.txtKundennummer_KV.Text
.Fields("fKdStatus").Value = frmMain.cboStatus_KV.Value
.Fields("fKdKundeSeit").Value = frmMain.txtKundeSeit_KV.Text
.Fields("fKdEintragsdatum").Value = CDate(frmMain.txtAenderungsdatum_KV.Text)
.Fields("fKdAenderungsdatum").Value = CDate(frmMain.txtAenderungsdatum_KV.Text)
.Fields("fKdDomain").Value = frmMain.txtDomain_KV.Text
.Fields("fKdKategorie").Value = frmMain.cboKategorie_KV.Value
.Fields("fKdOrt").Value = frmMain.txtOrt_KV.Text
.Fields("fKdAnrede").Value = frmMain.txtAnrede_KV.Text
.Fields("fKdNachname").Value = frmMain.txtNachname_KV.Text
.Fields("fKdVorname").Value = frmMain.txtVorname_KV.Text
.Fields("fKdVorname2").Value = frmMain.txtVorname2_KV.Text
.Update
End With
End Sub
Es kam dieselbe Meldung, daß das aktuelle Recordset keine Aktualisierung unterstützen würde. Möglicherweise Einschränkungen seitens Provider oder
des gewählten LockTypes. Wenn ich hier debugge, springt er in die erste Zeile des "With rs". Da dies die Kundennummer als Autowert ist, die sowieso nicht
geändert werden sollte, hab ich diese Zeile auskommentiert. Auch, um auszuschließen, daß es am Autowert liegt. Aber die Meldung kam trotzdem und hat
nach dem Debuggen auf die zweite Zeile verwiesen.
LockType steht momentan auf adLockOptimistic. Es werden erstmal keine weiteren Bearbeiter dieser Software zu erwarten sein. Ansonsten hätte ich eher
adLockPessimistic verwendet. Was ist denn hier mit Provider gemeint? Als CursorType habe ich OpenKeyset. Was könnte hier noch die Ursache sein? Und ist es sinnvoll, die Kundennummer im Format "KD-00001" in der DB als Autowert zu führen, oder wäre nicht hier auch Text die sinnvollere Wahl?
Danke und Gruß
Ronald
Anzeige
AW: Update ADO-Datensatz
20.05.2021 15:14:42
ChrisL
Hi Roland
Der entscheidende Code fehlt (conntection und rs open). OpenKeyset wäre richtig adOpenKeyset.
Recherche z.B.
https://www.ms-office-forum.net/forum/showthread.php?t=90319
Es war das CursorLocation und eine kleine Änderung im ConnectString...
Provider wäre m.E. der Datenbankbetreiber.
Eine Index-Zahl als eindeutige ID / Autowert scheint mir sinnvoll. Mit "KD-" ergänzen und als Text zu konvertieren, scheint mir unnötig bzw. weniger sinnvoll.
cu
Chris
AW: Update ADO-Datensatz
20.05.2021 15:53:06
Ronald
Wenn ich Dich recht verstehe, ists sinnvoller, den Index als Zahl zu lassen und nur, wenn diese Zahl nach draußen geht (via Angebot, Rechnung etc.) vorgänging via separate Prozedur die jeweils fehlenden Nullen und das "KD" davor setzen. Ja, ich glaube, dies ist machbar.

Public Sub Privatkundendaten_aus_DB_holen()
'#     Aktuelle Prozedur     #
Call a_DB_Verbindung_aufbauen
Call b_SQL_Abfrage_PrivatKd
Call c_Handling_der_Datensaetze
End Sub
...

Public Sub a_DB_Verbindung_aufbauen()
With cn
.CursorLocation = adUseClient
.Mode = adModeShareDenyNone
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Softwerk\SoftWERK_ERP.mdb;Persist Security Info=False;"
End With
End Sub
...

Public Sub b_SQL_Abfrage_PrivatKd()
With rs
.ActiveConnection = cn
.CursorLocation = adUseClient
.CursorType = adOpenKeyset
.LockType = adLockPessimistic
End With
strQuery = "SELECT * FROM tKunden ORDER BY fKdNummer ASC"
'WHERE fKdNummer = " & " '" & strAusgewaehlterDatensatz_KV & "'"
Set rs = cn.Execute(strQuery)
End Sub
...

Public Sub c_Handling_der_Datensaetze()
'suchen und finden von Anfang an
intAnzeigeZaehler = intAnzeigeZaehler + 1
If intAnzeigeZaehler = 1 Then
rs.MoveFirst
Do
rs.MoveNext
Loop Until rs.Fields("fKdNummer").Value = strAusgewaehlterDatensatz_KV Or rs.EOF
'Verwenden
If rs.EOF Then
MsgBox "Kundennummer nicht gefunden!"
Else
frmMain.txtKundennummer_KV.Value = rs.Fields("fKdNummer").Value
frmMain.cboStatus_KV.Value = rs.Fields("fKdStatus").Value
frmMain.txtKundeSeit_KV.Value = rs.Fields("fKdKundeSeit").Value
frmMain.txtEintragsdatum_KV.Value = rs.Fields("fKdEintragsdatum").Value
frmMain.txtAenderungsdatum_KV.Value = rs.Fields("fKdAenderungsdatum").Value
frmMain.txtDomain_KV.Value = rs.Fields("fKdDomain").Value
frmMain.cboKategorie_KV.Value = rs.Fields("fKdKategorie").Value
frmMain.txtOrt_KV.Value = rs.Fields("fKdOrt").Value
frmMain.txtAnrede_KV.Value = rs.Fields("fKdAnrede").Value
frmMain.txtNachname_KV.Value = rs.Fields("fKdNachname").Value
frmMain.txtVorname_KV.Value = rs.Fields("fKdVorname").Value
frmMain.txtVorname2_KV.Value = rs.Fields("fKdVorname2").Value
End If
ElseIf intAnzeigeZaehler > 1 Then
frmMain.txtKundennummer_KV.Value = rs.Fields("fKdNummer").Value
frmMain.cboStatus_KV.Value = rs.Fields("fKdStatus").Value
frmMain.txtKundeSeit_KV.Value = rs.Fields("fKdKundeSeit").Value
frmMain.txtEintragsdatum_KV.Value = rs.Fields("fKdEintragsdatum").Value
frmMain.txtAenderungsdatum_KV.Value = rs.Fields("fKdAenderungsdatum").Value
frmMain.txtDomain_KV.Value = rs.Fields("fKdDomain").Value
frmMain.cboKategorie_KV.Value = rs.Fields("fKdKategorie").Value
frmMain.txtOrt_KV.Value = rs.Fields("fKdOrt").Value
frmMain.txtAnrede_KV.Value = rs.Fields("fKdAnrede").Value
frmMain.txtNachname_KV.Value = rs.Fields("fKdNachname").Value
frmMain.txtVorname_KV.Value = rs.Fields("fKdVorname").Value
frmMain.txtVorname2_KV.Value = rs.Fields("fKdVorname2").Value
End If
frmMain.cmdFelderAktualisieren_KV.Enabled = True
Call d_privKD_Textbox_zu_String 'Sicherheitskopie anlegen, zum Abfragen, ob was geändert wurde
End Sub
Jetzt wurde bemerkt, daß sich was geändert hat und der Update-Vorgang kommt ins Rollen:

Public Sub f_Update_privKD()
With rs
'.Fields("fKdNummer").Value = frmMain.txtKundennummer_KV.Text
.Fields("fKdStatus").Value = frmMain.cboStatus_KV.Value
.Fields("fKdKundeSeit").Value = CDate(frmMain.txtKundeSeit_KV.Text)
.Fields("fKdEintragsdatum").Value = CDate(frmMain.txtAenderungsdatum_KV.Text)
.Fields("fKdAenderungsdatum").Value = CDate(frmMain.txtAenderungsdatum_KV.Text)
.Fields("fKdDomain").Value = frmMain.txtDomain_KV.Text
.Fields("fKdKategorie").Value = frmMain.cboKategorie_KV.Value
.Fields("fKdOrt").Value = frmMain.txtOrt_KV.Text
.Fields("fKdAnrede").Value = frmMain.txtAnrede_KV.Text
.Fields("fKdNachname").Value = frmMain.txtNachname_KV.Text
.Fields("fKdVorname").Value = frmMain.txtVorname_KV.Text
.Fields("fKdVorname2").Value = frmMain.txtVorname2_KV.Text
.Update
End With
End Sub
Zum Einen stellt sich mir die Frage, ob ich bei der Connection bzw. beim Recordset etwas besser hätte machen können. Es bringt schließlich nichts, wenn
man beispielsweise adOpenKeyset an der falschen Stelle einbaut und es später durch einen Standardwert überschrieben wird. Das gilt auch für die
anderen Parameter. Daher meine Frage, ob dies so richtig ist oder wo und wie ich diese sinnvoller einbauen könnte.
Was auch noch erwähnt werden sollte, ist die Tatsache, daß ich im Netz gelesen habe, man müsse .Edit anführen, ehe die Zuweisung der
Steuerelementinhalte zu den Datenbankfeldern erfolgt. Bei mir steht aber nur EditMode zur Verfügung und dieser sei wohl nicht kompatibel. Daher
habe ich den nicht drin. AddNew hab ich nicht drin, weil ich ja nur aktualisieren will.
Gruß Ronald
Anzeige
AW: Update ADO-Datensatz
20.05.2021 18:23:19
Yal
Hallo zusammen,
Wenn eine Datensatz in der Kunden-Tabelle durch den Kundennummer eindeutig identifiziert ist, dann soll dieses Feld in der Tabelle als alleinige Schlüsselfeld definiert sein.
Als Text oder Zahl egal, hauptsache eindeutig, also nicht doppelt. Ein Feld als einzige Schlüsselfeld weigert die Übernahme einen neuen Datensatz mit einem bereit vorhandenen Kundennummer.
VG
Yal
AW: Update ADO-Datensatz
20.05.2021 19:46:40
Ronald
Wie meinst Du das? "fKdNummer" ist Primärschlüssel. Aber genau dieses Feld wollte ich gar nicht ändern, nur alle anderen. "fKdNummer" ist ja auskommentiert.
Gruß Ronald
AW: Update ADO-Datensatz
21.05.2021 10:30:43
ChrisL
Hi Roland
Zum Format der Kundennummer. Wichtig ist wie von Yal bereits erwähnt, dass es ein eindeutiger Wert ist (keine Duplikate). Dies erreichst du über die Feldeinstellung bzw. AutoWert bietet sich dazu an. Ob es dann auch noch ein Primärschlüssel ist, ist eine andere Frage, aber üblicherweise ja.
Das Nummernformat erachte ich nebst erwähntem auch ganz generell als sinnvoll. Beispielsweise wenn du die neuste Nummer aus einer Liste ermitteln willst =MAX(Kundennummer), was im Textformat nur umständlich gehen würde. Eine Konstante zur Kennzeichnung des Nummerntyps erachte ich ganz generell als unnötig. Würde mich nerven, wenn ich vor jede Nummer noch ein "KD-" setzen müsste. Man schreibt ja auch nicht z.B. IBAN = Nummer IBAN-1234.
In deinem Beispielcode konnte ich zwei konkrete Probleme erkennen.
1. Du beginnst mit MoveFirst und machst gleich MoveNext. Der erste Datensatz wird somit immer übersprungen.
2. Wenn kein RS ermittelt wurde oder wenn RS.EOF, dann kann auch kein Update erfolgen.
Konkret konnte ich deinen Code nicht anhand einer Beispieldatei nachbauen (z.B. intAnzeigeZaehler erschliesst sich anhand vom Code-Auszug nicht und generell fehlen die Variablen-Deklarationen). Ich habe darum einen neuen Mustercode geschrieben.
- Connection-String am Anfang vom Code musst du gemäss deinen Bedürfnissen wieder anpassen.
- Ich bevorzuge die Late-Binding Variante. Deshalb muss Cursor- und Locktype mit einer Zahl angegeben werden.
- Nicht aufgeführt ist der Abschluss-Code zum Schliessen der Connection und RS, sowie zum leeren der Variablen.
- Aktiviere "Option Explicit" um eine korrekte Deklaration der Variablen zu erzwingen

Public cn As Object
Public rs As Object
Public Const cnString As String = "Provider=Microsoft.ACE.OLEDB.16.0;Data Source=C:\Pfad\TestDB.mdb"

Public Sub Privatkundendaten_aus_DB_holen()
Call a_DB_Verbindung_aufbauen
Call b_SQL_Abfrage_PrivatKd
Call c_Handling_der_Datensaetze
End Sub

Public Sub a_DB_Verbindung_aufbauen()
Set cn = CreateObject("ADODB.Connection")
cn.Open cnString
End Sub

Public Sub b_SQL_Abfrage_PrivatKd()
Dim strAusgewaehlterDatensatz_KV As String
Dim strQuery As String
Set rs = CreateObject("ADODB.Recordset")
strAusgewaehlterDatensatz_KV = frmMain.txtKundennummer_KV
strQuery = "SELECT * FROM tKunden WHERE fKdNummer=" & strAusgewaehlterDatensatz_KV
' CursorType 1 = adOpenKeyset
' https://docs.microsoft.com/en-us/sql/ado/reference/ado-api/cursortypeenum?view=sql-server-ver15
' LockType 3 = adLockOptimistic
' https://docs.microsoft.com/en-us/sql/ado/reference/ado-api/locktypeenum?view=sql-server-ver15
rs.Open strQuery, cn, 1, 3
End Sub

Public Sub c_Handling_der_Datensaetze()
If rs.EOF And rs.BOF Then
MsgBox "Kundennummer nicht gefunden!"
Else
frmMain.txtKundennummer_KV.Value = rs.Fields("fKdNummer").Value
frmMain.txtVorname_KV.Value = rs.Fields("fKdVorname").Value
End If
End Sub

Public Sub f_Update_privKD()
With rs
If .EOF And .BOF Then
MsgBox "Kein gültiger Kunde ausgewählt"
Else
.Fields("fKdVorname").Value = frmMain.txtVorname_KV.Text
.Update
End If
End With
End Sub
cu
Chris
Anzeige
AW: Update ADO-Datensatz
21.05.2021 11:35:01
Ronald
Hallo Chris
Danke für Deine Tips und Anmerkungen.
Hinsichtlich der Kundennummer KD-00001. Die sollte sich doch klar von der Lieferantennummer, der Rechnungsnummer, der Auftragsnummer und
den Tausend anderen Nummern abheben. Um das KD-Getippe einzusparen, könnte man doch mit ein bißchen Aufwand dieses fix in der Texbox integrieren.
Wenn eine Kundennummer eingetippt werden soll, steht bereits "KD-" drin und wenn die korrigiert werden soll, kann man nur bis nach dem Bindestrich
löschen. Ist sicherlich nicht ganz trivial, aber sicher benutzerfreundlicher, als das Getippe.
Zu 1.
Danke für den Hinweis. Habe ich bisher noch gar nicht bemerkt, bei all dem Geteste. Habe es bereits mit einer zusätzlichen If-Abfrage in der Do-Schleife
behoben (siehe neuerer Beitrag weiter oben, wo der originale Quelltextvorschlag gepostet wurde, auf welchen ich mich bezogen habe.
Gruß Ronald
Anzeige
AW: Update ADO-Datensatz
21.05.2021 12:59:07
ChrisL
Hi
Dass hier schon eine umfangreiche Vorgeschichte existiert, war mir nicht bewusst. Da der andere Beitrag noch offen ist, würde ich vorschlagen dort weiter zu machen (bringt nichts, wenn 2 Beiträge parallel offen sind).
https://www.herber.de/forum/archiv/1828to1832/t1831545.htm
Das mit der Kundennummer ist eine Philosophiefrage und letztlich eine Frage der persönlichen Präferenz.
Festnetz-Nummer: 1234
Mobile-Nummer: 4567
So erkenne ich, was was ist, ohne dass die Nummer selber ein spezielles Format aufweisen müsste. Bei der Einwahl möchte ich nicht Festnetz-1234 tippen müssen.
Was hingegen öfters verwendet wird, sind spezielle Nummernkreise. Auch kann es sinnvoll sein, innerhalb der Nummern zusätzliche Erkennungsmerkmale einzubauen z.B. das Länderkürzel bei IBAN.
Den von dir beschriebenen Vorteil (Unterscheidungsmerkmal) erkenne ich schon, aber die Nachteile z.B. in der Sortierung und Auswertung sollten bei der Lösungswahl ebenfalls berücksichtigt werden.
cu
Chris
Anzeige
AW: Update ADO-Datensatz
21.05.2021 15:22:26
Yal
Hallo zusammen,
das Getippe mit dem "KD-": interessant genug, um sich daran zu üben:

Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Static LetzterEintrag As Long
Dim Eintrag As String
Const cKD = "KD-"
Const cKdn = "00000000"
Eintrag = Replace(Me.TextBox1, cKD, "")
If IsNumeric(Right(Me.TextBox1.Text, 1)) Then LetzterEintrag = CLng(Right(Eintrag, Len(cKdn)))
Application.EnableEvents = False
Me.TextBox1 = cKD & Format(LetzterEintrag, cKdn)
Application.EnableEvents = True
End Sub
Übersprung der erste Datensatz:
ja, der Test muss am Anfang stattfinden (hatte ich schon eingereicht)

rs.MoveFirst 'falls in dem Recordset schon Bewegung gegeben hätte. Wenn frisch, dann nutzlos.
Do While rs("fKdNummer")  strAusgewaehlterDatensatz_KV And Not rs.EOF
rs.MoveNext
Loop
If Not rs.EOF Then
End If
@Chris: ja, es ist ein Langzeit-Projekt ;-)
VG
Yal
Anzeige
AW: Update ADO-Datensatz
21.05.2021 15:35:26
Ronald
Grüß Dich Yal
Ich habe Deinen ersten Quellcode-Snippet nicht ganz verstanden, was genau es macht.
Ich bin gerade am überlegen, wie ich die letzte oder höchstwertige Kundennummer herausbekomme, um beim Anlegen eines neuen Kunden
eine Nummer höher zu gehen. Hierbei sollte erstmal das tatsächliche Format der Kundennummer noch keine Rolle spielen.
Meine Überlegung wäre nun die, einmal geschwind alle Datensätze zu holen, per MoveLast zum letzten DS zu springen, um dann dort
das Feld "fKdNummer" abzufragen und den Wert in einer Variable für die weitere Nutzung zwischenzuspeichern und dann dieses rs wieder zu schließen.
Oder gänzlich anders vielleicht mittels

SELECT max("fKdNummer") FROM tKunden
Und danach direkt nur:

Variable = rs.Fields("fKdNummer").Value
Würde das gehen oder gibts nur einen Königsweg?
Gruß Ronald
Anzeige
AW: Update ADO-Datensatz
21.05.2021 16:06:08
Yal
Hallo Ronald,
Mein Coding von vorher: mach eine separate Userform mit einem Textbox und teste den Code dorthin.
zu deine Frage:
Lösung bei fKdNummer als zahl:
Ich würde es in einer separaten Function ablegen.

Private Function TopKdNr_holen() As Long
' cn ist bekannt
Dim rs As New ADODB.Recordset
rs.Open "SELECT Max([fKdNummer]) as MaxKdn FROM tKunden;", cn
If Not rs.EOF Then TopKdNr_holen = rs("MaxKdn")
End Function
Lösung mit FkDNummer als Text, inkl. Prefix "KD-".
Die Umwandlung in Zahl und der "max" soll innerhalb von Access stattfinden, daher als Teil vom SQL-Anweisung.

Private Function TopKdNr_holen() As Long
' cn ist bekannt
Dim rs As New ADODB.Recordset
rs.Open "SELECT Max(cLng(Mid([fKdNummer],4))) as MaxKdn FROM tKunden;", cn
If Not rs.EOF Then TopKdNr_holen = rs("MaxKdn")
End Function
VG
Yal
Anzeige
AW: Update ADO-Datensatz
21.05.2021 16:10:06
Ronald
Sieht sehr gut aus. Danke, Yal!
Ich werde es dann gleich mal ausprobieren.
Gruß Ronald
AW: Update ADO-Datensatz
21.05.2021 16:30:04
Ronald
Grüß Dich Yal
Ich habe bisher noch keine allgemeingültige Erklärung zu Funktionen gefunden und weiß daher bis heute nicht, wie sie funktionieren und habe
sie bisher immer gemieden. Könntest Du mir bitte einerseits erklären, wie man Deine Funktion hier aufruft und andernseits generell erklären,
wie eine Funktion aufgebaut und benutzt werden kann? Vielleicht hast Du auch einen guten Link zum Selbststudium. ByRef und ByVal ist mir
einigermaßen klar. Aber wie gesagt, das Grundverständnis habe ich bisher auch im Internet nicht finden können. Oder ich habs wahrscheinlich
einfach nicht kapiert.
Gruß Ronald
Anzeige
AW: Grundlagen...
21.05.2021 17:27:09
EtoPHG
Hallo Roland (und Yal),
Ich habe mich bis jetzt zurückgehalten, mich in Eure Threads einzumischen. Ich muss aber gestehen, dass mir beim Lesen des Öfteren die Finger gezuckt haben und die Haare gekräuselt haben. Nach deiner Äusserung keine allgemeingültige Erklärung zu Funktionen gefunden und weiß daher bis heute nicht, wie sie funktionieren kann ich mich aber nicht mehr zurückhalten. Die Google-Suche "was ist eine funktion in excel" liefert 19Mio Ergebnisse, aber schon das Google-Snippet liefert eine Antwort und der nächste Link führt zu einer vollständigen MS-Hilfeseite.
Eine Funktion ist z.B. ein + (für eine Addition) , oder praktisch alle EXCEL Formeln. Ein U(ser) D(efined) F(unction) ist ein selbstgeschriebenes Stück Code, dass genau ein Resultat zurückliefert.
Zu den 'Finger-Zuck-Punkten': Anscheinend versuchst du via Excel und Userforms eine DB Verwaltung von Daten einer MS-Access DB zu realisieren. Ich finde schon diesen Ansatz fragwürdig, denn Access bietet genügen Hilfsmittel und Benutzer-Forms um das einigermassen benutzerfreundlich zu realisieren. Bei Dir ist aber offensichtlich noch nicht einmal das Datenmodell der DB fertig durchdacht. Das man z.B. in einer Kunden-Table den eindeutigen Schlüssel noch mit einem Prefix wie KD- versieht ist gegen alle Grundlage eines DB-Designs. Eine Kundenummer ist eine (systemlose, nicht klassifizierende) Nummer und soll auch nix anderes sein. In welchem Kontext diese Nummer steht wird auf der Benutzeroberfläche (Userform, Papier etc.) mit beschreibenden Label dargestellt. Sie kann und soll in DB-Engines auch automatisch erzeugt werden, ohne dass ich solche Handstände wie 'die Grösste suchen und die nächste selbst zusammenstöpseln' machen muss. DB-Aggregats-Funkionen wie MAX etc. sollten sich ebenfalls auf nummerische Ausdrücke beschränken. Alle Konversionen innerhalb eines SELECT's führen zu drastischen Erhöhungen der Antwortzeiten. etc.etc...
Mir scheint, dass du hier 4 oder mehr Sachen auf einmal lernen willst, aber konzeptionell praktische keine (logischen) Vorarbeiten gemacht wurden.
Man kann nicht DB-Design, Excel-Userforms, VBA, Informatik-Grundlagen (Objekte, Methoden, Eigenschaften, Funktionen) und SQL gleichzeitig lernen.
Nimm es mir nicht Übel, aber ich befürchte aus deinem Projekt kann so nichts Brauchbares werden.
Gruess Hansueli
AW: Grundlagen...
21.05.2021 20:43:10
Ronald
Hallo Hansueli
(Vom Namen her aus der Schweiz)
Als erstes mal vielen Dank für Deine ausführliche Nachricht.
Punktuell möchte ich Dir rechtgeben. Jedoch habe ich mir sehr wohl Gedanken hinsichtlich des Datenbankmodells gemacht. Auch programmiere ich schon
einige Jahre. Allerdings im Rahmen meiner Möglichkeiten. Also ohne Klassen und Funktionen. Mein letztes Projekt war eine Datenbank mit über 30 verschiedenen Daten pro Datensatz. Diese wurden im Excel gespeichert. Pro Zeile ein Datensatz. Mit Userform, wo man entweder per Klick in die entsprechende Zeile oder per Hoch-Runter-Buttons auf der Userform in die nächste Zeile springen konnte. Dabei wurde jeweils die gemachten Änderungen in Textboxen oder Comboboxen automatisch gespeichert und die Daten des nächsten Datensatzes angezeigt. Mit Autovervollständigung diverser Daten von anderen Tabellenblättern. Aber wie gesagt, das Ganze ohne Access. Aber man wächst an seinen Aufgaben. Deswegen ist es nun mein erstes Programm mit Datenbankanbindung. Und ja, ich habe vorgehabt, es in Access direkt zu machen. Da es aber nicht möglich war, im Access des Office 2016 benutzerdefinierte Formulare hinzuzufügen, sondern nur Klassen und Module, habe ichs gelassen und mich stattdessen aufs Excel "beschränkt", wo dies funktioniert. Und wie bereits erwähnt, es ist mein erstes DB-Projekt, was aber nicht bedeutet, daß ich GAR NICHTS kann. Ich habe gemacht, was ich konnte und dort, wo ich nicht weiterkam, mir bei Google und Beispielquelltexten Hilfe geholt und als letzten Schritt im Forum gefragt, wozu ein Forum letztendlich ja auch gut ist. Wenn ich der Profi wäre, wäre ich hier nicht als Fragesteller, sondern als Helfer. Und es ist doch keine Schande, wenn ich noch keine Seite im Netz gefunden habe, wo Funktionen so erklärt wurden, daß ichs verstehe. Soll ich mich dafür schämen, daß ich nachfrage? Es ist doch klar und menschlich, daß man meidet, was man nicht kennt. Wenn ich aber jetzt Profis gegenüber habe und mich getraut habe, wegen den Funktionen zu fragen, habe ich nicht solch ein Bashing meiner Person erwartet. Obwohls vielleicht teilweise gerechtfertigt ist... Es ist hier dennoch ein Hilfeforum.
Gruß Ronald
AW: Grundlagen EXCEL, ACCESS, GUI...
21.05.2021 23:48:33
EtoPHG
Hallo Ronald (wohl auch aus CH?)
Ich verstehe nicht, wieso Du Dich 'gebashed' fühlst. Vielleicht wegen meines letztes Satzes, bezgl. des Scheiterns?
Ich hab versucht meinen Eindruck von Euren Dialogen im Forum sachlich zu hinterfragen oder, ja, zu kritisieren. Auch Deine jetzigen Ausführungen bestärken mich im Gefühl das da vieles wild durcheinander gewürfelt wird. EXCEL ist nun mal keine Datenbank und ich kann mit XL schwer relationale Datenstrukturen abbilden. Wenn Du schon ein Datenmodell hast: Wie sieht es den grob aus? Oder überhaupt: Erläutere doch mal in groben Zügen, wie dein Projekt aussieht. Das man in ACCESS nicht möglich sei benutzerdefinierte Formulare hinzuzufügen, sondern nur Klassen und Module ist auch wieder so eine Aussage, die mich nur den Kopf schütteln lässt. Natürlich kann ich auch in Access 'Userforms' erstellen, die denen von Excel in nix nachstehend, sondern noch viel umfangreicher auf das Handling von Daten eingehen können. Das Verknüpfen von Excel, als Benutzeroberfläche (Graphical User Interface) und Access, als Datenspeicher, rechtfertigt sich (in meinen Augen) höchstens dann, wenn ich mit vielen relational verknüpften Daten der DB umfangreiche Berechnungen und Transformationen mit XL-Formeln (Funktionen) anstellen will und auf der anderen Seite die Konsistenz der Daten und ihren Relationen durch Access gewährleisten will. Allerdings lässt sich weder das Einte noch das Andere aus den verschiedenen Fragen/Antworten in euren Forumsbeiträgen ableiten. Bis jetzt bewegten sich die Fragestellungen auf den trivialsten Stufen von Datenhaltung, wie sie du vielleicht auch mit deinem (in deinen Augen komplizierten) Projekt mit 30 verschiedenen Daten (nein eigentlich Columns) verwirklicht hast. In der harten Geschäftswelt dürftest du für eine einfach Funktion "Eine Tabelle in einer Datenbank pflegen (suchen, ändern, löschen, neue einfügen) " höchsten 2Tage (Programmier) Arbeit aufwenden! Natürlich darf ein Anfäger* auch mal 5 daran arbeiten ;-)
In meinem Verständnis würdest du mehr profitieren können, wenn du mal dein Projekt nach dem EVA-Prinzip (Eingabe-Verarbeitung-Ausgabe) erläutern würdest und Dir im Forum Empfehlung einholen würdest.
Nix für Ungut (und v.a. nicht die Person ist wichtig, sondern die Sache!) und schönes Wochenende
Gruess Hansueli
nun ja,
21.05.2021 22:53:39
Yal
Hansueli,
ich gebe Dir in viele Punkte recht, aber worum geht es hier? Es geht meiner Meinung nach, die Bereitschaft von Excel-Bastler besser zu werden, zu unterstützen.
In welcher Reihenfolge welche Erfahrung und Wisseneineignung gemacht wird, bestimmt der Fragende. Meine Versuche mit zu grossen Sprünge (Konzept, Theorie, Best Practice) die Fragenden zu lenken, sind selten fruchtbar gewesen. Wenn ich zu früh etwas zu kompliziert platziert, kommt es nicht an, schlimmsten Fall verlieren wir die Motivation der Fragenden, weil es "alles viel zu kompliziert ist".
Ich folge Ronald seit eine Weile und lasse ihn das Tempo bestimmen.
Jetzt traut er sich an der Function und ich werde einfach ihn erklären (wohl wissend, dass es im Net bereit unzählige Erklärung gibt).
Eine Function ist nichts anderes als eine Sub, die eine Werte zurückgibt. Es wird mit der Name der Function gerufen.

Sub test()
Debug.Print Mal2(4)
End Sub
Function Mal2(EingangsWert As Double) As Double
Mal2 = EingangsWert * 2
End Function
VG
Yal
AW: von Harassen und Tischen...
22.05.2021 08:29:47
Harassen
Hallo Yal,
Versteh mich nicht falsch, ich bewundere deine Beratungsausdauer im Forum und deine Vorschläge haben meist Hand und Fuss. Mach weiter so, aber
nun zu: Konzepten, Theorie und Best Practice
Konzept: Ich will mir eine gemütliche Essecke für mind. 10 Personen einrichten. Dazu will ich einen Tisch und Stühle aus Lattenkisten (schweizerdeutsch: Harass) Stühle bauen. Alles soll 'stylish' aussehen und im Outdoor-Bereich eingesetzt werden.
Theorie: Ich brauche: Eine massive Tischplatte, 4 Metallfüsse (der Tisch muss was aushalten), Bretter für die Stühle, sowie Schrauben und Nägel.
Best Practice: Beratung bei der Beschaffung im Bau+Hobby Markt: Werkzeuge für das Zusammenbauen sind natürlich wichtig: Also sicher einen Hammer und eine Bohrmaschine, sowie gleich noch die Verbindungsteile (Schrauben und Nägel).
Einen Plan hab ich im Konzept mal weggelassen, da ich schon anderes Kleinzeug gebastelt habe und alles bereits im Kopf habe.
Verkauft wurden mir eine Schlagbohrmaschine und Schraubnägel, sowie ein Vorschlaghammer und Hammerkopfschrauben.
Leider ist aus der Arbeit nix brauchbares geworden: Die Tischfüsse mit dem Hammer und den Schrauben befestigt. Die Lattenkisten mit der Bohrmaschine und den Nägeln zusammengeschustert. Alles wackelt und fällt auseinander, da die Verbindungsstellen überall ausfransen.
Was ich falsch gemacht habe, ist mir immer noch ein Rätsel. Nach unserer 2ten Party musste ich alles wegwerfen, obwohl all meine Freunde die 'stylischen' Möbel bewundert haben. Ich werde von Vorne anfangen...
Hast Du oder Ronald einen Rat für mich.?
Gruess Hansueli
Entschuldige bitte Buchstabendreher Ronald (owT)
21.05.2021 17:53:19
EtoPHG

AW: Update ADO-Datensatz
21.05.2021 18:51:36
ChrisL
Hi Ronald (diesmal richtig)
Wenn die Grundlagen (z.B. was ist ein Parameter etc.) fehlen, dann ist auch eine Excel-Hilfe nur schwer zu verstehen. Ich bin bei Hansueli, dass du (zu) viele Themen gleichzeitig anreisst.
Trotzdem ein Versuch zur einfachen Erklärung bzw. Beispiele zum Start. Auf Feinheiten (z.B. Funktionen ohne Rückgabewert oder optionale Parameter etc.) gehe ich bewusst nicht ein.
1. Aufruf einer (Unter-)prozedur.
2. Aufruf einer (Unter-)prozedur mit Parameter-Übergabe
3. Verwendung einer Funktion im Parameter-Übergabe und Rückgabewert

Sub t1()
Call MeineNachricht1
End Sub
Sub MeineNachricht1()
MsgBox "Hallo Welt"
End Sub

Sub t2()
Call MeineNachricht2("Ronald")
End Sub
Sub MeineNachricht2(str As String)
MsgBox "Hallo " & str
End Sub

Sub t3()
MsgBox MeineNachricht3("Ronald")
End Sub
Function MeineNachricht3(str As String) As String
MeineNachricht3 = "Hallo " & str
End Function
Wenn du also einen Rückgabewert erwartest, dann verwende eine Funktion (eher eine Eselsbrücke, wie eine absolute Aussage).
Jede normale Excel-Formel ist auch eine (Tabellen-)funktion. Z.B.
=SUMME(A1:A10)
Parameter-Übergabe Bereich A1:A10 und es kommt die Summe zurück.
Es gibt Standardfunktionen (z.B. Summe) und die von Hansueli erwähnten benutzerdefinierten Funktionen (User Defined Function). MeineNachricht3 zählt zu den benutzerdefienierten (UDF).
Die UDF lässt sich übrigens auch als normale "Formel" (Tabellenfunktion) verwenden, vorausgesetzt der Funktion-VBA-Code wurde in ein Standardmodul kopiert:
=MeineNachricht3("Ronald")
Mit als Public (öffentlich) deklarierten Variablen, lassen sich übrigens Parameterübergaben vermeiden. Bis auf wenige Ausnahmen (z.B. übergreifend verwendete Konstanten wie Dateipfad), bevorzuge ich Parameterübergaben ggü. Public, aber auch das ist eine Frage der Präferenz. Übertreiben sollte man es weder mit Public, noch mit Parameterübergaben.
cu
Chris
AW: Update ADO-Datensatz
21.05.2021 20:45:52
Ronald
Grüß Dich Chris
Ich hab nicht gefragt, was Parameter sind. Naja, eine ausführliche Antwort habe ich Hansueli schon gegeben. Sie wird auch Dir teilweise Fragen beantworten.
Ich danke Dir für die Erklärung der Funktion. Ich schau mir das mal an und durchdenke mir das mal. Vielen Dank.
Gruß Ronald

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige