next up previous contents
Next: Addresses Up: Beispielprogramme Previous: Beispielprogramme

PartLists

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 gif) kann man Daten in die einzelnen Tabellen eingeben, z.B. nach Ausführung des Kommandos DataEditor.Open Teil.



Christoph Steindl
Thu Jul 24 14:37:19 MET DST 1997