[gelöst] Zeichen im String ersetzen?

12. September 2008 08:53

Guten Morgen,

hab das Problem, das ich Zeichen in einem String ersetzen muss ... hab dazu den Befehl CONVERTSTR gefunden, allerdings scheint der nur zu funktionieren, wenn zu ersetzende Zeichen und neue Zeichen die gleiche Länge haben.
Aber haben sie halt bei mir nicht! Muss ich jetzt mit ner verrückten Ansammlung von STRPOS,COPYSTR und DELSTR meinen String zerpflügen oder geht das auch irgendwie eleganter ?
Zuletzt geändert von enno am 17. September 2008 14:39, insgesamt 3-mal geändert.

Re: Zeichen im String ersetzen?

12. September 2008 10:10

Sieht so aus. Ich habe seinerzeit nichts Besseres gefunden :-/

Re: Zeichen im String ersetzen?

12. September 2008 10:34

enno hat geschrieben:... oder geht das auch irgendwie eleganter ?
Schau dir mal die Codeunit "TextManagement" aus meinen NAV-Tools an.
Dort gibt es die Funktion Umlaut2PlainText, welche dasselbe Problem behandelt.

Re: Zeichen im String ersetzen?

12. September 2008 11:47

wir haben für unsere Anforderung folgende Funktion geschrieben
Code:
ReplaceAllSubstr(VAR MainStr : Text[1024];SearchStr : Text[255];ReplaceStr : Text[255];Casesensitiv : Boolean)
// This function replaces all substrings(SearchStr) of a string(MainStr) with an other substring(ReplaceStr)
// -> see function ReplaceSubstr() above to replace just the first substring of a string
REPEAT
  len := STRLEN(SearchStr);
  pos := STRPOS(MainStr, SearchStr);

  IF NOT Casesensitiv THEN BEGIN
    SearchStr := LOWERCASE(SearchStr);
    pos := STRPOS(LOWERCASE(MainStr), SearchStr);
  END;

  IF pos > 0 THEN BEGIN
    MainStr := DELSTR(MainStr, pos, len);
    MainStr := INSSTR(MainStr, ReplaceStr, pos)
  END;
UNTIL pos = 0;


eventuell hilft dir das weiter.
greetz
grer

Re: Zeichen im String ersetzen?

12. September 2008 13:43

Danke ...

hab mir mit eurer Hilfe eine entsprechende Funktion zusammengeschustert ... aber bisschen traurig ist das schon, das C/AL das nicht standardmäßig bereitstellt.

Noch ne andere Frage, die überhaupt nicht hierher passt, ich aber deswegen nicht ein neues Thema aumachen will:
Wie kann ich über eine Record-Variable einen neuen Datensatz ansteuern (quasi den leeren Datensatz den man mit den Pfeilen nach dem letzten Datensatz findet ... ) ?

Geht sowas irgendwie mit Record.Get(''); oder mit Form.Getrecord(''); oder wie oder wer oder was?
Will quasi aus nem Formular mein anderes Formular im neuen Datensatz öffnen (so dass es gleich auszufüllen geht).

Grüße

Re: Zeichen im String ersetzen?

12. September 2008 13:51

enno hat geschrieben:Noch ne andere Frage, die überhaupt nicht hierher passt, ich aber deswegen nicht ein neues Thema aumachen will:
Daher wäre es sinnvoller, dass du zukünftig doch ein neues Thema dafür aufmachst, denn niemand würde eine Antwort auf diese Frage in diesem Thema vermuten.


enno hat geschrieben:Wie kann ich über eine Record-Variable einen neuen Datensatz ansteuern (quasi den leeren Datensatz den man mit den Pfeilen nach dem letzten Datensatz findet ... ) ?

Geht sowas irgendwie mit Record.Get(''); oder mit Form.Getrecord(''); oder wie oder wer oder was?
Will quasi aus nem Formular mein anderes Formular im neuen Datensatz öffnen (so dass es gleich auszufüllen geht).

Grüße

Antwort: Record.INIT;

Re: Zeichen im String ersetzen?

12. September 2008 14:31

hab mir mit eurer Hilfe eine entsprechende Funktion zusammengeschustert ... aber bisschen traurig ist das schon, das C/AL das nicht standardmäßig bereitstellt.


Wie man´s so nimmt. Je nachdem, was du für einen Substring durch was für einen ersetzt, wird der erzeugte String unabschätzbar lang. Also ist die Definition der Funktion (Länge des Ausgangsstrings) kaum ordentlich hinzukriegen und schon gar nicht sicher zu stellen, dass sie brauchbar funktioniert, da sie potenziell in einen Fehler läuft, wenn sie den zu erzeugenden String nicht zeitig abschneidet. Aber dann käme ja nicht das gewünschte heraus. Sowas würde ich auch in keinem ERP-System implementieren.

Re: Zeichen im String ersetzen?

15. September 2008 09:57

Timo Lässer hat geschrieben:Antwort: Record.INIT;


Mmmmhhh, wenn ich mein Formular aber schon geöffnet hab initialisiert er mir ja aber quasi meinen aktuellen DS. Sprich, wenn ich auf DS5 stehe und dieser DS ist gefüllt, leert er mir den ganzen DS, anstatt zum "neuen" DS6 zu springen.

Ich will quasi sowas die den Druck auf die Taste F3 nachbilden, das er das Formular beim Druck auf nen Button in nem leeren Datensatz öffnet.

Re: Zeichen im String ersetzen?

15. September 2008 10:30

enno hat geschrieben:
Timo Lässer hat geschrieben:Antwort: Record.INIT;


Mmmmhhh, wenn ich mein Formular aber schon geöffnet hab initialisiert er mir ja aber quasi meinen aktuellen DS. Sprich, wenn ich auf DS5 stehe und dieser DS ist gefüllt, leert er mir den ganzen DS, anstatt zum "neuen" DS6 zu springen.

Ich will quasi sowas die den Druck auf die Taste F3 nachbilden, das er das Formular beim Druck auf nen Button in nem leeren Datensatz öffnet.

Record.INIT initialisiert sämtliche Felder des Datensatzes mit Ausnahme der Primärschlüsselfelder.
Dadurch bedingt sieht es nur so aus, als würde er dir deinen vorhandenen Datensatz leeren.

Entweder leerst du noch zusätzlich die Primärschlüsselfelder, oder du verwendest einfach Clear(Record);

Re: Zeichen im String ersetzen?

15. September 2008 11:58

INIT klappt ja auch ganz gut, wenn ich nen Datensatz im Quellcode neu erzeugen will ...
aber ich will ja im Formular auf den leeren Datensatz "springen" (quasi den, der beim Blättern in den Datensätzen nach dem letzten DS kommt) ...

eigentlich will ich es in etwa sowas machen (beim button-push auf nem anderen Formular):

Code:
meinetabelle.INIT;
meinformular.SETRECORD(meinetabelle);
meinformular.RUNMODAL;


... irgendwie klappt das net und er zerschießt mir mit INIT trotzdem meinen aktuellen Datensatz und geht nicht auf den neuen...

Re: Zeichen im String ersetzen?

16. September 2008 10:08

mmhhh,

geht nicht oder drück ich mich nicht richtig aus?
oder hab ich nen Denkfehler in der oben beschriebenen Funktion?


Grüße

Re: Zeichen im String ersetzen?

16. September 2008 13:53

wird wohl nicht gehen, du müsstest wirklich einen neuen anlegen mit leeren feldern, habs selber probiert nachzustellen mit verschieden befehlen über get, next, findlast, setrange, init, insert, hat aber alles nichts geholfen

Re: Zeichen im String ersetzen?

16. September 2008 14:16

Jetzt verstehe ich dein Problem...

Ich hatte mal vor Jahren sowas in der Art umgesetzt, weiß aber nicht mehr genau, wie ich es geschafft hatte.
Grundtechnik war, dass beim Öffnen der Form (OnOpenForm?)ein Filter gesetzt wurde, wozu es definitiv keinen Datensatz gab und auch niemals geben wird.
Logischerweise zeigt NAV dann einen leeren Datensatz an.
Dann musste ich nur in irgendeinem Trigger (OnFindRecord? OnAfterGetRecord? ...?) den Filter wieder aufheben, so dass der dann neu einzugebene Datensatz nicht sofort durch den Filter rutscht und unvollständig verschwindet.

Wie gesagt: Genau weiß ich es nicht mehr, aber so im Prinzip hatte ich es damals gelöst.

Re: Zeichen im String ersetzen?

16. September 2008 14:48

ich habs rausgefunden, mit timos tip ;)

bei onOpenForm filter setzen, bei onAfterGetCurrRecord filter lösen, damit gehts

so etwas ähnliches hatte ich davor auch probiert, nur war ich im falschen trigger beim lösen...

Re: Zeichen im String ersetzen?

17. September 2008 13:31

ok ... danke die Herren ... das geht schonmal sehr gut ...

Jetzt hab ich nur ein Problem: Mein Primärschlüssel wird automatisch über ne Nummernserie eingetragen. Ich müßte jetzt nur irgendwie rauskriegen, welche Nummer denn wohl eingetragen werden wird, wenn ich die Eingaben abschicke.

Re: Zeichen im String ersetzen?

17. September 2008 13:33

enno hat geschrieben:Jetzt hab ich nur ein Problem: Mein Primärschlüssel wird automatisch über ne Nummernserie eingetragen. Ich müßte jetzt nur irgendwie rauskriegen, welche Nummer denn wohl eingetragen werden wird, wenn ich die Eingaben abschicke.

Hänge den dich in den OnInsert-Trigger der Tabelle. Dort wird in der Funktion NoSeriesMgt.InitSeries das PK-Feld gefüllt, wenn die Nummer nicht schon manuell eingegeben worden war.
Diese Funktion brauchst du also nur aufzurufen.

Re: Zeichen im String ersetzen?

17. September 2008 14:08

Natalie hat geschrieben:Hänge den dich in den OnInsert-Trigger der Tabelle. Dort wird in der Funktion NoSeriesMgt.InitSeries das PK-Feld gefüllt, wenn die Nummer nicht schon manuell eingegeben worden war.
Diese Funktion brauchst du also nur aufzurufen.


Wie soll ich mich denn in den OnInsert-Trigger hängen? Ich steh ja im Formular...
Ich mein: die Funktion wird in der Tabelle aufgerufen. Aber wie gebe ich die neu gezogene Nummer in der Tabelle denn in mein Formular zurück?

Re: Zeichen im String ersetzen?

17. September 2008 14:15

enno hat geschrieben:Ich mein: die Funktion wird in der Tabelle aufgerufen. Aber wie gebe ich die neu gezogene Nummer in der Tabelle denn in mein Formular zurück?


Zwei Möglichkeiten:
1. Wenn du von der Form aus ein DeinRecord.INSERT(TRUE) ausführst, steht hinterher in DeinRecord."No." die vergebene Nummer drin. Die brauchst du also nur noch lesen.
2. Du rufst die Funktion selbst auf, schreibst die neue Nummer aber nicht direkt in das Feld, sondern ein eine Variable, die du nur abfragst.

Am wenigsten Arbeit hast du mit 1.

Re: Zeichen im String ersetzen?

17. September 2008 14:39

der Zeiger steht quasi nach dem INSERT genau auf dem neuen Datensatz ... das ist natürlich praktisch ... dann klappt die ganze Sache ...

Danke an euch alle ... jetzt gehts soweit wie gewünscht ... das WE kann kommen :lol:

Re: [gelöst] Zeichen im String ersetzen?

17. September 2008 15:40

noch ein kleiner Nachtrag:

ich ruf nach der ganzen Neuanlegerei jetzt mein Formular B aus Formular A auf und will Formular A danach schließen ...
dadurch schließt es Formular B auch wieder gleich mit ...

... teilweise verständlich ... ne Art Mutter-Kind-Beziehung ... aber geht das auch ohne "das Kind" gleich wieder zu schließen?