Prozeduren Previous topic Chapter index Next topic

SE_CALC_00DAWN

 

Eingabeparameter

Parameter

Typ

Beschreibung

SNID

INTEGER

ID der Sendung.

STARTSEID

INTEGER

ID des Sendeelementes ab welchem die Berechnung durchgeführt wird.

DO_ADD

SMALLINT

0: Den Zeiten (SeZeit, SeToleranz1 und SeToleranz2) wird 24h abgezogen, wenn die Werte > 23h sind. 1: Den Zeiten wird 24h dazugezählt, wenn die Werte < 0 sind.

 

Ausgabeparameter

Parameter

Typ

Beschreibung

DAWN

INTEGER

Die (angepasste) SeZeit des ersten Sendeelementes (SeId = STARTSEID) wird zurückgegeben.

 

Beschreibung

Wird von SE_CALC_FROM_SEID aufgerufen, wenn die Berechnung in der 00-Uhr Stunde stattfindet. Spezialbehandlung, damit der Tageswechsel 23 nach 00 auch in der 00-Uhr Stunde richtig gerechnet wird.

 

Definition

CREATE PROCEDURE SE_CALC_00DAWN(
    SNID INTEGER,
    STARTSEID INTEGER,
    DO_ADD SMALLINT)
RETURNS (
    DAWN INTEGER)
AS
  DECLARE VARIABLE AktSeGruppe CHAR(1);
  DECLARE VARIABLE AktSeTyp CHAR(2);
  DECLARE VARIABLE AktSeToleranz2 INTEGER;
  DECLARE VARIABLE AktSeToleranz1 INTEGER;
  DECLARE VARIABLE AktSeZeit INTEGER;
  DECLARE VARIABLE AktSeId INTEGER;
  DECLARE VARIABLE AktSeStatus INTEGER;
  DECLARE VARIABLE AktSeIstZeit INTEGER;
  DECLARE VARIABLE NewSeZeit INTEGER;
  DECLARE VARIABLE NewTolerance1 INTEGER;
  DECLARE VARIABLE NewTolerance2 INTEGER;
  DECLARE VARIABLE Do_Calc INTEGER;
BEGIN

    /*
      Diese Prozedur ist ein Hack fuer die 0Uhr Stunde (Siehe auch [DABDB234]).
      Wenn in der 0-Uhr Stunde ein Tageswechsel von 23Uhr auf 0Uhr Stunde erfolgt,
      kann mit diese Procedure allen Werten > 23h, 24h abgezogen (DO_ADD=0) bzw.
      allen Werten < 0h 24h dazugerechnet werden (DO_ADD=1). Damit der Tageswechsel
      in der 0Uhr Stunde also richtig gerechnet wird, wird diese Procedure zu
      Beginn der Procedure SE_CALC_FROM_SEID ausgefuehrt (DO_ADD=0) und am Schluss
      nochmals, um die minus Zeiten wieder entsprechend zu korrigieren (DO_ADD=1).
    */

    Do_Calc = 0;

    FOR
    SELECT
      SEID,SEZEIT,SEGRUPPE,SETYP,SETOLERANZ1,SETOLERANZ2,
      SESTATUS,SEISTZEIT
    FROM SENDEELEMENTE
    WHERE (SESNID = :SnId)
    ORDER BY SEPOSITION ASCENDING
    INTO
      :AktSeId,:AktSeZeit,:AktSeGruppe,:AktSeTyp,:AktSeToleranz1,:AktSeToleranz2,
      :AktSeStatus,:AktSeIstZeit
    DO BEGIN

      IF (AktSeId = STARTSEID) THEN BEGIN
        Do_Calc = 1;
      END

      IF (Do_Calc = 1) THEN
      BEGIN

          IF (AktSeToleranz1 is NULL) THEN BEGIN
            AktSeToleranz1 = 0;
          END
          IF (AktSeToleranz2 is NULL) THEN BEGIN
            AktSeToleranz2 = 0;
          END

          NewSeZeit = AktSeZeit;
          NewTolerance1 = AktSeToleranz1;
          NewTolerance2 = AktSeToleranz2;
    
          /* Wenn Zeit kleiner ist als 0h, dann 24h dazurechnen */
          IF (DO_ADD = 1) THEN BEGIN
            IF (AktSeZeit < 0) THEN BEGIN
              NewSeZeit = AktSeZeit + 86400000; END
            IF (AktSeToleranz1 < 0) THEN BEGIN
              NewTolerance1 = AktSeToleranz1 + 86400000; END
            IF (AktSeToleranz2 < 0) THEN BEGIN
              NewTolerance2 = AktSeToleranz2 + 86400000; END
          END ELSE BEGIN
          /* Wenn Zeit groesser ist als 23h, dann 24h abziehen */
            IF (AktSeZeit > 82800000) THEN BEGIN
              NewSeZeit = AktSeZeit - 86400000; END
            IF (AktSeToleranz1 > 82800000) THEN BEGIN
              NewTolerance1 = AktSeToleranz1 - 86400000; END
            IF (AktSeToleranz2 > 82800000) THEN BEGIN
              NewTolerance2 = AktSeToleranz2 - 86400000; END
          END
    
          /* Update, nur wenn sich etwas geaendert hat */
          IF ((NewSeZeit <> AktSeZeit) or (NewTolerance1 <> AktSeToleranz1)
             OR (NewTolerance2 <> AktSeToleranz2)) THEN
          BEGIN
            UPDATE Sendeelemente SET SeZeit = :NewSeZeit, SeToleranz1 = :NewTolerance1,
                                     SeToleranz2 = :NewTolerance2
            WHERE SeId = :AktSeId;
          END

          /* Wurde die Zeit des ersten Elements angepasst, muss die SP
             SE_CALC_FROM_SEID mit der aktualisierten Zeit als Startzeit rechnen */
          IF (AktSeId = STARTSEID) THEN BEGIN
            IF ((AktSeIstZeit > 0) AND (AktSeStatus > 2)) THEN BEGIN
              Dawn = AktSeIstZeit;
            END ELSE BEGIN
              Dawn = NewSeZeit;
            END
          END

       END /* do_calc */

    END  /* for */

END

 

     Previous topic Chapter index Next topic