Prozeduren Previous topic Chapter index Next topic

SE_MOVE_BLOCK

 

Eingabeparameter

Parameter

Typ

Beschreibung

SRCSNID

INTEGER

Ein Primary Key Wert von der SENDUNGEN Tabelle

SRCSEPOSITION

INTEGER

Damit wird das Sendeelement, welches verschoben werden soll, angegeben.

DESTSESNID

INTEGER

Ein Primary Key Wert von der SENDUNGEN Tabelle.

DESTSEDATUM

DATE

Damit wird das Ziel Datum übergeben.

DESTSEZEIT

INTEGER

Damit wird die Ziel Sendeelement Zeit übergeben.

DESTSESPPOSITION

INTEGER

Damit wird die Ziel Sendeplan Position übergeben.

DESTSESNPOSITION

INTEGER

Damit wird die Ziel Sendung Position übergeben.

DESTSEPOSITION

INTEGER

Damit wird die Ziel Sendeelement Position übergeben.

MOVEGROUP

INTEGER

Damit wird angegeben, ob nur ein Element oder eine ganze Gruppe verschoben werden soll.

DIRECTION

INTEGER

Damit wird die Richtung bestimmt ab dem angegebenen Element.

 

Ausgabeparameter

Parameter

Typ

Beschreibung

BLOCKSEID

INTEGER

Ein Primary Key Wert von der SENDEELEMENTE Tabelle wird zurückgegeben.

BLOCKSEPOSITION

INTEGER

Gibt die SePosition vom Block zurück.

 

Beschreibung

Verschiebt ein Sendeelement (mit Klammer) oder auch ganze Blöcke. (Wird von SE_MOVE aufgerufen)

 

Definition

CREATE PROCEDURE SE_MOVE_BLOCK(
    SRCSNID INTEGER,
    SRCSEPOSITION INTEGER,
    DESTSESNID INTEGER,
    DESTSEDATUM DATE,
    DESTSEZEIT INTEGER,
    DESTSESPPOSITION INTEGER,
    DESTSESNPOSITION INTEGER,
    DESTSEPOSITION INTEGER,
    MOVEGROUP INTEGER,
    DIRECTION INTEGER)
RETURNS (
    BLOCKSEID INTEGER,
    BLOCKSEPOSITION INTEGER)
AS
  DECLARE VARIABLE FirstLoopFlag   INTEGER;
  DECLARE VARIABLE LastKlammer     CHAR(1);
  DECLARE VARIABLE LastGruppe      CHAR(1);
  DECLARE VARIABLE LastTyp         CHAR(2);

  DECLARE VARIABLE SeId            INTEGER;
  DECLARE VARIABLE SeSnId          INTEGER;
  DECLARE VARIABLE SeDatum         DATE;
  DECLARE VARIABLE SeZeit          INTEGER;
  DECLARE VARIABLE SeSpPosition    INTEGER;
  DECLARE VARIABLE SeSnPosition    INTEGER;
  DECLARE VARIABLE SePosition      INTEGER;
  DECLARE VARIABLE SeGruppe        CHAR(1);
  DECLARE VARIABLE SeKlammer       CHAR(1);
  DECLARE VARIABLE SeTyp           CHAR(2);
  DECLARE VARIABLE SeRFlag         CHAR(1);
  DECLARE VARIABLE SeSequenz       CHAR(1);
  
  DECLARE VARIABLE SeToleranz1     INTEGER;
  DECLARE VARIABLE SeToleranz2     INTEGER;
  DECLARE VARIABLE HourInMsDiff    INTEGER;
  DECLARE VARIABLE ATeId           INTEGER;
  DECLARE VARIABLE AFirstTeId      INTEGER;
  DECLARE VARIABLE SeBlockId       INTEGER;
  DECLARE VARIABLE LastSeBlockId   INTEGER;
  DECLARE VARIABLE ExitAfterKlammer SMALLINT;
BEGIN
  LastSeBlockId = 0;
  /* ****************************************************** */
  /* Ab aktueller Position reuckwaerts Elemente verschieben */
  /* Ende bei erster Vorwaerts-Klammer oder bei Header      */
  /* (Header wird mitverschoben).                           */
  /* ****************************************************** */
  IF (Direction = 1) THEN BEGIN

    FirstLoopFlag = 1;
    ExitAfterKlammer = 0;

    FOR
      SELECT
        SEID,SESNID,SEDATUM,SEZEIT,SESPPOSITION,SESNPOSITION,SEPOSITION,SESEQUENZ,
        SEGRUPPE,SEKLAMMER,SETYP,SETOLERANZ1,SETOLERANZ2,SEBLOCKID,SERFLAG
      FROM SENDEELEMENTE
      WHERE (SESNID = :SrcSnId) AND (SEPOSITION <= :SrcSePosition)
      ORDER BY SEPOSITION DESCENDING
      INTO
        :SeId,:SeSnId,:SeDatum,:SeZeit,:SeSpPosition,:SeSnPosition,:SePosition,:SeSequenz,
        :SeGruppe,:SeKlammer,:SeTyp,:SeToleranz1,:SeToleranz2,:SeBlockId,:SeRFlag
    DO BEGIN

      IF (FirstLoopFlag = 1) THEN BEGIN
        FirstLoopFlag = 0;
        AFirstTeId = NULL;
        SELECT MIN(TEID)
        FROM TRIGGEREDEVENTS
        WHERE (TETYP < 100) AND
              ((TESEID = :SeId) OR
               (TESEID IN (SELECT TESEID FROM TRIGGEREDEVENTS
                           WHERE (TETRIGGEREDSEID = :SeId))))
        INTO :AFirstTeId;
      END
      ELSE BEGIN
        IF (MoveGroup = 0) THEN BEGIN
          IF ((LastKlammer <> 'R') AND (SeKlammer <> 'V')) THEN BEGIN
            IF (AFirstTeId IS NULL) THEN BEGIN
              EXIT;
            END
            ATeId = NULL;
            SELECT MIN(TEID)
            FROM TRIGGEREDEVENTS
            WHERE (TETYP < 100) AND
                  ((TESEID = :SeId) OR
                   (TESEID IN (SELECT TESEID FROM TRIGGEREDEVENTS
                               WHERE (TETRIGGEREDSEID = :SeId))))
            INTO :ATeId;
            IF (ATeId IS NULL) THEN BEGIN
              EXIT;  /* Exit Loop and Procedure */
            END
          END
        END
        ELSE IF ((SeBlockId <> LastSeBlockId) OR (LastGruppe <> SeGruppe)) THEN BEGIN
          EXIT;
        END
        IF ((ExitAfterKlammer = 1) OR (LastTyp = 'H') OR (LastTyp = 'HR') OR (LastTyp = 'HB')) THEN BEGIN
          IF ((SeKlammer <> 'V') OR (LastGruppe <> SeGruppe)) THEN BEGIN
            EXIT;  /* Exit Loop and Procedure */
          END ELSE BEGIN
            ExitAfterKlammer = 1;
          END
        END
      END

      LastKlammer = SeKlammer;
      LastGruppe  = SeGruppe;
      LastTyp     = SeTyp;
      DestSePosition = DestSePosition - 1;
      BlockSeId       = SeId;
      BlockSePosition = DestSePosition;
      LastSeBlockId   = SeBlockId;

      /* Die Toleranz muss noch auf die Ziel-Stunde angepasst werden */
      IF (SeTyp <> 'S') THEN BEGIN
        HourInMsDiff = (CAST((DestSeSnPosition / 100) AS INTEGER) - 
                        CAST((SeSnPosition / 100) AS INTEGER)) * 
                       (60 * 60 * 1000);
        IF (SeToleranz1 <> 0) THEN BEGIN
          SeToleranz1 = SeToleranz1 + HourInMsDiff;
          IF (SeToleranz1 > (24 * 60 * 60 * 1000)) THEN BEGIN
            SeToleranz1 = SeToleranz1 - (24 * 60 * 60 * 1000);
          END
        END
        IF (SeToleranz2 <> 0) THEN BEGIN
          SeToleranz2 = SeToleranz2 + HourInMsDiff;
          IF (SeToleranz2 > (24 * 60 * 60 * 1000)) THEN BEGIN
            SeToleranz2 = SeToleranz2 - (24 * 60 * 60 * 1000);
          END
        END
      END

      /* SERFLAG darf nicht zurueckgesetzt werden, wenn es sich um ein X Flag handelt! */
      IF (SeRFlag <> 'X') THEN BEGIN
        SeRFlag = '-';
      END
      /* Die Zeit darf nicht geaendert werden, wenn es sich um ein Zeit-Element handelt! */
      IF (SeSequenz in ('P','T','Z')) THEN BEGIN
        DestSeZeit = SeZeit;
      END

      UPDATE SENDEELEMENTE SET
        SESNID       = :DestSeSnId,
        SEDATUM      = :DestSeDatum,
        SEZEIT       = :DestSeZeit,
        SESPPOSITION = :DestSeSpPosition,
        SESNPOSITION = :DestSeSnPosition,
        SEPOSITION   = :DestSePosition,
        SESTATUS     = 0,
        SETOLERANZ1  = :SeToleranz1,
        SETOLERANZ2  = :SeToleranz2,
        SEBLOCKID    = NULL,
        SERFLAG      = :SeRFlag
      WHERE (SEID = :SeId);
    END
  END

  /* ********************************************************* */
  /* Ab aktueller Position vorwaerts Elemente verschieben.     */
  /* Ende bei letzter Rueckwaerts-Klammer oder vor naechstem . */
  /* Header (Header wird NICHT mitverschoben).                 */
  /* ********************************************************* */
  ELSE BEGIN

    FirstLoopFlag = 1;

    FOR
      SELECT
        SEID,SESNID,SEDATUM,SEZEIT,SESPPOSITION,SESNPOSITION,SEPOSITION,SESEQUENZ,
        SEGRUPPE,SEKLAMMER,SETYP,SETOLERANZ1,SETOLERANZ2,SEBLOCKID,SERFLAG
      FROM SENDEELEMENTE
      WHERE (SESNID = :SrcSnId) AND (SEPOSITION >= :SrcSePosition)
      ORDER BY SEPOSITION ASCENDING
      INTO
        :SeId,:SeSnId,:SeDatum,:SeZeit,:SeSpPosition,:SeSnPosition,:SePosition,:SeSequenz,
        :SeGruppe,:SeKlammer,:SeTyp,:SeToleranz1,:SeToleranz2,:SeBlockId,:SeRFlag
    DO BEGIN

      IF (FirstLoopFlag = 1) THEN BEGIN
        LastKlammer = SeKlammer;
        LastGruppe  = SeGruppe;
        BlockSeId       = SeId;
        BlockSePosition = DestSePosition;
        LastSeBlockId   = SeBlockId;
        FirstLoopFlag = 0;
        ATeId = NULL;
        SELECT MIN(TEID)
        FROM TRIGGEREDEVENTS
        WHERE (TETYP < 100) AND 
              ((TESEID = :SeId) OR
               (TESEID IN (SELECT TESEID FROM TRIGGEREDEVENTS
                           WHERE (TETRIGGEREDSEID = :SeId))))
        INTO :ATeId;
      END
      ELSE BEGIN
        IF (MoveGroup = 0) THEN BEGIN
          IF ((LastKlammer <> 'V') AND (SeKlammer <> 'R')) THEN BEGIN
            IF (ATeId IS NULL) THEN BEGIN
              EXIT;
            END
            ATeId = NULL;
            SELECT MIN(TEID)
            FROM TRIGGEREDEVENTS
            WHERE (TETYP < 100) AND
                  ((TESEID = :SeId) OR
                   (TESEID IN (SELECT TESEID FROM TRIGGEREDEVENTS
                               WHERE (TETRIGGEREDSEID = :SeId))))
            INTO :ATeId;
            IF (ATeId IS NULL) THEN BEGIN
              EXIT;  /* Exit Loop and Procedure */
            END
          END
        END
        ELSE IF ((SeBlockId <> LastSeBlockId) OR (LastGruppe <> SeGruppe)) THEN BEGIN
          EXIT;
        END
        IF ((SeTyp = 'H') OR (SeTyp = 'HR') OR (SeTyp = 'HB')) THEN BEGIN
          EXIT;  /* Exit Loop and Procedure */
        END

        LastKlammer = SeKlammer;
        LastGruppe  = SeGruppe;
        DestSePosition = DestSePosition + 1;
        BlockSeId       = SeId;
        BlockSePosition = DestSePosition;
        LastSeBlockId   = SeBlockId;

        /* Die Toleranz muss noch auf die Ziel-Stunde angepasst werden */
        IF (SeTyp <> 'S') THEN BEGIN
          HourInMsDiff = (CAST((DestSeSnPosition / 100) AS INTEGER) - 
                          CAST((SeSnPosition / 100) AS INTEGER)) * 
                         (60 * 60 * 1000);
          IF (SeToleranz1 <> 0) THEN BEGIN
            SeToleranz1 = SeToleranz1 + HourInMsDiff;
            IF (SeToleranz1 > (24 * 60 * 60 * 1000)) THEN BEGIN
              SeToleranz1 = SeToleranz1 - (24 * 60 * 60 * 1000);
            END
          END
          IF (SeToleranz2 <> 0) THEN BEGIN
            SeToleranz2 = SeToleranz2 + HourInMsDiff;
            IF (SeToleranz2 > (24 * 60 * 60 * 1000)) THEN BEGIN
              SeToleranz2 = SeToleranz2 - (24 * 60 * 60 * 1000);
            END
          END
        END

        /* SERFLAG darf nicht zurueckgesetzt werden, wenn es sich um ein X Flag handelt! */
        IF (SeRFlag <> 'X') THEN BEGIN
          SeRFlag = '-';
        END
        /* Die Zeit darf nicht geaendert werden, wenn es sich um ein Zeit-Element handelt! */
        IF (SeSequenz in ('P','T','Z')) THEN BEGIN
          DestSeZeit = SeZeit;
        END

        UPDATE SENDEELEMENTE SET
          SESNID       = :DestSeSnId,
          SEDATUM      = :DestSeDatum,
          SEZEIT       = :DestSeZeit,
          SESPPOSITION = :DestSeSpPosition,
          SESNPOSITION = :DestSeSnPosition,
          SEPOSITION   = :DestSePosition,
          SESTATUS     = 0,
          SETOLERANZ1  = :SeToleranz1,
          SETOLERANZ2  = :SeToleranz2,
          SEBLOCKID    = NULL,
          SERFLAG      = :SeRFlag
        WHERE (SEID = :SeId);
      END
    END
  END
END

 

     Previous topic Chapter index Next topic