PDA

Vollständige Version anzeigen : Ausnahme in GrossKlein Modul


nother
04.06.2012, 16:19
Hallo,
jemand liebes aus diesem tollen Forum hat mir mal ein Codeschnipsel für ein Accessmodul erstellt, der dringend modifiziert werden muss...
Option Compare Database


Public Function GrossKlein(s)
Dim Res As String, Init As Boolean, Ch As String * 1, i As Long

If IsNull(s) Then
GrossKlein = s
Else
Res = "": Init = True
For i = 1 To Len(s)
Ch = Mid(s, i, 1)
Select Case Ch
Case "A" To "Z", "Ä", "Ö", "Ü", "a" To "z", "ä", "ö", "ü", "ß"
Ch = IIf(Init, UCase(Ch), LCase(Ch))
Init = False
Case Else
Init = True
End Select
Res = Res & Ch
Next i
GrossKlein = Res
End If
End Function

Das schreibt super den Anfangsbuchstaben Gross...
Ich habe aber ein Feld das folgendermaßen aussieht:
Sehr geehrter Herr THOMAS MUSTERMANN,
Wenn ich das Modul durchlaufen lasse entsteht natürlich:
Sehr Geehrter Herr Thomas Mustermann.
Das "geehrter" soll natürlich klein bleiben...
wie kann man denn in diesem Modul eine "Ausnahme" definieren???
Weiß jemand auf die schnelle Rat?

Danke für die Mühe

Storch
04.06.2012, 17:25
Hallo,
Du schreibst:
"Ich habe aber ein Feld das folgendermaßen aussieht:". Ich hoffe, Du speicherst nicht die gesamte Anrede in einem Feld ab????:boah:

ohne den Code jetzt genauer beguckt und über Modifikationen nachzudenken....

Machbar ist fast alles, nur mit welchem Aufwand. Ist es nur diese eine Anredefloskel, die verwendet wird oder gibt es mehrere?

Man könnte ja hier ZB die Funktion für die stelle, wo 'geehrter' beginnt, aussetzen oder andere Wege gehen. Aber stellt sich die Frage, wieviele Floskeln gibt es, beginnt das Wort , das kleingeschrieben werden soll immer an der selben Stelle? Ich kann mir grade keine Codelösung vorstellen, die flexibel alles abdeckt, was nicht heisst, das es keine gibt.

Wozu ich Dir eher raten würde.....
Nehme Anredefloskeln in einer sogenannten Lookuptabelle auf. Die Floskeln kannst DU dann über ein Kombifeld zur Auswahl anbieten.
Wenn Du nun für einen Bericht, den Satz:
'Sehr geehrter Herr Max Mustermann' ausgeben willst, kannst Du das in etwa so machen:

Ausgabe = [Anredefloskel] & " " & GroßKlein([Vorname]) & " " & GroßKlein([Nachname]) nur Luftcode als Muster.

Da die Anredeflosklen in der LookupTabelle vordefiniert sind, was natürlich in eine einwandfreie Deutsch passieren sein sollte, ist die Anwendung der Groß-Klein>Funktion überflüssig, Für die Felder Vor und Nachname wird die Funktion aber ausgeführt.

Ich finde das so wesentlich flexibler und komfortabler gelöst, als die Funktion zu erweitern.

Weiterer Vorteil: Wenn DU für die Lookuptabelle ein form erstellst und dieses zB per Doppelklick zur Verfügung stellst, kann der Anwender seine eigenen Floskeln definieren.

gpswanderer
04.06.2012, 17:32
Hallo,
man könnte auch die Anrede in einer extra Tabelle unterbringen zusammen mit einer Spalte für Herr, Frau und Firma zusammen mit den 3 Floskeln und einem Primärschlüssel. In die vorhandene Tabelle kommt dann nur ein Fremdschlüssel für die Anrede.
Das wäre dann die etwas erweiterte Version von Uwe.

Storch
04.06.2012, 17:41
Das wäre dann die etwas erweiterte Version von Uwe.
Danke für die Ergänzung, an Titel hatte ich eben garnicht gedacht, obwohl ich das bei Personendaten immer so mache :mrcool:

nother
04.06.2012, 19:22
Schon mal Danke das ihr beiden euch gedanken gemacht habt!
Ich habe natürlich relativ schnell und Betriebsblind "geschossen"...
Ik hol mal aus: Die Daten werden per CSV geliefert; alles Gross geschrieben.
Dann wandern sie durch den Deutsche Post Infomanager und werden als Excelfile ausgespuckt. Da entsteht dieses besagte Feld der vollständigen Briefanrede.
Das Excelfile wird nun mit einer Tabellenerstellungsabfrage mit einem weiteren Filial-Excelfile in eine Access Datenbank importiert/kommuliert < sagt man das so? > So das Kundendatensatz und Filiale in einer Zeile sind.
Nun laufen ein paar Aktuallisierungsmodule/Abfragen über die Datensätze und "bereinigen" sie und unter anderem auch diese Gross-Klein Klamotte.
Es gibt nur die zwei "floskeln": geehrter und geehrte.
Natürlich könnte ich noch eine Abfrage erstellen die anschließend das wieder korrigiert, aber eleganter wäre es imho wenn die beiden floskeln bei der GrossKlein Abfrage ignoriert werden könnte.
Danke für euren Gehirnschmalz! ;)

fraeser
04.06.2012, 19:34
Habe mir ehrlich gesagt die Funktion auch nicht genau angeschaut, aber:
Suche doch am Ende der Funktion nach "Geehrter" und "Geehrte" und ersetze diese dann in Kleinbuchstaben...

nother
04.06.2012, 19:38
Nun ja, genau das wollte ich eben vermeiden!
Aber thx...

fraeser
04.06.2012, 19:56
Mmh, verstehe nicht, warum Du das vermeiden willst - wären ja nur ein oder 2 Zeilen mehr (Replace). Irgendwie mußt Du diese Sonderfälle ja dem Code verklickern. Gibt es (evtl. später) doch noch weitere Floskeln, hast Du hier ja einige Anregungen, daß über eine Art Übersetzungstabelle zu realisieren.

Marsu65
04.06.2012, 20:07
Eine Zeile ... mit weniger wirst du wohl nichts ausrichten können: ;)
Res = Replace(Res,"Geehrte", "geehrte")

fraeser
04.06.2012, 20:11
Ja,
zzgl. 2. Zeile für "Geehrter".

Oder die interne Funktion "UCaseAnrede"...
:-)))))))))))))))) LOL

Storch
04.06.2012, 20:14
Du kannst für diesen starren Fall die rot eingefügte Modifikation verwenden. Falls die spinnt(ich hatte in der Vergangenheit Probleme, mit Next i mitten aus dem Code die Schleife hochzuzählen) , nimm die Grüne Variante(mit Sprungmarke).
Public Function GrossKlein(s)
Dim Res As String, Init As Boolean, Ch As String * 1, i As Long

If IsNull(s) Then
GrossKlein = s
Else
Res = "": Init = True
For i = 1 To Len(s)
If i > 1 And i < 11 Then Next i
If i > 1 And i < 11 Then Goto Nächstes i
Ch = Mid(s, i, 1)
Select Case Ch
Case "A" To "Z", "Ä", "Ö", "Ü", "a" To "z", "ä", "ö", "ü", "ß"
Ch = IIf(Init, UCase(Ch), LCase(Ch))
Init = False
Case Else
Init = True
End Select
Res = Res & Ch
Nächstes_i:
Next i
GrossKlein = Res
End If
End Function
Die Modifikation schließt die 2. bis 10.Stelle des Strings von der GroßKlein-Prüfung aus. Damit dürfte auch 'geehrte' mit abgedeckt sein. Ist ja ein Zeichen weniger als 'geehrter'.

Flexibilität gibt es mit der Lösung aber nicht. Wie soll ein Code wissen, welches Wort groß und welches klein geschrieben sein soll. Ich denke, sowas ließe sich nur mit Vergleichswerten realisieren.

Marsu65
04.06.2012, 20:26
zzgl. 2. Zeile für "Geehrter".Plödsinn :D
Stifte nicht mehr Verwirrung als schon vorhanden ist ;)

Nun ja, genau das wollte ich eben vermeiden!
Was genau?

fraeser
04.06.2012, 20:31
@Marsu65

Ups, sorry, hast recht! Gedankenfehler....:-))

nother
05.06.2012, 08:04
Vielen lieben Dank für die Müh,
hatte beides irgendwie nicht funktioniert. Mag aber auch an meiner gestrigen übermüdung gelegen haben.
Im Anschluss habe ich dann doch eine weitere aktuallisierungsabfrage erstellt, die das geforderte erledigt.
Lasse diesen Thread aber noch offen, weil ich die anderen Lösungsansätze nochmals testen möchte.
Melde mich!
Thx

Marsu65
05.06.2012, 13:54
Die eine Kodezeile
- nach dem Next i
- vor dem GrossKlein = Res
einfügen.

OT:
hatte beides irgendwie nicht funktioniert.
"Irgendwie" ist das Unwort der Woche :)

nother
05.06.2012, 17:14
Vielen Dank!
Werde das später (WE) noch mal testen...
Aktuell habe ich es anders gelöst:
VAR6: Glätten(Wenn([kun_anrede]="Frau";"Sehr geehrte Frau";"Sehr geehrter Herr")) & " " & Glätten([tbl_rohdaten.kun_titel])& " " & Glätten([tbl_rohdaten.kun_vorname_name]) & ","
Somit war der Titel wieder Isoliert und das Feld aus dem Infopostmanager ist auch somit Hinfällig.
Wie gesagt, die Zeit fehlt für ausgiebige Tests!
Danke Danke!

Toast78
06.06.2012, 06:24
Ich mach das ganze mal noch komplizierter: Es soll ja so tolle Nachnamen vor allem im südeuropäischen Raum geben, deren mehrere(!) Worte mit Kleinbuchstaben bekommen. So "Marco di Paolo" zum Beispiel.