Im folgenden wird ein Programm zur Verwaltung von Stücklisten gezeigt mit der Möglichkeit, entweder Mengenübersichtsstücklisten oder Baukastenstücklisten auszugeben.
MODULE PartsLists;
IMPORT Oberon, Texts, ODBC, SQLBase, ESQL, In, Out, Strings;
TYPE
Nummer = LONGINT;
ID = LONGINT;
Teil = RECORD
nr: Nummer;
bezeichnung: ARRAY 64 OF CHAR;
art: ARRAY 10 OF CHAR;
lagerBestand: LONGINT;
einheit: SHORTINT
END ;
Struktur = RECORD
oberTeil, unterTeil: Nummer;
menge: LONGINT
END ;
VerkaufsTeil = RECORD
nr: Nummer;
verkaufsPreis: LONGINT
END ;
FremdTeil = RECORD
nr: Nummer;
bestellPolitik: SHORTINT
END ;
EigenTeil = RECORD
nr: Nummer;
losGroesse: INTEGER;
END ;
Arbeitsplan = RECORD
apNummer: INTEGER;
ersteller: ID;
pruefer: ID;
erstellungsDatum: ODBC.DateRec
END ;
TeilArbeitsplan = RECORD
teil: Nummer;
arbeitsplan: INTEGER
END ;
TechVerfahren = RECORD
vNummer: INTEGER;
bezeichnung: ARRAY 64 OF CHAR
END ;
Arbeitsgang = RECORD
apNummer: INTEGER;
agNummer: INTEGER;
vNummer: INTEGER
END ;
BetriebsMittel = RECORD
bmNummer: INTEGER;
bezeichnung: ARRAY 64 OF CHAR;
wartung: SHORTINT
END ;
AGBM = RECORD
apNummer: INTEGER;
agNummer: INTEGER;
bmNummer: INTEGER
END ;
AGKomp = RECORD
apNummer: INTEGER;
agNummer: INTEGER;
oberTeil, unterTeil: Nummer
END ;
VAR
connStr: ARRAY 256 OF CHAR;
conn: SQLBase.Connection;
text: Texts.Text; r: Texts.Reader;
PROCEDURE Execute (s: ARRAY OF CHAR);
VAR stat: SQLBase.Statement;
BEGIN
stat := conn.Prepare(s); stat.Execute
END Execute;
PROCEDURE CreateTables*;
BEGIN
Execute("CREATE TABLE Teil FOR Teil");
Execute("CREATE TABLE Struktur FOR Struktur");
Execute("CREATE TABLE VerkaufsTeil FOR VerkaufsTeil");
Execute("CREATE TABLE FremdTeil FOR FremdTeil");
Execute("CREATE TABLE EigenTeil FOR EigenTeil");
Execute("CREATE TABLE Arbeitsplan FOR Arbeitsplan");
Execute("CREATE TABLE TeilArbeitsplan FOR TeilArbeitsplan");
Execute("CREATE TABLE TechVerfahren FOR TechVerfahren");
Execute("CREATE TABLE Arbeitsgang FOR Arbeitsgang");
Execute("CREATE TABLE BetriebsMittel FOR BetriebsMittel");
Execute("CREATE TABLE AGBM FOR AGBM");
Execute("CREATE TABLE AGKomp FOR AGKomp");
END CreateTables;
PROCEDURE DropTables*;
BEGIN
Execute("DROP TABLE Teil");
Execute("DROP TABLE Struktur");
Execute("DROP TABLE VerkaufsTeil");
Execute("DROP TABLE FremdTeil");
Execute("DROP TABLE EigenTeil");
Execute("DROP TABLE Arbeitsplan");
Execute("DROP TABLE TeilArbeitsplan");
Execute("DROP TABLE TechVerfahren");
Execute("DROP TABLE Arbeitsgang");
Execute("DROP TABLE BetriebsMittel");
Execute("DROP TABLE AGBM");
Execute("DROP TABLE AGKomp");
END DropTables;
PROCEDURE TrimRight (VAR s: ARRAY OF CHAR);
VAR i: INTEGER;
BEGIN
i := 0; WHILE s[i] # 0X DO INC(i) END ;
REPEAT DEC(i) UNTIL (i = 0) OR (s[i] # " ");
s[i + 1] := 0X
END TrimRight;
PROCEDURE BoxOfBricks*;
VAR nr, teilnr: Nummer; bezeichnung: ARRAY 64 OF CHAR; menge: LONGINT;
s, s2: SQLBase.Statement; str: ARRAY 512 OF CHAR;
BEGIN
In.Open; In.LongInt(teilnr);
str := "SELECT T1.nr, T1.bezeichnung, Struktur.menge FROM Teil AS T1 INNER
JOIN (Teil INNER JOIN Struktur ON Teil.nr = Struktur.oberTeil) ON
T1.nr = Struktur.unterTeil GROUP BY T1.nr, Teil.nr, T1.bezeichnung,
Struktur.menge";
Strings.Append(" HAVING Teil.nr = :teilnr INTO :nr, :bezeichnung, :menge", str);
s := conn.Prepare(str);
s.Execute;
IF s.ret = SQLBase.Success THEN
Out.String("Baukastenstueckliste fuer Teil "); Out.Int(teilnr, 0); Out.Ln;
Out.String("Teilenummer"); Out.Char(9X); Out.String("Bezeichnung");
Out.Char(9X); Out.String("Menge"); Out.Ln;
WHILE s.Fetch() DO
TrimRight(bezeichnung);
Out.Int(nr, 0); Out.Char(9X); Out.String(bezeichnung); Out.Char(9X);
Out.Int(menge, 0); Out.Ln
END
END
END BoxOfBricks;
PROCEDURE Quantity*;
VAR nr, teilnr: Nummer; bezeichnung: ARRAY 64 OF CHAR; sum: LONGINT;
s, s2: SQLBase.Statement;
BEGIN
In.Open; In.LongInt(teilnr);
s := conn.Prepare("SELECT T1.nr, T1.bezeichnung FROM Teil AS T1
INNER JOIN (Teil INNER JOIN Struktur ON Teil.nr = Struktur.oberTeil)
ON T1.nr = Struktur.unterTeil GROUP BY T1.nr, T1.bezeichnung, Teil.nr
HAVING Teil.nr = :teilnr INTO :nr, :bezeichnung, :sum");
s.Execute;
IF s.ret = SQLBase.Success THEN
Out.String("Mengenuebersichtsstueckliste fuer Teil "); Out.Int(teilnr, 0);
Out.Ln; Out.String("Teilenummer"); Out.Char(9X); Out.String("Bezeichnung");
Out.Char(9X); Out.String("Menge"); Out.Ln;
WHILE s.Fetch() DO
TrimRight(bezeichnung);
Out.Int(nr, 0); Out.Char(9X); Out.String(bezeichnung); Out.Char(9X);
s2 := conn.Prepare("SELECT Sum(Struktur.menge) AS Menge FROM Teil AS T1
INNER JOIN (Teil INNER JOIN Struktur ON Teil.nr = Struktur.oberTeil)
ON T1.nr = Struktur.unterTeil GROUP BY Teil.nr, T1.nr HAVING
(Teil.nr = :teilnr) AND (T1.nr = :nr) INTO :sum");
s2.Execute; IF ~s2.Fetch() THEN HALT(44) END ;
Out.Int(sum, 0); Out.Ln
END
END
END Quantity;
PROCEDURE Connect*;
BEGIN conn := ESQL.OpenUI(connStr, connStr)
END Connect;
BEGIN
connStr := ""
END PartsLists.
Das Kommando PartsLists.Connect dient zum Aufbauen der Verbindung zur Datenbank.
Die Kommandos PartsLists.CreateTables, und PartsLists.DropTables dienen zum Erstellen der nötigen Tabellen bzw. zum Löschen der Tabellen.
Das Kommando PartsLists.BoxOfBricks gibt die Strukturstückliste für den Teil aus, dessen Teilenummer man als Parameter angibt.
Das Kommando PartsLists.Quantity gibt die Mengenübersichtsstückliste für den Teil aus, dessen Teilenummer man als Parameter angibt.
Mit dem DataEditor (siehe Kapitel
) kann man Daten in die einzelnen Tabellen eingeben, z.B. nach Ausführung des Kommandos DataEditor.Open Teil.