Code: Alles auswählen
! Feiertagsberechnung - Complete-V3.01 von Petrus (03-2018)
! Changelog:
! - Daten der Feiertage werden "nur 1x" im Jahr berechnet
! Ausnahme: Sobald ueber die SV neue, eigene Daten hinzugefuegt werden,
! erfolgt beim naechsten Scriptaufruf eine erneute Berechnung
! - Die berechneten Daten werden chronologisch sortiert und in den SVs abgelegt
! => Daten koennen damit z.B. in anderen Programmen ausgewertet werden
! - Berechnungen komplett ueberarbeitet => Gueltigkeit bis zum Jahr 2199
! - Auswertungen erfolgen mit Jahrestagen statt mit Datumsangaben => kompakteres Programm
! - V3.01: Falsches Format bei der Ermittlung der aktuellen Tageszahl korrigiert
! ==============================================================================
! Systemvariable Nr.1 und Nr.2 vom Typ: Logikwert
! Name-Nr.1/2 (Default): Feiertag-Heute / Feiertag-Morgen
! Werte: true/false = Ja/Nein
! ==============================================================================
string sv_Bool = "Feiertag-Heute,Feiertag-Morgen";
!
! ==============================================================================
! Systemvariable Nr.3 und Nr. 4 vom Typ: Zeichenkette
! Name-Nr.3 (Default): "Feiertag-Daten" Bedeutung: SV fuer die berechneten Jahrestage der Feiertage
! Name-Nr.4 (Default): "Feiertag-Eigene" bedeutung: SV fuer eigene Feiertagsdaten
!
! Moegliche Werte fuer SV-Nr.4:
! Datum (XX.XX. oder X.X.) oder mit Differenzangabe zum Ostersonntag (OS), 1.Advent (AD) oder Muttertag (MT)
! Beispiele: "OS-48=Rosenmontag;MT+0=Muttertag;AD-11=Buß- und Bettag"
! Trennzeichen zwischen den einzelnen Daten ist das Semikolon.
! ==============================================================================
string sv_Daten = "Feiertag-Daten,Feiertag-Eigene";
! ==============================================================================
! Systemvariable Nr.5 und Nr.6 vom Typ: Werteliste
! Name-Nr.5/6 (Default): Feiertag-Heute-Name / Feiertag-Morgen-Name
! Werte: Namen der Feiertage chronologisch zu den in SV-Nr.3 gespeicherten Daten
! ==============================================================================
string sv_Name = "Feiertag-Heute-Name,Feiertag-Morgen-Name";
! ============================================================================
! Scriptvariable Nr. 1
! Bedeutung: Die Feiertagsliste mit Datum und Name
! Werte: Datum (XX.XX. oder X.X.) oder mit Differenzangabe zum Ostersonntag (OS), 1.Advent (AD) oder Muttertag (MT)
! Trennzeichen zwischen den einzelnen Daten ist das Semikolon.
! ============================================================================
string s_Feiertage = "01.01.=Neujahr;03.10.=Tag der deutschen Einheit;OS-2=Karfreitag;OS+1=Ostermontag;OS+50=Pfingstmontag;OS+39=Christi Himmelfahrt;25.12.=1. Weihnachtsfeiertag;26.12.=2. Weihnachtsfeiertag;01.05.=Erster Mai;01.11.=Allerheiligen;OS+60=Fronleichnam
";
! ============================================================================
! Scriptvariable Nr. 2
! Bedeutung (b_debug): Zum testen des Scripts in der Testumgebung der WebUI
! kann die DEBUG-Funktion aktiviert werden. Daten werden
! dann neu berechnet und gespeichert. Ausgaben erfolgen
! ausschliesslich in der WebUI.
! SV's Nr.1 und 2 werden nicht veraendert!
! Default : false
! Werte : true (Funktion ein) ; false (Funktion aus)
! Scriptvariable Nr. 3
! Bedeutung (s_today): Ist die DEBUG-Funktion aktiviert, dann wird ausschliesslich
! das angegebene Datum "s_today" als Referenzdatum fuer die
! Ermittlung eines Feiertages verwendet.
! Wert : beliebiges Datum
! Format: JJJJ-MM-TT
! Scriptvariable Nr. 4
! Bedeutung (b_CheckSVs): Falls aktiviert, werden die benoetigten Systemvariablen
! ggf. automatisch in der CCU angelegt und, sofern bereits
! vorhanden, auf den korrekten Typ hin ueberprueft.
! Werte : true (Funktion ein) ; false (Funktion aus)
! Default : false
! Hinweis : Es ist in der Regel ausreichend, wenn diese Funktion nur bei der
! 1. Anwendung aktiviert und danach wieder deaktiviert wird.
! ============================================================================
boolean b_debug = false;
string s_today = "2018-04-01";
boolean b_CheckSVs = true;
! ****************************************************
! Ab hier Script CODE - Don't change behind this line
! ****************************************************
! *** Systemvariablen pruefen?
object svObjects=dom.GetObject(ID_SYSTEM_VARIABLES);
object svObj; string s_wert1; integer i_wert2=0;
if (b_CheckSVs) {
! SV: Namensliste (Werteliste)
foreach(s_wert1, sv_Name.Split(",")) {
svObj = svObjects.Get(s_wert1);
if (svObj) {
if (svObj.ValueType() != ivtInteger) { WriteLine(s_wert1 # " : ValueSubTyp wrong!"); quit; }
else { if (b_debug) { WriteLine(s_wert1 # " : ValueTyp OK!"); } }
} else {
svObj = dom.CreateObject(OT_VARDP);
svObjects.Add(svObj.ID());
svObj.Name(s_wert1);
svObj.ValueType(ivtInteger);
svObj.ValueSubType(istEnum);
svObj.DPInfo("Feiertagname");
svObj.ValueList("-");
svObj.State(0);
dom.RTUpdate(false);
if (b_debug) { WriteLine(s_wert1 # " : Systemvariable created!"); }
}
}
! SV: Feiertag (Logikwert)
foreach(s_wert1, sv_Bool.Split(",")) {
svObj = svObjects.Get(s_wert1);
if (svObj) {
if (svObj.ValueSubType() != istBool) { WriteLine(s_wert1 # " : ValueSubTyp wrong!"); quit; }
else { if (b_debug) { WriteLine(s_wert1 # " : ValueTyp OK!"); } }
} else {
svObj = dom.CreateObject(OT_VARDP);
svObjects.Add(svObj.ID());
svObj.Name(s_wert1);
svObj.ValueType(ivtBinary);
svObj.ValueSubType(istBool);
svObj.ValueName0("Nein");
svObj.ValueName1("Ja");
svObj.State(false);
svObj.DPInfo("Ist ein Feiertag?");
svObj.ValueUnit("");
dom.RTUpdate(false);
if (b_debug) { WriteLine(s_wert1 # " : Systemvariable created!"); }
}
}
! SV: Datenliste (Zeichenkette)
foreach(s_wert1, sv_Daten.Split(",")) {
svObj = svObjects.Get(s_wert1);
if (svObj) {
if (svObj.ValueType() != ivtString) { WriteLine(s_wert1 # " : ValueTyp wrong!"); quit; }
else { if (b_debug) { WriteLine(s_wert1 # " : ValueTyp OK!"); } }
} else {
svObj = dom.CreateObject(OT_VARDP);
svObjects.Add(svObj.ID());
svObj.Name(s_wert1);
svObj.ValueType(ivtString);
svObj.ValueSubType(istChar8859);
if(i_wert2){svObj.DPInfo("Eigene Feier- und Ereignistage");}else{svObj.DPInfo("Berechnete Jahrestage der Feier- und Ereignistage"); i_wert2=1;}
svObj.ValueUnit("");
svObj.State("");
svObj.Internal(false);
svObj.Visible(true);
dom.RTUpdate(false);
if (b_debug) { WriteLine(s_wert1 # " : Systemvariable created!"); }
}
}
}
! *** Das Jahr
if (b_debug) { integer i_jahr=s_today.StrValueByIndex("-",0).ToInteger(); } else { integer i_jahr=system.Date("%Y").ToInteger(); }
! *** Schaltjahr (SJ) : (ja/nein)=(1/0)
integer SJ=((!i_jahr%400)||((i_jahr%100)&&(!i_jahr%4))).ToInteger();
! *** Jahreszahl heute (s_today)
! Nur bei DEBUG berechnen. Statt: s_today=system.Date(s_today#" 06:00:00").ToTime().Format("%j").ToString(0);
if (b_debug){ integer i_wert1=s_today.StrValueByIndex("-",1).ToInteger();
s_today=((s_today.StrValueByIndex("-",2).ToInteger()+((489*i_wert1)/16)-30)-((7+i_wert1)/10)*(2-SJ)).ToString();
} else {s_today=system.Date("%j").ToInteger().ToString();}
integer i_wert1=s_today.ToInteger();
! *** Jahreszahl morgen (s_tomorrow)
string s_tomorrow="1"; if(i_wert1<(365+SJ)){ s_tomorrow=(i_wert1+1).ToString(); }
! *** SV-Objekte definieren
string s_Obj=sv_Daten.StrValueByIndex(",", 0); string s_Obj2=sv_Daten.StrValueByIndex(",", 1);
svObj=svObjects.Get(s_Obj); object svObj2=svObjects.Get(s_Obj2);
! *** Wenn nicht DEBUG, dann aktuelle Daten aus SV holen.
boolean b_wert1=false; string s_fDaten="";
if (!b_debug) {
if (svObj){
! Wenn Daten bereits im aktuellen Jahr berechnet wurden => keine erneute Berechnung erforderlich => nur Daten aus SV holen.
if (svObj.Value().StrValueByIndex(";", 0).StrValueByIndex("#", 0).ToInteger()==i_jahr){
s_fDaten=svObj.Value();
! Wenn neue, eigene Daten in SV stehen (neuer Zeitstempel) => dann doch Berechnung erneut durchfuehren.
if (svObj2) {if (svObj2.Timestamp().ToInteger() > s_fDaten.StrValueByIndex(";", 0).StrValueByIndex("#", 1).ToInteger()){b_wert1=true;}}
} else { b_wert1=true; }
! Script beenden, wenn SV nicht existiert.
} else { WriteLine(s_Obj # " : Object not found!"); quit; }
}
! *** Berechnungen
string s_wert2;
if ((b_wert1) || (b_debug)) {
! Osterkennziffer (i_wert3) fuer Berechnungen ermitteln
integer i_wert3=(204-(i_jahr%19)*11)%30; i_wert3=120+i_wert3-(i_wert3/27); i_wert1=(i_wert3+((i_jahr*5)/4)-(i_jahr/2100))%7; i_wert3=i_wert3-i_wert1;
! Ostersonntag :Tag :Monat :Jahrestag (OS+0)
i_wert1=1+(i_wert3%31); i_wert2=i_wert3/31; integer OS=i_wert1+59+((i_wert2==4).ToInteger()*31)+SJ; ! Jahrestag (OS+0)
if (b_debug) {WriteLine("\nOstersonntag ist am "#i_wert1.ToString()#"."#i_wert2.ToString()#". und der "#OS.ToString()#". Tag im Jahr "#i_jahr.ToString());}
! Muttertag :Tag im Mai :Jahrestag (MT+0)
i_wert1=8+(i_wert3%7)-(7*(118/i_wert3)); integer MT=i_wert1+120+SJ;
if (b_debug) {WriteLine("Muttertag ist am "#i_wert1.ToString()#".5. und der "#MT.ToString()#". Tag im Jahr "#i_jahr.ToString());}
! 1.Advent :Tag :Monat :Jahrestag (AD+0)
i_wert1=1+((26+(i_wert3%7))%30); i_wert2=12-(i_wert1/27); integer AD=i_wert1+304+((i_wert2==12).ToInteger()*30)+SJ;
if (b_debug) {WriteLine("1. Advent ist am "#i_wert1.ToString()#"."#i_wert2.ToString()#". und der "#AD.ToString()#". Tag im Jahr "#i_jahr.ToString());}
! **Ggf. eigene Feier-/Festtage aus SV ergaenzen
if (svObj2){
if (svObj2.Value()){ s_Feiertage=s_Feiertage#";"#svObj2.Value(); }
s_fDaten=i_jahr.ToString() # "#" # svObj2.Timestamp().ToInteger().ToString();
} else { string s_fDaten=i_jahr.ToString() # "#0"; }
! Daten einlesen, Jahrestage berechnen und merken
string s_fNamen="-";
foreach(s_wert2,s_Feiertage.Split(";")){
! Zeitwert aus Feiertagseintrag holen
s_wert1=s_wert2.StrValueByIndex("=",0);
! Pruefen ob Angabe ein beweglicher Feiertag zu OS,MT,AD ist
i_wert1=((s_wert1.Substr(0,2)=="OS").ToInteger()*OS)+((s_wert1.Substr(0,2)=="MT").ToInteger()*MT)+((s_wert1.Substr(0,2)=="AD").ToInteger()*AD);
! Wenn beweglicher Feiertag => Differenz zum Referenztag (OS,MT,AD) addieren
if (i_wert1) { s_fDaten=s_fDaten # ";" # (i_wert1+s_wert1.Substr(2,s_wert1.Length()-2).ToInteger()).ToString();
} else { ! ...andernfalls normale Datumsangabe: Tages- und Monatswert formatieren...
i_wert1=s_wert1.StrValueByIndex(".",0).ToInteger(); i_wert2=s_wert1.StrValueByIndex(".",1).ToInteger();
s_wert1=((i_wert1+((489*i_wert2)/16)-30)-((7+i_wert2)/10)*(2-SJ)).ToString(); ! ...Jahrestag berechnen
s_fDaten=s_fDaten # ";" # s_wert1; ! ...und zur Datenliste hinzufuegen
}
s_fNamen=s_fNamen # ";" # s_wert2.StrValueByIndex("=",1); ! zugehoerigen Namen zur Namenliste hinzufuegen
}
! *** Daten und Namen chronologisch sortieren ***
i_wert3=0; i_wert1=2; foreach(s_wert1,s_fDaten.Split(";")){i_wert3=i_wert3+1;}
while(i_wert1<i_wert3){ i_wert2 = i_wert1;
if((i_wert2>1) && (s_fDaten.StrValueByIndex(";",i_wert2-1).ToInteger()>s_fDaten.StrValueByIndex(";",i_wert2).ToInteger())){
AD=i_wert2; i_wert2=i_wert2-1;
while((i_wert2>1) && (s_fDaten.StrValueByIndex(";",i_wert2-1).ToInteger()>s_fDaten.StrValueByIndex(";",AD).ToInteger())){i_wert2=i_wert2-1;}
MT=0; s_wert1=""; s_wert2="";
while(MT<i_wert3){
if (MT==i_wert2) {s_wert1=s_wert1#s_fDaten.StrValueByIndex(";",AD)#";"; s_wert2=s_wert2#s_fNamen.StrValueByIndex(";",AD)#";";}
if (MT!=AD) {s_wert1=s_wert1#s_fDaten.StrValueByIndex(";",MT)#";"; s_wert2=s_wert2#s_fNamen.StrValueByIndex(";",MT)#";";}
MT=MT+1;
}
s_fDaten=s_wert1.Substr(0,s_wert1.Length()-1); s_fNamen=s_wert2.Substr(0,s_wert2.Length()-1);
}
i_wert1=i_wert1+1;
}
! *** Daten in die SV schreiben ***
if (svObj){ s_fDaten=s_fDaten#";"; svObj.State(s_fDaten); } else { WriteLine(s_Obj # " : Object not found!"); quit; } ! Script beenden, wenn SV nicht existiert.
! *** Namen in die SV schreiben ***
foreach(s_wert1, sv_Name.Split(",")) {
svObj = svObjects.Get(s_wert1);
if (svObj) { svObj.ValueList(s_fNamen); svObj.State(0); } else { WriteLine(s_wert1 # " : Object not found!"); quit; } ! Script beenden, wenn SV nicht existiert.
}
! *** Bei DEBUG ermittelte Daten ausgeben ***
if (b_debug) { WriteLine("\nErmittelte Daten: "); i_wert1=1; while(i_wert1<i_wert3){WriteLine(s_fDaten.StrValueByIndex(";",i_wert1)#" : "#s_fNamen.StrValueByIndex(";",i_wert1)); i_wert1=i_wert1+1;}}
}
! *** Auf Feiertag heute und morgen pruefen ***
i_wert2=0;
while(i_wert2<2){
if (i_wert2==0){s_wert1=s_today; s_wert2="\nHeute ("#s_wert1;} else {s_wert1=s_tomorrow; s_wert2="Morgen ("#s_wert1;}
s_Obj=sv_Name.StrValueByIndex(",",i_wert2); s_Obj2=sv_Bool.StrValueByIndex(",",i_wert2);
svObj=svObjects.Get(s_Obj); if (!svObj) { WriteLine(s_Obj # " : Object not found!"); quit; } ! Script beenden, wenn SV nicht existiert.
svObj2=svObjects.Get(s_Obj2); if (!svObj2) { WriteLine(s_Obj2 # " : Object not found!"); quit; } ! Script beenden, wenn SV nicht existiert.
i_wert1=s_fDaten.Find(";"#s_wert1#";"); ! Jahrestag in den Daten suchen
if (i_wert1>=0){ ! Wenn Wert gefunden => Feiertag...
i_wert1=1; while(s_wert1!=s_fDaten.StrValueByIndex(";",i_wert1)) { i_wert1=i_wert1+1; } ! ...dann Position (Index) ermitteln...
if (!b_debug) { svObj.State(i_wert1); svObj2.State(1); } else { WriteLine(s_wert2#") ist ein Feiertag : " # web.webGetValueFromList(svObj.ValueList(),i_wert1)); } ! ...und Ergebnis in SVs setzen oder bei DEBUG ausgeben.
} else { ! ...andernfalls kein Wert gefunden => kein Feiertag
if (!b_debug) { svObj.State(0); svObj2.State(0); } else { WriteLine(s_wert2#") ist kein Feiertag!"); }
}
i_wert2=i_wert2+1; ! weiterer Durchlauf fuer morgen
}
Danke für's Drüberschauen...