Das Notes Forum

Domino 9 und frühere Versionen => ND7: Entwicklung => Thema gestartet von: inu am 20.05.10 - 10:55:33

Titel: Telefonnummer "entformatieren"
Beitrag von: inu am 20.05.10 - 10:55:33
Hallo Leute,

in einer DB von uns werden Telefonnummern nach folgendem Format eingepflegt:

"01234 - 1 23 45 67 89"

Nun benötige ich eine Ansicht, welche in einer Spalte diese Telefonnummer so darstellt:

"01234123456789"

Es sollen also alle Zeichen, die keine Ziffern sind, herausgenommen werden. Wie kann ich das mit der Formelsprache umsetzen?

Viele Grüße
David
Titel: Re: Telefonnummer "entformatieren"
Beitrag von: Peter Klett am 20.05.10 - 11:05:40
Denkansatz:

_tmp := @ReplaceSubstring (Telefonnummer; "0" : "1": ...; "")

Dann hast Du in _tmp alle Zeichen, die Du aus Telefonnummer entfernen musst.

Über eine Schleife (habe noch nie eine Schleife in @Formel geschrieben) kannst Du dann mit
For x = 1 to Len (_tmp) (-> das ist die Script-Schleife, die musst Du natürlich in Formel schreiben)
@Middle (_tmp; x; 1) jedes zu ersetzende Zeichen ermitteln und ersetzen
Titel: Re: Telefonnummer "entformatieren"
Beitrag von: Axel am 20.05.10 - 11:16:26
Ich habe das mal in einer Ansichtenspalte mit dieser Formel gelöst:

@ReplaceSubstring(list; "-":"/":"(":")":" "; "");

Axel

Titel: Re: Telefonnummer "entformatieren"
Beitrag von: Thomas Schulte am 20.05.10 - 12:28:24
Denkansatz:

_tmp := @ReplaceSubstring (Telefonnummer; "0" : "1": ...; "")

Dann hast Du in _tmp alle Zeichen, die Du aus Telefonnummer entfernen musst.

Und wenn man dann noch den Denkansatz von Peter ein wenig erweitert und anstelle von "" ein
Code
_tmp := @ReplaceSubstring (Telefonnummer; " ": "0" : "1": ...; @char(13))
durchführt und dabei auch vorhandene " " Leerzeichen ersetzt. Die machen sonst nämlich als Zeichen unter Umständen Probleme.

Und dann noch einen zweiten ReplaceSubstring baut der
Code
NurZahlenTelefonnummer := @ReplaceSubstring(Telefonnummer;@Unique(@Explode(_tmp;@char(13)));"")
durchführt, dann bekommt man egal was der Benutzer da reingeschrieben hat und ohne alle Sonderfälle, Vielleichtzeichen oder andere Formatierungsmöglichkeiten berücksichtigen zu müssen immer die reinen Zahlen raus.

Selbst bei so einer Eingabe ...
(+)0049Hastdunichtgese/hen(0)89\21 - ?123    @  26 Thomas Schulte 678

Kommt immer das hier raus ...
00490892412326678

Nur CRs sollte der Benutzer in diesem Fall nicht eintragen dürfen!!! Aber das Problem wäre auch noch lösbar.  ;)
Titel: Re: Telefonnummer "entformatieren"
Beitrag von: Peter Klett am 20.05.10 - 12:45:40
Genial, ich ahnte, dass es auch ohne Schleife geht, kam aber nicht drauf.

Wenn man dann auch noch immer @char(13) ersetzt, bleibt keine Eventualität mehr übrig:

NurZahlenTelefonnummer := @ReplaceSubstring(Telefonnummer;@Unique(@Explode(_tmp;@char(13))):@char(13);"")
Titel: Re: Telefonnummer "entformatieren"
Beitrag von: cebolina am 20.05.10 - 13:16:37
Wenn man dann auch noch immer @char(13) ersetzt, bleibt keine Eventualität mehr übrig:

ich widerspreche ungern, aber es bleiben noch " " und @NewLine zu berücksichtigen.

So gehts aber (zumindest in einem berechneten Feld; in Ansicht habe ich nicht probiert):

feldname := Feld1 ;
erlaubt := (" " : "0" : "1" : "2" : "3" : "4" : "5" : "6" : "7" : "8" : "9") ;
verboten := @ReplaceSubstring(feldname ; erlaubt ; @Char(13)) ;
@ReplaceSubstring(feldname ; @Unique(@Explode(verboten ; @Char(13))) : @Char(13) : @NewLine : " " ; "")

Gruß
Stefan
Titel: Re: Telefonnummer "entformatieren"
Beitrag von: Peter Klett am 20.05.10 - 13:30:51
ich widerspreche ungern ...
Ich auch, aber  :)

Das Leerzeichen muss nur deshalb entfernt werden, da es in "erlaubt" enthalten ist (also dort, erstes Element, zu entfernen).

@Newline ist normalerweise @Char (13) + @Char (10) (zumindest im Win-Umfeld), wenn man über @Char (13) explodiert, müsste erst @Char (10) und dann @Char (13) ersetzt werden. Falls das generell ein Problem gibt, kann man aber auch irgendein nicht erlaubtes Zeichen als Trennzeichen nehmen.

feldname := Feld1 ;
erlaubt := ("0" : "1" : "2" : "3" : "4" : "5" : "6" : "7" : "8" : "9") ;
trennzeichen = "#";
verboten := @ReplaceSubstring(feldname ; erlaubt ; trennzeichen) ;
@ReplaceSubstring(feldname ; @Unique(@Explode(verboten ; trennzeichen)) : trennzeichen ; "")

Damit sollte das eine allgemeingültige Formel sein, um in einem String bekannte erlaubte Zeichen stehen zu lassen, ohne alle unerlaubten Zeichen zu kennen (hab es aber nicht getestet).
Titel: Re: Telefonnummer "entformatieren"
Beitrag von: Tim Pistor am 20.05.10 - 13:53:57
Auch mein Senft dazugeb :

dirtyNumber := "+00++1aaa2s   ss345d" + @NewLine + "dd6  ddd7s8  ss9s0&$s";
cleanNumber := @implode( @Explode(dirtyNumber; @implode(@Explode( dirtyNumber ; "0123456789"))) ; "" );
Titel: Re: Telefonnummer "entformatieren"
Beitrag von: Thomas Schulte am 20.05.10 - 14:04:52
Tim bekommt eindeutig den Preis für das Kreativste Denken verliehen.
Titel: Re: Telefonnummer "entformatieren"
Beitrag von: cebolina am 20.05.10 - 14:10:35
Tim bekommt eindeutig den Preis für das Kreativste Denken verliehen.
stimmt, die Lösung von Tim ist wirklich "elegant"!

Gruß
Stefan
Titel: Re: Telefonnummer "entformatieren"
Beitrag von: Peter Klett am 20.05.10 - 14:18:15
Tim bekommt eindeutig den Preis für das Kreativste Denken verliehen.
stimmt, die Lösung von Tim ist wirklich "elegant"!
Respekt, kann mich nur anschließen
Titel: Re: Telefonnummer "entformatieren"
Beitrag von: Tim Pistor am 20.05.10 - 14:47:32
Tim bekommt eindeutig den Preis für das Kreativste Denken verliehen.
stimmt, die Lösung von Tim ist wirklich "elegant"!
Respekt, kann mich nur anschließen

Vielen Dank :)

Und noch zur Erklärung :

@implode( @Explode(dirtyNumber; @implode(@Explode( dirtyNumber ; "0123456789"))) ; "" )
=> Erlaubte Zeichen

@implode( @Explode(dirtyNumber; @implode(@Explode( dirtyNumber ; "0123456789"))) ; "" )
=> Die erlaubten Zeichen sind die Trenner. Die verbotenen Zeichen bleiben übrig

@implode( @Explode(dirtyNumber; @implode(@Explode( dirtyNumber ; "0123456789"))) ; "" );
=> Nun wird der String nach den verbotenen Zeichen getrennt und wieder zusammengefügt. Die erlaubten Zeichen bleiben übrig

Was meint Ihr? Gibt es bei @Explode ein Problem wenn das gleiche Zeichen mehrmals bei den Trennern vorkommt?
@Explode( "1a2b3c4d" ; "aaabbbcccdddeee");
Titel: Re: Telefonnummer "entformatieren"
Beitrag von: Peter Klett am 20.05.10 - 14:59:47
Nein, ich glaube nicht, dass das ein Problem gibt. Notes trennt, sobald eines der Zeichen vorkommt, warum sollte es dann noch nach weiteren Zeichen weiter hinten suchen?

Habe mal mit "01234567890123456789" getestet, das Ergebnis ist das gleiche.
Titel: Re: Telefonnummer "entformatieren"
Beitrag von: WernerMo am 20.05.10 - 15:55:40
Hallo,

ich will ja nicht vorlaut sein, aber evtl. gibt es ein Zeichen, das Ihr so nicht entfernen wollt?

Gerade im Internationale Umfeld ist das Kreuz"+" in der Telefonnummer von großer Bedeutung, evtl. sollte man dem zumindest an erste Stelle eine Sonderrolle zukommen lassen?

Gruß Werner
Titel: Re: Telefonnummer "entformatieren"
Beitrag von: Peter Klett am 20.05.10 - 16:07:28
Man nimmt alle die Zeichen, die man nicht entfernen möchte, in den String mit den erlaubten Zeichen auf, z.B. auch das +

cleanNumber := @Implode (@Explode (dirtyNumber; @Implode (@Explode (dirtyNumber ; "+0123456789"))) ; "" );

Die richtigen Zeichen anzugeben ist dann Sache des jeweiligen Entwicklers.
Titel: Re: Telefonnummer "entformatieren"
Beitrag von: Tim Pistor am 20.05.10 - 16:11:05
Hallo,

ich will ja nicht vorlaut sein, aber evtl. gibt es ein Zeichen, das Ihr so nicht entfernen wollt?

Gerade im Internationale Umfeld ist das Kreuz"+" in der Telefonnummer von großer Bedeutung, evtl. sollte man dem zumindest an erste Stelle eine Sonderrolle zukommen lassen?

Gruß Werner

Und um das zweite "+" bei "+49 9229+2345" zu killen macht man sowas :

A := @implode( @Explode(dirtyNumber; @implode(@Explode( dirtyNumber ; "0123456789+"))) ; "" );
@Left(A; 1) + @Left(@replacesubstring(A; "+"; "") ; -1);

Jetzt wirds aber langsam schmutzig ;) Für solche "extremfälle" brauchts dann mal halt ein wenig IQ beim Anwender ;)
Titel: Re: Telefonnummer "entformatieren"
Beitrag von: WernerMo am 20.05.10 - 16:46:46
Hallo,

damit wäre ich ganz und garnicht einverstanden:
Man nimmt alle die Zeichen, die man nicht entfernen möchte, in den String mit den erlaubten Zeichen auf, z.B. auch das +

Zum Glück hat ja Tim aus seiner "eleganten" Lösung eine "elegant²" gemacht.

Suuuuuuuper gut Tim.

Gruß aus Weißenburg (=Gefängnis)
Werner
Titel: Re: Telefonnummer "entformatieren"
Beitrag von: cebolina am 20.05.10 - 17:28:45
Zitat
Und um das zweite "+" bei "+49 9229+2345" zu killen macht man sowas :

A := @implode( @Explode(dirtyNumber; @implode(@Explode( dirtyNumber ; "0123456789+"))) ; "" );
@Left(A; 1) + @Left(@replacesubstring(A; "+"; "") ; -1);

damit bin jetzt ich nicht einverstanden  ;D

Es gibt viele Telefonnummern, die in diesem Format vorhanden sind:

+49(0)123 456789

Ergebnis ist dann +490123456789 = falsch
korrekt müsste das Ergebnnis lauten: +49123456789 (ohne 0)

Und wenn die Zeichenfolge nicht mit + anfängt (man weiß ja nie), ist das Ergebnis wieder falsch.
"0123 456789" ergibt dann "00123456789".

Aber wie Tim schon sagte - jetzt wirds langsam wirklich schmutzig.

Gruß
Stefan
Titel: Re: Telefonnummer "entformatieren"
Beitrag von: Peter Klett am 20.05.10 - 19:05:45
Wenn wir schon mal am Erbsenzählen sind:

Die Aufgabe/Anfrage war:

"Es sollen also alle Zeichen, die keine Ziffern sind, herausgenommen werden. Wie kann ich das mit der Formelsprache umsetzen?"

Diese Aufgabe ist, denke ich, bestens gelöst worden.

Die Annahme, dass die "elegant²"

A := @implode( @Explode(dirtyNumber; @implode(@Explode( dirtyNumber ; "0123456789+"))) ; "" );
@Left(A; 1) + @Left(@replacesubstring(A; "+"; "") ; -1);

einen Fehler bei fehlendem + als erstem Zeichen bringt, ist ein Interpretationsfehler, aber tatsächlich ist sie nicht 100%ig, denn bei mehr als einem + am Anfang wird die erste Ziffer nach den + entfernt. Erst @Left und dann @ReplaceSubstring (Reihenfolgeproblem) ist hoffentlich ganz korrekt.

A := @Implode (@Explode (dirtyNumber; @Implode (@Explode (dirtyNumber; "0123456789+"))) ; "" );
@Left(A; 1) + @ReplaceSubstring(@Left(A; -1); "+"; "");

Doch das ist jetzt oberpingelig. Wenn eine Telefonnummer wirklich ganz korrekt angezeigt werden soll (z.B. um damit direkt zu wählen), würde ich das schon bei der Eingabe entsprechend validieren, und nicht erst in einer Ansicht irgendwie geraderechnen. Und das erfolgt ja, entweder technisch oder organisatorisch, wenn ich David richtig verstanden habe.
Titel: Re: Telefonnummer "entformatieren"
Beitrag von: FriFra am 20.05.10 - 23:45:56
"+" durch "" zu ersetzen ist falsch. Richtig wäre hier "00", denn "+49" ist "0049".

Ich hab vor kurzem genau für diese Probleme eine Lösung gebaut.

ich ersetze z.B. immer "(0)" -> "", "+"->"00"

Erst danach fliegen alle nicht numerischen Zeichen raus. Weiterhin ersetze ich im Nachgang alle "0049" durch "0"
Und zum Schluß schneide ich von allen lokalen Nummern die Orstvorwahl weg. Die Landes und Ortsvorwahl hab ich dabei konfigurierbar gehalten, damit man das Ergebnis gem. den lokalen Gegebenheitem steuern kann.

Titel: Re: Telefonnummer "entformatieren"
Beitrag von: Tim Pistor am 21.05.10 - 08:39:45
"+" durch "" zu ersetzen ist falsch. Richtig wäre hier "00", denn "+49" ist "0049".

Ich hab vor kurzem genau für diese Probleme eine Lösung gebaut.

ich ersetze z.B. immer "(0)" -> "", "+"->"00"

Erst danach fliegen alle nicht numerischen Zeichen raus. Weiterhin ersetze ich im Nachgang alle "0049" durch "0"
Und zum Schluß schneide ich von allen lokalen Nummern die Orstvorwahl weg. Die Landes und Ortsvorwahl hab ich dabei konfigurierbar gehalten, damit man das Ergebnis gem. den lokalen Gegebenheitem steuern kann.

Ja, jetzt wirds wirklich schmutzig... wir reden ja hier von einer Spaltenformel ;) Ist zwar auch möglich das
(mehr oder weniger) dynamisch/konfigurierbar zu halten. Aber naja...
Titel: Re: Telefonnummer "entformatieren"
Beitrag von: FriFra am 21.05.10 - 08:48:37
@Tim: Wenn man es in einer Spaltenformel habenwill, dann lässt man halt die 0049 stehen oder, wenn die Anwendung ohnehin nur in D eingesetzt wird, macht es halt unkonfigurierbar. Nach so vielen Posts kann es schonmal untergehn, dass es um eine Spalte ging, das Ändert aber am Prinzip nichts... Im Grunde hab ich nur etwas dazu geschrieben, weil eben "+" -> "" schlichtweg falsch ist.
Titel: Re: Telefonnummer "entformatieren"
Beitrag von: Tim Pistor am 21.05.10 - 09:06:18
Im Grunde hab ich nur etwas dazu geschrieben, weil eben "+" -> "" schlichtweg falsch ist.

ja klar, sorry, da hast Du natürlich Recht. Aber nicht in jedem Fall wird das "+" zu einem "00".
In den USA wäre es eine "011". Das meinte ich u.a. mit "jetzt wirds schmutzig".

Aber mal was wichtiges, @inu (David) : Konnten wir Dir helfen?´ ;D ;D ;D

Edit: vertippt
Titel: Re: Telefonnummer "entformatieren"
Beitrag von: diali am 21.05.10 - 11:28:00
wahrscheinlich wird die Nummer für eine CTI-Anwendung benötigt. Die meisten CTI-Anwendungen können die Strings für gehende Telefonate formatieren.

Das Problem sind die ankommenden Anrufe. Sollen diese in einer Datenbank aufgelöst werden, wird üblicherweise das Kanonisches Format (siehe Wikipedia (http://de.wikipedia.org/wiki/Kanonisches_Format) oder msdn (http://Kanonisches Adressformat für Telefonnummern)) verwendet.

Und schon gibt es das nächste Problem mit den Klammern um die Ortsvorwahl, die dann ohne die 0 dasteht!
Titel: Re: Telefonnummer "entformatieren"
Beitrag von: atbits am 21.05.10 - 11:34:17
Also für mich sieht es aus als hätte sich inu schon längst aus dieser Diskussion verabschiedet ...
tja life is hard - David
Titel: Re: Telefonnummer "entformatieren"
Beitrag von: FriFra am 21.05.10 - 11:38:38
Und schon gibt es das nächste Problem mit den Klammern um die Ortsvorwahl, die dann ohne die 0 dasteht!

Nein gibt es nicht (Beispiel):
+1 (425) 555-0100

"+" -> "00"
"(425)" -> "425" (es wird nur "(0)" gelöscht, bei "(425)" - was es als Ortsvorwahl nirgends gibt - müssen nur die Klammern weg)

Das Ergebnis wäre dann: 0014255550100, und diese Nummer ist valide. Bleibt halt nur das zuvor angesprochene Problem, dass nicht in jedem Land das "+"="00" ist, dies gilt aber zumindest in Europa.
Titel: Re: Telefonnummer "entformatieren"
Beitrag von: Bastel123 am 21.05.10 - 13:50:39
Einen habe ich noch:

in Italien (und Russland glaube ich) ist die "0" bei der Ortsvorwahl Bestandteil der Rufnummer und darf nicht rausgekürzt werden. Ich habe die Rufnummern daher in vier Blöcke unterteilt

1. Ländervorwahl (Mussfeld) +49
2. Ortsvorwahl (Mussfeld) 2345 (ohne "0")
3. Firmenkopfnummer (Mussfeld)
4. Durchwahl

Falls es z. B. ein ISDN Anschluss ist wird keine Durchwahl eingtragen, es kommt alles in die Firmenkopfnummer.

Bei eingehenden Telefonaten ist darauf zu achten, dass auch innerhalb eines Landes teilweise die Ländervorwahl mit gegeben wird. also 0049301234567 oder 0301234567

Es wird noch schöner wenn die Anwendung in unterschiedlichen Ländern zmit unterschiedlichen CTI System um Einsatz kommt.
Ist aber immer spannend und die Anwender danken es einem.  ;-)

Schöne Pfingsten

Sebastian
Titel: Re: Telefonnummer "entformatieren"
Beitrag von: Tim Pistor am 21.05.10 - 19:41:06
1. Ländervorwahl (Mussfeld) +49
2. Ortsvorwahl (Mussfeld) 2345 (ohne "0")
3. Firmenkopfnummer (Mussfeld)
4. Durchwahl

Wenn Du den Präfix für die Kennzeichnung eines internationalen Gespräches ("+" / "00" / "011" ) noch bei
der Ländervorwahl rauswirfst, ist die Sache noch besser. Dieser müsste dann zur Laufzeit je nach Standort
berechnet werden.

Präfix (dynamisch) + Ländervorwahl + Ortsvorwahl + Firmenkopfnummer + Durchwahl
Titel: Re: Telefonnummer "entformatieren"
Beitrag von: Peter Klett am 21.05.10 - 22:27:29
Ich finde, man kann sich auch überorganisieren. Vier Felder für eine Telefonnummer, naja, wie gut dass nur drei Pflichtfelder sind, so kann man 110 immerhin speichern.

Da setze ich doch lieber auf den Verstand der Mitarbeiter und evtl. eine Datenkontrolle. Die Qualität wird nicht zwingend besser, wenn man sich den Wolf validiert. Und vor Zahlendrehern schützt das auch nicht. Es sei denn, nach Eingabe der Telefonnummer geht automatisch ein Ruf raus und per Spracherkennung wird gleich noch der Teilnehmername erfasst. Vielleicht stellt man dann eine ungewöhnliche Namenshäufung bei "Hallo" und "Wirkaufennix" fest ...
Titel: Re: Telefonnummer "entformatieren"
Beitrag von: atbits am 21.05.10 - 22:39:43
Sehe ich auch so Peter.
Shit in - Shit out!

Wird Zeit dass der Otto-Normal-Dummuser auch merkt.

Ausserdem sollte IBM endlich die neue Formel @DoExactlyWhatIWant einbauen, damit kann man dann auch über eine KI die Telefonnummer formatieren ;-)

Sorry habe gerade meine sarkastischen 5 Minuten - David
Titel: Re: Telefonnummer "entformatieren"
Beitrag von: Bastel123 am 26.05.10 - 10:11:44
Hallo Peter,

natürlich hast Du recht. Garbage in - Garbage out.

Die "Vierteilung" habe ich eingeführt weil sich bei Firmenumzügen oft nur die Kopfnummer und nicht die Durchwahl ändert, dass kann man gut programatisch dann ändern.

Zum gesunden Menschenverstand: Viele Mitarbeiter haben gar kein Vorstellungsvermögen vom Wert richtig gepflegter Adressen.
- Kundenmitarbeiter bei denen unter Remarks steht: 2005 verstorben, die aber weiter in Mailinglisten stehen.
- Firmenadressen mit xxx in der Stadt und Straße
- unzustellbare Rückläufer, die über drei Jahre gehortet, aber nicht eingepflegt werden
und so weiter und so fort

Wenn wir dann noch von verteilten, nicht syncronen Datenbeständen in unterschiedlichen System anfangen ist die reine Telefonnummer nur noch Nebensache.

Gruß

Sebastian
 

Titel: Re: Telefonnummer "entformatieren"
Beitrag von: Peter Klett am 26.05.10 - 12:02:22
Hallo Sebastian,

entschuldige, ich wollte Dich bzw. Dein Vorgehen natürlich nicht angreifen. Das wichtigste an guten Anwendungen ist, dass sie die vorhandenen Probleme lösen und funktionieren. Wenn Du mit der "Vierteilung" (da sind wir dann schon nahe dran an der "Exekution" von Scotty67  ;D) von Telefonnummern Probleme bei Euch verringern kannst, solltest Du das unbedingt machen.

Den einen richtigen Weg gibt es sowieso nicht, viele Wege führen zum Ziel.

Viele Grüße

Peter