0

3 Tabellen verknüpfen

Sorry dass ich nochmal nachhake aber vielleicht helfen screenshots beim Verständnis:

 

Ich möchte nun für jede Rezeptur wissen welche Moleküle zu welchen % enthalten sind. Wie bekomme ich die Ansicht der Moleküle in die Rezepturen? Any Ideas?

12 Antworten

null
    • Leonid_Semik
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Ich weiß Nicht ob die Namen genauso bei dier heißen, aber vielleicht si ähnlich:

    als Funktionsfeld:

    ---

    let me := this;
    let myFactor := sum(Materials_used_in_recipe.Materials.Molecules_used_in_materials.Volumenprozent) / 100;
    let myArr := unique(Materials_used_in_recipe.Materials.Molecules_used_in_materials.Molecules);
    let myArr2 := for i in myArr do
    i.'Molecules name' + " - " + sum(i.Molecules_used_in_materials[cnt(Materials.Materials_used_in_recipe[Recipes = me]) != 0].Volumenprozent) / myFactor
    end;
    join(myArr2, "
    ")

    ----

    Das Feld muss mindestens zwei Spalten hoch gezogen werden damit die Werte untereinander liegen

     

    Leo

    • chemdata
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Lieber Leo, vielen Dank, das werde ich ausprobieren ... darf ich nur kurz zum generellen Verständnis nachfragen: Die Tabellenbezeichnungen müssen jeweils Namen haben ohne Leerzeichen, verstehe ich das richtig, und deswegen hast Du alles mit Unterstrich verbunden? Das ist momentan leider noch nicht der Fall, kann sein das ich schon daran scheitere. Setze das mal neu auf und melde mich dann noch mal! Danke schon jetzt für's drüberschauen...

    • chemdata
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Er hängt noch bei den Molecules, siehe Screenshot:

    • chemdata
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Lieber Leo, Ich stehe noch auf dem Schlauch, bin bei den NX-Befehlen ein blutiger Anfänger...

    Wenn

    let myArr := unique(Materials_used_in_recipe.Materials.Molecules_used_in_materials.Molecules) jetzt z.B. die Werte 2,3,1,7,5 ausgibt,

    was macht dann die Schleife

    let myArr2 := for i in myArr do
    i.'Molecules name' + " - " + sum(i.Molecules_used_in_materials[cnt(Materials.Materials_used_in_recipe[Recipes = me]) != 0].Volumenprozent) / myFactor
    end

    • Leonid_Semik
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo chemdata,

    myArr gibt eine Reihe der IDs der Tabelle Molecules, welche in deinem Material vorkommen, dabei werden die Dopplungen ignoriert. Die Schleife nimmt dann jedes Molekül und schreib den Namen und das Volumen rein. In deiner DB sollte dann die Formel vielleicht so aussehen:

    ---

    let me := this;
    let myFactor := sum(Materials_used_in_recipe.Materials.'Zusammensetzung molekular'.Volumenprozent) / 100;
    let myArr := unique(Materials_used_in_recipe.Materials.'Zusammensetzung molekular'.Molecules);
    let myArr2 := for i in myArr do
    i.Molecule + " - " + sum(i.VORKOMMEN[cnt(Materials.Materials_used_in_recipe[Recipes = me]) != 0].Volumenprozent) / myFactor
    end;
    join(myArr2, "
    ")

    ---

    Leo

    • chemdata
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Leo, Du bist ein Genie!

    Habe es dank Deiner Hilfe jetzt hinbekommen, musste noch ein paar Namen ändern, aber nun läuft es...und ich habe auch verstanden wie es geht.

    Das einzige Problem ist wenn ich jetzt die Materialmengen ändere, dann berechnet das Skript nicht automatisch die neuen Anteile.

    Kann ich das mit einem Berechnungs-Button händisch anschieben? Wie macht man so etwas? Oder kann man an das Skript noch was dranhängen was eine automatische Rekalkulation anschiebt sobald irgend ein Wert sich ändert?

    Vielen vielen Dank Dir!

    • chemdata
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Never mind, ich war zu voreilig, hatte noch einen Fehler drin, inzwischen funktioniert es aber super!

    Eine letzte Frage hätte ich aber noch - gibt es einen Weg, diese Ergebnisse jetzt wiederum automatisch in eine neue Tabelle zu übertragen, d.h. die tatsächlich vorkommenden Moleküle und deren Prozentuale Vorkommen in jeweils eine separate Spalte zu schreiben?

    • Leonid_Semik
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo chemdata,

    Ninox kann keine Spalten  per skript erstellen erstellen. Ich würde in diesem Fall noch eine Tabelle Molecules_used_in_recipes erstellen  und diese dann per Button aktualisieren. Aus der Tabelle recipes:

    etwa so:

    ---

    delete Molecules_used_in_recipes;
    let me := this;
    for i in Materials_used_in_recipe do
    for j in i.Materials.'Zusammensetzung Molekular' do
    if cnt(Molecules_used_in_recipes[Molecules = j.Molecules]) = 0 then
    let new := (create Molecules_used_in_recipes);
    new.(Recipes := me);
    new.(Molecules := j.Molecules);
    new.(Volumenprozent := j.Volumenprozent / 100 * i.Volumenprozent)
    else
    let my := first(Molecules_used_in_recipes[Molecules = j.Molecules]);
    let myVol := my.Volumenprozent;
    my.(Volumenprozent := j.Volumenprozent / 100 * i.Volumenprozent + myVol)
    end
    end
    end

    ---

    Leo

    • chemdata
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Leo, this works like a charm! Allerdings spuckt mir die neue Tabelle jetzt die Ninoxinterne ID des Moleküls aus, nicht dessen Namen. Um das Feld jetzt noch mit dem NAMEN des Moleküls zu versehen schaffe ich einfach nicht. Ich verstehe zwar den prinzipiellen Rahmen des Skripts, wir loopen durch alle Materialien des Rezepts (i) und deren molekulare Zusammensetzungen (j), wenn er ein NEUES Molekül finden schreibt er es mitsamt Volumenprozent in die neue Tabelle Molecules_used_in_recipes (aber eben mit ID statt mit Namen) und wenn er ein Molekül findet was er schon in der Tabelle hat addiert er die Volumenprozente dazu - sehr sehr schick, und es läuft einwandfrei.

    Nur wie bekomme ich jetzt die Namen zu den IDs da noch rein? Ich stehe schon wieder auf dem Schlauch...

    Und was noch toll wäre: wenn ich jetzt in der Tabelle Molecules einen ZIELWERT für jedes Molekül eingebe, und in der Tabelle Molecule_used_in_recipes dann die Abweichung ISTWERT von ZIELWERT anzeigen lassen kann. So zum Beispiel um zu kontrollieren ob der Alkoholprozentsatz unter bzw. über einem gewissen Limit liegt. Ich mache sicherheitshalber noch zwei Screenshots. Dein Calculate-Button-Skript habe ich mit meinen Namen versehen, es lautet jetzt:

    delete Molecules_used_in_recipe;
    let me := this;
    for i in Materials_used_in_recipe do
    for j in i.Materials.Molekularzusammensetzung do
    if cnt(Molecules_used_in_recipe[Molecule = j.Molecules]) = 0 then
    let new := (create Molecules_used_in_recipe);
    new.(Recipes := me);
    new.(Molecule := j.Molecules);
    new.(Volume := j.Volume / 100 * i.Volume)
    else
    let my := first(Molecules_used_in_recipe[Molecule = j.Molecules]);
    let myVol := my.Volume;
    my.(Volume := j.Volume / 100 * i.Volume + myVol)
    end
    end
    end

    • chemdata
    • vor 3 Jahren
    • Gemeldet - anzeigen
    • Leonid_Semik
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Schreib bei der Spalte Molecule in Funktion statt Molecules --> Molecules.Molecule;

    für Zielwert --> Molecules.Zielwert

    dementspechend fürs Resultat : Molecules.Zielwert-Volume

     

    Leo

    • chemdata
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Kann ich Dir irgendwie ein Bier spendieren? ** Glücklich ** it works! Dank Dir lerne ich auch allmählich einzelne Programmierschritte selbst zu schreiben. Wirklich toll, Danke