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
-
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
-
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...
-
Er hängt noch bei den Molecules, siehe Screenshot:
-
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 -
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
-
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!
-
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?
-
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
-
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 -
-
Schreib bei der Spalte Molecule in Funktion statt
Molecules --> Molecules.Molecule;
für Zielwert -->
Molecules.Zielwert
dementspechend fürs Resultat : Molecules.Zielwert-Volume
Leo
-
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
Content aside
- vor 3 JahrenZuletzt aktiv
- 12Antworten
- 353Ansichten