Hallo Experten,
in meiner Kundendatenbank mit über 4.000 Datensätzen möchte ich folgendes automatisieren:
Darin gibt es ein Hauptformular mit der Kundenadresse und Informationen. In diesem Hauptformular gibt es ein Feld "Mailvorbereitung", in welches ich die Endung der Mailadresse eingebe, z.B. wäre dies für den Kunden mit Namen "Beispiel" die Endung @beispiel.de.
In das Hauptformular habe ich ein Unterformular (verknüpft über die Kundennummer) eingebunden, in welchem in Listenform alle Ansprechpartner dieses Kunden angezeigt werden, u.a. mit Telefonnummer, Durchwahl, Funktion und auch "Mailadresse", dies können bei manchen Kunden leicht 50 Ansprechpartner sein. Bei manchen Ansprechpartnern ist bereits eine Mailadresse eingetragen, bei manchen aber auch nicht. Wie kann ich zur Vorbereitung erreichen, dass nur in die leeren Felder "Mailadresse" automatisch die "Mailvorbereitung" aus dem Hauptformular eingetragen wird ? Und darüber hinaus dann auch bei Neuanlagen von Ansprechpartnern diese "Mailvorbereitung" aus dem Hauptformular als Standardwert vorgegeben wird ? Dann bräuchte ich nur noch davor die Namen zu ergänzen.
Gruß
neutrino
@Neutrino
ZitatWie kann ich zur Vorbereitung erreichen, dass nur in die leeren Felder "Mailadresse" automatisch die "Mailvorbereitung" aus dem Hauptformular eingetragen wird
Mit einer Aktualisierungsabfrage (Luftcode)
UPDATE Ansprechpartner As AP
INNER JOIN Kunden As K ON AP.KundenID_F = K.KundenID
SET AP.Mailadresse = K.Mailvorbereitung
WHERE AP.MailAdresse Is NullZitatUnd darüber hinaus dann auch bei Neuanlagen von Ansprechpartnern diese "Mailvorbereitung" aus dem Hauptformular als Standardwert vorgegeben wird
Code im UFo
Private Sub Form_Current()
If Me.NewRecord Then
'bei neuen DS
Me.Mailadresse = Me.Parent.Mailvorbereitung
Else
'bei bestehenden DS
If Left(Me.Mailadresse,1) = "@" Then
MsgBox "Mailadresse unvollständig; - Name fehlt!"
End If
End If
End Subgruss ekkehard
Perfekt, Daaanke !! ;D
Hallo Ekkehard,
habe Deinen Code getestet, klappt aber noch nicht.
Mein Hauptformular heisst: "Kundenbasis", das Feld mit der Mailadressenvorbereitung heisst "Mailvorbereitung"
Mein Unterformular heisst: "Ansprechpartner", das Feld mit der Mailadresse heisst "Mailadresse"
Verknüpft mit der Kundennummer, Name des Feldes lautet "Kdnr"
Dein Code hinter meiner Schaltfläche müsste somit lauten
Private Sub Befehl1_Click()
UPDATE Ansprechpartner As AP
INNER JOIN Kundenbasis As K ON AP.Kdnr_F = K.Kdnr
SET AP.Mailadresse = K.Mailvorbereitung
WHERE AP.MailAdresse Is Null
End Sub
Hängt mit Kompilierfehler
Gruss
neutrino
Hallo,
Du vermischt bzw. verwechselst hier SQL mit VBA.
Der Code ab Update bis Null ist SQL und muss auch als SQL ausgeführt werden.
Private Sub Befehl1_Click()
CurrentDB.Execute "UPDATE Ansprechpartner As AP INNER JOIN Kundenbasis As K ON AP.Kdnr_F = K.Kdnr SET AP.Mailadresse = K.Mailvorbereitung WHERE AP.MailAdresse Is Null", dbFailOnError
End Sub
Die CurrentDB Zeile in einer Zeile, ich habe mal bewusst keine Zeilenschaltung eingefügt.
Hallo Klaus,
Danke für deine Erläuterungen an den TS.
Da ich das als einmalige Aktion verstehe, dachte ich an ein schnelles C&P ins
SQL-Fenster und ausführen.
gruss ekkehard
Hallo zusammen,
Ihr habt Recht, ich habe nicht wirklich Ahnung von SQL unf VBA... Ich reime mir das immer zusammen, bisher hat es immer geklappt.. ;)
@Klaus: Mein Debugger meckert über das "," am Ende des Codes
Ist der Code zur Änderung der Tabellen geschrieben die hinter den Formularen liegen (dann in einem Schritt über alle Kundensätze) oder zur Änderung der gerade sichtbaren Felder in dem aktuell offenen Formular und Unterformular (nur dem aktiven Kundensatz) ? Letzteres meinte ich eigentlich. Ich habe mir eine Schaltfläche in mein
Danke und Gruß
neutrino
Hallo,
da habe ich vor dem Komma noch ein Az (") vergessen, bitte einfügen, habe ich oben auch noch gemacht.
@neutrino
Die Abfrage macht das für alle DS der Tabelle "Ansprechpartner" bei
denen das Feld "Mailadresse" komplett leer ist.
Den Rest erledigt mein Code; - bei neuen DS wird die Vorgabe direkt
übernommen (natürlich nur soweit vorhanden), bei bestehenden DS
(dem aktuellen) wird geprüft ob die Adresse komplett ist, - wird nach
der Abfrage ja vorkommen. Falls nicht kommt eine MsgBox.
gruss ekkehard
Hallo zusammen,
habe den Code mehrfach gestartet, es fehlte aber immer ein Parameter. Bis ich dann aus dem Code hinter Kdnr die Zeichen "_F" gelöscht habe. Dann funktionierte der Code. War das evtl. ein Tippfehler, oder macht "_F" hier Sinn ?
Da meine Datenbank sehr groß ist (4.000 Adressen, 6.000 Ansprechpartner) fände ich es besser, wenn nicht immer die komplette Tabelle überarbeitet wird, sondern nur der gerade im Hauptformular offene Datensatz (somit nur die aktuelle Kundennummer = Kdnr). Geht das auch ?
Danke und Gruß
neutrino
@Neutrino
Na ja, die Feldnamen musst du schon anpassen. Solange wir hier kein
Beziehungsbild sehen, nehmen die meisten Standardfeldnamen. Und da
hat ein Fremdschlüsselfeld meist das Suffix "_F".
Das muss ja auch nicht jedes mal (wann ist das überhaupt?) die ganze
Tabelle aktualisiert werden. Wenn die Abfrage einmal gelaufen ist,
kannst du die wieder "wegwerfen". Dann steht in allen DS in denen
vorher nichts stand der Wert aus "Mailvorbereitung". Anschliessend wird
das Feld nur noch bei neuen DS (Anspr.Partnern) geprüft und gefüllt.
Noch mal erkläre ich das jetzt aber nicht.
gruss ekkehard
OK, nochmals Danke und Gruß
neutrino
Moin nochmal,
Bitte habt Nachsehen mit einem "Laien"..
Ich habs nochmal probiert. Wenn ich den Code übernehme ..AP.Kdnr_F = K.Kdnr SET.. dann meckert ACCESS "1 Parameter wurde erwartet, aber es wurden zu wenig Parameter übergeben". Nur wenn ich den Code anpasse ..AP.Kdnr = K.Kdnr SET.. läuft dieser durch. Daher war meine Frage, ob diese unterschiedliche Bezeichnung programmtechnisch gewollt war ? Die verknüpfende Kundennummer heisst bei mir "Kdnr".
Allerdings klappt dies nicht bei allen Ansprechpartnern. Es gibt Kunden, bei denen einige Ansprechpartner nach Durchlauf eine ergänzte Mailadresse haben und manche nicht. Habe überlegt, ob diese Felder vielleicht nicht leer sind, aber es sind zB keine Lehrzeichen enthalten, müssten somit "is null" entsprechen. Oder kann es daran liegen, dass der Durchlauf bei 6.000 Ansprechpartnern dauert ? Ich kann aber nirgendwo erkennen (kein Balken oder ähnliches) ob der Durchlauf abgeschlossen ist.
Gruß
neutrino
Hallo,
Du musst genau die Feldnamen verwenden die Du vergeben hast.
Und bitte zeige jetzt mal das Bild des Beziehungsfensters.
Du hast ja hoffentlich Beziehungen angelegt.
Jetzt versteh ich glaube ich Euer Missverständnis. In beiden Tabellen heisst das Feld "Kdnr". Über diese Felder habe ich beide Tabellen verknüpft.
Ok die Abfrage läuft ja jetzt. Nur bleiben immernoch einige Ansprechpartner, bei denen sich das Feld "Mailadresse" komischerweise nicht automatisch füllt. Ich habe diese Felder auf Leerzeichen durchsucht, aber keine gefunden. Dann habe ich Testweise neue Ansprechpartner mit genau dem gleichen Inhalt angelegt und siehe da, dort wird das "Mailadresse" gefüllt. Irgendwas muß somit in diesen vermeintlich leeren Feldern sein, weshalb "is null" hier scheitert.
Kann man diese Felder irgendwie per Makro bereinigen ?
Danke und Gruß
neutrino
Hallo,
warum äußert Du Dich nicht zu dem gewünschten Beziehungsbild?
@neutrino
Hm, könnte es sein, das diese DS verwaist sind, also das Feld "Kdnr" leer ist?
Dann würden die gar nicht in der Abfrage auftauchen.
Ansonsten kannst du auch einfach das Kriterium in der ursprünglichen Abfrage
ändern
UPDATE Ansprechpartner As AP INNER JOIN Kundenbasis As K ON AP.Kdnr = K.Kdnr SET AP.Mailadresse = K.Mailvorbereitung WHERE AP.MailAdresse Not Like '*@*'
gruss ekkehard
@Klaus: Ehrliche Antwort, ich weiß nicht wie .. :)
@ekkehard: Ich dachte erst, das mit dem @ ist die Lösung, komischerweise funktioniert dies aber gar nicht, damit werden gar keine Felder gefüllt.
Ich habe jetzt mit "is null" weiter experimentiert und habe festgestellt, dass die Laufzeite eine Rolle spielt. Die 4000 Adressen + 6000 APs benötigen etwas Zeit. Wenn ich ca 1min abwarte und erst dann das Formular refreshe, kommen auch die Ergebnisse !! Praktisch wäre es, könnte man irgendwo erkennen, dass der Code noch arbeitet (Balken o.ä.). Kann man einen solchen Balken irgendwie einblenden ?
Gruß
neutrino
@neutrino
was weißt Du nicht, wie man ein Bild hier einfügt, oder was ein Beziehungsbild ist ?
ZitatDie 4000 Adressen + 6000 APs benötigen etwas Zeit.
Eigentlich ist das noch Kleinkram für Access, das ist eine Sache von 1-2 Sekunden.
Vorausgesetzt, die DB ist richtig aufgebaut. So ist z.B. für eine gute Performance eine sinnvolle Indizierung von Feldern unerlässlich.
Daher sind auch die Beziehungen der Tabellen enorm wichtig.
Hast Du überhaupt Beziehungen im Beziehungsfenster angelegt ?
So schlimm ist es nicht, das Bild wäre kein Problem ;D ;D Aber das Beziehungsbild wäre schwierig. Meine Datenbank ist total komplex, über viele Jahre gewachsen. Funktioniert aber (auch Dank diesem Forum) perfekt..
Gruß
neutrino
Nein, habe ich jedenfalls nicht bewusst. Sicherlich könnte man die Performance deutlich verbessern, aber im normalen Tagesgeschäft läuft alles auf Knopfdruck.
Hallo!
ZitatWenn ich ca 1min abwarte und erst dann das Formular refreshe, kommen auch die Ergebnisse
Currentdb.Execute sollte doch synchron ablaufen. Ein Requery nach diese Code-Zeile sollte meiner Meinung nach die neuen Daten anzeigen.
mfg
Josef
Man muß sich dies wie folgt vorstellen: Ich bearbeite einen bestimmten Kundensatz und gebe die Mailvorbereitung in ein dazu vorgesehenes Feld ein. Den Code aktiviere ich in dem Formular mit einer Schaltfläche. Die Ergebnisse kommen aber erst dann im Unterformular mit den vielen Ansprechpartnern hoch, wenn ich das Formular refreshe (oder zB einen Datensatz vor und dann wieder zurückschalte). Weil aber immer die komplette Tabelle durchläuft, muß ich mit dem refresh über eine Minute warten, bis auch Daten ganz unten in der Tabelle durchgelaufen sind.
Daher würde ich am liebsten nur den einen gerade offenen Datensatz bearbeiten (denn mehr ändert sich sowieso in dem Moment nicht), aber dazu habe ich noch keine Lösung.
Gruß
neutrino
Hallo,
dann nutze doch das AfterUpdate-Ereignis des "Mailvorbereitung"-Feldes und aktualisiere (nur) die mit diesem Kunden-DS korrelierenden Ansprechpartnern. (Entweder mit dem besagten SQL-Update-Statement und einer Where-Condition oder aber auch mit ein bisschen VBA das Recordset der Unterformulare)
Zudem kann dabei auch die Standardwert- Eigenschaft des Mailadressfeldes mit dem Eingabewert besetzt werden...
Den Standardwert habe ich besetzt. Gute Lösung !
Dies: mit dem besagten SQL-Update-Statement und einer Where-Condition habe ich nicht umsetzen können.
Hallo,
Sub Mailvorbereitung_AfterUpdate()
Me!UfoSteuerelementname!MailAdresse.Defaultvalue = """" & Me!MailVorbereitung & """"
Currentdb.Execute "UPDATE Ansprechpartner SET Mailadresse = '" & Me!Mailvorbereitung & '" WHERE MailAdresse is Null And KDNR = " & Me!KDNR ,dbFailOnError ' falls KDNR vom Datentyp LONG ist.
Me!UfoSteuerelementname.Form.Requery
End Sub
Nochmals vielen Dank für Eure Hilfe !!! Dies ist ein tolles Forum !
Hallo,
habe einen schönen Code entdeckt, der mir einen "bitte warten" Fortschrittsbalken in der Statusanzeige anzeigt.
Private Sub btnStatuszeile_Click()
Dim lngZaehler As Long
Const clngMaximum = 100000
SysCmd acSysCmdInitMeter, "Bitte warten...", clngMaximum
For lngZaehler = 1 To clngMaximum
SysCmd acSysCmdUpdateMeter, lngZaehler
Next
SysCmd acSysCmdRemoveMeter
End Sub
Wie kann dieser Code mit meinem Code
Private Sub Befehl279_Click()
CurrentDb.Execute "UPDATE _Ansprechpartnerbasis As AP INNER JOIN Kundenbasis As K ON AP.Kdnr = K.Kdnr SET AP.Mail = K.MailBasis WHERE AP.Mail is null", dbFailOnError
End Sub
"verheiratet" werden, damit während der Laufzeit meines Codes der "bitte Warten" Balken in der Statusanzeige angezeigt wird ?
Gruß
neutrino
Die Zusammenführung wird nicht funktionieren können, da Massendatenverarbeitung (Abfrage) und laufender Zähler nicht zusammenpassen.
Entweder Du aktualisierst per Schleife. Dann kannst Du Deinen Fortschritt wunderbar betrachten, zumal das Ganze dann deutlich länger laufen wird.
Oder aber Du siehst zu, dass die Abfrage flüssig läuft, so dass eine Fortschrittsanzeige gar keine Chance hat zur Sichtbarkeit => Indexnutzung (https://www.ms-office-forum.net/forum/showthread.php?t=317707)
OK, schade.. :-\ ;D
Wo ich bei meinem Datenbankmonster (Über 20 Jahre gewachsen, erst in Access2.0, dann irgendwann in Access 2016 importiert..) mit einem Index ansetzen soll, ist mir schleierhaft. Davon habe ich keinen Schimmer..
Habe aber ansonsten auch Null Performanceprobleme
ZitatNull Performanceprobleme
Wenn die Abfragen so schnell laufen, dass man eine Fortschrittsanzeige gar nicht sehen kann, braucht man auch keine installieren.