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.