Prozeduren Previous topic Chapter index Next topic

SE_CALC_FROM_SEID

 

Eingabeparameter

Parameter

Typ

Beschreibung

SNID

INTEGER

ID der Sendung.

MINZEIT

INTEGER

Minimale Anspielzeit. Wird ein Element eingekürzt und die Dauer liegt unter der minimalen Anspielzeit, wird ein zusätzliches Element in die SENDEELEMENTE Tabelle eingefügt welches darauf hinweist. Dieses wird dann z.B. in der Planning Base grafisch dargestellt.

STARTSEID

INTEGER

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

STARTZEIT

INTEGER

Startzeit des oben angegebenen Sendeelementes.

 

Ausgabeparameter

Parameter

Typ

Beschreibung

TEST

INTEGER

Ruckgabewert dient nur zu Testzwecken.

 

Beschreibung

Führt die Berechnung einer Sendung von der angegebenen Position durch. Die Angabe der Position erfolgt über die ID des Sendeelementes und dessen Startzeit.

 

Definition

CREATE PROCEDURE SE_CALC_FROM_SEID(
    SNID INTEGER,
    MINZEIT INTEGER,
    STARTSEID INTEGER,
    STARTZEIT INTEGER)
RETURNS (
    TEST INTEGER)
AS
  DECLARE VARIABLE FirstLoopFlag INTEGER;
  DECLARE VARIABLE LastLaenge    INTEGER;
  DECLARE VARIABLE LastStartNext INTEGER;
  DECLARE VARIABLE GruppenCode   CHAR(1);
  DECLARE VARIABLE GruppenEnde   INTEGER;
  DECLARE VARIABLE GruppenFlag   INTEGER;
  DECLARE VARIABLE NextSeZeit    INTEGER;
  DECLARE VARIABLE Dauer         INTEGER;
  DECLARE VARIABLE Do_Calc       INTEGER;

  DECLARE VARIABLE AktSeId         INTEGER;
  DECLARE VARIABLE AktSeSnId       INTEGER;
  DECLARE VARIABLE AktSePosition   INTEGER;
  DECLARE VARIABLE AktSeSnPosition INTEGER;
  DECLARE VARIABLE AktSeZeit       INTEGER;
  DECLARE VARIABLE AktSeSequenz    CHAR(1);
  DECLARE VARIABLE AktSeGruppe     CHAR(1);
  DECLARE VARIABLE AktSeTyp        CHAR(2);
  DECLARE VARIABLE AktSeStartNext  INTEGER;
  DECLARE VARIABLE AktSeToleranz1  INTEGER;
  DECLARE VARIABLE AktSeToleranz2  INTEGER;
  DECLARE VARIABLE AktSeFixeLaenge INTEGER;
  DECLARE VARIABLE AktSeParallel   CHAR(1);

  DECLARE VARIABLE AktSeRegion       SMALLINT;
  DECLARE VARIABLE WBlockRegion      SMALLINT;
  DECLARE VARIABLE WBlockStartZeit   INTEGER;
  DECLARE VARIABLE WBlockNextSeZeit  INTEGER;
  DECLARE VARIABLE WBlockEndZeit     INTEGER;
BEGIN

  /* Initialisierungen */
  GruppenCode   = '-';
  GruppenEnde   = 0;
  GruppenFlag   = 0;
  FirstLoopFlag = 1;
  WBlockRegion  = 0;
  WBlockEndZeit = 0;
  WBlockStartZeit = 0;
  WBlockNextSeZeit = 0;
  Test = 0;
  Do_Calc = 0;

  /* Spezialfall: In der 0-Uhr Stunde muss der Tagesueberlauf
     speziell gehandhabt werden... [DABDB-234] */
  FOR SELECT SeSnPosition FROM SENDEELEMENTE
    WHERE (SESNID = :SnId) ROWS 1 INTO :AktSeSnPosition
  DO
  BEGIN
    IF (AktSeSnPosition = 0) THEN BEGIN
      /* In der 0-Uhr Stunde wird den Zeiten > 23h, 24h abgezogen */
      EXECUTE PROCEDURE SE_CALC_00DAWN(snid, startseid, 0)
        RETURNING_VALUES(STARTZEIT);
    END
  END

  /* Rechnen */
  FOR
    SELECT
      SEID,SESNID,SEPOSITION,SESNPOSITION,SEZEIT,SESEQUENZ,SEGRUPPE,SETYP,
      SESTARTNEXT,SETOLERANZ1,SETOLERANZ2,SEFIXELAENGE,SEPARALLEL,SEREID
    FROM SENDEELEMENTE
    /* Elemente mit R, S oder X Flags werden ignoriert */
    WHERE (SESNID = :SnId) AND (SERFLAG NOT IN ('R','S','X'))
    ORDER BY SEPOSITION ASCENDING
    INTO
      :AktSeId,:AktSeSnId,:AktSePosition,:aktsesnposition,:AktSeZeit,:AktSeSequenz,:AktSeGruppe,:AktSeTyp,
      :AktSeStartNext,:AktSeToleranz1,:AktSeToleranz2,:AktSeFixeLaenge,:AktSeParallel,:AktSeRegion
  DO BEGIN
    IF (AktSeId = STARTSEID) THEN BEGIN
      Do_Calc = 1;
      NextSeZeit = STARTZEIT;
      AktSeZeit  = NextSeZeit;
    END
    IF (Do_Calc = 1) THEN BEGIN

      /* NULL-Zeiten behandeln */
      IF (AktSeStartNext is NULL) THEN BEGIN
        AktSeStartNext = 0;
      END
      IF (AktSeToleranz1 is NULL) THEN BEGIN
        AktSeToleranz1 = 0;
      END
      IF (AktSeToleranz2 is NULL) THEN BEGIN
        AktSeToleranz2 = 0;
      END
      IF (AktSeFixeLaenge is NULL) THEN BEGIN
        AktSeFixeLaenge = 0;
      END

      /* Fehlzeiten und Ueberzeiten loeschen */
      IF ( (AktSeTyp = 'F') OR (AktSeTyp = 'U') ) THEN BEGIN
        DELETE FROM SENDEELEMENTE
        WHERE (SEID = :AktSeId);
      END
      /* DABDB-423 */
      ELSE IF (AktSeSequenz <> 'P') THEN BEGIN

        /* TempZeit initialisieren */
        IF (FirstLoopFlag <> 0) THEN BEGIN
          NextSeZeit = AktSeZeit;
          FirstLoopFlag = 0;
        END

        /* Wird nur beim neuen Regiokonzept benoetigt */
        IF (AktSeTyp = 'HR') THEN BEGIN /* Wir treten in eine Region ein */
          WBlockStartZeit = NextSeZeit;
          WBlockRegion = 0;
          WBlockNextSeZeit = NextSeZeit;
        END
        IF ((WBlockRegion <> 0) AND (AktSeRegion = 0)) THEN BEGIN /* Wir verlassen die Region */
          IF (WBlockEndZeit < WBlockNextSeZeit) THEN BEGIN
            WBlockEndZeit = WBlockNextSeZeit;
          END
          NextSeZeit = WBlockEndZeit;
          WBlockRegion = 0;
        END

        /* ********************************************************************* */
        /* Gruppen-Header verarbeiten (Typ H).                                   */
        /* Gruppen-Header koennen einen beliebigen Sequenzcode haben. Sie        */
        /* koennen eine FixeLaenge (>0) fuer die nachfolgende Gruppe definieren. */
        /* Das Element, welches an die Gruppe anschliesst verhaelt sich dann wie */
        /* ein Z-Element, dessen Startzeit mit dem Header gesetzt wurde.         */
        /* ********************************************************************* */
        IF (AktSeGruppe <> GruppenCode) THEN BEGIN
          GruppenCode = AktSeGruppe;
          IF (GruppenEnde <> 0) THEN BEGIN
            AktSeZeit = GruppenEnde;   /* fuer nachfolgende Verarbeitungen */
            GruppenEnde = 0;
            GruppenFlag = 1;           /* Z-Verarbeitung ausloesen */
          END
        END

        IF ((AktSeTyp = 'H') OR (AktSeTyp = 'HR') OR (AktSeTyp = 'HB')) THEN BEGIN
          IF (AktSeFixeLaenge <> 0) THEN BEGIN
            GruppenEnde = AktSeZeit + AktSeFixeLaenge;
          END
          ELSE BEGIN
            GruppenEnde = 0;
          END
        END

        /* ********************************** */
        /* Z-, T- und R-Elemente verarbeiten. */
        /* ********************************** */
        IF (AktSeSequenz IN ('Z', 'T', 'R') OR (GruppenFlag = 1)) THEN BEGIN

          WBlockEndZeit = 0;
          /* Felder 'Zeit' (notwendig bei Gruppen-Ende) und 'Dauer' nachtragen */
          IF ((AktSeTyp <> 'H') AND (AktSeTyp <> 'HR') AND (AktSeTyp <> 'HB')) THEN BEGIN
            UPDATE SENDEELEMENTE SET
              SEZEIT = :AktSeZeit, SEDAUER = :AktSeStartNext, SERFLAG = '-'
            WHERE (SEID = :AktSeId);
            NextSeZeit = AktSeZeit + AktSeStartNext;
          END
          ELSE BEGIN
            UPDATE SENDEELEMENTE SET
              SEZEIT = :AktSeZeit, SERFLAG = '-'
            WHERE (SEID = :AktSeId);
            NextSeZeit = AktSeZeit;
          END
          
          /* Zurueck rechnen */
          IF (GruppenFlag = 1) THEN BEGIN
            /* Bei Gruppen-Ende ist vorangehendes Element nie zu kurz (MinZeit=0)! */
            EXECUTE PROCEDURE SE_CALC_BACK (AktSeSnId, AktSePosition, AktSeZeit, 0, GruppenEnde)
                    RETURNING_VALUES (LastLaenge, LastStartNext, GruppenEnde);
          END
          ELSE BEGIN
            EXECUTE PROCEDURE SE_CALC_BACK (AktSeSnId, AktSePosition, AktSeZeit, MinZeit, GruppenEnde)
                    RETURNING_VALUES (LastLaenge, LastStartNext, GruppenEnde);
          END
        END

        /* **************************************************** */
        /* F-, L-, K- und Q-Elemente verarbeiten.               */
        /* Diese Elemente muessen Toleranz1 und Toleranz2 haben */
        /* und koennen FixeLaenge (>0) haben.                   */
        /* **************************************************** */
        IF ((AktSeSequenz IN ('F', 'L', 'K', 'Q')) AND (GruppenFlag = 0)) THEN BEGIN

          /* Ist Toleranz2 + 20h kleiner als Toleranz1, wird von einem Tageswechsel ausgegangen */
          IF ((AktSeToleranz2 + 72000000) < AktSeToleranz1) THEN BEGIN
            AktSeToleranz2 = AktSeToleranz2 + 86400000;
          END

          IF (AktSeSequenz = 'Q') THEN BEGIN
            NextSeZeit = AktSeToleranz1;
            EXECUTE PROCEDURE SE_CALC_BACK (AktSeSnId, AktSePosition, NextSeZeit, MinZeit, GruppenEnde)
                    RETURNING_VALUES (LastLaenge, LastStartNext, GruppenEnde);
          END
          ELSE IF (AktSeSequenz = 'F') THEN BEGIN
            NextSeZeit = AktSeToleranz1;
            EXECUTE PROCEDURE SE_CALC_BACK (AktSeSnId, AktSePosition, NextSeZeit, MinZeit, GruppenEnde)
                    RETURNING_VALUES (LastLaenge, LastStartNext, GruppenEnde);
            Test = Test + 2;
            IF ((LastStartNext - LastLaenge) > 0) THEN BEGIN
              IF ((LastStartNext - LastLaenge) > (AktSeToleranz2 - AktSeToleranz1)) THEN BEGIN
                NextSeZeit = AktSeToleranz2;
              END
              ELSE BEGIN
                NextSeZeit = AktSeToleranz1 + (LastStartNext - LastLaenge);
              END
              EXECUTE PROCEDURE SE_CALC_BACK (AktSeSnId, AktSePosition, NextSeZeit, MinZeit, GruppenEnde)
                      RETURNING_VALUES (LastLaenge, LastStartNext, GruppenEnde);
              Test = Test + 20;
            END
          END
          ELSE BEGIN
            IF (NextSeZeit < AktSeToleranz1) THEN BEGIN
              NextSeZeit = AktSeToleranz2;
              EXECUTE PROCEDURE SE_CALC_BACK (AktSeSnId, AktSePosition, NextSeZeit, MinZeit, GruppenEnde)
                      RETURNING_VALUES (LastLaenge, LastStartNext, GruppenEnde);
              Test = Test + 1;
            END

            IF (NextSeZeit > AktSeToleranz2) THEN BEGIN
              NextSeZeit = AktSeToleranz2;
              EXECUTE PROCEDURE SE_CALC_BACK (AktSeSnId, AktSePosition, NextSeZeit, MinZeit, GruppenEnde)
                      RETURNING_VALUES (LastLaenge, LastStartNext, GruppenEnde);
              Test = Test + 10;
              IF ((LastLaenge > 0) AND (LastLaenge < (AktSeToleranz2 - AktSeToleranz1))) THEN BEGIN
                NextSeZeit = AktSeToleranz2 - LastLaenge;
                EXECUTE PROCEDURE SE_CALC_BACK (AktSeSnId, AktSePosition, NextSeZeit, MinZeit, GruppenEnde)
                        RETURNING_VALUES (LastLaenge, LastStartNext, GruppenEnde);
                Test = Test + 100;
              END
            END
          END

          /* Nun muessen auch noch die Werbe-Block Zeiten angepasst werden */
          WBlockStartZeit = NextSeZeit;
          WBlockNextSeZeit = NextSeZeit;
          WBlockEndZeit = 0;

          /* Nehme Dauer, oder Fixlaenge */
          Dauer = AktSeStartNext;
          IF (AktSeFixeLaenge > 0) THEN BEGIN
            IF (AktSeFixeLaenge < AktSeStartNext) THEN BEGIN
              Dauer = AktSeFixeLaenge;
            END
          END

          IF ((AktSeTyp <> 'H') AND (AktSeTyp <> 'HR') AND (AktSeTyp <> 'HB')) THEN BEGIN
            /* F-Seqzenz Element ist KEIN Header */
            UPDATE SENDEELEMENTE SET
              SEZEIT = : NextSeZeit, SEDAUER = :Dauer, SERFLAG = '-'
            WHERE (SEID = :AktSeId);
            NextSeZeit = NextSeZeit + Dauer;
          END
          ELSE BEGIN
            /* F-Sequenz Element ist ein Header */
            UPDATE SENDEELEMENTE SET
              SEZEIT = : NextSeZeit, SERFLAG = '-'
            WHERE (SEID = :AktSeId);
          END

        END

        /* ******************************************* */
        /* S-, B-, M-, W-, und C-Elemente verarbeiten. */
        /* ******************************************* */
        IF ((AktSeSequenz in ('S','B','M','W','C')) AND (GruppenFlag = 0)) THEN BEGIN
          IF ((AktSeTyp <> 'H') AND (AktSeTyp <> 'HR') AND (AktSeTyp <> 'HB') AND (AktSeParallel <> 'D')) THEN BEGIN
            /* Regiokonzept */
            IF ((AktSeRegion <> 0) AND (WBlockRegion <> AktSeRegion)) THEN BEGIN
              IF (WBlockEndZeit < WBlockNextSeZeit) THEN BEGIN
                WBlockEndZeit = WBlockNextSeZeit;
              END
              WBlockNextSeZeit = WBlockStartZeit;
              WBlockRegion = AktSeRegion;
            END
            IF (AktSeRegion > 0) THEN BEGIN
              UPDATE SENDEELEMENTE SET
                SEZEIT = :WBlockNextSeZeit, SEDAUER = :AktSeStartNext, SERFLAG = '-'
              WHERE (SEID = :AktSeId);
              NextSeZeit = NextSeZeit + AktSeStartNext;
              WBlockNextSeZeit = WBlockNextSeZeit + AktSeStartNext;
            END
            ELSE BEGIN
              UPDATE SENDEELEMENTE SET
                SEZEIT = :NextSeZeit, SEDAUER = :AktSeStartNext, SERFLAG = '-'
              WHERE (SEID = :AktSeId);
              NextSeZeit = NextSeZeit + AktSeStartNext;
            END
          END
          ELSE BEGIN
            UPDATE SENDEELEMENTE SET
              SEZEIT = :NextSeZeit, SERFLAG = '-'
            WHERE (SEID = :AktSeId);
          END
        END

        GruppenFlag = 0;

      END
    END
  END

  /* Spezialfall: In der 0-Uhr Stunde muss der Tagesueberlauf
     speziell gehandhabt werden... [DABDB-234] */
  IF (AktSeSnPosition = 0) THEN BEGIN
    /* In der 0-Uhr Stunde wird den Zeiten > 23h, 24h dazugezaehlt */
    EXECUTE PROCEDURE SE_CALC_00DAWN(snid, startseid, 1)
      RETURNING_VALUES(STARTZEIT); /* return wird hier nicht gebraucht */
  END

  /* Positionsnummern der Sendung(en) neu durchnumerieren */
  EXECUTE PROCEDURE SE_RENUMPOSITION (SnId);

END

 

     Previous topic Chapter index Next topic