0

Keyword 'this' (Scripting)

(For English version see next post)

 

Hallo zusammen,

 

ich habe eine Frage zum Scripting, konkret zum Keyword 'this'. Bisher war ich der Meinung, 'this' gäbe mir den aktuellen Datensatz zurück, wäre also identisch mit 'record(AktuelleTabelle,Nr)'. Dem scheint aber nicht so zu sein.

Es lässt sich an folgendem Beispiel nachvollziehen. Firma ist dabei eine Tabelle mit Referenz auf sich selbst über das Feld 'Übergeordnete Firma'. Folgende Formel wirft den Fehler, dann und sonst lieferten unterschiedliche Datentypen zurück:

let currentFirma := this;
currentFirma := currentFirma.'Übergeordnete Firma'

Passt man die Formel aber folgendermaßen an, funktioniert sie:

let currentFirma := record(Firma,Nr);
currentFirma := currentFirma .'Übergeordnete Firma'

Kann mir eventuell jemand den Unterschied erklären? (Je detailierter, umso besser, diese Erkenntnis hat mich viele Stunden und komplizierte Workarounds gekostet.)

 

Gruß

Sebastian

9 Antworten

null
    • Sebastian_Werner
    • vor 5 Jahren
    • Gemeldet - anzeigen

    (das ganze nochmal auf englisch)

     

    Greetings,

     

    I've got a question regarding scripting, specifically about the keyword 'this'. Until now I was under the impression that 'this' would return the current record, just like 'record(CurrentTable,Nr)'. That does not seem to be the case.

    It can be reproduced with the following example. Company is a table that references itself by the field 'Parent Company'. The following formula throws the error that then and else return different data types:

    let currentCompany := this;
    currentCompany := currentCompany.'Parent Company'

    After changing the formula to the following, it works:

    let currentFirma := record(Company,Nr);
    currentCompany := currentCompany.'Parent Company'

    Can someone explain the difference to me? (The more detailed, the better. This insight has cost me many hours and complicated workarounds.)

     

    regards

    Sebastian

    • Ninox-Professional
    • planoxpro
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo, versuch's mal mit 'let currenCompany := this.nr'.

    • Sebastian_Werner
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Gerade ausprobiert. Auch diese Version verursacht das selbe Problem:

    let currentFirma := this.Nr;
    currentFirma := currentFirma.'Übergeordnete Firma'

    Mit record funktioniert es ja und ich werde es zukünftig entsprechend verwenden. Mich interessiert eigentlich nur, wo der Unterschied liegt bzw. was genau mit 'this' eigentlich zurück gibt.

    • Sebastian_Werner
    • vor 5 Jahren
    • Gemeldet - anzeigen

    (Aus irgendeinem Grund wird meine Code-Formatierung zumindest beim Posten mit Google Chrome nicht übernommen.)

    • Leonid_Semik
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Sebastian,

    erlich gesagt, verstehe ich dein Code gar nicht. Wenn du die Firma mit sich selbst verknüpfen möchtest, dann reicht so ein Code:

    —-

    'Übergeordnete Firma':=this

    —-

    Leo

    • Sebastian_Werner
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Leo,

    das Beispiel ist Teil eines größeren, komplexeren Scripts und befindet sich dort innerhalb einer Schleife. Ein einfaches 'Übergeordnete Firma':=this ist dort nicht ausreichend, da ich durch eine Baumstruktur bis zum obersten Datensatz navigieren muss.

    Der Vollständigkeit halber hier der gesamte Code (zur Ermittlung des vollständigen Namens einer Abteilung oder Tochtergesellschaft):

    let fullName := Name;
    let currentFirma := record(Firma,Nr);
    for i from 0 to cnt(select Firma) do
    if currentFirma.'Übergeordnete Firma' != null then
    currentFirma := currentFirma.'Übergeordnete Firma';
    fullName := currentFirma.Name + ", " + fullName
    end
    end;
    fullName

    Ich weiß, die Schleife kann deutlich mehr Durchläufe haben, als nötig. Eigentlich war das als Thema für einen weiteren Foren-Post gedacht. Solange ich keine hardcodierte Limitierung auf z.B. 10 Hierarchiestufen verwenden möchte und es keine Schleifen mit Abbruchbedingung, keine rekursiven Funktionen, keine Berechnungen, die sich selbst referenzieren und keine Trigger, die durch Änderungen von anderen Triggern ausgelöst werden gibt, sehe ich keine andere Lösung.

    Falls jemand einen besseren Ansatz hat, wäre ich sehr daran interessiert.

    • Leonid_Semik
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Mein Vorschlag:

    —-

    let NN=0;

    var fullName:=Name;

    switch cnt('Übergeordnete Firma') do

    case 1:

    (

    let currentFirma:='Übergeordnete Firma';

    while NN<1 do

    fullName:=fullName+", "+currentFirma.Name;

    switch cnt(currenFirma.'Übergeordnete Firma') do

    case 0:

    (NN:=3)

    case 1:

    (

    currentFirma:=currentFirma.'Übergeordnete Firma';

    NN:=0

    )

    end

    end

    )

    end;

    fullName

    —-

    ich hoffe ich habe alles richtig eingetippt, habe momentan nur iphone zur verfügung

     

    Leo

    • Sebastian_Werner
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Leo,

     

    Ich mußte dein Script etwas anpassen, damit es funktioniert hat und habe es dann gleich noch etwas vereinfacht:

    —-

    let fullName := Name;
    let currentCompany := record(Firma,Nr);
    while currentCompany.'Übergeordnete Firma' != null do
    currentCompany := currentCompany.'Übergeordnete Firma';
    fullName := currentCompany.Name + ", " + fullName
    end
    ;
    fullName

    —-

    Der Schlüssel war die while-Schleife. In irgendeinem Script hatte ich schonmal eine gesehen, als ich aber vor ein Paar Tagen auf der Suche nach der Syntax nichts gefunden hatte, dachte ich, ich hätte mich geirrt und es gäbe doch keine.

     

    Ich danke dir vielmals!
    Das Script sollte jetzt auch mit sehr großen Datenbeständen performant laufen.

     

    Gruß
    Sebastian

    • Leonid_Semik
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Sebastian,

    klasse, deine Version ist halb so lang als meine. Werde damit versuchen die Stammbaumdatenbank aufzuhübschen.

    Leo

Content aside

  • vor 5 JahrenZuletzt aktiv
  • 9Antworten
  • 3875Ansichten