SCHEMA Allgemeine_Objekte;

REFERENCE FROM Historisierung (historisches_Objekt);

ENTITY Wochentag;
--- Attribute :
    Langtext: STRING(10);
--- Relationen :
END_ENTITY;


(* zulaessige Werte, in der Form (Kennung,Langtext):

   (1,'Sonntag')
   (2,'Montag')
   (3,'Dienstag')
   (4,'Mittwoch')
   (5,'Donnerstag')
   (6,'Freitag')
   (7,'Samstag')

*)

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

ENTITY einfacher_Zeitraum
SUBTYPE OF (Zeitraum);
--- Attribute :
--- Relationen :
    hat_Startdatum: Startdatum;
    hat_Dauer: Dauer;
END_ENTITY;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

ENTITY Startdatum;
--- Attribute :
    Jahr: OPTIONAL INTEGER;
    Monat_im_Jahr: OPTIONAL INTEGER;
    Woche_im_Jahr: OPTIONAL INTEGER;
    Tag_im_Monat: OPTIONAL INTEGER;
    vorwaerts_oder_rueckwaerts: OPTIONAL BOOLEAN;
    Woche_im_Monat: OPTIONAL INTEGER;
    Tag_in_der_Woche: OPTIONAL INTEGER;
    Stunde_am_Tag: OPTIONAL INTEGER;
    Minute_in_der_Stunde: OPTIONAL INTEGER;
    Sekunde_in_der_Minute: OPTIONAL INTEGER;
--- Relationen :
INVERSE
    von_einfachem_Zeitraum: SET [0: ?] OF einfacher_Zeitraum FOR hat_Startdatum;
WHERE
    nur_Monat_oder_Woche: NOT(EXISTS(Monat_im_Jahr)AND EXISTS(Woche_im_Jahr));
END_ENTITY;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

ENTITY Dauer;
--- Attribute :
    Jahre: OPTIONAL INTEGER;
    Monate: OPTIONAL INTEGER;
    Wochen: OPTIONAL INTEGER;
    Tage: OPTIONAL INTEGER;
    Stunden: OPTIONAL INTEGER;
    Minuten: OPTIONAL INTEGER;
    Sekunden: OPTIONAL INTEGER;
--- Relationen :
INVERSE
    von_einfachem_Zeitraum: SET [0: ?] OF einfacher_Zeitraum FOR hat_Dauer;
END_ENTITY;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

ENTITY komplexer_Zeitraum
SUBTYPE OF (Zeitraum);
--- Attribute :
--- Relationen :
    hat_ersten_Zeitraum: Zeitraum;
    hat_zweiten_Zeitraum: Zeitraum;
    hat_Operator: Operator;
END_ENTITY;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

ENTITY Operator;
--- Attribute :
    Kennung: STRING(1);
    Langtext: STRING;
--- Relationen :
UNIQUE
    Kennung_eindeutig: Kennung;
END_ENTITY;


(* zulaessige Werte, in der Form (Kennung,Langtext):

   ('+','Vereinigung')
   ('*','Durchschnitt')
   ('-','Differenz')

*)

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

ENTITY Zeitraum
ABSTRACT SUPERTYPE OF (ONEOF(einfacher_Zeitraum , komplexer_Zeitraum ))
SUBTYPE OF (historisches_Objekt);
--- Attribute :
--- Relationen :
INVERSE
    erster_in: SET [0: ?] OF komplexer_Zeitraum FOR hat_ersten_Zeitraum;
    zweiter_in: SET [0: ?] OF komplexer_Zeitraum FOR hat_zweiten_Zeitraum;
END_ENTITY;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Datum = STRING;
WHERE
    Datums_Format: SELF LIKE '##.##.####';
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Uhrzeit = STRING;
WHERE
    Uhrzeit_Format: SELF LIKE '##:##' OR SELF LIKE '##:##:##' OR SELF LIKE '##:##:##:###';
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Jahr = INTEGER;
WHERE
    Jahr_sinnvoll: { 1900<=SELF<=2099};
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Monat = INTEGER;
WHERE
    Monat_sinnvoll: { 1<=SELF<=12};
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Woche = INTEGER;
WHERE
    Woche_sinnvoll: { 1<=SELF<=53};
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Tag = INTEGER;
WHERE
    Monat_sinnvoll: { 1<=SELF<=31};
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Stunde = INTEGER;
WHERE
    Stunde_sinnvoll: { 1<=SELF<=12};
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Minute = INTEGER;
WHERE
    Minute_sinnvoll: { 1<=SELF<=12};
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Anzahl = INTEGER;
WHERE
    Anzahl_nicht_negativ: SELF>=0;
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Anzahl_zweistellig = INTEGER;
WHERE
    Anzahl_zweistellig: { 0<=SELF<=99};
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Groesse = REAL;
WHERE
    Groesse_nicht_negativ: SELF>=0;
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Tage = Anzahl;
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Millisekunden = Anzahl;
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Meter = Groesse;
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Dezimeter = Groesse;
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Zentimeter = Groesse;
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Millimeter = Groesse;
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Mikrometer = Groesse;
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Kilometer = Groesse;
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Meter_ueber_NN = REAL;
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Quadratmeter = Groesse;
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Quadratmillimeter = Groesse;
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Tonnen = Groesse;
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Prozent = REAL;
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Gon = Groesse;
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Winkel = REAL;
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Grad = INTEGER;
WHERE
    Grad_sinnvoll: { 0<=SELF<=359};
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Newton_pro_Quadratmillimeter = Anzahl;
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Kilonewton = Groesse;
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Kilogramm = Groesse;
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Kilogramm_pro_Quadratmeter = Groesse;
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE cd_pro_Quadratmeter = Anzahl;
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Lux = Anzahl;
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Kilowatt = Anzahl;
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Grad_Celsius = Groesse;
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Hektopascal = INTEGER;
WHERE
    Hektopascal_sinnvoll: { 800<=SELF<=1200};
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Stundenkilometer = Anzahl;
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Meter_pro_Sekunde = Groesse;
WHERE
    Meter_pro_Sekunde_nicht_neg: SELF>=0;
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE Millimeter_pro_Stunde = Groesse;
WHERE
    Millimeter_pro_Stunde_n_neg: SELF>=0;
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE DM = Groesse;
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

TYPE EURO = Groesse;
END_TYPE;

-- SCHEMA - OKSTRA - INDEX - VERSION << - VERSION >>

END_SCHEMA; -- Allgemeine_Objekte