Prozeduren Previous topic Chapter index Next topic

SE_GETBLOCKPOS

 

Eingabeparameter

Parameter

Typ

Beschreibung

SNID

INTEGER

Primary Key Wert von der SENDUNGEN Tabelle

SEPOSITION

INTEGER

Positionsnummer vom selektierten Sendeelement.

POSTYPE

INTEGER

Gibt die Such-Richtung an:
0: Letztes Element des Klammer-Blockes bestimmen.
1: Erstes Element des Klammer-Blockes bestimmen

 

Ausgabeparameter

Parameter

Typ

Beschreibung

BLOCKSEID

INTEGER

Primary Key Wert von der SENDEELEMENTE Tabelle

BLOCKSESNID

INTEGER

Primary Key Wert von der SENDUNGEN Tabelle

BLOCKSEDATUM

DATE

Das Datum von diesem Block.

BLOCKSEZEIT

INTEGER

Die Zeit von diesem Block

BLOCKSESPPOSITION

INTEGER

Die Senungsposition von diesem Block.

BLOCKSESNPOSITION

INTEGER

Die Stunden Position von diesem Block.

BLOCKSEPOSITION

INTEGER

Die Position vom diesem Block.

NEXTSEPOSITION

INTEGER

Gibt die nächste Position zurück.

 

Beschreibung

Damit erhält man anhand einer Position Informationen über den Block.

 

Definition

CREATE PROCEDURE SE_GETBLOCKPOS(
    SNID INTEGER,
    SEPOSITION INTEGER,
    POSTYPE INTEGER)
RETURNS (
    BLOCKSEID INTEGER,
    BLOCKSESNID INTEGER,
    BLOCKSEDATUM DATE,
    BLOCKSEZEIT INTEGER,
    BLOCKSESPPOSITION INTEGER,
    BLOCKSESNPOSITION INTEGER,
    BLOCKSEPOSITION INTEGER,
    NEXTSEPOSITION INTEGER)
AS
  DECLARE VARIABLE LastKlammer       CHAR(1);
  DECLARE VARIABLE DestSeId          INTEGER;
  DECLARE VARIABLE DestSeSnId        INTEGER;
  DECLARE VARIABLE DestSeDatum       DATE;
  DECLARE VARIABLE DestSeZeit        INTEGER;
  DECLARE VARIABLE DestSeSpPosition  INTEGER;
  DECLARE VARIABLE DestSeSnPosition  INTEGER;
  DECLARE VARIABLE DestSePosition    INTEGER;
  DECLARE VARIABLE DestSeKlammer     CHAR(1);
  DECLARE VARIABLE TriggerPos        INTEGER;
  DECLARE VARIABLE LastSeId          INTEGER;
  DECLARE VARIABLE DestSeGruppe      CHAR(1);
  DECLARE VARIABLE LastSeGruppe      CHAR(1);
BEGIN
  LastSeGruppe = NULL;
  /* Erstes Element des Klammer-Blockes bestimmen */
  IF (PosType = 1) THEN BEGIN
    LastKlammer = 'R';
    FOR
      SELECT
        SEID,SESNID,SEDATUM,SEZEIT,SESPPOSITION,SESNPOSITION,
        SEPOSITION,SEKLAMMER,SEGRUPPE
      FROM SENDEELEMENTE
      WHERE (SESNID = :SnId) AND (SEPOSITION <= :SePosition)
      ORDER BY SEPOSITION DESCENDING
      INTO
        :DestSeId,:DestSeSnId,:DestSeDatum,:DestSeZeit,:DestSeSpPosition,:DestSeSnPosition,
        :DestSePosition,:DestSeKlammer,:DestSeGruppe
    DO BEGIN                                                    /* DABDB-268 */
      IF (((LastKlammer <> 'R') AND (DestSeKlammer <> 'V')) OR (DestSeGruppe <> LastSeGruppe)) THEN BEGIN
        TriggerPos = NULL;
        SELECT MIN(SEPOSITION)
        FROM SENDEELEMENTE JOIN TRIGGEREDEVENTS
          ON ((TETYP <= 99) AND ((SEID = TETRIGGEREDSEID) OR (SEID = TESEID)))
        WHERE ((TESEID = :LastSeId) OR
               (TESEID IN (SELECT TESEID FROM TRIGGEREDEVENTS
                           WHERE (TETRIGGEREDSEID = :LastSeId))))
        INTO :TriggerPos;
        IF ((TriggerPos IS NULL) OR (DestSePosition < TriggerPos)) THEN BEGIN
          NextSePosition = (DestSePosition + BlockSePosition) / 2;
          EXIT;  /* Exit Loop and Procedure */
        END
      END
      LastSeId = DestSeId;
      LastKlammer = DestSeKlammer;
      LastSeGruppe = DestSeGruppe;
      BlockSeId          = DestSeId;
      BlockSeSnId        = DestSeSnId;
      BlockSeDatum       = DestSeDatum;
      BlockSeZeit        = DestSeZeit;
      BlockSeSpPosition  = DestSeSpPosition;
      BlockSeSnPosition  = DestSeSnPosition;
      BlockSePosition    = DestSePosition;
    END
    NextSePosition = BlockSePosition - 500;
  END

  /* Letztes Element des Klammer-Blockes bestimmen */
  ELSE BEGIN
    LastKlammer = 'V';
    FOR
      SELECT
        SEID,SESNID,SEDATUM,SEZEIT,SESPPOSITION,SESNPOSITION,
        SEPOSITION,SEKLAMMER,SEGRUPPE
      FROM SENDEELEMENTE
      WHERE (SESNID = :SnId) AND (SEPOSITION >= :SePosition)
      ORDER BY SEPOSITION ASCENDING
      INTO
        :DestSeId,:DestSeSnId,:DestSeDatum,:DestSeZeit,:DestSeSpPosition,:DestSeSnPosition,
        :DestSePosition,:DestSeKlammer,:DestSeGruppe
    DO BEGIN                                                    /* DABDB-268 */
      IF (((LastKlammer <> 'V') AND (DestSeKlammer <> 'R')) OR (DestSeGruppe <> LastSeGruppe)) THEN BEGIN
        TriggerPos = NULL;
        SELECT MAX(SEPOSITION)
        FROM SENDEELEMENTE JOIN TRIGGEREDEVENTS
          ON ((TETYP <= 99) AND ((SEID = TETRIGGEREDSEID) OR (SEID = TESEID)))
        WHERE ((TESEID = :LastSeId) OR
               (TESEID IN (SELECT TESEID FROM TRIGGEREDEVENTS
                           WHERE (TETRIGGEREDSEID = :LastSeId))))
        INTO :TriggerPos;
        IF ((TriggerPos IS NULL) OR (DestSePosition > TriggerPos)) THEN BEGIN
          NextSePosition = (DestSePosition + BlockSePosition) / 2;
          EXIT;  /* Exit Loop and Procedure */
        END
      END
      LastSeId = DestSeId;
      LastKlammer = DestSeKlammer;
      LastSeGruppe = DestSeGruppe;
      BlockSeId          = DestSeId;
      BlockSeSnId        = DestSeSnId;
      BlockSeDatum       = DestSeDatum;
      BlockSeZeit        = DestSeZeit;
      BlockSeSpPosition  = DestSeSpPosition;
      BlockSeSnPosition  = DestSeSnPosition;
      BlockSePosition    = DestSePosition;
    END
    NextSePosition = BlockSePosition + 500;
  END
END

 

     Previous topic Chapter index Next topic