Access Fehler im VBA Code
Hallo Leute,
Ich habe ein etwas umfangreicheres Problem, wo ich selber in einer Sackgasse stecke.
Also folgendes Problem:
Ich gebe den Wert1(20001-010) in Text1 ein, speichere diesen Wert in eine Tabelle(Tabelle1),
wenn dieser Wert schon vorhanden ist soll eine Fehlermeldung(Diese Nummer ist schon vergeben, verwenden Sie bitte die Nummer 20001-011).
Das funktioniert so weit.
Dann gebe ich Wert2(20000-001) in Text1 ein, speichere diesen Wert.
Jetzt gebe ich den Wert2(20000-001) nochmal ein und es erscheint wieder die Fehlermeldung(Diese Nummer ist schon vergeben, verwenden Sie bitte die Nummer 20001-011), sollte aber eigentlich anzeigen Fehlermeldung(Diese Nummer ist schon vergeben, verwenden Sie bitte die Nummer 20000-002)
Hier der VBA-Code
Was muss ich verändern damit es passt?
LG bumbum
Ich habe ein etwas umfangreicheres Problem, wo ich selber in einer Sackgasse stecke.
Also folgendes Problem:
Ich gebe den Wert1(20001-010) in Text1 ein, speichere diesen Wert in eine Tabelle(Tabelle1),
wenn dieser Wert schon vorhanden ist soll eine Fehlermeldung(Diese Nummer ist schon vergeben, verwenden Sie bitte die Nummer 20001-011).
Das funktioniert so weit.
Dann gebe ich Wert2(20000-001) in Text1 ein, speichere diesen Wert.
Jetzt gebe ich den Wert2(20000-001) nochmal ein und es erscheint wieder die Fehlermeldung(Diese Nummer ist schon vergeben, verwenden Sie bitte die Nummer 20001-011), sollte aber eigentlich anzeigen Fehlermeldung(Diese Nummer ist schon vergeben, verwenden Sie bitte die Nummer 20000-002)
Hier der VBA-Code
Private Sub Befehl1_Click()
Dim rs As Recordset
Dim rs1 As Recordset
Dim i As Double
Dim i1 As Double
DoCmd.SetWarnings False
Set rs = Application.CurrentDb.OpenRecordset("Select max(ArtNr) as Max from Tabelle1")
rs.MoveFirst
i = rs!Max
rs.Close
Set rs1 = Application.CurrentDb.OpenRecordset("Select max(LiefNr) as Max1 from Tabelle1")
rs1.MoveFirst
i1 = rs1!Max1
rs1.Close
If Mid(Text1.Value, 1, 5) = i1 Then
If Mid(Text1.Value, 7, 3) <= i Then
Frage = MsgBox("Die Artikelnummer " & Text1.Value & " ist schon vergeben, bitte verwenden sie die Artikelnummer " & i1 & "-" & CStr(i + 1), vbOKOnly, "Fehler")
Else
DoCmd.RunSQL ("insert into Tabelle1 (LiefNr, ArtNr) values (mid(NText1, 1, 5), mid(NText1, 7, 3)")
End If
Else
DoCmd.RunSQL ("insert into Tabelle1 (LiefNr, ArtNr) values (mid(NText1, 1, 5), mid(NText1, 7, 3)")
End If
End Sub
Was muss ich verändern damit es passt?
LG bumbum
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 125586
Url: https://administrator.de/forum/access-fehler-im-vba-code-125586.html
Ausgedruckt am: 05.02.2025 um 12:02 Uhr
10 Kommentare
Neuester Kommentar
Hallo bumbum!
PS. Sorry, hatte mich vorher verlesen.
Gruß Dieter
PS. Sorry, hatte mich vorher verlesen.
Gruß Dieter
Du holst die erstmal dem Max wert für die ArtNr und vergleichst dann die Eingabe damit.
Wenns Kleiner/Gleich ist wird 1 addiert.
d.h. Egal was du eingibst solange es Kleiner/Gleich Max(ArtNr) ist wird Max(ArtNr)+1 gerechnet.
Dann ist da noch die sache mit den Datentypen
In der Tabelle steht 20000-010
in Zeile 9 wird daraus ein Double Wert wie der nun aussieht weiss ich nicht.
Debug doch mal was für werte du eigentlich wo hast.
Wenns Kleiner/Gleich ist wird 1 addiert.
d.h. Egal was du eingibst solange es Kleiner/Gleich Max(ArtNr) ist wird Max(ArtNr)+1 gerechnet.
Dann ist da noch die sache mit den Datentypen
In der Tabelle steht 20000-010
in Zeile 9 wird daraus ein Double Wert wie der nun aussieht weiss ich nicht.
Debug doch mal was für werte du eigentlich wo hast.
Moin Moin
Wenn du in Tabelle 1 folgende werte hast:
Dann liefert das SQL Statement
immer 011, egal welche Liefernr du gerade am wickel hast.
Du must bei der Suche nach der ArtNr diese auf LieferNr einschränken.
z.B. so
Weiterhin funktioniert diese Prüfung nur bei der größten LieferNr.
Wenn du also in meinem BSP 20000-001 eingibst wird deine Routine das gewissenhaft eintragen.
Gruß L.
Wenn du in Tabelle 1 folgende werte hast:
LieferNr | ArtNr |
20001 | 011 |
20000 | 001 |
Dann liefert das SQL Statement
Select max(ArtNr) as Max1 from Tabelle1
Du must bei der Suche nach der ArtNr diese auf LieferNr einschränken.
z.B. so
"Select max(ArtNr) as Max1 from Tabelle1 Where LieferNr= " & i1
Weiterhin funktioniert diese Prüfung nur bei der größten LieferNr.
Wenn du also in meinem BSP 20000-001 eingibst wird deine Routine das gewissenhaft eintragen.
Gruß L.
Dann hat Max1 aus irgendwelchen Gründen keinen Wert zugewiesen bekommen.
Hat il einen gültigen Wert ?
Hast du Logan000s Statement an deien datenbank angepasst LiefNr statt LieferNr
Am besten nochmal den source posten damit man das ganze im zusammenhang sieht
Hat il einen gültigen Wert ?
Hast du Logan000s Statement an deien datenbank angepasst LiefNr statt LieferNr
Am besten nochmal den source posten damit man das ganze im zusammenhang sieht
Brauchst du max(LiefNr wirklich ?
Im Moment sieht es so aus
1. Höchste Lieferantennummer bestimmen
2. mit dem Ergebniss von 1. die höchsten Artiikelnummer bestimmen.
3. Gucken ob 1. gleich Texteingabe stelle 1 -5
4. Gucken ob 2. gleich Texteingabe stelle 7 - 9
Das was du eingibst wird also immer mit den gleichen werten verglichen.
Vielleicht so:
1. Nachsehen ob es einen Lieferanten Texteingabe stelle 1 -5 in der db ( kein max) gibt wenn ja
2. mit dem Ergebniss von 1. die höchsten Artiikelnummer bestimmen.
4. Gucken ob 2. gleich Texteingabe stelle 7 - 9
Im Moment sieht es so aus
1. Höchste Lieferantennummer bestimmen
2. mit dem Ergebniss von 1. die höchsten Artiikelnummer bestimmen.
3. Gucken ob 1. gleich Texteingabe stelle 1 -5
4. Gucken ob 2. gleich Texteingabe stelle 7 - 9
Das was du eingibst wird also immer mit den gleichen werten verglichen.
Vielleicht so:
1. Nachsehen ob es einen Lieferanten Texteingabe stelle 1 -5 in der db ( kein max) gibt wenn ja
2. mit dem Ergebniss von 1. die höchsten Artiikelnummer bestimmen.
4. Gucken ob 2. gleich Texteingabe stelle 7 - 9
Moin bumbum,
es geht doch viel schneller, wenn man/frau den Fehler an der richtigen Stelle sucht.
Dazu ist hilfreich, entweder im DEBUG-Mode durchzusteppen mit F8 oder die Fehlermeldung zu lesen.
Zusätzliche Zeitersparnis ist eine Kombination der beiden Methoden in sinnvoller Reihenfolge.
Also erste Fehlermeldung heißt doch "rs!max ist NULL", sachste.
Wer brät rs!max wo zusammen? Er hier (der in der letzten Zeile):
<code type>
...
Dim i1 as Double
...
i1 = rs1!Max1
rs1.Close
Set rs = Application.CurrentDb.OpenRecordset("Select max(ArtNr) as Max from Tabelle1 where LiefNr = " & i1)
Bullshit. "LiefNr" ist doch genauso ein String/Zeichenfeld in der Datenbank wie nachher "Artnr"
Wenn wir den SELECT nun auch nach einer größten "LiefNr" suchen lassen, die ein String ist (KEINE ZAHL!),
dann sieht das so aus:
Später wirst Du für das INSERT ähnliches brauchen:
Aber 2 logische Probleme kommen vorher noch.
1) Die Logik "nächste freie ArtNr ist der String "maximaleLiefNr"+"maximale ArtikelNr" ist Quark.
Von welchem Lieferanten das ist, das muss der Anwender sicherlich sagen/eingeben/auswählen.
Und von einem bestimmten Lieferanten kann dann sicherlich die höchste bekannte/vergebene ArtNr ermittelt werden.
2) Aber wenn das so geschafft ist, dann brauchst Du nicht die "höchste vergebene ArtNr",
sondern die "höchste vergebene ArtNr plus 1", die nächste freie.
Bitte sag doch mal an, welchen Datentyp die beiden Felder "LiefNr" und "ArtNr" in der Tabelle1 haben.
Grüße
Biber
es geht doch viel schneller, wenn man/frau den Fehler an der richtigen Stelle sucht.
Dazu ist hilfreich, entweder im DEBUG-Mode durchzusteppen mit F8 oder die Fehlermeldung zu lesen.
Zusätzliche Zeitersparnis ist eine Kombination der beiden Methoden in sinnvoller Reihenfolge.
Also erste Fehlermeldung heißt doch "rs!max ist NULL", sachste.
Wer brät rs!max wo zusammen? Er hier (der in der letzten Zeile):
<code type>
...
Dim i1 as Double
...
i1 = rs1!Max1
rs1.Close
Set rs = Application.CurrentDb.OpenRecordset("Select max(ArtNr) as Max from Tabelle1 where LiefNr = " & i1)
Bullshit. "LiefNr" ist doch genauso ein String/Zeichenfeld in der Datenbank wie nachher "Artnr"
Wenn wir den SELECT nun auch nach einer größten "LiefNr" suchen lassen, die ein String ist (KEINE ZAHL!),
dann sieht das so aus:
....
Dim strMaxLiefnr as String
Dim strmaxArtNrOfLief as String
...
' i1 = rs1!Max1
strMaxLiefnr = rs1!Max1
rs1.Close
strmaxArtNrOfLief ="Select max(ArtNr) as MaxArtnr from Tabelle1 where LiefNr = '" & strMaxLiefnr & "'"
Set rs = Application.CurrentDb.OpenRecordset(strmaxArtNrOfLief)
....
Später wirst Du für das INSERT ähnliches brauchen:
....
Dim strInsertStmt as String
....
strInsertStmt = "insert into Tabelle1 (LiefNr, ArtNr) values ('" & _
mid(Text1, 1, 5) & "', '" & mid(Text1, 7, 3) &"')"
If Mid(Text1.Value, 1, 5) = i1 Then
If Mid(Text1.Value, 7, 3) <= i Then
Frage = MsgBox("Die Artikelnummer " & Text1.Value & " ist schon vergeben, bitte verwenden sie die Artikelnummer " & i1 & "-" & CStr(i + 1), vbOKOnly, "Fehler")
Else
DoCmd.RunSQL (strInsertstmt)
End If
Else
DoCmd.RunSQL (strInsertStmt)
End If
....
Aber 2 logische Probleme kommen vorher noch.
1) Die Logik "nächste freie ArtNr ist der String "maximaleLiefNr"+"maximale ArtikelNr" ist Quark.
Von welchem Lieferanten das ist, das muss der Anwender sicherlich sagen/eingeben/auswählen.
Und von einem bestimmten Lieferanten kann dann sicherlich die höchste bekannte/vergebene ArtNr ermittelt werden.
2) Aber wenn das so geschafft ist, dann brauchst Du nicht die "höchste vergebene ArtNr",
sondern die "höchste vergebene ArtNr plus 1", die nächste freie.
Bitte sag doch mal an, welchen Datentyp die beiden Felder "LiefNr" und "ArtNr" in der Tabelle1 haben.
Grüße
Biber