11-07-2024 07:40 AM
Ich habe versucht diese Sequenz aus Diadem 8 auf Diadem 2017 umzuschreiben. In Abhängigkeit vom Vorzeichen von M01 sollen Berechnungen durchgeführt werden.
ch(fxp) := (ch(M01)>=0)*(ch(M01)*2+ch(M02)*7;
ch(fxn) := (ch(M01)<0)*(ch(M01)*8+ch(M02)*4;
ch(Fx) := (ch(fxp)+ch(fxn));
Mit der unteren Sequenz erhalte ich den Fehler „Die Variable verwendet einen Automatisierungstyp, der von VBScript nicht unterstützt wird“ (Zeile 10, Spalte 1, erste If-Anweisung). Ich weiß nicht wie ich der Variablen „ifwert“ den Wert des Kanals M01 zuweisen kann. Ich könnte auch auf die Variable verzichten, wenn die If-Anweisung direkt den Wert des Kanals M01 akzeptieren würde, wie in Diadem 8. Kann mir jemand hierbei helfen?
Vielen Dank, Christian
Option Explicit 'Erzwingt die explizite Deklaration aller Variablen in einem Script.
Dim ifwert
Ifwert = Ch("[1]/M01")
If (ifwert >= 0) Then
Call Calculate("Ch(""[1]/fxp"") = Ch(""[1]/M01"")*2+Ch(""[1]/M02"")*7")
End If
If (ifwert < 0) Then
Call Calculate("Ch(""[1]/fxn"") = Ch(""[1]/M01"")*8+Ch(""[1]/M02"")*3")
End If
Call Calculate("Ch(""[1]/Fx"") = Ch(""[1]/fxp"")+Ch(""[1]/fxn"")")
11-08-2024 07:34 AM
Die Überschrift des Threads ist mißverständlich und vielleicht auch der Grund, warum die Umsetzung nicht funktioniert. Wenn der Wert eines Kanals einer Variablen zugewiesen werden soll, dann lautet die Syntax für den ersten Wert des Kanals M01 in der ersten Kanalgruppe:
Ifwert = Data.Root.ChannelGroups(1).Channels("M01").Values(1)
Nur mit dieser Syntax macht der anschließende Vergleich "If (ifwert >= 0)" dann auch Sinn.
Geht es tatsächlich um die Zuweisung eines Kanalobjekts an eine Variable, sähe das so aus:
set objKan = Data.Root.ChannelGroups(1).Channels("M01")
11-11-2024 01:45 AM
Guten Morgen,
vielen Dank für die Antwort. Es geht tatsächlich um die Zuweisung aller Werte des Kanals M01 an die Variable Ifwert. Für jeden Wert von M01 soll entschieden werden, mit welcher Formel gerechnet wird. Das hat in Diadem 8 sehr einfach funktioniert.
Mit dem Befehl "set objKan = Data.Root.ChannelGroups(1).Channels("M01")" bekomme ich die Fehlermeldung
"das Argument ist nicht optional".
Die Variante mit dem ersten Wert von M01 funktioniert, ist aber hier nicht zielführend.
VG
Christian
Option Explicit 'Erzwingt die explizite Deklaration aller Variablen in einem Script.
Dim objKan
' Variable objKan nimmt den Wert des Kanals M01 an
set objKan = Data.Root.ChannelGroups(1).Channels("M01")
' Berechnungen durchführen
If (objKan >= 0) Then
Call Calculate("Ch(""[1]/fxp"") = Ch(""[1]/M01"")*2+Ch(""[1]/M02"")*7")
End If
If (objKan < 0) Then
Call Calculate("Ch(""[1]/fxn"") = Ch(""[1]/M01"")*8+Ch(""[1]/M02"")*3")
End If
Call Calculate("Ch(""[1]/Fx"") = Ch(""[1]/fxp"")+Ch(""[1]/fxn"")")
11-11-2024 05:29 AM - edited 11-11-2024 05:30 AM
Nun, alle Werte eines Kanals können nicht einer einzelnen Variable zugewiesen werden, es sei denn, es handelt sich um eine Objekt- oder Array-Variable. Der Vergleich mit einem Einzelwert funktioniert wiederum nur mit dem einzelnen Kanalwert:
set objKan = Data.Root.ChannelGroups(1).Channels("M01")
If (objKan.Values(i) >= 0) Then ...
wobei i der Index des Kanalwerts ist, der Werte 1 bis Kanallänge (objKan.Properties("length").Value) annehmen kann.
11-12-2024 03:32 AM
Danke für die Antwort, ich werde es damit versuchen. Es ist schon ernüchternd, wie viel aufwändiger die Programmierung im Vergleich zu Diadem 8 geworden ist. Da konnte man so eine Aufgabe mit drei Zeilen erledigen, ohne tiefere Programmierkenntnisse.
11-12-2024 05:40 AM
Die Erfahrung aus unseren DIAdem-Schulungen (https://www.mueller-krahmer.de/diadem-schulungen/) besagt in der Tat, daß die objektorientierte Syntax für Anwender ohne tieferen Programmierhintergrund nicht so einfach zu handhaben ist. Allerdings vereinfacht sich der Umgang mit dieser Syntax deutlich, wenn man benötigte Elemente konsequent per Drag&Drop aus dem Datenportal erzeugt oder das Autovervollständigen im Script-Editor nutzt.