Seite 1 von 1

Was mache ich falsch bei ws_set, get und compare

Verfasst: 06 Okt 2009 16:12
von ath
Hallo,

was treibt ws_compare eigentlich genau? Vergleicht er den exakten Inhalt einer "Variablen" oder wird nur überprüft, ob die Variable initialisiert ist?

Folgendes Beispiel:

%ws_setmem[1]=%avgval_mpast[2~01~0000]%%
soll die durchschnittliche Temperatur des Monats Januar speichern.

Mit %ws_getmem[1]% kontrolliere ich das Ergebnis und bin erstmal zufrieden - der Wert wird ausgegeben (6,5). Jetzt vergleiche ich %ws_compare[6]=-255~%ws_getmem[1]%~Variable ist gesetzt~Variable ist nicht gesetzt% und erhalte als Antwort: "Variable ist gesetzt". Im nächsten Schritt probiere ich %ws_compare[6]=-255~7,5~Variable ist gesetzt~Variable ist nicht gesetzt% und erhalte wieder "Variable ist gesetzt".

Mache ich da was falsch?

Verfasst: 06 Okt 2009 19:08
von joergeli
Hallo ath,
%ws_compare[6]=-255~%ws_getmem[1]%~Variable ist gesetzt~Variable ist nicht gesetzt% und erhalte als Antwort: "Variable ist gesetzt". Im nächsten Schritt probiere ich %ws_compare[6]=-255~7,5~Variable ist gesetzt~Variable ist nicht gesetzt% und erhalte wieder "Variable ist gesetzt".
Ergebnis ist m.E. korrekt, da:

ws_compare[6] vergleicht w1 <> w2, also ob Wert1 ungleich Wert2 ist.
%ws_compare[6]=1~2~ja~nein%

Wenn man Deine Werte einsetzt:
%ws_compare[6]=-255~6,5~ja~nein%
%ws_compare[6]=-255~7,5~ja~nein%

kommt als Ergebnis jedesmal "ja", bzw. "Variable ist gesetzt" heraus,
da ja -255 <> 6,5 (bzw. 7,5).

Auszug aus der WsWIN-Hilfe:
"Wenn eine Speichervariable (1..32) keine Daten enthält, d.h. noch nicht verwendet wurde, gibt sie als Wert –255 zurück.

Beispiel: Abfrage ob Variable 10 gesetzt wurde:
%ws_compare[6]=-255~%ws_getmem[10]%~Variable wurde zugewiesen~Variable noch nie benutzt%"


Wenn eine Speicher-Variable im Bereich von 1...32 noch keinen Wert erhält, gibt sie also -255 zurück.
Beim anschließenden compare[6]:
%ws_compare[6]=-255~-255~ja~nein%
käme also "nein" (bzw. "Variable ist nicht gesetzt") heraus, da -255 nicht ungleich -255 ist.

In Deinem Fall ist als Wert aber zum Einen 6,5 und zum Anderen 7,5 enthalten, somit -255<>w1, ergo "Variable ist gesetzt".

Nebenbei:
Das manuelle Einsetzen eines Wertes (7,5) - was in anderen Fällen zum Testen durchaus sinnvoll ist - bringt hier nichts,
da Du ja wissen möchtest, ob eine Speicher-Variable gesetzt ist.
Setz anstelle von 7,5 mal -255 ein, dann bekommst Du als Ergebnis "Variable ist nicht gesetzt",
Du hast damit aber keine Aussage, ob und welche Speicher-Variable "nicht gesetzt" ist.

Ich hoffe, ich konnte es einigermassen rüberbringen :wink:



Gruß
Jörg

Verfasst: 06 Okt 2009 19:38
von ath
Hallo Jörg,

danke für Deine Antwort. Wenn ich es richtig verstehe, dann hat der Index 6 bei ws_compare eine besondere Bedeutung. Nun gut, ich habe ihn gegen die 1 ausgetauscht - allerdings ändert das am Ergebnis (zumindest in meinem Beispiel) nichts.

Irgendwie habe ich da noch ein Brett vor´m Kopf.

Verfasst: 06 Okt 2009 20:05
von joergeli
Hallo ath,
... dann hat der Index 6 bei ws_compare eine besondere Bedeutung
Nein, nicht der Index 6 hat eine besondere Bedeutung,
sondern dieser Satz aus der WsWIN-Hilfe:
"Wenn eine Speichervariable (1..32) keine Daten enthält, d.h. noch nicht verwendet wurde, gibt sie als Wert –255 zurück."
Mit anderen Worten: Bei nicht gesetzter Speicher-Variable ist trotzdem ein Wert von -255 enthalten.
Auf Vorhandensein exakt dieser -255 wird mit compare[6] verglichen.
Nun gut, ich habe ihn gegen die 1 ausgetauscht ...
Mit compare[1] (Wert1 größer Wert2) wird es nicht funktionieren:
Vergleich w1 > w2: %ws_compare[1]=1~2~ja~nein%

Dein Beispiel:
%ws_compare[1]=-255~%ws_getmem[1]%~ja~nein%
%ws_compare[1]=-255~6,5~ja~nein% (ws_getmem[1] gibt bei Dir 6,5 aus)
Ergebnis "nein", da -255 nicht größer ist, als 6,5

Angenommen Speicher-Variable 1 ( bzw. ws_setmem[1] ) ist noch nicht gesetzt, dann enthält sie aber trotzdem den Wert -255.
%ws_compare[1]=-255~-255~ja~nein%
Ergebnis wieder "nein", da -255 zwar gleich -255 ist, aber eben nicht größer ist als -255.
____________________________________________________________

Funktionieren würde es m.E. aber mit Index 3, also Wert1 = Wert2:
Vergleich w1 = w2 : %ws_compare[3]=1~2~ja~nein%
%ws_compare[3]=-255~%ws_getmem[1]%~ja~nein%
%ws_compare[3]=-255~6,5~ja~nein%
Ergebnis "nein", da -255 nicht gleich 6,5

Bei nicht gesetzter Speicher-Variable:
%ws_compare[3]=-255~-255~ja~nein%
Ergebnis "ja", da -255 gleich -255


Nebenbei:
Bei Deinem Beispiel (mit Index 6) wird als Ergebnis immer "Variable ist gesetzt" herauskommen,
da Du sie ja vorher mit %ws_setmem[1]% wirklich gesetzt hast.
Laß also den Index 6 drin.
Warum willst du denn überhaupt prüfen, ob eine Speicher-Variable gesetzt ist,
oder geht's nur um das Verständnis ?

Gruß
Jörg

Verfasst: 06 Okt 2009 21:43
von weneu
Hallo,
@Andreas
Kann es sein, dass Du noch nicht bemerkt hast, dass die verschiedenen Werte bei ws_compare (von 1 - 6) unterschiedliche Vergleiche durchführen?
Sonst müsstest Du eigentlich die Ausführungen von Jörg verstanden haben.

Verfasst: 07 Okt 2009 05:36
von ath
weneu hat geschrieben:Hallo,
@Andreas
Kann es sein, dass Du noch nicht bemerkt hast, dass die verschiedenen Werte bei ws_compare (von 1 - 6) unterschiedliche Vergleiche durchführen?
Hallo Werner,

korrekt. Jetzt habe ich nochmal in Deiner Hilfe auf Seite 46 nachgelesen und sollte bestimmt weiterkommen.

Mein Ziel ist es, eine Statistik ähnlich "longtimecalculated" nach zu empfinden. Dazu muß ich u. a. zählen, wieviele Werte ich addiert habe. Da %avgval_mpast[2~01~-050]% bspw. keinen Wert - also Leer - liefern würde, könnte ich mit einem Vergleich gegen Leer, einen Zähler erhöhen oder nicht.

Ich weis, in dieser Richtung liegt wegen der ganzen ~%[] der Wahnsinn.

Soweit ich weis, gibt es aber keine andere Möglichkeit für "longtimecalculated" oder "monthlongtime" als die Standardgraphik. Sollte es da Variablen geben, die das Ergebnis direkt liefern wäre ich natürlich für jeden Hinweis dankbar.

Verfasst: 07 Okt 2009 06:50
von joergeli
Moin Andreas,
Mein Ziel ist es, eine Statistik ähnlich "longtimecalculated" nach zu empfinden. Dazu muß ich u. a. zählen, wieviele Werte ich addiert habe. Da %avgval_mpast[2~01~-050]% bspw. keinen Wert - also Leer - liefern würde, könnte ich mit einem Vergleich gegen Leer, einen Zähler erhöhen oder nicht.
Das wiederum habe ich jetzt nicht ganz verstanden :wink:
Beim longtimecalculated.gif werden ja z.B. die durchschnittlichen Monats-Temperaturen für eine Anzahl von Jahren, bezogen auf den jeweiligen Monat, ausgegeben.
Anders ausgedrückt: z.B. der Januar im Zeitraum von 1999 bis 2005 hatte xx °C Durchschnittstemperatur.

Du könntest doch die Durchschnitts-Monatstemperatur für den Januar jedes einzelnen Jahres ermitteln lassen.

%avgval_mpast[2~01~1999]%
%avgval_mpast[2~01~2000]%
%avgval_mpast[2~01~2001]%
etc.

Diese Werte müssen natürlich mit ws_setmem zwischengespeichert werden.

Dann addierst Du diese Werte und dividierst sie anschl. durch die Anzahl der Jahre (mit der Variablen ws_calc )


Das würde m.E. mit WsWIN-Bordmitteln m.E. aber ein ziemlicher "Aufriß" werden, weil man ja immer mit ws_setmem zwischenspeichern muss
und die anschl. Addition und Division mit den entspr. ws_getmem-Variablen vornehmen muss.

Ich würde sagen, für diese Aufgabe ist m.E. dann besser ein Tabellenkalkulationsprogramm geeignet,
d.h. die Daten aus WsWIN exportieren und die Berechnungen dann z.B. mit Excel vornehmen.

Ich bin mir aber nicht sicher, ob ich dein Problem richtig verstanden habe.
Falls nein, schreib doch mal genau, was Du möchtest, bzw. skizzier mal eine Tabelle, wie Du sie Dir vorstellst.

Gruß
Jörg

Verfasst: 07 Okt 2009 09:36
von ath
Hallo Jörg,

das hast Du prinzipiell schon richtig verstanden.

Das Ermitteln der Monatsdurchschnittswerte ist nicht das Problem. Um aber den Durchschnitt der Monatswerte zu errechnen muß ich wissen, wieviele Werte ich vorher addiert habe. Deswegen die Prüfung auf "leer".

Nun könnte ich - wie Du vorgeschlagen hast - die Werte von 1999 bis 2009 addieren und dann durch 10 teilen, weil ich ja weis, daß ich 10 Jahre habe. Das ist aber in meinen Augen Datenverarbeitung zu Fuß und im nächsten Jahr müßte ich das Template wieder anpassen um das Jahr 2010 zu integrieren. Das macht keinen Spaß.

Excel ist für mich keine Lösung, da ich damit meine Internetseiten nicht automatisch aktualisieren kann. Außerdem ist der Datenexport von WsWIN nach Excel nach wie vor Krampf - es geht, aber komfortabel ist anders.

Verfasst: 08 Okt 2009 08:08
von joergeli
Hallo Andreas,
Nun könnte ich - wie Du vorgeschlagen hast - die Werte von 1999 bis 2009 addieren und dann durch 10 teilen, weil ich ja weis, daß ich 10 Jahre habe. Das ist aber in meinen Augen Datenverarbeitung zu Fuß und im nächsten Jahr müßte ich das Template wieder anpassen um das Jahr 2010 zu integrieren. Das macht keinen Spaß.

Excel ist für mich keine Lösung, da ich damit meine Internetseiten nicht automatisch aktualisieren kann. Außerdem ist der Datenexport von WsWIN nach Excel nach wie vor Krampf - es geht, aber komfortabel ist anders.
Naja, daß "durch 10 teilen" sollte natürlich automatisiert mit ws_calc ablaufen.
Template anpassen kommt ja nur ein Mal im Jahr vor und ist m.e. kein allzu großer Aufwand.
Wenn man allerdings Perfektionist ist ... :wink:

In punkto Excel gebe ich Dir Recht, ist halt nur manuell zu bewerkstelligen.

In der ws_variables.txt habe habe ich noch folgende Passage über das Speichern/Lesen von Variablen in/aus einer Datei ( ws_store.cfg ) gefunden.
Evtl. vereinfacht daß das Zwischenspeichern der Variablen (bis zu 999):

------------ Variablen in Datei speichern bzw. von dort holen ---------
xxx = 1 ... 999
Kommentar zur Var xxx %varstore_writer[xxx~remark]%
Sichern in Datei %varstore_write[xxx~text]%
Lesen aus Datei %varstore_read[xxx]%

Bemerkung zu Var 9 %varstore_writer[9~^season_min[0~21122007~20032008]^]%
Sichern Season Daten %varstore_write[9~%season_min[0~21122007~20032008]%]%
Lesen Text %varstore_read[9]%

Wenn Sie bei ..._writer[... eine Variable speichern wollen, ersetzen Sie das
Prozent durch "^" bzw. das Programm macht das automatisch für Sie.
Wenn Sie diese Variable dann wieder lesen mit ..._readr[... ersetzt Wswin die "^"
durch Prozent und ersetzt beim Abarbeiten eben diese "zurückgeholte" Variable mit den
ermittelten Daten.
Sie können das für eine dynamische Aktualisierung nutzen.
-------------------------------------------------------


Gruß
Jörg