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
![]() ![]() ![]() |