Prozeduren Previous topic Chapter index Next topic

SE_CALC_BACK

 

Eingabeparameter

Parameter

Typ

Beschreibung

SNID

INTEGER

ID der Sendung.

SEPOS

INTEGER

Sendeelement Position.

ENDZEIT

INTEGER

Hier wird die aktuelle Sendezeit vom Z- oder R-Sequenz Element übergeben.

MINZEIT

INTEGER

Minimale Anspielzeit. Wird ein Element eingekürzt und die Dauer liegt unter der minimalen Anspielzeit, wird ein zusätzliches Element in die SENDEELEMENTE Tabelle eingefügt welches darauf hinweist. Dieses wird dann z.B. in der Planning Base grafisch dargestellt.

GRPENDE

INTEGER

Aktuelle Zeit vom Gruppenende.

 

Ausgabeparameter

Parameter

Typ

Beschreibung

LASTLAENGE

INTEGER

Rückgabe der eingekürzten Länge vom letzten Element.

LASTSTARTNEXT

INTEGER

Rückgabe der StartNext Zeit vom letzten Element.

KORRGRPENDE

INTEGER

Rückgabe der effektiven Gruppenendzeit. Kann bei Headern angepasst worden sein.

 

Beschreibung

Gelangt man beim Vorwärtsrechnen an eine Z- oder R-Sequenz, wird mit dieser Procedure eine Rückwärtsberechnung durchgeführt. (Wird von SE_CALC_FROM_SEID aufgerufen).

 

Definition

CREATE PROCEDURE SE_CALC_BACK(
    SNID INTEGER,
    SEPOS INTEGER,
    ENDZEIT INTEGER,
    MINZEIT INTEGER,
    GRPENDE INTEGER)
RETURNS (
    LASTLAENGE INTEGER,
    LASTSTARTNEXT INTEGER,
    KORRGRPENDE INTEGER)
AS
  DECLARE VARIABLE Laenge          INTEGER;
  DECLARE VARIABLE LetzteSeZeit    INTEGER;

  DECLARE VARIABLE AktSeId         INTEGER;
  DECLARE VARIABLE AktSeSnId       INTEGER;
  DECLARE VARIABLE AktSeDatum      DATE;
  DECLARE VARIABLE AktSeSpPosition INTEGER;
  DECLARE VARIABLE AktSeSnPosition INTEGER;
  DECLARE VARIABLE AktSePosition   INTEGER;
  DECLARE VARIABLE AktSeZeit       INTEGER;
  DECLARE VARIABLE AktSeSequenz    CHAR(1);
  DECLARE VARIABLE AktSeTyp        CHAR(2);
  DECLARE VARIABLE AktSeStartNext  INTEGER;
  DECLARE VARIABLE AktSeFixeLaenge INTEGER;
  DECLARE VARIABLE AktSeParallel   CHAR(1);
  DECLARE VARIABLE AktSeRegion     SMALLINT;
  DECLARE VARIABLE RegionCode      SMALLINT;
  DECLARE VARIABLE RegionBlockStart INTEGER;
  DECLARE VARIABLE RegionBlockEnde  INTEGER;
  DECLARE VARIABLE AktSeGruppe     CHAR(1);
  DECLARE VARIABLE AktSeRFlag      CHAR(1);
BEGIN
  /* Initialisierungen */
  RegionCode       = 0;
  RegionBlockStart = 0;
  RegionBlockEnde  = 0;

  LetzteSeZeit = EndZeit;

  /* Reuckgaben vorbelegen */
  LastLaenge    = 0;
  LastStartNext = 0;
  KorrGrpEnde   = GrpEnde;

  FOR
    SELECT
      SEID,SESNID,SEDATUM,SESPPOSITION,SESNPOSITION,SEPOSITION,
      SEZEIT,SESEQUENZ,SETYP,SESTARTNEXT,SEFIXELAENGE,SEPARALLEL,
      SEREID,SEGRUPPE,SERFLAG
    FROM SENDEELEMENTE
    /* Elemente mit R, S oder X Flags werden ignoriert */
    WHERE (SESNID = :SnId) AND (SERFLAG NOT IN ('R','S','X')) AND (SEPOSITION < :SePos)
    ORDER BY SEPOSITION DESCENDING
    INTO
      :AktSeId,:AktSeSnId,:AktSeDatum,:AktSeSpPosition,:AktSeSnPosition,:AktSePosition,
      :AktSeZeit,:AktSeSequenz,:AktSeTyp,:AktSeStartNext,:AktSeFixeLaenge,:AktSeParallel,
      :AktSeRegion,:AktSeGruppe,:AktSeRFlag
  DO BEGIN

    /* NULL-Zeiten behandeln */
    IF (AktSeFixeLaenge is NULL) THEN BEGIN
      AktSeFixeLaenge = 0;
    END

    /* Fehlzeiten und Ueberzeiten loeschen */
    IF ( (AktSeTyp = 'F') OR (AktSeTyp = 'U') ) THEN BEGIN
      DELETE FROM SENDEELEMENTE
      WHERE (SEID = :AktSeId);
    END
    /* DABDB-423 */
    ELSE IF (AktSeSequenz <> 'P') THEN BEGIN

      /* B-Elemente zurueckrechnen */
      IF (AktSeSequenz = 'B') THEN BEGIN
        /* Wenn es Regionen hat, muss die Start- und Endzeit behalten werden */
        IF (RegionCode <> AktSeRegion) THEN BEGIN
          /* Region Ende nur speichern wenn es mit einer Region beginnt */
          IF (RegionCode = 0) THEN BEGIN
            RegionBlockEnde = LetzteSeZeit;
          END
          RegionCode = AktSeRegion;
          EndZeit = RegionBlockEnde;
          /* Region Start fuer die Headerzeit speichern */
          IF (RegionBlockStart > LetzteSeZeit) THEN BEGIN
            RegionBlockStart = LetzteSeZeit;
          END
        END

        /* Bei Header SeZeit vom vorhergehenden Element uebernehmen */
        IF ((AktSeTyp = 'H') OR (AktSeTyp = 'HR') OR (AktSeTyp = 'HB') OR (AktSeParallel = 'D')) THEN BEGIN
          /* Bei Regionen wird die laengste Zeit fuer den Header genommen */
          IF ((RegionBlockStart > 0) AND (AktSeParallel <> 'D')) THEN BEGIN
            EndZeit = RegionBlockStart;
          END
          ELSE BEGIN
            EndZeit = LetzteSeZeit;
          END
        END
        ELSE BEGIN
          EndZeit = EndZeit - AktSeStartNext;
        END
        LetzteSeZeit = EndZeit;

        UPDATE SENDEELEMENTE SET
          SEZEIT = :EndZeit,
          SEDAUER = :AktSeStartNext
        WHERE (SEID = :AktSeId);

        /* Bei Header: Gruppen-Endzeit korrigieren */
        IF (((AktSeTyp = 'H') OR (AktSeTyp = 'HR') OR (AktSeTyp = 'HB')) AND (AktSeFixeLaenge <> 0)) THEN BEGIN
          KorrGrpEnde = EndZeit + AktSeFixeLaenge;
        END

      END

      /* Alle anderen Elemente bearbeiten ( S / M / Z / F / L / K / Q / W / R / C / T ) */
      ELSE BEGIN

        /* Reserven machen */
        IF (AktSeZeit >= EndZeit) THEN BEGIN
          IF (AktSeSequenz NOT IN ('Z', 'R', 'F', 'L', 'K', 'Q', 'T')) THEN BEGIN  /* removed: and (AktSeStartNext > 0) */
            UPDATE SENDEELEMENTE SET
              SERFLAG = 'R'
            WHERE (SEID = :AktSeId);
          END
        END

        ELSE BEGIN

          LastLaenge = EndZeit - AktSeZeit;
          LastStartNext = AktSeStartNext;

          /* Fehlzeit eintragen */
          IF (LastLaenge > AktSeStartNext) THEN BEGIN
            AktSeZeit = AktSeZeit + AktSeStartNext;
            Laenge = LastLaenge - AktSeStartNext;
            EXECUTE PROCEDURE SE_CALC_INS_DIFF(0,
                                               AktSeSnId,
                                               AktSeDatum,
                                               AktSeSpPosition,
                                               AktSeSnPosition,
                                               AktSePosition,
                                               AktSeZeit,
                                               Laenge,
                                               AktSeGruppe);

            LastLaenge = AktSeStartNext;
          END

          /* Feld 'Dauer' nachtragen */
          UPDATE SENDEELEMENTE SET
            SEDAUER = :LastLaenge
          WHERE (SEID = :AktSeId);

          /* Ueberzeit eintragen */
          IF ((LastLaenge < MinZeit) AND (AktSeStartNext >= MinZeit)) THEN BEGIN
            UPDATE SENDEELEMENTE SET
              SERFLAG = 'K'
            WHERE (SEID = :AktSeId);
            EXECUTE PROCEDURE SE_CALC_INS_DIFF(1,
                                               AktSeSnId,
                                               AktSeDatum,
                                               AktSeSpPosition,
                                               AktSeSnPosition,
                                               AktSePosition,
                                               AktSeZeit,
                                               LastLaenge,
                                               AktSeGruppe);
          END
          ELSE BEGIN
            IF (AktSeRFlag = 'K') THEN BEGIN
              UPDATE SENDEELEMENTE SET
                SERFLAG = '-'
              WHERE (SEID = :AktSeId);
            END
          END
          
          /* Abbruch */
          EXIT;
        END
      END

      /* Z-, R-, L- oder F-Event erreicht -> Abbruch */
      IF (AktSeSequenz IN ('Z', 'R', 'F', 'L', 'K', 'Q', 'T')) THEN BEGIN
        EXIT;
      END

    END
  END
END

 

     Previous topic Chapter index Next topic