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. |
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
![]() ![]() ![]() |