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

Nach 1 kommt 10

Nach 1 kommt 10
20.05.2021 21:44:57
Ronald
Guten Abend
In meiner Primärschlüsselspalte "fKdNummer" sind nur Nummern drin. 1, 2, 3. Ich hole die Daten so aus der DB:

Public Sub b_SQL_Abfrage_Aktual_nach_Update()
strQuery = "SELECT * FROM tKunden ORDER BY fKdNummer ASC"
Set rs = cn.Execute(strQuery)
End Sub
Dann kann ich mit den Buttons vorwärts / rückwärts von Datensatz zu Datensatz navigieren.
Wie kann ich es vermeiden, daß klassischerweise nach 1 die 10 und dann die 11 kommt, ehe die 2 kommt? Ich möchte es lieber, daß nach der 9 die 10
kommt und dann die 11.
Danke im Voraus
Gruß Ronald

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Nach 1 kommt 10
20.05.2021 21:57:22
Pierre
Hi,
ich hab zwar keine Ahnung davon, aber es gibt doch sicherlich die Möglichkeit, eine (oder wenn über 100 Datensätze zwei oder oder oder) führende Nullen einzufügen?
Wäre das eine Möglichkeit?
Gruß Pierre
AW: Nach 1 kommt 10 nur bei Text, wenn....
23.05.2021 10:45:57
EtoPHG
die DB-Column (fKdNummer) als numerisch definiert ist, Ronald
Die order by Klausel sortiert nach den binären Inhalten der Column(s). Mit klassisch hat das nix tun.
Die Frage stellt sich also: Warum ist fKdNummer in Deiner DB als String definiert?
Gruess Hansueli
AW: Nach 1 kommt 10
20.05.2021 22:25:05
Yal
Hallo Ronald,
in der Ursprungsform war dein Kundennummer-Feld als Text-Typ deklariert, hatte aber eine feste Struktur mit "KD-"+feste Anzahl an Zahlen. Passt.
Wenn Du "KD-" und die führenden Nullen weglässt, sodass nur noch zahlen übrig sind, hast Du eventuell Zahlen in unterschiedliche Länge.
Dann muss Du dein Feld als Zahl deklarieren. Weil bei einer Text-Sortierung kommt "10" vor "9". Als Zahl nicht.
VG
Yal
Anzeige
AW: Nach 1 kommt 10
22.05.2021 22:44:56
JoWE
Hallo Ronald,
Du gibst doch hoffentlich nicht auf wegen der Anwürfe eines (sorry!) Alleskönners?
Wann lädst Du denn nun Deine aktuellste Version hoch?
Nicht nur Yal kann es kaum erwarten.
Und es macht ja doch auch Spaß, hier mit Dir zu "entwickeln".
Uns, Dir und denen, die darüber, wenn sie ehrlich sind, zumindest schmunzeln, weil sie an ihre eigene Entwicklung zurück denken.
Grüße aus dem Bergischen Land,
Jochen
AW: Nach 1 kommt 10
22.05.2021 23:28:00
Ronald
Aufgeben? Was ist das? Entweder Morgen/Übermorgen abends sitz ich wieder an der Kiste, oder spätestens kommende Woche. Momentan ist im Garten viel zu tun, auf daß es eine gute Ernte gibt.
Danke für die aufmunternden Worte :-)
Gruß Ronald
Anzeige
AW: Nach 1 kommt 10
23.05.2021 11:54:05
Jowe
Hallo Ronald,
teste mal:

Public Sub b_SQL_Abfrage_Aktual_nach_Update()
strSQL = "Select * from tKunden;"
With rs
.ActiveConnection = cn
.LockType = 3
.Open strSQL
.Sort = Right(fKdNummmer, 5)
End With
End sub
Gruß
Jochen
AW: Nach 1 kommt 10
23.05.2021 21:08:28
Ronald
Ich muß zugeben, daß ich wieder auf das KD- vor den Kundennummern zurück gekrebst bin.
Ein Grund dafür ist, daß es nicht so kurz aussieht. Man vergleiche:
Kundennummer: KD-00001
Kundennummer: 1
Und hierbei spielt es ja keine Rolle, ob ich 2 oder 3 oder 4 führende Nullen vor der 1 hab. Nur eine 1 sieht nunmal so kurz aus, wie sie es auch ist.
Und ich wollte auch nicht erst bei 500 anfangen zu zählen. :-)
Ich habe momentan noch einige Leichenprozeduren drin, die ich alle mal raushauen muß, sodaß nur die funktionellen und benutzten Prozeduren drin
bleiben. Ich gehe davon aus, daß es für VB6 und VBA noch keine Lösung gibt, kein ausführbares Snippet, welches ungenutzten Code aufspürt, richtig? :-)
Daher spare ich es mir für den Moment. das Projekt hochzuladen (ich versuche es, in den nächsten Tagen das bereinigte Projekt hochzuschaufeln) und begnüge mich fürs Erste mit dem Code für "neuen Kunden":

Private Sub cmdNeuerKunde_Click()
Call mod_1_Kundenverwaltung.Felder_Leeren_KV
Call TopKdNr_holen
Call mod_1_Kundenverwaltung.h_KDNummern_Format
txtKundeSeit_KV.SetFocus
End Sub
...

Public Sub Felder_Leeren_KV()
frmMain.txtKundennummer_KV.Text = ""
frmMain.cboStatus_KV.Value = ""
frmMain.txtKundeSeit_KV.Text = ""
frmMain.txtEintragsdatum_KV.Text = ""
frmMain.txtAenderungsdatum_KV.Text = ""
frmMain.txtDomain_KV.Text = ""
frmMain.cboKategorie_KV.Value = "Auswahl treffen"
frmMain.txtOrt_KV.Text = ""
frmMain.txtAnrede_KV.Text = ""
frmMain.txtNachname_KV.Text = ""
frmMain.txtVorname_KV.Text = ""
frmMain.txtVorname2_KV.Text = ""
End Sub
...hierbei ist die Verbindung zur DB noch offen. Hier wird aus KD-00005 (letzter/höchster DB-Eintrag für Kundennummer) eine 5 gemacht. Danke für die
Vorlage. Funktioniert prächtig.

Private Function TopKdNr_holen() As Long
strQuery = "SELECT Max(cLng(Mid([fKdNummer],4))) as MaxKdn FROM tKunden;"
Set rs = cn.Execute(strQuery)
If Not rs.EOF Then TopKdNr_holen = rs("MaxKdn")
strNeueKdNr = CStr(TopKdNr_holen + 1)
End Function
Hier wurde die "Kundennummer um 1 erhöht, um jetzt weiterverarbeitet zu werden. KD plus die führenden Nullen. Dies wird dann auch hier
entsprechend der T extbox zugewiesen, damit der Bediener sich keine Gedanken darum zu machen braucht, wie es ja eigentlich auch sein sollte.

Public Sub h_KDNummern_Format()
If Len(strNeueKdNr) = 1 Then
strNeueKdNr = "KD-0000" & strNeueKdNr
ElseIf Len(strNeueKdNr) = 2 Then
strNeueKdNr = "KD-000" & strNeueKdNr
ElseIf Len(strNeueKdNr) = 3 Then
strNeueKdNr = "KD-00" & strNeueKdNr
ElseIf Len(strNeueKdNr) = 5 Then
strNeueKdNr = "KD-0" & strNeueKdNr
ElseIf Len(strNeueKdNr) = 5 Then
strNeueKdNr = "KD-" & strNeueKdNr
End If
frmMain.txtKundennummer_KV = strNeueKdNr
End Sub
Jetzt sollte der Bediener alle bekannten Informationen eingeben und dann auf "Speichern" klicken:

Private Sub cmdSpeichern_Click()
Call mod_1_Kundenverwaltung.Daten_In_DB_schreiben
End Sub
Jetzt wird ein separates Recordset benutzt. Eine Kollision wird es mit dem anderen "noch offenen" Recordset, welches nur rs heißt, wird es wohl nicht geben, da bei adLockPessimistic erst gesperrt wird, wenn der Update-Befehl ausgeführt wird.

Public Sub Daten_In_DB_schreiben()
Dim sqlQuery As String
Dim nConnection As New ADODB.Connection
Dim rsWrite As New ADODB.Recordset
nConnection.Open "provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\waelty\Downloads\_Privat\_Holzzzwerk\Projekt Büro Holzzzwerk\Holzzzwerk ERP\Softwerk\SoftWERK_ERP.mdb" & ";JET OLEDB:Database"
sqlQuery = "SELECT * FROM tKunden"
rsWrite.Open Source:=sqlQuery, ActiveConnection:=nConnection, CursorType:=adOpenKeyset, LockType:=adLockOptimistic
With rsWrite
.AddNew
If frmMain.txtKundennummer_KV.Text = "" Then
'Diese Abfrage würde wegfallen, wenn die Textbox auf Locked=True steht.
Else
.Fields("fKdNummer").Value = CInt(frmMain.txtKundennummer_KV.Text)
End If
.Fields("fKdStatus").Value = frmMain.cboStatus_KV.Value
'Hier wäre es auch sinnvoll, die Abfrage reinzumachen, oder einen Standardwert _
vorzugeben, damit der Wert nicht einfach "nichts" ist.
If frmMain.txtKundeSeit_KV.Text = "" Then
Else
.Fields("fKdKundeSeit").Value = CDate(frmMain.txtKundeSeit_KV.Text)
End If
If frmMain.txtAenderungsdatum_KV.Text = "" Then
Else
.Fields("fKdEintragsdatum").Value = CDate(frmMain.txtAenderungsdatum_KV.Text)
End If
.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
nConnection.Close
End Sub
Sicherlich gibt es auch bei diesem Code(s) hier Verbesserungspotential.
Gruß Ronald
Anzeige
wahrscheinlich hier weiter machen?!
23.05.2021 21:13:52
Ronald
Grüßt Euch alle
Da sich das Projekt momentan auf zwei verschiedene Threads verteilt, wäre es wohl sinnvoll, ausschließlich hier weiter zu schreiben...
Gruß Ronald
Das "Update"
23.05.2021 21:26:42
Ronald
Grüßt Euch alle
Ich möchte noch das Update abdrucken, wie ich es bisher gelöst habe:
Wie mehrfach abgedruckt, wird das komplette Recordset abgeholt und man kann vorwärts und rückwärts durch die Datensätze navigieren. Momentan ist es noch so gelöst, daß man auf "Aktualisieren" klicken muß, daß es auch ein Update macht. Später wäre es die Möglichkeit, daß bereits beim "Navigieren" geprüft wird und dem Benutzer mitgeteilt wird, daß etwas geändert wurde, ob er diese denn speichern wolle oder nicht. Aber momentan gehts zum Testen über den Button:

Private Sub cmdFelderAktualisieren_KV_Click()
Call mod_1_Kundenverwaltung.z_DB_Verbindung_schliessen
Call mod_1_Kundenverwaltung.e_privKD_auf_Aenderung_pruefen
If boolAenderung_Form_KV = True Then 'Es wurde etwas geändert
Call mod_1_Kundenverwaltung.f_Update_privKD
Call mod_1_Kundenverwaltung.g_Aktual_nach_Update
End If
End Sub
...

Public Sub z_DB_Verbindung_schliessen()
cn.Close
Set rs = Nothing
End Sub
Jetzt wird auf Änderungen geprüft und ein Merker gesetzt. If Me.Dirty=true scheint nur im Access selber zu funktionieren:

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
Jetzt gibts ein neues Recordset rsUpdate:

Public Sub f_Update_privKD()
Dim sqlQuery As String
Dim nConnection As New ADODB.Connection
Dim rsUpdate As New ADODB.Recordset
Dim strKDNrZumUpdaten As String
nConnection.Open "provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\waelty\Downloads\_Privat\_Holzzzwerk\Projekt Büro Holzzzwerk\Holzzzwerk ERP\Softwerk\SoftWERK_ERP.mdb" & ";JET OLEDB:Database"
strKDNrZumUpdaten = strKundennummer_KV
sqlQuery = "SELECT * FROM tKunden WHERE fKdNummer = " & " '" & intKDNrZumUpdaten & "'"
rsUpdate.Open Source:=sqlQuery, ActiveConnection:=nConnection, CursorType:=adOpenKeyset, LockType:=adLockOptimistic
With rsUpdate
If frmMain.txtKundennummer_KV.Text = "" Then
Else
.Fields("fKdNummer").Value = CInt(frmMain.txtKundennummer_KV.Text)
End If
.Fields("fKdStatus").Value = frmMain.cboStatus_KV.Value
If frmMain.txtKundeSeit_KV.Text = "" Then
Else
.Fields("fKdKundeSeit").Value = CDate(frmMain.txtKundeSeit_KV.Text)
End If
If frmMain.txtAenderungsdatum_KV.Text = "" Then
Else
.Fields("fKdEintragsdatum").Value = CDate(frmMain.txtAenderungsdatum_KV.Text)
End If
.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
nConnection.Close
strKundenNummerNachUpdate = frmMain.txtKundennummer_KV.Text
intAnzeigeZaehler = 0
End Sub
Jetzt muß das Recordset nochmals neu komplett abgeholt werden, sodaß man mit geändertem Inhalt wieder navigieren kann:

Public Sub g_Aktual_nach_Update()
Call a_DB_Verbindung_aufbauen
Call b_SQL_Abfrage_Aktual_nach_Update
'suchen und finden von Anfang an
intAnzeigeZaehler = intAnzeigeZaehler + 1
If intAnzeigeZaehler = 1 Then
rs.MoveFirst
Do
rs.MoveNext
Loop Until rs.Fields("fKdNummer").Value = strKundenNummerNachUpdate 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
Über etwaige Verbesserungsvorschläge, auch hinsichtlich der Optimierung der Performance, bin ich wie immer dankbar.
Gruß Ronald
PS: Ich muß gestehen, daß ich bisher viel mit global deklarierten Variablen arbeite :-o ...bisher...
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige