Ankündigung

Einklappen
Keine Ankündigung bisher.

Kalenderberechnungen ( Osterformel )

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    #46
    werde kurzfristig eine genauere Info geben ;-)

    Gruss

    Wolfgang


    FB_Addon_TelNo{ height:15px !important; white-space: nowrap !important; background-color: #0ff0ff;}
    ETS 6.2 EibPC V3.x

    Kommentar


      #47
      Hallo,

      hier noch kurz für alle eine kleine Info zur Integration der Feiertagsberechnung. In meinem Beispiel setze ich - abhängig vom Feiertag - die Zeit fürs Hochfahren der Jalousien.


      Gruss und gutes Neues Jahr

      Wolfgang
      FB_Addon_TelNo{ height:15px !important; white-space: nowrap !important; background-color: #0ff0ff;}
      Angehängte Dateien
      ETS 6.2 EibPC V3.x

      Kommentar


        #48
        Hallo,

        noch ein kleiner Hinweis: bitte in der Formel zur Berechnung des Ostertages
        alle F16 per Suche / Ersetzen durch F32 ersetzen - sonst kommt es ggf. zu kleinen Verschiebungen ( zumindest im Jahr 2014 ! )

        Gruss

        Wolfgang
        FB_Addon_TelNo{ height:15px !important; white-space: nowrap !important; background-color: #0ff0ff;}
        ETS 6.2 EibPC V3.x

        Kommentar


          #49
          WE_DatwertToDate, Problem seit Patch 3.019

          Ein gutes und gesundes 2015 !

          Getreu den vorstehenden Beispielen habe ich seit Anfang 2014 eine Kalenderseite in meiner Visu.

          Seit den letzten Patch spinnt die Anzeige der Ostern-abhängigen Feiertage.
          Über Weihnachten habe ich das Problem verdrängt und erst jetzt wieder angesehen. Die Fehlanzeige setzt sich leider auch 2015 fort.

          Die Berechnung der Feiertage scheint in Ordnung zu sein. Die Relation der festen Feiertage zu den verschieblichen Feiertagen stimmt ebenfalls.
          Nur das Makro WE_DatwertToDate zeigt bei Tag und Monat immer den Wert 0 an.
          Entweder hat sich hier ein Tippfehler eingeschlichen oder ein Timing im Ablauf zerschießt die Werte. Bis zum Patch lief es monatelang richtig.

          Ich seh es leider nicht!! Ich hoffe auf einen Kennerblick

          Im Sourceteil ist das Makro und die Eibstudiozeilen.
          2 Bilder, Variable und Anzeige

          Danke für jede Hilfe!

          Wolfgang

          Code:
          //***************************************************************************
          //*    WE_DatwertToDate
          //***************************************************************************
          //*    Bestimmt aus Datwert das Datum 
          //* ( Basierend auf UnixTime von Bernd Meiners ( CodingWettbewerb ) )
          //***************************************************************************
          
          :begin WE_DatwertToDate( Name, DayCount )
          :info $Wandelt ein Datum auf Basis Datwert in 3 Variablen$ \\
              $Name: der Variablen (wird ergänzt um Monat, Day, Year )$ \\
              $Die aufzusplittende Unixzeit$
          :var c_DatWert@
          
          
          Name^Monat = 0s32
          Name^Tag = 0s32
          Name^Date = $$
          
          
          c_DatWert@ = convert( DayCount, 0s32)
          
          // Rueckrechnung auf absolutes Jahr
          Name^Jahr = convert(convert(c_DatWert@, 1f32 ) / 365f32, 1s32) + 1970s32
          
          Name^AnzSchaltTage =(Name^Jahr - 1s32 - 1968s32 ) / 4s32 - (Name^Jahr - 1s32 - 1900s32 ) / 100s32 + \\
                  (Name^Jahr - 1s32 - 1600s32 ) / 400s32
          
          Name^IstSchaltJahr  = (mod(Name^Jahr,4s32) == 0s32 AND \\
                  ( mod( Name^Jahr, 100s32) != 0s32 or mod(Name^Jahr, 400s32)==0s32))
          Name^AnzTage = c_DatWert@ - ( Name^Jahr - 1970s32) * 365s32  - Name^AnzSchaltTage
          
          if !Name^IstSchaltJahr then {
              if Name^AnzTage > 0s32 and Name^AnzTage <= 31s32 then Name^Monat = 1s32; Name^Tag = Name^AnzTage endif;
              if Name^AnzTage > 31s32 and Name^AnzTage <= 59s32 then Name^Monat = 2s32; Name^Tag = Name^AnzTage - 31s32 endif;
              if Name^AnzTage > 59s32 and Name^AnzTage <= 90s32 then Name^Monat = 3s32; Name^Tag = Name^AnzTage - 59s32 endif;
              if Name^AnzTage > 90s32 and Name^AnzTage <= 120s32 then Name^Monat = 4s32; Name^Tag = Name^AnzTage - 90s32 endif;
              if Name^AnzTage > 120s32 and Name^AnzTage <= 151s32 then Name^Monat = 5s32; Name^Tag = Name^AnzTage - 120s32 endif;
              if Name^AnzTage > 151s32 and Name^AnzTage <= 181s32 then Name^Monat = 6s32; Name^Tag = Name^AnzTage - 151s32 endif;
              if Name^AnzTage > 181s32 and Name^AnzTage <= 212s32 then Name^Monat = 7s32; Name^Tag = Name^AnzTage - 181s32 endif;
              if Name^AnzTage > 212s32 and Name^AnzTage <= 243s32 then Name^Monat = 8s32; Name^Tag = Name^AnzTage - 212s32 endif;
              if Name^AnzTage > 243s32 and Name^AnzTage <= 273s32 then Name^Monat = 9s32; Name^Tag = Name^AnzTage - 243s32 endif;
              if Name^AnzTage > 273s32 and Name^AnzTage <= 304s32 then Name^Monat = 10s32; Name^Tag = Name^AnzTage - 273s32 endif;
              if Name^AnzTage > 304s32 and Name^AnzTage <= 334s32 then Name^Monat = 11s32; Name^Tag = Name^AnzTage - 304s32 endif;
              if Name^AnzTage > 334s32 and Name^AnzTage <= 365s32 then Name^Monat = 12s32; Name^Tag = Name^AnzTage - 334s32 endif
          } endif
          
          if Name^IstSchaltJahr then {
              if Name^AnzTage > 0s32 and Name^AnzTage <= 31s32 then Name^Monat = 1s32; Name^Tag = Name^AnzTage endif;
              if Name^AnzTage > 31s32 and Name^AnzTage <= 60s32 then Name^Monat = 2s32; Name^Tag = Name^AnzTage - 31s32 endif;
              if Name^AnzTage > 60s32 and Name^AnzTage <= 91s32 then Name^Monat = 3s32; Name^Tag = Name^AnzTage - 60s32 endif;
              if Name^AnzTage > 91s32 and Name^AnzTage <= 121s32 then Name^Monat = 4s32; Name^Tag = Name^AnzTage - 91s32 endif;
              if Name^AnzTage > 121s32 and Name^AnzTage <= 152s32 then Name^Monat = 5s32; Name^Tag = Name^AnzTage - 121s32 endif;
              if Name^AnzTage > 152s32 and Name^AnzTage <= 182s32 then Name^Monat = 6s32; Name^Tag = Name^AnzTage - 152s32 endif;
              if Name^AnzTage > 182s32 and Name^AnzTage <= 213s32 then Name^Monat = 7s32; Name^Tag = Name^AnzTage - 182s32 endif;
              if Name^AnzTage > 213s32 and Name^AnzTage <= 244s32 then Name^Monat = 8s32; Name^Tag = Name^AnzTage - 213s32 endif;
              if Name^AnzTage > 244s32 and Name^AnzTage <= 274s32 then Name^Monat = 9s32; Name^Tag = Name^AnzTage - 244s32 endif;
              if Name^AnzTage > 274s32 and Name^AnzTage <= 305s32 then Name^Monat = 10s32; Name^Tag = Name^AnzTage - 274s32 endif;
              if Name^AnzTage > 305s32 and Name^AnzTage <= 335s32 then Name^Monat = 11s32; Name^Tag = Name^AnzTage - 305s32 endif;
              if Name^AnzTage > 335s32 and Name^AnzTage <= 366s32 then Name^Monat = 12s32; Name^Tag = Name^AnzTage - 335s32 endif
          } endif
          
          :return Name^Date = convert( Name^Tag, $$ ) + $.$ + convert( Name^Monat, $$ ) + $.$ + convert( Name^Jahr, $$ )
          :end
          
          
          ***************************************** die Codezeilen **********************************************************
          
          /* Bestimmung der Kalenderparameter */;
          if chtime(01,00,00) or systemstart() then {
              c_KalJahr = convert( split( convert(setdate(), $$), 6u16, 9u16 ), 1s32 );
              write( '0/0/8's32, c_KalJahr );
              c_KalMon = convert( split( convert(setdate(), $$), 3u16, 4u16 ), 1s32 );
              c_KalTag = convert( split( convert(setdate(), $$), 0u16, 1u16 ), 1s32 );
              c_AktAnzTage = WE_Datwert( c_KalJahr, c_KalMon, c_KalTag );
          /* Test ob Feiertag */;
              c_TypKalenderTag = WE_IsFeiertag( convert(setdate(),$$) );
          } endif
          
             if change('0/0/8's32 ) or systemstart() then {
               c_KalJahr = '0/0/8's32;
               WE_Ostertag( c_KalJahr, c_KalOster ); /* Berechnung OsterTag */;
               c_OsterDayTest = WE_Datwert( c_KalJahr, c_KalOsterMon, c_KalOsterTag );
               c_OsterDay = WE_Datwert( c_KalJahr, 4s32, 5s32 ); 
          /* Berechnung der bewegl. Feiertage */;
               c_AschermittwochDay = c_OsterDay - 46s32;
               c_FaschingsDay = c_AschermittwochDay - 1s32;
               c_OstermontagDay = c_OsterDay + 1s32;
               c_HimmelfahrtDay = c_OsterDay + 39s32;
               c_PfingstDay = c_OsterDay + 49s32;
               c_PfingstmontagDay = c_PfingstDay + 1s32;
               c_FronleichDay = c_OsterDay + 60s32;
          /* Bestimmung der fixen Tage */;
               c_NeujahrDay = WE_Datwert( c_KalJahr, 1s32, 1s32 );
               c_WeihnachtsDay = WE_Datwert( c_KalJahr, 12s32, 25s32 );
               c_Weihnachts2Day = WE_Datwert( c_KalJahr, 12s32, 26s32 );
               c_HlDreiKoenigeDay = WE_Datwert( c_KalJahr, 1s32, 6s32 );
               c_ErsterMaiDay = WE_Datwert( c_KalJahr, 5s32, 1s32 );
               c_TagDerDeutschenEinheitDay = WE_Datwert( c_KalJahr, 10s32, 3s32 );
               c_AllerheiligenDay = WE_Datwert( c_KalJahr, 11s32, 1s32 );
          /* Bestimmung der DatumStrings wg. Anzeige */;
               WE_DatwertToDate( c_Ostern, c_OsterDay );
               WE_DatwertToDate( c_Ostermontag, c_OstermontagDay );
               WE_DatwertToDate( c_Aschermittwoch, c_AschermittwochDay );
               WE_DatwertToDate( c_Fasching, c_FaschingsDay );
               WE_DatwertToDate( c_Himmelfahrt, c_HimmelfahrtDay );
               WE_DatwertToDate( c_Pfingsten, c_PfingstDay );
               WE_DatwertToDate( c_Pfingstmontag, c_PfingstmontagDay );
               WE_DatwertToDate( c_Fronleich, c_FronleichDay )
          } endif
          Angehängte Dateien

          Kommentar


            #50
            Hatte das Problem in meiner Adventberechnung. Wolfgang hat mir daraufhin
            folgendes geschrieben:

            In der Funktion WE_DatwertToDate ist die Jahresberechnung zu ändern:

            Code:
            Statt:
            Name^Jahr = convert(convert(c_DatWert@, 1f32 ) / 365f32, 1s32) + 1970s32
            
            Besser:
            Name^Jahr = c_KalJahr
            Vielleicht ist das auch hier das Problem
            MfG MrKnx

            Kommentar


              #51
              Hallo Schloessl,

              denke tatsaechlich, dass es die Problematik mit der Jahresberechnung ist - ich
              dachte eine Division durch 365 reicht ... Wenn die Schalttage aber nicht beruecksichtigt werden, kann es zu Rundungsproblemen am jahresende kommen ...
              Das ganze hat m.E. nichts mit V3 etc. zu tun ... bei mir ist mit der Aenderung ( wg. jahresberechnung ) alles i.o.: s. Anhang.

              Gruss

              Wolfgang

              PS: falls du nicht weiter kommst => einfach PN !
              Angehängte Dateien
              ETS 6.2 EibPC V3.x

              Kommentar


                #52
                Danke für die Hilfe

                Großer Dank an MsKNx und Wetronic,

                es ist, bzw. war das Jahr.
                Name^Jahr = c_KalJahr behebt das Problem!
                Mit einem Rundungsfehler habe ich natürlich nicht gerechnet bei der Fehlersuche.
                Wahrscheinlich habe ich auch nach dem Versionswechsel auf Patch 3.019 erstmals wieder den Kalender angesehen. Vor Weihnachten waren ja nicht soviele Feiertage mehr! :-)
                Nehmt doch die Änderungen in das Makro auf. Vielleicht hilft es weiteren Nutzern.

                Danke für die prompte Hilfe!
                Wolfgang

                Kommentar

                Lädt...
                X