PDA

Vollständige Version anzeigen : Automatische Kundenerkennung


Tomte
23.09.2003, 22:09
Hallo,
Ich möchte in einem Kundenformular beim Anlegen eines Kunden feststellen können, ob der Kunde bereits in der Datenbank existiert oder, ob er wirklich neu angelegt werden muss. Wäre es zum Bsp. möglich nach Eingabe des Namens und der Straße einen MsgBox-Hinweis "Kunde ist bereits vorhanden " erscheinen zu lassen oder gibt es da bessere Lösungsansätze?
Vielen Dank für die Hilfe!

racoon0506
23.09.2003, 22:22
Ich verwende bei solchen Gelegenheiten ein Kombinationsfeld, in dem ich mir (aufgeklappt) Nachname, Vorname, Strasse und Ort anzeigen lasse. Wenn ein Kunde nicht in der Liste vorhanden ist, kann man das dann entweder via Button in einem Erfassungsform für die Adressen ergänzen (nach dem Schliessen des Erfassungsform das Kombifeld aktualisieren und die Auswahl vorgeben....) oder die "Bei Nicht in Liste"-Eigenschaft verwenden. (Zweiteres klappt natürlich nicht, wenn z.b. die Auswahl Müller ist, dieser Nachname bereits existiert und es sich trotzdem um einen neuen Kunden handelt....da bietet sich der Ergänzen-Button an!)

elmar
23.09.2003, 22:24
Hier ein Beispiel, konvertiert aus dem Makro "Kunden" in der Beispieldatenbank Nordwind.mdb

Du musst nur die Feld- und Tabellennamen tauschen...
Sollte dann klappen (habe ich aus Zeitgründen nicht testen können)


Function Kunden_Code_prüfen()
On Error GoTo Kunden_Code_prüfen_Err

' Dem Formular "Kunden" zugeordnet.
' Dem Ereignis "VorAktualisierung" des Felds "Kunden-Code" zugeordnet.
If (Eval("DLookUp(""[Kunden-Code]"",""[Kunden]"",""[Kunden-Code] = Form.[Kunden-Code] "") Is Not Null")) Then
' Wenn der Wert von "Kunden-Code" nicht eindeutig ist, eine Meldung anzeigen.
Beep
MsgBox "Der Kunden-Code, den Sie eingegeben haben, existiert bereits. Bitte geben Sie einen eindeutigen Code ein.", vbInformation, "Mehrfach vorhandener Kunden-Code"
' Zum Steuerelement "Kunden-Code" zurückkehren.
DoCmd.CancelEvent
End If


Kunden_Code_prüfen_Exit:
Exit Function

Kunden_Code_prüfen_Err:
MsgBox Error$
Resume Kunden_Code_prüfen_Exit

End Function

Tomte
24.09.2003, 12:28
Hallo Elmar!
Das klappt bei mir nicht. Wie und wo muss ich so eine Funktion denn genau einfügen? Soll ich ein neues Modul dafür erstellen oder den Code ins "Vor Aktualisierung-Ereigenis" des entsprechenden Feldes einfügen?
Danke!

elmar
24.09.2003, 16:35
Hallo Tomte,

ich habe eine bessere Lösung für Dich, ausgetestet unter AC2k.

Wie auch racoon0506 schreibt, habe ich hier ein Kombofeld benutzt.
Alternativ kannst Du auch die Variablen komb_Name und komb_strasse aus den Feldern Deines Forms auslesen.

Schau Dir den Code an, bei Fragen dazu musst Du Dich halt wieder melden.

Private Sub testkombo_AfterUpdate() ' nach Aktualisierung des Kombofeldes

Dim komb_Name As String
Dim komb_strasse As String
Dim Doppel_ermitteln As Byte

komb_Name = Me.testkombo.Column(0) ' Wenn der Name in Spalte 1 des Kombos steht
komb_strasse = Me.testkombo.Column(1) ' wenn der Strassenname in Spalte 2 des Kombs steht

Doppel_ermitteln = DCount("[NNAME]", "[Mitglieder_Kneipp_Verein]", "[NNAME] = '" & komb_Name & "' AND [STRASSE] = '" & komb_strasse & "' ")
' mit DCount wird anhand der Kriterien aus dem Kombofeld in der Mitglieder- oder Kundentabelle
' geprüft, ob mindestens 1 DS mit dem gleichen Namen UND(!) der gleichen Strasse mit Hausnr.
' vorhanden ist. Wird "0" zurückgeliefert, geht es bei Case 0 weiter
' ist der Rückgabewert 1 oder mehr, tritt "Case Is größer 0" in Kraft
'
'
Select Case Doppel_ermitteln
Case Is > 0
MsgBox "Der ausgewählte Kunde ist bereits mit gleichem Namen und Strasse vorhanden!", vbOKOnly + vbInformation, "Kunde ist bereits vorhanden"
Case 0
MsgBox "Der ausgewählte Kunde ist noch nicht vorhanden!", vbOKOnly + vbInformation, "Kunde ist noch nicht vorhanden"
Me.NNAME = komb_Name ' hier wird der Name des Kunden sogleich in das dafür vorgesehene Feld eingefügt
Me.Strasse = komb_strasse ' desgleichen wird die Straße im Feld Strasse erfasst
' bitte die Feldnamen an die Namen in Deiner Datenbank anpassen!!

End Select
End Sub



Gruß
elmar

ede-k
24.09.2003, 18:46
Hallo Tomte,

wenn du in deine Datenbank die von dir beschriebene Funktion einbauen möchtest, kannst du folgenden Code verwenden.


Private Sub DeinKundenNachnamefeld_AfterUpdate()
Dim strDeinKundenNachnamefeld As String, strSQL As String, strMsg As String
Dim lngAnz As Long, I As Integer, db As Database, rs As Recordset

On Error Resume Next
strDeinKundenNachnamefeld = Me.DeinKundenNachnamefeld
If Err <> 0 Then
Beep
Exit Sub
End If

strSQL = "select * from DeineKundenTabelle where DeinKundenNachnamefeld = '" & strDeinKundenNachnamefeld & "'"
Set db = CurrentDb()
Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot)
Err = 0
rs.MoveLast
If Err <> 0 Then 'OK, nichts gefunden...
rs.Close
Exit Sub
End If
lngAnz = rs.RecordCount
rs.MoveFirst
strMsg = "Folgende Datensätz zu »" + strDeinNachnamefeld + "« existieren bereits:" + vbCrLf + vbCrLf
For I = 1 To lngAnz
strMsg = strMsg & rs("DeinKundenNachnamefeld") & ", " & rs("KundenVornamefeld") & " in " & rs("KundenOrtfeld") & vbCrLf
rs.MoveNext
Next I
rs.Close
Beep
MsgBox strMsg, vbOKOnly + vbInformation, "Hinweis:"

End Sub



Das ganze funktioniert so, dass nach Eingabe des Nachnamens geprüft wird ob der Nachname bereits vorhanden ist. Wenn Ja wird dir ein Msg-Box Hinweis angezeigt. Du gibst z.b. Müller ein, springst zum nächsten Feld...sollte bereits ein Kunde mit dem Namen Müller vorhanden sein, wird der Hinweis angezeigt: Folgende Datensätze zu "Müller" existieren bereits:
Müller, Hans in München
Müller, Fritz in Hamburg

Sollte nichts vorhanden sein, passiert auch nichts.

Du kannst die Felder beliebig erweitern, z.b. das auch die Straße angezeigt wird.

Das ganze funktioniert aber nur, wenn die Schreibweise übereinstimmt, z.b. bei Eingabe von Meyer,Maier oder Meier funktioniert das nicht, weil die Routine genau nach der Zeichenkette sucht.

Hoffe das funktioniert auch wirklich :D

Tomte
25.09.2003, 09:58
Hallo ede-k!
Danke für die Hilfe! Es erscheint jetzt gegebenenfalls zwar die MsgBox "Folgende DS zu "Name" existieren bereits", aber nicht welche DS das sind, d.h. der Platz nach dieser Info bleibt frei. Hast Du dafür noch eine Erklärung?
Danke!

ede-k
25.09.2003, 18:20
Nein ohne mir das ganze anzugucken kann ich nicht sagen woran das liegt.

Hab das ganze ausprobiert, und bei mir funktioniert das ganze....

Kannst dir ja die Testdatei ziehen, vielleicht fällt dir dann ja etwas auf... ansonsten poste hier mal ein auszug deiner db.