Eingabeparameter
Parameter | Typ | Beschreibung |
---|---|---|
SNID |
INTEGER |
ID der Sendung. |
SEPOSITION |
INTEGER |
Die Position eines Element in dieser Gruppe. |
SEGRUPPE |
CHAR(1) |
Das Gruppenkürzel zu der zu berechneten Gruppe. |
Ausgabeparameter
(Es gibt keine Ausgabeparameter)
Beschreibung
Berechnet die Blocklänge eines Block und schreibt sie in den Header.
Definition
CREATE PROCEDURE SE_CALC_HEADER_BLOCK(
SNID INTEGER,
SEPOSITION INTEGER,
SEGRUPPE CHAR(1))
AS
DECLARE VARIABLE HeaderSeId INTEGER;
DECLARE VARIABLE HeaderLaenge INTEGER;
DECLARE VARIABLE FirstLoopFlag INTEGER;
DECLARE VARIABLE IsHeaderOnly INTEGER;
DECLARE VARIABLE GruppenCode CHAR(1);
DECLARE VARIABLE RegionCode SMALLINT;
DECLARE VARIABLE RegionLaenge INTEGER;
DECLARE VARIABLE AktSeId INTEGER;
DECLARE VARIABLE AktSeDauer INTEGER;
DECLARE VARIABLE AktSeStartNext INTEGER;
DECLARE VARIABLE AktSeGruppe CHAR(1);
DECLARE VARIABLE AktSeTyp CHAR(2);
DECLARE VARIABLE AktSeRegion SMALLINT;
DECLARE VARIABLE AktSeParallel CHAR(1);
DECLARE VARIABLE AktSeSequenz CHAR(1);
DECLARE VARIABLE TriggeredId INTEGER;
DECLARE VARIABLE StartPos INTEGER;
DECLARE VARIABLE EndPos INTEGER;
BEGIN
/* Initialisierungen */
HeaderSeId = 0;
HeaderLaenge = 0;
RegionLaenge = 0;
FirstLoopFlag = 1;
IsHeaderOnly = 0;
IF ((SEPOSITION = 0) AND (SEGRUPPE = ' ')) THEN BEGIN
StartPos = -1;
EndPos = 0;
END
ELSE BEGIN
EXECUTE PROCEDURE SE_GETGROUPSTART(SNID, SEPOSITION, SEGRUPPE)
RETURNING_VALUES :StartPos;
EXECUTE PROCEDURE SE_GETGROUPEND(SNID, SEPOSITION, SEGRUPPE)
RETURNING_VALUES :EndPos;
END
FOR
SELECT
SEID,SEDAUER,SEGRUPPE,SETYP,SESTARTNEXT,SEREID,SEPARALLEL,SESEQUENZ
FROM SENDEELEMENTE
/* Elemente mit R, S oder X Flags werden ignoriert */
WHERE (SESNID = :SnId) AND (SERFLAG NOT IN ('R','S','X')) AND
((:StartPos = -1) OR ((SEPOSITION >= :StartPos) AND (SEPOSITION <= :EndPos)))
ORDER BY SEPOSITION ASCENDING
INTO
:AktSeId,:AktSeDauer,:AktSeGruppe,:AktSeTyp,:AktSeStartNext,:AktSeRegion,:AktSeParallel,:AktSeSequenz
DO BEGIN
/* GruppenCode initialisieren */
IF (FirstLoopFlag <> 0) THEN BEGIN
GruppenCode = AktSeGruppe;
RegionCode = AktSeRegion;
FirstLoopFlag = 0;
END
/* ********************************************************************** */
/* Sobald die Gruppe zu Ende ist, oder das naechste Header Element kommt, */
/* wird die Blocklaenge ins Dauer Feld vom letzten Header Element */
/* geschrieben. */
/* ********************************************************************** */
IF ((AktSeGruppe <> GruppenCode) OR (AktSeTyp = 'H') OR (AktSeTyp = 'HR') OR (AktSeTyp = 'HB')) THEN BEGIN
/* Wenn es Regionen hat, dann wird die laengste Region als Laenge genommen */
IF (RegionLaenge <> 0) THEN BEGIN
IF (RegionLaenge > HeaderLaenge) THEN BEGIN
HeaderLaenge = RegionLaenge;
END
END
/* Headerzeit aktualisieren (ausser beim ersten Header nicht!) */
/* und Headerzeit nur bei H Elementen auf 0 setzen! */
IF ((HeaderSeId <> 0) AND ((HeaderLaenge <> 0) OR (IsHeaderOnly = 1))) THEN BEGIN
UPDATE SENDEELEMENTE SET
SEDAUER = :HeaderLaenge, SESTARTNEXT = :HeaderLaenge,
SEMITTELTEIL = :HeaderLaenge
WHERE (SEID = :HeaderSeId);
END
/* GruppenCode zwischenspeichern */
IF (AktSeGruppe <> GruppenCode) THEN BEGIN
GruppenCode = AktSeGruppe;
HeaderSeId = 0;
END
/* Header ID zwischenspeichern */
IF ((AktSeTyp = 'H') OR (AktSeTyp = 'HR') OR (AktSeTyp = 'HB')) THEN BEGIN
HeaderSeId = AktSeId;
IF (AktSeTyp = 'H') THEN BEGIN
IsHeaderOnly = 1;
END
ELSE BEGIN
IsHeaderOnly = 0;
END
END
RegionCode = AktSeRegion;
/* Header laenge wieder auf null setzen fuer den naechsten Header */
HeaderLaenge = 0;
RegionLaenge = 0;
END
/* ansonsten wird die Laenge aufaddiert. Neu wird noch die laengste Region gespeichert */
ELSE BEGIN
IF (RegionCode <> AktSeRegion) THEN BEGIN
RegionCode = AktSeRegion;
IF (HeaderLaenge > RegionLaenge) THEN BEGIN
RegionLaenge = HeaderLaenge;
END
HeaderLaenge = 0;
END
/* DABDB-182 */
TriggeredId = NULL;
SELECT MIN(TEID) FROM TRIGGEREDEVENTS
WHERE (TETRIGGEREDSEID = :AktSeId)
INTO :TriggeredId;
/* DABDB-185 */
IF ((AktSeTyp <> 'F') AND (AktSeTyp <> 'U') AND (AktSeSequenz <> 'P') AND
(AktSeParallel <> 'D') AND (TriggeredId IS NULL)) THEN BEGIN
HeaderLaenge = HeaderLaenge + AktSeStartNext; /* oder AktSeDauer */
END
END
END
/* letzte Headerzeit aktualisieren */
/* aber Headerzeit nur bei H-Elementen auf 0 setzen! */
IF ((HeaderSeId <> 0) AND ((HeaderLaenge <> 0) OR (IsHeaderOnly = 1) OR
/* DABDB-410 */
((StartPos <> -1) AND (RegionLaenge <> 0)))) THEN BEGIN
/* Wenn es mit einer Regionen aufhoert, muss diese auch noch beruecksichtig werden */
IF (RegionLaenge <> 0) THEN BEGIN
IF (RegionLaenge > HeaderLaenge) THEN BEGIN
HeaderLaenge = RegionLaenge;
END
END
UPDATE SENDEELEMENTE SET
SEDAUER = :HeaderLaenge, SESTARTNEXT = :HeaderLaenge,
SEMITTELTEIL = :HeaderLaenge
WHERE (SEID = :HeaderSeId);
END
END
![]() ![]() ![]() |