Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Suchen ersetzen in Abfrage auch mit Modul machbar?

Begonnen von Torsten., November 10, 2014, 15:16:37

⏪ vorheriges - nächstes ⏩

Torsten.

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.

DF6GL

#1
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])

Torsten.

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.

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

DF6GL

#4
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"


Torsten.

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.

MaggieMay

Hi,

dabei ist zu beachten, dass Access beim Vergleich (normalerweise) nicht zwischen Groß- und Kleinschreibung unterscheidet.
Freundliche Grüße
MaggieMay

Torsten.

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.

DF6GL

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.

Torsten.

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.

DF6GL

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

Torsten.

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

DF6GL

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.




Torsten.

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.




MaggieMay

#14
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.
Freundliche Grüße
MaggieMay