bumbum
Goto Top

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
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

Content-Key: 125586

Url: https://administrator.de/contentid/125586

Printed on: April 18, 2024 at 12:04 o'clock

Mitglied: 76109
76109 Sep 23, 2009 at 10:25:52 (UTC)
Goto Top
Hallo bumbum!

PS. Sorry, hatte mich vorher verlesen.

Gruß Dieter
Member: bumbum
bumbum Sep 23, 2009 at 10:35:41 (UTC)
Goto Top
Hallo Dieter,

wenn ich das eingegben habe, kommt die Fehlermeldung(Die Artikelnummer 20000-001 ist schon vergeben, bitte verwenden sie die Artikelnummer 20001-011).
also immer noch nicht anderst, als vorher.
Danke für den Vesuch,aber hast du noch ne andere möglichkeit?

LG bumbum
Mitglied: 34891
34891 Sep 23, 2009 at 10:41:35 (UTC)
Goto Top
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.
Member: bumbum
bumbum Sep 23, 2009 at 11:00:55 (UTC)
Goto Top
Zitat von @34891:
Du holst die erstmal dem Max wert für die ArtNr und vergleichst
dann die Eingabe damit.

wie sollte ich das denn sonst machen?

es soll erst die ersten 5 Zeichen (20000) in der Tabelle1 Spalte LiefNr gesucht werden, wenn der Wert vorhanden ist, sollen die letzten 3 Zeichen (001) in der Tabelle1 Spalte ArtNr durchsucht werden, erst wenn beide übereinstimmen soll die Fehlermeldung kommen.

Tabellenname : Tabelle1
LiefNR | ArtNr
20001 | 011
20000 | 001

Zitat von @34891:^
In der Tabelle steht 20000-010
in Zeile 9 wird daraus ein Double Wert.

der Wert in Zeile 9, also i ist die ArtNr und besteht nur aus drei Zeichen(001)

LG bumbum
Member: Logan000
Logan000 Sep 23, 2009 at 11:57:43 (UTC)
Goto Top
Moin Moin

Wenn du in Tabelle 1 folgende werte hast:
LieferNrArtNr
20001011
20000001

Dann liefert das SQL Statement
Select max(ArtNr) as Max1 from Tabelle1
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
"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.
Member: bumbum
bumbum Sep 23, 2009 at 12:27:09 (UTC)
Goto Top
es erscheint ein debug Fehler
Unzulässige Verwendung von Null

in Zeile 9.
rs!Max = NULL

was kann ich dagegen machen??

LG bumbum
Mitglied: 34891
34891 Sep 23, 2009 at 12:42:52 (UTC)
Goto Top
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
Member: bumbum
bumbum Sep 23, 2009 at 12:50:09 (UTC)
Goto Top
Hallo Tweiss
i1 = 0
ja habe ich angepasst(auch LiefNr)

der momentane VBA-Code
Private Sub NBefehl1_Click()
Dim rs As Recordset
Dim rs1 As Recordset
Dim i As Double
Dim i1 As Double
DoCmd.SetWarnings False
Set rs1 = Application.CurrentDb.OpenRecordset("Select max(LiefNr) as Max1 from Tabelle1")  
rs1.MoveFirst
i1 = rs1!Max1
rs1.Close
Set rs = Application.CurrentDb.OpenRecordset("Select max(ArtNr) as Max from Tabelle1 where LiefNr = " & i1)  
rs.MoveFirst
i = rs!Max
rs.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(Text1, 1, 5), mid(Text1, 7, 3))")  
    End If
Else
    DoCmd.RunSQL ("insert into Tabelle1 (LiefNr, ArtNr) values (mid(Text1, 1, 5), mid(Text1, 7, 3))")  
End If
End Sub
Mitglied: 34891
34891 Sep 23, 2009 at 13:58:45 (UTC)
Goto Top
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
Member: Biber
Biber Sep 23, 2009 at 19:26:51 (UTC)
Goto Top
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:

 

....
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