Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Access Fehler im VBA Code

Frage Entwicklung VB for Applications

Mitglied: bumbum

bumbum (Level 1) - Jetzt verbinden

23.09.2009, aktualisiert 12:39 Uhr, 5033 Aufrufe, 10 Kommentare

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
01.
Private Sub Befehl1_Click() 
02.
Dim rs As Recordset 
03.
Dim rs1 As Recordset 
04.
Dim i As Double 
05.
Dim i1 As Double 
06.
DoCmd.SetWarnings False 
07.
Set rs = Application.CurrentDb.OpenRecordset("Select max(ArtNr) as Max from Tabelle1") 
08.
rs.MoveFirst 
09.
i = rs!Max 
10.
rs.Close 
11.
Set rs1 = Application.CurrentDb.OpenRecordset("Select max(LiefNr) as Max1 from Tabelle1") 
12.
rs1.MoveFirst 
13.
i1 = rs1!Max1 
14.
rs1.Close 
15.
If Mid(Text1.Value, 1, 5) = i1 Then 
16.
    If Mid(Text1.Value, 7, 3) <= i Then 
17.
        Frage = MsgBox("Die Artikelnummer " & Text1.Value & " ist schon vergeben, bitte verwenden sie die Artikelnummer " & i1 & "-" & CStr(i + 1), vbOKOnly, "Fehler") 
18.
    Else 
19.
        DoCmd.RunSQL ("insert into Tabelle1 (LiefNr, ArtNr) values (mid(NText1, 1, 5), mid(NText1, 7, 3)") 
20.
    End If 
21.
Else 
22.
    DoCmd.RunSQL ("insert into Tabelle1 (LiefNr, ArtNr) values (mid(NText1, 1, 5), mid(NText1, 7, 3)") 
23.
End If 
24.
End Sub
Was muss ich verändern damit es passt?

LG bumbum
Mitglied: 76109
23.09.2009 um 12:25 Uhr
Hallo bumbum!

PS. Sorry, hatte mich vorher verlesen.

Gruß Dieter
Bitte warten ..
Mitglied: bumbum
23.09.2009 um 12:35 Uhr
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
Bitte warten ..
Mitglied: 34891
23.09.2009 um 12:41 Uhr
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.
Bitte warten ..
Mitglied: bumbum
23.09.2009 um 13:00 Uhr
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
Bitte warten ..
Mitglied: Logan000
23.09.2009 um 13:57 Uhr
Moin Moin

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

Dann liefert das SQL Statement
01.
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
01.
"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.
Bitte warten ..
Mitglied: bumbum
23.09.2009 um 14:27 Uhr
es erscheint ein debug Fehler
Unzulässige Verwendung von Null

in Zeile 9.
rs!Max = NULL

was kann ich dagegen machen??

LG bumbum
Bitte warten ..
Mitglied: 34891
23.09.2009 um 14:42 Uhr
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
Bitte warten ..
Mitglied: bumbum
23.09.2009 um 14:50 Uhr
Hallo Tweiss
i1 = 0
ja habe ich angepasst(auch LiefNr)

der momentane VBA-Code
01.
Private Sub NBefehl1_Click() 
02.
Dim rs As Recordset 
03.
Dim rs1 As Recordset 
04.
Dim i As Double 
05.
Dim i1 As Double 
06.
DoCmd.SetWarnings False 
07.
Set rs1 = Application.CurrentDb.OpenRecordset("Select max(LiefNr) as Max1 from Tabelle1") 
08.
rs1.MoveFirst 
09.
i1 = rs1!Max1 
10.
rs1.Close 
11.
Set rs = Application.CurrentDb.OpenRecordset("Select max(ArtNr) as Max from Tabelle1 where LiefNr = " & i1) 
12.
rs.MoveFirst 
13.
i = rs!Max 
14.
rs.Close 
15.
If Mid(Text1.Value, 1, 5) = i1 Then 
16.
    If Mid(Text1.Value, 7, 3) <= i Then 
17.
        Frage = MsgBox("Die Artikelnummer " & Text1.Value & " ist schon vergeben, bitte verwenden sie die Artikelnummer " & i1 & "-" & CStr(i + 1), vbOKOnly, "Fehler") 
18.
    Else 
19.
        DoCmd.RunSQL ("insert into Tabelle1 (LiefNr, ArtNr) values (mid(Text1, 1, 5), mid(Text1, 7, 3))") 
20.
    End If 
21.
Else 
22.
    DoCmd.RunSQL ("insert into Tabelle1 (LiefNr, ArtNr) values (mid(Text1, 1, 5), mid(Text1, 7, 3))") 
23.
End If 
24.
End Sub
Bitte warten ..
Mitglied: 34891
23.09.2009 um 15:58 Uhr
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
Bitte warten ..
Mitglied: Biber
23.09.2009 um 21:26 Uhr
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):
01.
  
02.
... 
03.
Dim i1 as Double 
04.
... 
05.
i1 = rs1!Max1 
06.
 
07.
rs1.Close 
08.
 
09.
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:

01.
  
02.
 
03.
.... 
04.
Dim strMaxLiefnr as String 
05.
Dim strmaxArtNrOfLief as String 
06.
... 
07.
' i1 = rs1!Max1 
08.
strMaxLiefnr = rs1!Max1 
09.
rs1.Close 
10.
strmaxArtNrOfLief ="Select max(ArtNr) as MaxArtnr from Tabelle1 where LiefNr = '" & strMaxLiefnr & "'" 
11.
 
12.
 
13.
Set rs = Application.CurrentDb.OpenRecordset(strmaxArtNrOfLief)  
14.
 
15.
.... 
16.
 

Später wirst Du für das INSERT ähnliches brauchen:

01.
.... 
02.
 
03.
Dim strInsertStmt as String 
04.
.... 
05.
 
06.
strInsertStmt = "insert into Tabelle1 (LiefNr, ArtNr) values ('" & _  
07.
		 mid(Text1, 1, 5) & "', '" & mid(Text1, 7, 3) &"')" 
08.
 
09.
If Mid(Text1.Value, 1, 5) = i1 Then 
10.
    If Mid(Text1.Value, 7, 3) <= i Then 
11.
        Frage = MsgBox("Die Artikelnummer " & Text1.Value & " ist schon vergeben, bitte verwenden sie die Artikelnummer " & i1 & "-" & CStr(i + 1), vbOKOnly, "Fehler") 
12.
    Else 
13.
        DoCmd.RunSQL (strInsertstmt) 
14.
    End If 
15.
Else 
16.
    DoCmd.RunSQL (strInsertStmt) 
17.
End If 
18.
.... 
19.
 

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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Microsoft Office
Kreuztabelle Access + VBA Code (7)

Frage von Dr.Cornwallis zum Thema Microsoft Office ...

Datenbanken
gelöst Access mit VBA vorgefertigte Texte an Datensatz anfügen (4)

Frage von Dr.Cornwallis zum Thema Datenbanken ...

Datenbanken
gelöst Access Report per Email versenden, hat jemand zufällig einen Code dafür(VBA) (7)

Frage von Dr.Cornwallis zum Thema Datenbanken ...

VB for Applications
gelöst Xml-Datei laden bzw. auf Festplatte kopieren und per VBA in eine Access-Tabelle speichern (22)

Frage von machohunk zum Thema VB for Applications ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...