Prozeduren Previous topic Chapter index Next topic

SE_DELETE_BLOCK

 

Eingabeparameter

Parameter

Typ

Beschreibung

SRCSNID

INTEGER

Ein Primary Key Wert von der SENDUNGEN Tabelle

SRCSEPOSITION

INTEGER

Damit wird das Sendeelement in der Sendestunde über die Position angegeben.

DELETEGROUP

INTEGER

Damit wird angegeben, ob nur ein Element oder eine ganze Gruppe gelöscht werden soll.

SNIDPAPIERKORB

INTEGER

Die SNID vom Papierkorb.
Wenn NULL übergeben wird, heisst dies, dass es keinen Papierkorb im Main Scheduler gibt.

MAXSEPOSITION

INTEGER

Die grösste SEPOSITION im Papierkorb

HEADERBLOCKID

INTEGER

Hier wird die SEID vom ersten Gruppen Element übergeben, damit dies als BlockID gesetzt werden kann.

DIRECTION

INTEGER

Damit wird die Richtung bestimmt ab dem angegebenen Element.

 

Ausgabeparameter

Parameter

Typ

Beschreibung

TRASH_SNID

INTEGER

Hier erhält man die Sendungs ID vom Papierkorb zurück.

 

Beschreibung

Löscht ein Sendeelement (mit Klammer) oder auch ganze Blöcke.
Wenn es für die Welle ein Papierkorb gibt, dann wird das Sendeelement dorthin verschoben, ansonsten direkt gelöscht.
(Wird von SE_DELETE aufgerufen)

 

Definition

CREATE PROCEDURE SE_DELETE_BLOCK(
    SRCSNID INTEGER,
    SRCSEPOSITION INTEGER,
    DELETEGROUP INTEGER,
    SNIDPAPIERKORB INTEGER,
    MAXSEPOSITION INTEGER,
    HEADERBLOCKID INTEGER,
    DIRECTION INTEGER)
RETURNS (
    TRASH_SNID 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 SeGruppe        CHAR(1);
  DECLARE VARIABLE SeKlammer       CHAR(1);
  DECLARE VARIABLE SeTyp           CHAR(2);
  DECLARE VARIABLE ATeId           INTEGER;
BEGIN
  /* ****************************************************** */
  /* Ab aktueller Position reuckwaerts Elemente loeschen    */
  /* Ende bei erster Vorwaerts-Klammer oder bei Header      */
  /* (Header wird auch geloescht).                          */
  /* ****************************************************** */
  IF (Direction = 1) THEN BEGIN
    FirstLoopFlag = 1;

    FOR
      SELECT
        SEID,SEGRUPPE,SEKLAMMER,SETYP
      FROM SENDEELEMENTE
      WHERE (SESNID = :SrcSnId) AND (SEPOSITION <= :SrcSePosition)
      ORDER BY SEPOSITION DESCENDING
      INTO
        :SeId,:SeGruppe,:SeKlammer,:SeTyp
    DO BEGIN

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

      LastKlammer = SeKlammer;
      LastGruppe  = SeGruppe;
      LastTyp     = SeTyp;

      /* Wenn kein Papierkorb gefunden wurde oder es der Papierkorb selber ist, */
      /* dann wird wie bisher einfach geloescht! */
      IF ((SnIdPapierkorb IS NULL) OR (SnIdPapierkorb = SrcSnId)) THEN BEGIN
        DELETE FROM SENDEELEMENTE
        WHERE (SEID = :SeId);
        TRASH_SNID = 0; 
      END
      ELSE BEGIN
        MaxSePosition = MaxSePosition - 1;
        UPDATE SENDEELEMENTE SET SESNID = :SnIdPapierkorb, 
          SEPOSITION = :MaxSePosition, SEBLOCKID = :HeaderBlockId
        WHERE (SEID = :SeId);
        TRASH_SNID = SnIdPapierkorb;
      END
    END
  END

  /* ********************************************************* */
  /* Ab aktueller Position vorwaerts Elemente loeschen.        */
  /* Ende bei letzter Rueckwaerts-Klammer oder vor naechstem . */
  /* Header (Header wird NICHT geloescht).                     */
  /* ********************************************************* */
  ELSE BEGIN
    FirstLoopFlag = 1;

    FOR
      SELECT
        SEID,SEGRUPPE,SEKLAMMER,SETYP
      FROM SENDEELEMENTE
      WHERE (SESNID = :SrcSnId) AND (SEPOSITION >= :SrcSePosition)
      ORDER BY SEPOSITION ASCENDING
      INTO
        :SeId,:SeGruppe,:SeKlammer,:SeTyp
    DO BEGIN

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

        LastKlammer = SeKlammer;
        LastGruppe  = SeGruppe;

        /* Wenn kein Papierkorb gefunden wurde oder es der Papierkorb selber ist, */
        /* dann wird wie bisher einfach geloescht! */
        IF ((SnIdPapierkorb IS NULL) OR (SnIdPapierkorb = SrcSnId)) THEN BEGIN
          DELETE FROM SENDEELEMENTE
          WHERE (SEID = :SeId); 
          TRASH_SNID = 0;
        END
        ELSE BEGIN
          UPDATE SENDEELEMENTE SET SESNID = :SnIdPapierkorb, 
            SEPOSITION = :MaxSePosition, SEBLOCKID = :HeaderBlockId
          WHERE (SEID = :SeId);
          TRASH_SNID = SnIdPapierkorb;
          MaxSePosition = MaxSePosition + 1;
        END
      END
    END
  END
END

 

     Previous topic Chapter index Next topic