Hallo zusammen,
kann man den Vorgang suchen/ersetzen in einer Abfrage auch über ein Modul steuern?
Hintergrund der Frage, z.Zt. nutze ich die verschachtelte Art und Weise "suchen/ersetzen" wie folgt:
Feld: ersetzen(ersetzen([datenquelle];"1";"A");"2";"b")
Das ist soweit ok, hat aber den Nachteil wenn ich zuviele Abfragen aufliste kommt die Fehlermeldung "Der Text ist zu lang um bearbeitet zu werden".
Darum mein Frage ob man es über ein Modul lösen kann. Denn ich hoffe das man dann eigentlich darin "unendlich" viele Abfragen listen kann. Sehe ich das richtig und wenn ja wie muß der Code dazu aussehen?
Ich bitte um Eure Hilfe
Beste Grüße Torsten.
Hallo,
klar geht das, wenngleich es zu fragen wäre , welchen Sinn diese Ersetzerei in einer
Auswahl-Abfrage (so es eine ist) haben könnte.
Erzeuge in einem Standard-Modul eine Public-Funktion und ruf diese in der Abfrage auf...
ZitatPublic Function fktReplace (strMeineDatenquelle as String)
fktReplace= Replace (Replace(strMeineDatenquelle,"1","A"),"2","b")
End Function
in der Abfrage:
Feld: fktReplace([MeinDatenFeld])
Hallo Franz,
vielen Dank für die Hilfe, so kann ich es lösen.
Zu Deiner Frage warum in einer Abfrage die Ersetzerei,
ich bekomme Datensätze von unterschiedlichen Herstellern die Ihre Bezeichnungen alle individuell benennen.
Beispiel:
Hersteller 1 = HOSENTRÄGER
Hersteller 2 = hosenträger
Hersteller 3 = Hosentraeger usw.
Jetzt gehe ich dabei und ersetze die 3 Varianten zu einem einheitlichem "Hosenträger".
Würdest Du das anders lösen?
Gruß Torsten.
Ich habe die Funktion um fktReplace ergänzt, falls jemand anderes dieses brauchen kann:
Public Function [color=red][b]fktReplace[/b][/color](strMeineDatenquelle as String)
fktReplace= Replace (Replace(strMeineDatenquelle,"1","A"),"2","b")
End Function
Hallo,
ja sorry, da ist mir "verschieben" statt "kopieren" beim Schreiben passiert.. Habe das auch im Original-Post korrigiert, um Verwirrung zu vermeiden... :o
Zur Ersetzung:
das Beispiel könnte so gelöst werden:
Update tblArtikel Set Art_Bez = "Hosenträger" where Art_Bez like "Hosent*er"
Zitat von: Torsten. am November 10, 2014, 16:16:37
...Zu Deiner Frage warum in einer Abfrage die Ersetzerei,
ich bekomme Datensätze von unterschiedlichen Herstellern die Ihre Bezeichnungen alle individuell benennen.
Beispiel:
Hersteller 1 = HOSENTRÄGER
Hersteller 2 = hosenträger
Hersteller 3 = Hosentraeger usw.
Jetzt gehe ich dabei und ersetze die 3 Varianten zu einem einheitlichem "Hosenträger".
Würdest Du das anders lösen?
Gruß Torsten.
Deine Aussage hat mich etwas verunsichert. Gibt es einen besseren Weg?
Uuups - das hat sich überschnitten. Danke für den Hinweis.
Hi,
dabei ist zu beachten, dass Access beim Vergleich (normalerweise) nicht zwischen Groß- und Kleinschreibung unterscheidet.
Ich habe doch noch ein Problem:
Auch hier im Modul komme ich anscheinend an die Grenze der max. Zeichen - bei 1024 Zeichen pro Zeile ist Schluß.
Public Function fktReplace (strMeineDatenquelle as String)
fktReplace= Replace (Replace(strMeineDatenquelle,"1","A"),"2","b") [b][color=red]bei 1024 Zeichen ist Schluß[/color][/b]
End Function
Gibt es die Möglichkeit weitere suchen/ersetzen Angaben zu machen?
Wenn ich einen Zeilenumbruch setze und somit neue Angaben machen könnte (siehe unten), wir in der Abfrage nur die 2. Zeile fktReplace berücksichtigt.
Public Function fktReplace (strMeineDatenquelle as String)
fktReplace= Replace (Replace(strMeineDatenquelle,"1","A"),"2","b") [b][color=red]bei 1024 Zeichen ist Schluß[/color][/b]
fktReplace= Replace (Replace(strMeineDatenquelle,"3","c"),"4","d") [b][color=red]nur diese Zeile wird in der Abfrage bearbeitet[/color][/b]
End Function
Kann man die Situation so lösen, dass man praktisch unbegrenzte Abfragen suchen/ersetzen ausführen kann?
Ich bitte um Eure Hilfe
Gruß Torsten.
Hallo,
"bei 1024 Zeichen pro Zeile ist Schluß."
was heißt das?
Meinst Du den Abfrage-SQL-String oder den Inhalt der Variablen "strMeineDatenquelle" ?
Um wieviele verschiedene (Grund-)Benennungen handelt es sich überhaupt?
Bei mehreren Grund-Benennungen könnten diese in einer Tabelle aufgelistet werden und mittels Recordset durchlaufen werden, wobei jeweils die Aktualisierungsabfrage abläuft.
Moin Franz,
wenn ich Deine Frage richtig verstanden habe, es handelt es sich um den Abfrage-SQL-String.
Es sind sehr viele verschiedene Benennungen - gefühlsmäßig mehr als 200 (kommt aus einer Tabelle mit ca. 500Tsd Datensätzen).
Daher auch meine Eingangsfrage wie man das umgehen kann ...Fehlermeldung "Der Text ist zu lang um bearbeitet zu werden".
Das mit der Tabelle wäre eine gute Lösung, denn dann könnte man die jederzeit aktualisieren bzw. neue Benennungen hinzufügen.
Könntest Du mir behilflich sein, Deinen Vorschlag zu realisieren?
Gruß Torsten.
Hallo,
nur ad hoc und Luftcode:
Tbl_Ersetzungen:
Kritwert Sollwert
Hose*ger Hosenträger
Hem*rmel Hemdärmel
.
.
Function fkt_tblReplace()
Dim rs as Dao.Recordset, db as Database
Set db = Currentdb
Set rs= db.Openrecordset("Select * from tbl_Ersetzungen", dbOpenSnapShot)
Do Until rs.EOF
db.Execute "Update tblArtikel Set Art_Bez = '" & rs!Sollwert & "' where Art_Bez like '" & rs!Kritwert & "'", dbFailOnError
rs.MoveNext
Loop
rs.Close:Set rs=Nothing
Set DB= Nothing
End Function
Das funktioniert - fast.
Bei replace werden die Zeichen ausgetausch z.B. "die blusen in gelb sollen in rot geändert werden"
replace([tbl],"gelb","rot") = "die blusen in rot sollen in rot geändert werden"
Bei der Tabelle tbl_ersetzungen muß es 1 zu 1 sein, also:
Kritwert Sollwert
die blusen in gelb sollen in rot geändert werde die blusen in rot sollen in rot geändert werden
statt nur die Zeichen ersetzen
gelb rot
Hast Du dafür eine Idee, das in der Tabelle nicht Daten 1 zu 1 eingegeben werden müssen?
Gruß Torsten
Hallo,
versteh nicht ganz..
es können doch nur Textstellen ersetzt werden, die bzgl. dem "Kritwert" gefunden werden können... Je "genauer" der ist, um so genauer wird das Ergebnis sein.
Wenn es so ist:
Kritwert | gelb
Sollwert | rot
Dann wir der Feldinhalt:
die blusen in gelb sollen in rot geändert werden
nicht in
die blusen in rot sollen in rot geändert werden
geändert.
Wenn es so ist:
Kritwert | die blusen in gelb sollen in rot geändert werden
Sollwert | die blusen in gelb sollen in rot geändert werden
dann wird es geändert
Um bei Deinem Beispiel zu bleiben, ergänze bitte in der tbl_ersetzungen Hem*rmel um bspw. test = Hem*rmel test
Hosenträger funktioniert, Hemdärmel nicht.
Gruß Torsten.
Hallo Torsten,
was du da schreibst ist unlogisch, kann es sein, dass du dich irgendwie vertan hast?
Nachtrag:
Oder kann es sein, dass es das ist was du suchst:db.Execute "Update tblArtikel Set Art_Bez = Replace(art_bez,'" & rs!Kritwert & "', '" & rs!Sollwert & "') Where Art_Bez Like '*" & rs!Kritwert & "*'", dbFailOnError
Dann kann Kritwert allerdings keine Suchmuster mehr enthalten.
Hallo MaggieMay,
ich habe eben kurz getestet - und es hat funktioniert.
Ich werde nachher in Ruhe prüfen und gebe Dir dann noch Bescheid.
Gruß Torsten.
Ich komme nicht weiter.
Ich habe beide Vorschläge von Euch probiert und bekomme jetzt die Fehlermeldung:
Laufzeitfehler 3188
Aktualisieren nicht möglich, momentane Sperrung durch eine andere Sitzung auf diesem Rechner.
Ich weis nicht welche andere Sitzung gemeint ist, nur diese DB ist offen - nichts anderes in Bezug auf MS Access (Rechner wurde ebenfalls neu gestartet).
Ich habe die Test-Db und die Fehlermeldung mit angehängt. Was ist falsch bei mir?
Würdet Ihr Euch bitte nochmals mit meinem Problem beschäftigen?
Vorab vielen Dank, Gruß Torsten.
Hallo,
die Funktion (erster Zugriff auf die Tabelle) soll ja auch nicht in einer Abfrage (zweiter Zugriff auf die Tabelle) aufgerufen werden, sondern direkt (per VBA oder mit Taste F5, bzw. F8) ...
wobei das Funktionsargument überflüssig ist.
Vielen Dank, habe es in Function fkt_tblReplace()
abgeändert - funktioniert.
Vielen Dank, Gruß Torsten.