Eingabeparameter
Parameter | Typ | Beschreibung |
---|---|---|
SNID |
INTEGER |
ID der Sendung. |
SEPOS |
INTEGER |
Sendeelement Position. |
ENDZEIT |
INTEGER |
Hier wird die aktuelle Sendezeit vom Z- oder R-Sequenz Element übergeben. |
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. |
GRPENDE |
INTEGER |
Aktuelle Zeit vom Gruppenende. |
Ausgabeparameter
Parameter | Typ | Beschreibung |
---|---|---|
LASTLAENGE |
INTEGER |
Rückgabe der eingekürzten Länge vom letzten Element. |
LASTSTARTNEXT |
INTEGER |
Rückgabe der StartNext Zeit vom letzten Element. |
KORRGRPENDE |
INTEGER |
Rückgabe der effektiven Gruppenendzeit. Kann bei Headern angepasst worden sein. |
Beschreibung
Gelangt man beim Vorwärtsrechnen an eine Z- oder R-Sequenz, wird mit dieser Procedure eine Rückwärtsberechnung durchgeführt. (Wird von SE_CALC_FROM_SEID aufgerufen).
Definition
CREATE PROCEDURE SE_CALC_BACK(
SNID INTEGER,
SEPOS INTEGER,
ENDZEIT INTEGER,
MINZEIT INTEGER,
GRPENDE INTEGER)
RETURNS (
LASTLAENGE INTEGER,
LASTSTARTNEXT INTEGER,
KORRGRPENDE INTEGER)
AS
DECLARE VARIABLE Laenge INTEGER;
DECLARE VARIABLE LetzteSeZeit INTEGER;
DECLARE VARIABLE AktSeId INTEGER;
DECLARE VARIABLE AktSeSnId INTEGER;
DECLARE VARIABLE AktSeDatum DATE;
DECLARE VARIABLE AktSeSpPosition INTEGER;
DECLARE VARIABLE AktSeSnPosition INTEGER;
DECLARE VARIABLE AktSePosition INTEGER;
DECLARE VARIABLE AktSeZeit INTEGER;
DECLARE VARIABLE AktSeSequenz CHAR(1);
DECLARE VARIABLE AktSeTyp CHAR(2);
DECLARE VARIABLE AktSeStartNext INTEGER;
DECLARE VARIABLE AktSeFixeLaenge INTEGER;
DECLARE VARIABLE AktSeParallel CHAR(1);
DECLARE VARIABLE AktSeRegion SMALLINT;
DECLARE VARIABLE RegionCode SMALLINT;
DECLARE VARIABLE RegionBlockStart INTEGER;
DECLARE VARIABLE RegionBlockEnde INTEGER;
DECLARE VARIABLE AktSeGruppe CHAR(1);
DECLARE VARIABLE AktSeRFlag CHAR(1);
BEGIN
/* Initialisierungen */
RegionCode = 0;
RegionBlockStart = 0;
RegionBlockEnde = 0;
LetzteSeZeit = EndZeit;
/* Reuckgaben vorbelegen */
LastLaenge = 0;
LastStartNext = 0;
KorrGrpEnde = GrpEnde;
FOR
SELECT
SEID,SESNID,SEDATUM,SESPPOSITION,SESNPOSITION,SEPOSITION,
SEZEIT,SESEQUENZ,SETYP,SESTARTNEXT,SEFIXELAENGE,SEPARALLEL,
SEREID,SEGRUPPE,SERFLAG
FROM SENDEELEMENTE
/* Elemente mit R, S oder X Flags werden ignoriert */
WHERE (SESNID = :SnId) AND (SERFLAG NOT IN ('R','S','X')) AND (SEPOSITION < :SePos)
ORDER BY SEPOSITION DESCENDING
INTO
:AktSeId,:AktSeSnId,:AktSeDatum,:AktSeSpPosition,:AktSeSnPosition,:AktSePosition,
:AktSeZeit,:AktSeSequenz,:AktSeTyp,:AktSeStartNext,:AktSeFixeLaenge,:AktSeParallel,
:AktSeRegion,:AktSeGruppe,:AktSeRFlag
DO BEGIN
/* NULL-Zeiten behandeln */
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
/* B-Elemente zurueckrechnen */
IF (AktSeSequenz = 'B') THEN BEGIN
/* Wenn es Regionen hat, muss die Start- und Endzeit behalten werden */
IF (RegionCode <> AktSeRegion) THEN BEGIN
/* Region Ende nur speichern wenn es mit einer Region beginnt */
IF (RegionCode = 0) THEN BEGIN
RegionBlockEnde = LetzteSeZeit;
END
RegionCode = AktSeRegion;
EndZeit = RegionBlockEnde;
/* Region Start fuer die Headerzeit speichern */
IF (RegionBlockStart > LetzteSeZeit) THEN BEGIN
RegionBlockStart = LetzteSeZeit;
END
END
/* Bei Header SeZeit vom vorhergehenden Element uebernehmen */
IF ((AktSeTyp = 'H') OR (AktSeTyp = 'HR') OR (AktSeTyp = 'HB') OR (AktSeParallel = 'D')) THEN BEGIN
/* Bei Regionen wird die laengste Zeit fuer den Header genommen */
IF ((RegionBlockStart > 0) AND (AktSeParallel <> 'D')) THEN BEGIN
EndZeit = RegionBlockStart;
END
ELSE BEGIN
EndZeit = LetzteSeZeit;
END
END
ELSE BEGIN
EndZeit = EndZeit - AktSeStartNext;
END
LetzteSeZeit = EndZeit;
UPDATE SENDEELEMENTE SET
SEZEIT = :EndZeit,
SEDAUER = :AktSeStartNext
WHERE (SEID = :AktSeId);
/* Bei Header: Gruppen-Endzeit korrigieren */
IF (((AktSeTyp = 'H') OR (AktSeTyp = 'HR') OR (AktSeTyp = 'HB')) AND (AktSeFixeLaenge <> 0)) THEN BEGIN
KorrGrpEnde = EndZeit + AktSeFixeLaenge;
END
END
/* Alle anderen Elemente bearbeiten ( S / M / Z / F / L / K / Q / W / R / C / T ) */
ELSE BEGIN
/* Reserven machen */
IF (AktSeZeit >= EndZeit) THEN BEGIN
IF (AktSeSequenz NOT IN ('Z', 'R', 'F', 'L', 'K', 'Q', 'T')) THEN BEGIN /* removed: and (AktSeStartNext > 0) */
UPDATE SENDEELEMENTE SET
SERFLAG = 'R'
WHERE (SEID = :AktSeId);
END
END
ELSE BEGIN
LastLaenge = EndZeit - AktSeZeit;
LastStartNext = AktSeStartNext;
/* Fehlzeit eintragen */
IF (LastLaenge > AktSeStartNext) THEN BEGIN
AktSeZeit = AktSeZeit + AktSeStartNext;
Laenge = LastLaenge - AktSeStartNext;
EXECUTE PROCEDURE SE_CALC_INS_DIFF(0,
AktSeSnId,
AktSeDatum,
AktSeSpPosition,
AktSeSnPosition,
AktSePosition,
AktSeZeit,
Laenge,
AktSeGruppe);
LastLaenge = AktSeStartNext;
END
/* Feld 'Dauer' nachtragen */
UPDATE SENDEELEMENTE SET
SEDAUER = :LastLaenge
WHERE (SEID = :AktSeId);
/* Ueberzeit eintragen */
IF ((LastLaenge < MinZeit) AND (AktSeStartNext >= MinZeit)) THEN BEGIN
UPDATE SENDEELEMENTE SET
SERFLAG = 'K'
WHERE (SEID = :AktSeId);
EXECUTE PROCEDURE SE_CALC_INS_DIFF(1,
AktSeSnId,
AktSeDatum,
AktSeSpPosition,
AktSeSnPosition,
AktSePosition,
AktSeZeit,
LastLaenge,
AktSeGruppe);
END
ELSE BEGIN
IF (AktSeRFlag = 'K') THEN BEGIN
UPDATE SENDEELEMENTE SET
SERFLAG = '-'
WHERE (SEID = :AktSeId);
END
END
/* Abbruch */
EXIT;
END
END
/* Z-, R-, L- oder F-Event erreicht -> Abbruch */
IF (AktSeSequenz IN ('Z', 'R', 'F', 'L', 'K', 'Q', 'T')) THEN BEGIN
EXIT;
END
END
END
END
![]() ![]() ![]() |