0

Bestimmten Teil eines Textfeldes ändern

Ich bräuchte mal wieder Hilfe. Und zwar möchte ich beim Duplizieren von einem Datensatz überprüfen, ob im Feld "Beschreibung" irgendwo "KW (Leerzeichen) (irgendeine Zahl)" vorkommt.

 

Also ob das Feld Beshreibung zum Beispiel heißt "Auftrag xyz KW 8"

 

In dem Fall möchte ich, dass beim duplizierten Datensatz die Beschreibung übernommen wird und nur nach dem KW die Ziffer auf die aktuelle Kalenderwoche geändert wird.

 

Also ich weiß, wie man die Kalenderwoche ermittelt (week(date(today())). Aber mir ist nicht klar, wie ich das Suchen/Ersetzen von Text lösen kann.

 

Mein aktueller "Duplizieren" button sieht folgendermaßen aus (es wird nicht nur der Datensatz dupliziert sondern auch daran gehängte Datensätze in einer anderen Tabelle):

 

let my := this;
let new := duplicate(this);
new.(Auftragsdatum := date(today()));
new.(Lieferdatum := date(today()));
let newsub := for i in 'Sub-Aufträge'['Aufträge' = my] do
duplicate(i);
i.('Aufträge' := new);
i.(Rechnung := 0);
i.(Lieferdatum := 0)
end;
popupRecord(new)

3 Antworten

null
    • T_Bartzsch
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Du kannst mit regulären Ausdrücken - sog. RegEx nach solchen Pattern im Text suchen. In der Ninox gibts dazu zB. extractx

    Du schaust über 

    if extractx(DEINTEXTFELD, "(KW\s)(\d+)", "$2") > 0 then "Ja" else "Nein" end 

    ob es in deinem Textfeld ein "KW" mit einem folgenden Leerzeichen und anschließend einer (oder mehrerer) Zahlen gibt.

    Das Funktionsfeld würde jetzt "Ja" ausgeben.... oder dann halt im nächsten Schritt via replace den String "KW 8" durch die aktuelle KW zu ersetzen.

    let myKW := week(date(today()));
    if extractx('Text 2', "(KW )(\d+)", "$2") > 0 then
    replace('Text 2', "KW " + extractx('Text 2', "(KW )(\d+)", "$2"), "KW " + myKW)
    else
    "Keine KW im Text gefunden"
    end

     

    Um bei deinem Duplizieren zu bleiben:

    let my := this;
    let myKW := week(date(today()));
    let new := duplicate(this);
    new.(Auftragsdatum := date(today()));
    new.(Lieferdatum := date(today()));
    if extractx(Beschreibung, "(KW\s)(\d+)", "$2") > 0 then
    new.(Beschreibung := replace(Beschreibung, "KW " + extractx(Beschreibung, "(KW )(\d+)", "$2"), "KW " + myKW))
    end;
    let newsub := for i in 'Sub-Aufträge'['Aufträge' = my] do
    duplicate(i);
    i.('Aufträge' := new);
    i.(Rechnung := 0);
    i.(Lieferdatum := 0)
    end;
    popupRecord(new)

     

    Kurz zur Erklärung der RegEx Befehle im extractx

    Du suchst nach einem KW mit folgendem Leerzeichen (\d) und einer oder mehrerer Zahlen (\d+). Außerdem sind die beiden Suchbegriffe in zwei Gruppen aufgeteilt - einmal das (KW\s) und die beiden Zahlen (\d+). In der extractx-Funktion fragen wir nur die zweite Gruppe ab ($2)

    • Sprecher
    • info.23
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Das klappt wunderbar so und ist auch noch so beschrieben, dass ich das Prinzip verstehe und vielleicht in anderen Fällen einsetzen kann. 

    Vielen lieben Dank!!

    • T_Bartzsch
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Gern. Reguläre Ausdrücke sind echt gut zu gebrauchen für viele Anwendungsfälle. Ich schaue immer auf https://regex101.com/ ob - und wie - das Konstrukt funktioniert und übernehme das dann in Ninox. Gerade auch die Möglichkeit einzelne Gruppen anzusprechen (Klammern, "$1", "$2" usw... ) finde ich echt hilfreich