Prozeduren Previous topic Chapter index Next topic

SE_CALC_HEADER_BLOCK

 

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

 

     Previous topic Chapter index Next topic