Inhaltsverzeichnis   Programmierhandbuch


Module

Modulbeschreibung

Programm: A

Programm: B

Der Quellcode des Tcl-Skripts ist in 7 Dateien definiert:
  • Hinweise zur Moduldokumentation
  • header.tcl
  • part.tcl
  • parse_xml.tcl
  • search.cgi
  • access.tcl
  • htmlSites.tcl
  • toolbox.tcl


    Hinweise zur Moduldokumentation

    Quelldateibeschreibung

    #####################################################################################
    #
    # Dateiname    : Dateiname
    # Import       : Importierte Quelldateien, die allen Modulen zur Verfgung stehen
    # Beschreibung : Klassifizierung der Module
    #
    # Prozeduren   : Namen der Module, die in der Datei definiert sind
    #
    # globale Variablen : Innerhalb der Datei definierte globale Variable
    #
    # Programmierer   : 
    # Žnderungen      : Datum             Beschreibung
    #                   -                 -
    #
    #####################################################################################
    


    Modulbeschreibung

    #-----------------------------------------------------------------------------
    # Modulname    :  Modulname
    # Beschreibung :  Modulbeschreibung
    #
    # Parameter    :  Argumente dieses Moduls
    #                 in                 Inputparameter
    #                 out                Referenzparameter
    #                 Name               Name des Parameters
    #                 Datentyp           Datentyp
    #                 Beschreibung       Beschreibung
    #
    # globaler Zugriff :  Variablenname   Lesezugriff   Schreibzugriff
    #                     Name der globalen Variablen, auf die lesend 
    #                     und/oder schreibend zugegriffen wird.
    #
    # Rckgabewert und
    # Fehlerbehandlung : Beschreibung des Rckgabewertes und der Ausnahmebehandlung
    #
    # Programmierer   : 
    # Žnderungen      : Datum             Beschreibung
    #                   -                 -
    #
    #-----------------------------------------------------------------------------
    



    Module

    header.tcl

    ##############################################################################
    #
    # Dateiname    : header.tcl
    # Import       : -
    # Beschreibung : Module zum Laden und Abspeichern der Indexstrukturen von
    #                und auf die Festplatte.
    #                Deklariert s„mtliche globalen Variablen
    #
    # Prozeduren   : Gruppe I
    #                  save_index_structures {directory lists arrays} 
    #                  load {directory lists arrays} 
    #
    # globale Variablen :  Name                   Datentyp               Beschreibung
    #                      semester               assoziatives Array     Angabe, ob die Veranstaltung im Sommersemester oder im Wintersemester
    #                      stundenVorlesung       assoziatives Array     Zeitbedarf der Veranstaltungen w„hrend des Semesters in Zeitstunden
    #                      stundenPruefung        assoziatives Array     Zeitbedarf fr Prfungsvorbereitungen und Prfungen
    #                      credits                assoziatives Array     Arbeitsaufwand eines Studierenden, der mit der jeweiligen Veranstaltung verbunden ist
    #                      sws                    assoziatives Array     Anzahl der Semesterwochenstunden dieser Vorlesung
    #                      kategorie              assoziatives Array     Kategorie der Veranstaltung
    #                      unterKategorie         assoziatives Array     Unterkategorie der Veranstaltung
    #                      assessment             assoziatives Array     zu erbringender Nachweis am Ende des Semesters
    #                      titel                  assoziatives Array     Name der Veranstaltung
    #                      beschreibung           assoziatives Array     Beschreibung der Veranstaltung
    #                      kommentar              assoziatives Array     Kommentar der Veranstaltung
    #                      referenz               assoziatives Array     Literaturangaben
    #                      partnerveranstaltung   assoziatives Array     Veranstaltungsnummer verwandert Veranstaltungen
    #                      language               assoziatives Array     Sprache der Beschreibung
    #                      lang                   assoziatives Array     Sprache der Beschreibung
    #                      pruefungsordnung       assoziatives Array     Angabe in welchen Prfungsordnungen diese Veranstaltung enthalten ist und im welchen Semester sie gehalten wird
    #                      mitarbeiter            assoziatives Array     Titel, Vorname und Nachname des Mitarbeiters, der die Veranstaltung h„lt
    #
    #                      id                     List                   Veranstaltungsnummer
    #                      hoererStati            List                   Optionen, ob die Veranstaltung im Sommer- oder Wintersemester gelesen wird
    #
    #                      all_lists              List                   Auflistung der Namen aller Indexstrukturen, die Listen sind
    #                      all_arrays             List                   Auflistung der Namen aller Indexstrukturen, die assoziatve Arrays sind
    #                      all_indizes            List                   Auflistung der Namen aller Indexstrukturen
    #
    #                      standard_request       String                 Standardanfrage
    #                      standard_request_list  Liste                  Standardanfrage im Listenformat
    #
    ##############################################################################
    
    #-----------------------------------------------------------------------------
    # Variablendeklaration
    #-----------------------------------------------------------------------------
    
    # Deklaration der Indexstrukturen
    set semester()              {}
    set stundenVorlesung()      {}
    set stundenPruefung()       {}
    set credits()               {}
    set sws()                   {}
    set kategorie()             {}
    set unterKategorie()        {}
    set assessment()            {}
    set titel()                 {}
    set beschreibung()          {}
    set kommentar()             {}
    set referenz()              {}
    set partnerveranstaltung()  {}
    set language()              {}
    set lang()                  {}
    set pruefungsordnung()      {}
    set mitarbeiter()           {}
    
    set id           {}
    set hoererStati  { ss ws }
    
    set all_lists    { hoererStati id }
    set all_arrays   { semester stundenVorlesung stundenPruefung sws partnerveranstaltung referenz lang mitarbeiter pruefungsordnung kategorie assessment credits unterKategorie titel kommentar beschreibung }
    set all_indizes  { semester stundenVorlesung stundenPruefung sws partnerveranstaltung referenz lang mitarbeiter pruefungsordnung kategorie assessment credits unterKategorie titel kommentar beschreibung }
    
    set standard_request "seite=0&language=DE&titel=alle&kategorie=alle&unterkategorie=alle&pruefungsordnung=alle&semester=alle&mitarbeiter=alle&assessment=alle&hoererstatus=[lindex $hoererStati 0]"
    set standard_request_list { { seite 0 } { language DE } { titel alle } { kategorie alle } { unterkategorie alle } { pruefungsordnung alle } { semester alle } { mitarbeiter alle } { assessment alle } { hoererstatus ss } }
    
    #-----------------------------------------------------------------------------
    # Modulname    : save_index_structures
    # Beschreibung : Abspeichern der Indexstrukturen in das Verzeichnis 
    #                der Festplatte.
    #                Die Elemente der Listen  und  sind die Namen
    #                von Variablen im Geltungsbereichs der aufrufenden Prozedur.
    #                Die Liste  enth„lt die Variablennamen von Listen.
    #                Die Liste  enth„lt die Variablennamen von assoziatives Arrays.
    #                Fr jede Variable wird eine Textdatei gleichen Namens
    #                angelegt (Pr„fix .txt), in die der Wert der Variablen ge-
    #                speichert und im Verzeichnis  abgelegt wird.
    #                Wenn die Referenzvariable nicht existiert, wird entweder eine
    #                leere Liste bzw. eine leeres assoziatives Array gleichen Namens angelegt.
    #                Wenn das Verzeichnis nicht existiert, wird ein neues angelegt.
    #                Wenn die Referenzvariable nicht dem geforderten Typ entspricht, dann werden
    #                die Fehlermeldungen "Referenzvariable ist Liste und nicht Array" bzw.
    #                "Referenzvariable ist Array und nicht Liste" ausgegeben.
    #
    # Parameter    :  in | out   Name       Datentyp       Beschreibung
    #                    in      directory  string         absoluter Pfad zu den Indexstrukturen 
    #                    in      lists      Liste          Bestandteile der Liste sind Referenzparameter und zwar Listen
    #                    in      arrays     Liste          Bestandteile der Liste sind Referenzparameter und zwar assoziatives Arrays
    #
    #-----------------------------------------------------------------------------
    proc save_index_structures {directory lists arrays} {
      #Referenz auf Gltigkeitsbereich der aufrufenden Prozedur setzen
      foreach element $lists {
        upvar $element $element
        if {[string compare [info exists $element] 0] == 0} {
          set $element {}
        }
      }
    
      #Referenz auf Gltigkeitsbereich der aufrufenden Prozedur setzen
      foreach element $arrays {
        upvar $element $element
        if {[string compare [info exists $element] 0] == 0} {
          set ${element}() {}
        }
      }
    
      #wenn Verzeichnis nicht existiert, lege neues an
      if {[string compare [file isdirectory $directory] 0] == 0} {
        file mkdir $directory
      }
    
      foreach element $lists {
        # wenn Liste ein Array, dann breche ab
        if {[array exists $element] == 1} {
          puts "Fehler: Variable $element ist Array und nicht Liste"
          return
        }
        set tmpfile [open ${directory}${element}.txt w]
        puts $tmpfile ${element}
        puts $tmpfile [set $element]
        close $tmpfile
      }
    
      foreach element $arrays {
        set tmpfile [open ${directory}${element}.txt w]
        # wenn Liste ein Array, dann breche ab
        if {[array exists $element] == 0} {
          puts "Fehler: Variable $element ist Liste und nicht Array"
          return
        }
        foreach liste [array names $element] {
          puts $tmpfile ${element}($liste)
          puts $tmpfile [set ${element}($liste)]
        }
        close $tmpfile
      }
    }
    
    #-----------------------------------------------------------------------------
    # Modulname    : load
    # Beschreibung : Laden der Indexstrukturen auf dem Verzeichnis 
    #                von der Festplatte.
    #                Die Elemente der Listen  und  sind die Namen
    #                von Variablen des Geltungsbereichs der aufrufenden Prozedur.
    #                Die Liste  enth„lt die Variablennamen von Listen.
    #                Die Liste  enth„lt die Variablennamen von assoziatives Arrays.
    #                Fr jede Variable wird eine Textdatei gleichen Namens
    #                angelegt (Pr„fix .txt), in die der Wert der Variablen ge-
    #                speichert und im Verzeichnis  abgelegt wird.
    #                Wenn die Referenzvariable nicht existiert, wird entweder eine
    #                leere Liste bzw. eine leeres assoziatives Array gleichen Namens angelegt.
    #                Wenn das Verzeichnis nicht existiert, wird die Fehlermeldung
    #                "Verzeichnis xxx mit Indexstrukturen existiert nicht" ausgegeben.
    #                Wenn die Referenzvariable nicht dem geforderten Typ entspricht, dann werden
    #                die Fehlermeldungen "Referenzvariable ist Liste und nicht Array" bzw.
    #                "Referenzvariable ist Array und nicht Liste" ausgegeben.
    #                Wenn eine Indexstrukturdatei nicht existiert, wird eine leere Indexstruktur
    #                erzeugt.
    #
    # Parameter    :  in | out   Name       Datentyp    Beschreibung
    #                    in      directory  string      absoluter Pfad zu dem Indexverzeichnis
    #                  in/out    lists      Liste       Bestandteile der Liste sind Referenzparameter und zwar Listen
    #                  in/out    arrays     Liste       Bestandteile der Liste sind Referenzparameter und zwar assoziatives Arrays
    #                                                   
    #-----------------------------------------------------------------------------
    proc load {directory lists arrays} {
      #Referenz auf Gltigkeitsbereich der aufrufenden Prozedur
      foreach element $lists {
        upvar $element $element
        if {[string compare [info exists $element] 0] == 0} {
          set $element {}
        }
      }
    
      #Referenz auf Gltigkeitsbereich der aufrufenden Prozedur
      foreach element $arrays {
        upvar $element $element
        if {[string compare [info exists $element] 0] == 0} {
          set ${element}() {}
        }
      }
    
      #wenn Verzeichnis nicht existiert, gibt Fehlercode zurck
      if {[string compare [file isdirectory $directory] 0] == 0} {
          puts "Fehler: Verzeichnis $directory mit Indexstrukturen existiert nicht"
          return -1
      }
    
      #das Auslesen von Listen und Arrays ist identisch, da die eine Zeile immer
      #den Variablennamen inkl. evtl. Key-Wert und die darauffolgende Zeile den
      #Wert darstellt
      foreach index [concat $lists $arrays] {
        set myfile "${directory}${index}.txt"
        if {[file exists $myfile] == 1} {
          set tmpfile [open $myfile r]
          while {[eof $tmpfile] != 1} {
            set [gets $tmpfile] [gets $tmpfile]
          }
          close $tmpfile
        }
      }
    }
    



    part.tcl

    ##############################################################################
    #
    # Dateiname    : part.tcl
    # Import       : -
    # Beschreibung : L„dt die sprachabh„ngigen Bezeichnungen einer Veranstaltungs-
    #                seite aus der jeweiligen Konfigurationsdatei und ermittelt die
    #                zu einer bestimmten Veranstaltung geh”rigen Daten.
    #
    #
    # Prozeduren   : Gruppe I
    #                  init_literale {language directory} 
    #                  init_values {language vid} 
    #
    # globale Variablen :  Name                   Datentyp    
    #       Literale:      lit_semester           string      Bezeichner auf der Vorlesungsseite
    #                      val_semester           string      Wert auf der Vorlesungsseite
    #                      lit_stundenVorlesung   string      
    #                      val_stundenVorlesung   string               
    #                      lit_stundenPruefung    string               
    #                      val_stundenPruefung    string               
    #                      lit_credit             string               
    #                      val_credit             string               
    #                      lit_sws                string               
    #                      val_sws                string               
    #                      lit_kategorie          string               
    #                      val_kategorie          string               
    #                      lit_unterkategorie     string                
    #                      val_unterkategorie     string                
    #                      lit_assessment         string                
    #                      val_assessment         string                
    #                      lit_titel              string               
    #                      val_titel              string               
    #                      lit_beschreibung       string               
    #                      val_beschreibung       string               
    #                      lit_kommentar          string               
    #                      val_kommentar          string               
    #                      lit_referenz           string               
    #                      val_referenz           string               
    #                      lit_partner            string               
    #                      val_partner            string               
    #                      lit_sprache            string                
    #                      val_sprache            string                
    #                      lit_pruefungsordnung   string               
    #                      val_pruefungsordnung   string               
    #                      lit_mitarbeiter        string               
    #                      val_mitarbeiter        string               
    #
    #                      lit_fenstertitel       string               
    #                      val_fenstertitel       string               
    #                      lit_hoererstatus       string               
    #                      val_hoererstatus       string               
    #                      lit_alle               string               
    #                      val_alle               string               
    #                      lit_vorlesungen        string                
    #                      val_vorlesungen        string                
    #                      lit_arbeitsaufwand     string               
    #                      val_arbeitsaufwand     string               
    #
    #                      all_literale           list            Liste aller Bezeichner
    #                      all_values             list            Liste aller Werte
    #
    #                      tableDefault           string          HTML-Ersatzsymbol
    #
    ##############################################################################
    
    #-----------------------------------------------------------------------------
    # Variablendeklaration
    #-----------------------------------------------------------------------------
    
    # neue Literale mssen in die all_*-Listen eingetragen werden
    set all_literale { lit_hoererstatus lit_zurueck lit_fenstertitel lit_sws lit_semester lit_stundenVorlesung lit_stundenPruefung lit_credit lit_titel lit_beschreibung lit_kommentar lit_mitarbeiter lit_kategorie lit_unterkategorie lit_assessment lit_referenz lit_partner lit_pruefungsordnung lit_hoererstatus lit_alle lit_sprache lit_vorlesungen lit_arbeitsaufwand lit_titelanzeige}
    set all_values   { val_fenstertitel val_sws val_semester val_stundenVorlesung val_stundenPruefung val_credit val_titel val_beschreibung val_kommentar val_mitarbeiter val_kategorie val_unterkategorie val_assessment val_referenz val_partner val_pruefungsordnungen val_hoererstatus val_sprache }
    
    set tableDefault " "
    
    # Initialisierung aller globaler Variablen
    foreach element $all_literale {
      set lit_${element} &tableDefault 
    }
    
    foreach element $all_values {
      set val_${element} &tableDefault
    }
    
    #-----------------------------------------------------------------------------
    # Prozeduren
    #-----------------------------------------------------------------------------
    
    #-----------------------------------------------------------------------------
    # Modulname    : init_literale
    # Beschreibung : L„dt die sprachabh„ngigen Bezeichnungen einer Veranstaltungs-
    #                seite aus der jeweiligen Konfigurationsdatei .
    #                Liest die Datei "filename" zeilenweise aus. Aus dem ersten
    #                Element wird eine lokale Variable definiert, wobei 
    #                der Rest der Zeile den Wert dieser Variablen darstellt. Jedes
    #                Element der Liste array ist ein Referenzparameter und wenn
    #                der Name einer lokalen Variablen dem des Referenzparameters entspricht
    #                wird die Referenz ver„ndert.
    #                Wenn die Referenzvariable nicht eistiert, wird die Variable
    #                mit dem Wert " " initialisiert.
    #                Wenn die Datei nicht eistiert, wird nichts getan.
    #                
    #
    # Bespiel:       Zeile: myVariable value value value
    #                Variable: myVarable Wert: "value value value"
    #
    # Parameter    :  in | out  Name      Datentyp  Beschreibung
    #                    in     filename  string    Dateiname inkl. Pfadangabe der 
    #                                               Konfigurationsdatei aus der die
    #                                               Literale gelesen werden sollen
    #                                               Die Datei muá den Restriktionen
    #                                               entsprechen
    #                    out    array
    # 
    #-----------------------------------------------------------------------------
    proc init_literale {filename array} {
      global tableDefault
      foreach element $array {
        upvar $element $element
        set $element $tableDefault
      }
    
      if {[string compare [file eists $filename] 1] == 0} {
        set tmpfile [open $filename r]
        while {[eof $tmpfile] != 1} {
          set row [gets $tmpfile]
          set literal [lindex $row 0]
          set value   [lrange $row 1 end]
          if {[string compare [string trim $value] ""] == 0} {
            set value $tableDefault
          }
          set lit_${literal} $value
        }
        close $tmpfile
      }
    }
    
    #-----------------------------------------------------------------------------
    # Modulname    : init_values
    # Beschreibung : Ermittelt die zu einer bestimmten Veranstaltung geh”rigen Daten.
    #                Jedes Element der Liste array ist ein Referenzparameter und wenn
    #                der Name einer lokalen Variablen dem des Referenzparameters entspricht
    #                wird die Referenz ver„ndert.
    #                Wenn die Referenzvariable nicht existiert, wird eine
    #                Variable mit " " initialisiert.
    #                Wenn der Inhalt nicht ermittelt werden kann, wird die Referenz nicht ver„ndert.
    #
    # Parameter    :  in | out  Name      Datentyp  Beschreibung
    #                    in     language  string    Sprache
    #                    in     vid       string    Veranstaltungsnummer
    #                    out    array               Ergebnis
    #                    in     hoererstatus        Daten des Sommer- oder Wintersemesters sollen ermittelt werden
    #                    ben”tigt, um Links auf Partnerveranstaltungen zu erzeugen                    
    #                    in     script              Skript
    #                    in     old_request         alte Anfrage
    #                                                               
    #-----------------------------------------------------------------------------
    proc init_values {language vid array hoererstatus script old_request} {
      global tableDefault mitarbeiter
    
      foreach element $array {
          upvar $element $element
          switch $element {
            val_semester         { set val_semester         [rueck [getSemester $vid]]                  }
            val_stundenVorlesung { set val_stundenVorlesung [rueck [getStundenVorlesung $vid]]          }
            val_stundenPruefung  { set val_stundenPruefung  [rueck [getStundenPruefung $vid]]           }
            val_credit           { set val_credit           [rueck [getCredit $vid]]                    }
            val_sws              { set val_sws              [rueck [getSws $vid]]                       }
            val_mitarbeiter      { set val_mitarbeiter      [rueck [join [getMitarbeiterPlusHREF $vid] " / "]]       }
            val_kategorie        { set val_kategorie        [rueck [getKategorie $language $vid]]       }
            val_unterkategorie   { set val_unterkategorie   [rueck [getUnterkategorie $language $vid]]  }
            val_titel            { set val_titel            [rueck [getTitel $language $vid]]           }
            val_assessment       { set val_assessment       [rueck [getAssessment $language $vid]]      }
            val_beschreibung     { set val_beschreibung     [rueck [getBeschreibung $language $vid]]    }
            val_kommentar        { set val_kommentar        [htmljezeile [rueck [getKommentar $language $vid]]]       }
            val_referenz         { set val_referenz         [htmljezeile [rueck [getReferenz $vid]]]                  }
            val_partner          { set val_partner          [htmllinkjezeile [getPartner $vid] $script $old_request]                  }
            val_pruefungsordnungen { set val_pruefungsordnungen [getPruefungsordnungen $vid $hoererstatus]}
          }
      }
    }
    
    



    parse_xml.tcl

    ##############################################################################
    #
    # Dateiname    : parse_xml.tcl
    # Import       : -
    # Beschreibung : Durch den Aufruf der Prozedur parse_veranstaltungXml 
    #                wird der XMl-Parser aufgerufen, der das XML-Dokument
    #                liest und dabei die Indexstrukturen aufbaut.
    #                Die anderen Prozeduren sind Hilfsprozeduren und definieren
    #                wie die Indexstrukturen aufgebaut werden sollen.
    #
    # Prozeduren   : startTag {tagName attrList}                
    #                endTag {tagName}                           
    #                parser_push {data}                         
    #                parse_veranstaltungXml {xml_dokument}      Zugriffsfunktion
    #
    # globale Variablen : -
    #
    ##############################################################################
    
    #-----------------------------------------------------------------------------
    # Prozeduren
    #-----------------------------------------------------------------------------
    
    #-----------------------------------------------------------------------------
    # Modulname    :  parse_veranstaltungXml
    # Beschreibung :  Liest das XML-Dokument xml_dokument und generiert die
    #                 Indexstrukturen.
    #
    # Parameter    :  in | out  Name              Datentyp    default     Beschreibung
    #                    in     xml_dokument      string      
    #
    # globaler Zugriff :  Variablenname   Lesezugriff   Schreibzugriff
    #                     x                    x              x
    #                     x                    x              x
    #
    # Rckgabewert und
    # Fehlerbehandlung :   0   Das XML-Dokument wurde erfolgreich verarbeitet.
    #                     -1   Wenn das Paket des TCLXML-Parsers nicht im
    #                          Suchpfad des TCL-Interpreters enthalten ist, wird
    #                          die Fehlermeldung "Cannot load xml 1.7 package"
    #                          ausgeben und der Fehlercode zurckgegeben.
    #                     -2   Wenn das XML-Dokument nicht existiert, wird dieser 
    #                          Fehlercode zurckegeben.
    #
    #-----------------------------------------------------------------------------
    proc parse_veranstaltungXml {xml_dokument} {
      #-----------------------------------------------------------------------------
      # Importanweisungen
      #-----------------------------------------------------------------------------
    
      source toolbox.tcl
      source header.tcl
    
      #-----------------------------------------------------------------------------
      # Variablendeklaration
      #-----------------------------------------------------------------------------
    
      # Stack, in dem die Daten von verschachtelten Tag-Strukturen
      # zwischengespeichert werden.
                                          variable ref_myStack   {}
      # aktuelle Veranstaltungsnummer
                                          variable ref_currID          ""
      # aktuelle Sprache
                                          variable ref_currLanguage    ""
      # aktuelle Kategorie
                                          variable ref_currKategorie   ""
      # aktuelle ID eines Mitarbeiters
                                          variable ref_currMitArbID    ""
      # aktuelle Homeadresse eines Mitarbeiters 
                                          variable ref_currMitArbURL   ""
      # aktueller Mitarbeitertitel
                                          variable ref_currMitArbTitle ""
      # aktuelle Partnerveranstaltung
                                          variable ref_currPartnerID   ""       
    
      #-----------------------------------------------------------------------------
      # Prozeduren
      #-----------------------------------------------------------------------------
    
        #-------------------------------------------------------------------------
        # Modulname    :  startTag
        # Beschreibung :  Prozedur, die aufgerufen wird, wenn im XML-Dokument ein
        #                 Start-Tag gefunden worden ist.
        #
        # Parameter    :  in | out   Name       Datentyp       Beschreibung
        #                    in      tagName    string         Name des Start-Tags
        #                    in      attrList   list           Attributliste des
        #                                                      Start-Tags
        #
        # globaler Zugriff :  Variablenname       Lesezugriff   Schreibzugriff
        #                     currID                   +              +
        #                     currMitArbID             -              +
        #                     currMitArbURL            -              +
        #                     currMitArbTitle          -              +
        #                     currLanguage             +              +
        #                     currPartnerID            -              +
        #
        #     Indexstruktur   id                       -              +
        #     I               semester                 -              +
        #     I               lang                     -              +
        #
        #-------------------------------------------------------------------------
        proc startTag {tagName attrList} {
          global id lang semester
    
          upvar ref_currID currID ref_currMitArbTitle currMitArbTitle
          upvar ref_currMitArbID currMitArbID ref_currMitArbURL currMitArbURL
          upvar ref_currLanguage currLanguage ref_currPartnerID currPartnerID
                                         
          switch $tagName {
            veranstaltung        { set currID [lindex $attrList [expr [lsearch $attrList id] + 1]]
                                   lappend id $currID
                                   lappend semester([lindex $attrList [expr [lsearch $attrList semester] + 1]]) $currID
                                 }
            mitarbeiter          { set currMitArbID [lindex $attrList [expr [lsearch $attrList id] + 1]]
                                   set currMitArbURL [lindex $attrList [expr [lsearch $attrList url] + 1]]    
                                   set currMitArbTitle [lindex $attrList [expr [lsearch $attrList title] + 1]]
                                 }
            definition           { set currLanguage [lindex $attrList [expr [lsearch $attrList {xml:lang}] + 1]]
                                   if {[lsearch $lang() $currLanguage] == -1 } {
                                     lappend lang() $currLanguage
                                   }
                                   set lang($currID) [lappend lang($currID) $currLanguage]
                                 }
            partnerveranstaltung { set currPartnerID [lindex $attrList [expr [lsearch $attrList href] + 1]]
                                 }
          }
        }
    
        #-----------------------------------------------------------------------------
        # Modulname    :  endTag
        # Beschreibung :  Prozedur, die aufgerufen wird, wenn im XML-Dokument ein
        #                 Ende-Tag gefunden worden ist.
        #
        # Parameter    :  in | out   Name       Datentyp       Beschreibung
        #                    in      tagName    string         Name des Ende-Tags
        #                    in      currID                                     
        #                    in      currMitArbID            
        #                    in      currMitArbURL           
        #                    in      currMitArbTitle         
        #                    in      currLanguage            
        #                    in      currPartnerID           
        #                    in      currKategorie           
        #                  in|out    myStack                 
        #
        # globaler Zugriff :  Variablenname   Lesezugriff   Schreibzugriff
        #     I               titel                    -              +
        #     I               beschreibung             -              +
        #     I               kommentar                -              +
        #     I               kategorie                -              +
        #     I               assessment               -              +
        #     I               referenz                 -              +
        #     I               unterKategorie           -              +
        #     I               partnerveranstaltung     -              +
        #     I               pruefungsordnung         -              +
        #     I               stundenVorlesung         -              +
        #     I               stundenPruefung          -              +
        #     I               credits                  -              +
        #     I               sws                      -              +
        #     I               mitarbeiter              -              +
        #
        #-----------------------------------------------------------------------------
        proc endTag {tagName} {
          global titel beschreibung kommentar kategorie assessment referenz
          global unterKategorie partnerveranstaltung pruefungsordnung
          global stundenVorlesung stundenPruefung credits sws mitarbeiter
    
          upvar ref_currID currID ref_currMitArbTitle currMitArbTitle
          upvar ref_currMitArbID currMitArbID ref_currMitArbURL currMitArbURL
          upvar ref_currLanguage currLanguage ref_currPartnerID currPartnerID
          upvar ref_currKategorie currKategorie ref_myStack myStack
    
          switch $tagName {
            veranstaltungsverzeichnis -
            veranstaltung             -
            definition           { pull myStack
                                   pull myStack }
            stundenVorlesung     -
            stundenPruefung      -
            credits              -
            sws                  { lappend ${tagName}([pull myStack]) $currID }
            mitarbeiter          { set currMitArbName [pull myStack]
                                   set command ""
                                   append command mitarbeiter ( $currMitArbName " " ( $currMitArbID ) )
    
                                   #existiert Index fr den Mitarbeiter schon
                                   if {[info exists $command] == 1}  {
                                     #wenn ja, erweitere Liste um aktuelle VID
                                     set mitarbeiterVIDs [lindex [set $command] 4]
                                     lappend mitarbeiterVIDs $currID
                                   } else {
                                     #wenn nein, initialisiere Liste
                                     set mitarbeiterVIDs [list $currID]
                                   }
                                   set $command [list $currMitArbID $currMitArbName $currMitArbTitle $currMitArbURL $mitarbeiterVIDs] }
            titel                -
            beschreibung         -
            kommentar            { lappend ${tagName}(${currLanguage}_${currID}) [pull myStack] }
            assessment           { lappend ${tagName}(${currLanguage}_[pull myStack]) $currID }
            kategorie            { set data [pull myStack]
                                   set currKategorie $data
                                   # um sp„ter unterkategorien den Kategorien zuzuordnen
                                   lappend ${tagName}(${currLanguage}_$data) $currID }
            unterKategorie       { lappend ${tagName}(${currLanguage}_${currKategorie}_[pull myStack]) $currID }
            referenz             { lappend ${tagName}($currID) [pull myStack] }
            partnerveranstaltung { lappend ${tagName}($currID) [list $currPartnerID [pull myStack]] }
            pruefungsordnung     { pull myStack
                                   set ws [pull myStack]
                                   pull myStack
                                   set ss [pull myStack]
                                   set oid [pull myStack]
                                   lappend pruefungsordnung(${oid}_$currID) $ss $ws
                                   if {[lsearch $pruefungsordnung() $oid] == -1 } {
                                     lappend pruefungsordnung() $oid
                                   }
                               }
          }
        }
    
        #-------------------------------------------------------------------------
        # Modulname    :  parser_push
        # Beschreibung :  Prozedur, die aufgerufen wird, wenn im XML-Dokument eine
        #                 Zeichenkette gefunden worden ist, die keine Tags enth„lt.
        #
        # Parameter    :  in | out   Name    Datentyp   Beschreibung
        #                    in      data    string     Inhalt der Zeichenkette
        #
        # globaler Zugriff :  -
        #
        #-----------------------------------------------------------------------------
        proc parser_push {data} {
          upvar ref_myStack myStack
          lprepend myStack [string trim $data]
        }
    
      #-----------------------------------------------------------------------------
      # Hauptprogramm
      #-----------------------------------------------------------------------------
      #TclXML-Parser initialisieren
      if {[catch {package require xml 1.6}]} {
          catch {puts stderr "Paket XML Version 1.7 konnte nicht gelesen werden\n"}
          return -1
      }
      catch {rename xml::project {}}
      set parser [xml::parser project -final 1 -reportempty 0 -elementstartcommand startTag -elementendcommand endTag -characterdatacommand parser_push]
    
      #XML-Dokument laden
      if {[file exists $xml_dokument] == 0} {
          catch {puts stderr "Cannot load xmlfile"}
          return -2
      }
      set tmpfile [open $xml_dokument r]
      set xml_dokument [read $tmpfile]
      close $tmpfile
    
      #TclXML-Parser starten
      $parser parse $xml_dokument
      return
    }
    



    search.cgi

    #!/usr/bin/tclsh8.0
    exec tclsh80 $0 "$@"
    
    ##############################################################################
    #
    # Dateiname  : search.cgi
    # Import     : tcl/cgi-args.tcl
    #              header.tcl
    #              access.tcl
    #              part.tcl
    #              htmlSites.tcl
    #
    # Prozeduren : -
    #
    # globale Variablen : -
    #
    ##############################################################################
    
    #-----------------------------------------------------------------------------
    # Importanweisungen
    #-----------------------------------------------------------------------------
    
    source tcl/cgi-args.tcl
    source header.tcl
    source access.tcl
    source part.tcl
    source htmlSites.tcl
    
      global val_fenstertitel val_sws val_semester val_stundenVorlesung
      global val_stundenPruefung val_credit val_titel val_beschreibung
      global val_kommentar val_mitarbeiter val_kategorie val_unterkategorie
      global val_assessment val_referenz val_partner val_pruefungsordnungen
      global val_hoererstatus val_sprache 
      global lit_titlanzeige lit_fenstertitel lit_sws lit_semester lit_stundenVorlesung
      global lit_stundenPruefung lit_credit lit_titel lit_beschreibung
      global lit_kommentar lit_mitarbeiter lit_kategorie lit_unterkategorie
      global lit_assessment lit_referenz lit_partner lit_pruefungsordnung
      global lit_hoererstatus lit_alle lit_sprache lit_vorlesungen
      global lit_arbeitsaufwand lit_zurueck
    
    #-----------------------------------------------------------------------------
    # Hauptprogramm
    #-----------------------------------------------------------------------------
    #Ermittlung der CGI-Parameter
    get_cgi_input
    set request [get_cgi_argl]
    set val_seite             [join [get_cgi_arg seite]]
    set val_language          [join [get_cgi_arg language]]
    set val_kategorie         [join [get_cgi_arg kategorie]]
    set val_unterkategorie    [join [get_cgi_arg unterkategorie]]
    set val_titel             [join [get_cgi_arg titel]]
    set val_semester          [join [get_cgi_arg semester]]
    set val_assessment        [join [get_cgi_arg assessment]]
    set val_mitarbeiter       [join [get_cgi_arg mitarbeiter]]
    set val_pruefungsordnung  [join [get_cgi_arg pruefungsordnung]]
    set val_hoererstatus      [join [get_cgi_arg hoererstatus]]
    set cgi_script            $env(SCRIPT_NAME)
    
    #Indexstrukturen und Literale einlesen
    load "index//" $all_lists $all_arrays
    init_literale "config//config_${val_language}.txt" $all_literale
    
    #Kopfzeilen mit Auswahlliste erstellen
    set head ""
    append head "
    [createHREF $lit_sprache seite A $cgi_script $request] [allChange $val_language $lit_alle] [createHREF $lit_hoererstatus seite I $cgi_script $request ] [allChange $val_hoererstatus $val_hoererstatus ]
    [createHREF $lit_pruefungsordnung seite E $cgi_script $request] [allChange $val_pruefungsordnung $lit_alle] [createHREF $lit_kategorie seite C $cgi_script $request] [allChange $val_kategorie $lit_alle] [createHREF $lit_unterkategorie seite D $cgi_script $request] [allChange $val_unterkategorie $lit_alle]
    [createHREF $lit_semester seite F $cgi_script $request] [allChange $val_semester $lit_alle] [createHREF $lit_mitarbeiter seite G $cgi_script $request] [allChange $val_mitarbeiter $lit_alle] [createHREF $lit_assessment seite H $cgi_script $request] [allChange $val_assessment $lit_alle]
    .
    [createHREF $lit_titelanzeige seite 0 $cgi_script $request] [createHREF $lit_zurueck language $val_language $cgi_script $standard_request_list]






    " #Selektionskriterien set tail "" switch $val_seite { 0 { set currentIDs [getIDs] append tail [myaufzaehlung $val_language $lit_titel $currentIDs xxxx spez $request titel $val_hoererstatus $lit_alle] } A { append tail [aufzaehlung $val_language [getAllLanguages] xxxx 0 $request language $lit_alle] } C { set request [lersetze $request unterkategorie alle] append tail [aufzaehlung $lit_kategorie [getAllKategorien $val_language] xxxx 0 $request kategorie $lit_alle] } D { append tail [aufzaehlung $lit_unterkategorie [getAllUnterkategorien2 $val_language $val_kategorie] xxxx 0 $request unterkategorie $lit_alle] } E { append tail [aufzaehlung $lit_pruefungsordnung [getAllPruefungsordnungen] xxxx 0 $request pruefungsordnung $lit_alle] } F { append tail [aufzaehlung $lit_semester [getAllSemester] xxxx 0 $request semester $lit_alle] } G { append tail [aufzaehlung $lit_mitarbeiter [getAllMitarbeiter] xxxx 0 $request mitarbeiter $lit_alle] } H { append tail [aufzaehlung $lit_assessment [getAllAssessments $val_language] xxxx 0 $request assessment $lit_alle] } I { append tail [aufzaehlung $lit_hoererstatus [getAllHoererStati] xxxx 0 $request hoererstatus $lit_alle] } spez { if {[string compare $val_titel alle] == 0} { set currentIDs [getIDs] } else { set currentIDs $val_titel } foreach index $currentIDs { init_values $val_language $index $all_values $val_hoererstatus $cgi_script $request append tail "[getVeranstaltungsInfo3 $val_language $index]" append tail

    } } } #CGI-Header # niemals \n\n vergessen, sonst funktioniert CGI-Script nicht unter Linux puts "Content-type: text/html\n\n" #HTML-Seite set text " $lit_fenstertitel <LINK REL=STYLESHEET TYPE=text/css HREF=config//default.css> $head

    $tail " puts $text return



    access.tcl

    ##############################################################################
    #
    # Dateiname    : access.tcl
    # Import       : -
    # Beschreibung : Prozeduren, um auf die Indexstrukturen zugreifen zu k”nnen
    #                Die Prozeduren getValues, getKey und getmyKey sind Universal-
    #                routinen und werden von allen anderen Prozeduren benutzt.
    #
    # Prozeduren : getValues {ref_array keypatter ref_values} 
    #              getKey {ref_array keypatter value ref_result art} 
    #              getmyKey {ref_array keypatter ref_keys delete} 
    #
    #              Gruppe I
    #                 getSemester {vid} 
    #                 getStundenVorlesung {vid} 
    #                 getStundenPruefung {vid} 
    #                 getCredit {vid} 
    #                 getSws {vid} 
    #                 getAssessment {lang vid} 
    #                 getKategorie {lang vid} 
    #                 getUnterkategorie {lang vid} 
    #                 getTitel {lang id} 
    #                 getBeschreibung {lang vid} 
    #                 getKommentar {lang vid} 
    #
    #              Gruppe II
    #                 getReferenz {vid} 
    #                 getPartner {vid} 
    #                 getLanguage {vid} 
    #                 getPruefungsordnung {vid} 
    #                 getMitarbeiter {vid} 
    #
    #              getPruefungsordnungsInfo {pid vid ref_ss ref_ws}
    #              getMitarbeiterInfo {vid kuerzel ref_name ref_titel ref_url ref_toDo} 
    #
    #              Gruppe III
    #                 getSemesterIDs {topic} 
    #                 getStundenVorlesungIDs {topic} 
    #                 getStundenPruefungIDs {topic} 
    #                 getCreditIDs {topic} 
    #                 getSwsIDs {topic} 
    #                 getKategorieIDs {lang topic} 
    #                 getUnterkategorieIDs {lang topic} 
    #                 getAssessmentIDs {lang topic} 
    #                 getTitelID {lang topic} 
    #                 getPruefungsordnungsIDs {topic} 
    #                 getLanguageIDs {topic} 
    #                 getMitarbeiterIDs {topic} 
    #
    #              Gruppe IV
    #                 getAllSemester {} 
    #                 getAllStundenVorlesung {} 
    #                 getAllStundenPruefung {} 
    #                 getAllCredits {} 
    #                 getAllSws {} 
    #                 getAllKategorien {language} 
    #                 getAllUnterkategorien1 {language} 
    #                 getAllUnterkategorien2 {language kategorie} 
    #                 getAllAssessments {language} 
    #                 getAllTitel {language} 
    #                 getAllLanguages {} 
    #                 getAllPruefungsordnungen {} 
    #                 getAllMitarbeiter {} 
    #                 getAllHoererStati {} 
    #                 getAllIDs {} 
    #
    #              rueck {now} 
    #              allChange {data default} 
    # globale Variablen :  -
    #
    ##############################################################################
    
    #-----------------------------------------------------------------------------
    # Modulname    : getValues 
    # Beschreibung : Gibt die Werte des assoziativen Arrays  aus, wenn
    #                das Muster auf den Schlssel paát
    #
    # Parameter    :  in | out   Name       Datentyp       Beschreibung
    #                  in|out    ref_array  array          Arrayindexstruktur
    #                   in       keypatter  string         Muster, das im Schlssel
    #                                                      des Arrays enthalten sein muá
    #                  in|out    ref_valuelist list        Ergebnis
    #
    # globaler Zugriff :  Variablenname   Lesezugriff   Schreibzugriff
    #                     alle Indexstrukturen  +             -
    #
    #-----------------------------------------------------------------------------
    proc getValues {ref_array keypatter ref_valuelist} {
      upvar $ref_array array
      upvar $ref_valuelist result
      set result ""
      # andere Schleifen auch so ab„ndern
      foreach index [array names array $keypatter] {
        set zw $array(${index})
        if {[lsearch $result $zw] == -1 } {
          lappend result $zw
        }
      }
      return
    }
    
    #-----------------------------------------------------------------------------
    # Modulname    :  getKey
    # Beschreibung :  Gibt alle Schlssel der Indexstruktur  zurck, auf die
    #                 das Muster  paát und in deren Liste der Wert  vorkommt.
    #
    # Parameter    :  in | out   Name       Datentyp       Beschreibung
    #                  in|out    ref_array  array          Arrayindexstruktur
    #                   in       keypatter  string         Muster, das im Schlssel
    #                                                      des Arrays enthalten sein muá
    #                   in       value      string
    #                  in|out    ref_result list           Ergebnis
    #
    # globaler Zugriff :  Variablenname   Lesezugriff   Schreibzugriff
    #                     jeweilige Indexstruktur +           -
    #
    #-----------------------------------------------------------------------------
    proc getKey {ref_array keypatter value ref_result art} {
      upvar $ref_array array
      upvar $ref_result result
      set result ""
      foreach index [array names array $keypatter] {
        if { [lsearch $array($index) $value] > -1 } {
          switch $art {
            1  {  set a ""
                  set r ""
                  set b ""
                  regexp {([^_]+)_([^_]+)} $index a  b  r
                  set result $r
                }
            2   { set a ""
                  set b ""
                  set c ""
                  set d ""
                  set r ""
                  regexp {([^_]+)_([^_]+)_([^_]+)} $index a b c r
                  set result $r
                }
            default { set result $index }
          }
        }
      }
      set result [join $result]
      return
    }
    
    proc rueck {now} {
      global tableDefault
      if {[string compare [string trim $now] ""] == 0} {
        return $tableDefault
      } else {
        return $now
      }
    }
    
    #-----------------------------------------------------------------------------
    # Modulname    :  getmyKey
    # Beschreibung :  Gibt eine Liste von Schlssel eines assoziativen Arrays
    #                 zurck, auf die das Muster  zutrifft.
    #
    # Parameter    :  in | out   Name       Datentyp       Beschreibung
    #                 verschieden
    #
    # globaler Zugriff :  Variablenname   Lesezugriff   Schreibzugriff
    #
    #-----------------------------------------------------------------------------
    proc getmyKey {ref_array keypatter ref_keys delete} {
      upvar $ref_array array
      upvar $ref_keys result
      set result ""
      # andere Schleifen auch so ab„ndern
      if { $delete != 0 } {
          foreach index [array names array $keypatter] {
              set a ""
              set c ""
              set r ""
              set b ""
              switch $delete {
                1 { regexp {([^_]+)} $index a r }
                2 { regexp {([^_]+)_([^_]+)} $index a b r }
                3 { regexp {([^_]+)_([^_]+)_([^_]+)} $index a b c r }
              }
              if {[lsearch $result $r] == -1 } {
                lappend result $r
              }
          }
        } else {
        set result [array names array $keypatter]
      }
      return
    }
    
    #-----------------------------------------------------------------------------
    # Modulname    :  Gruppe II
    # Beschreibung :  Ermittlung der zu einer bestimmten VeranstaltungsID geh”renden
    #                 Daten
    #
    # Parameter    :  in | out   Name       Datentyp       Beschreibung
    #                 verschieden
    #
    # globaler Zugriff :  Variablenname   Lesezugriff   Schreibzugriff
    #                     jeweilige Indexstruktur +           -
    #
    #-----------------------------------------------------------------------------
    proc getSemester {vid} {
      global semester
      set result ""
      getKey semester "*" $vid result 0
      return $result
    }
    
    proc getStundenVorlesung {vid} {
      global stundenVorlesung
      set result ""
      getKey stundenVorlesung "*" $vid result 0
      return $result
    }
    
    proc getStundenPruefung {vid} {
      global stundenPruefung
      set result ""
      getKey stundenPruefung "*" $vid result 0
      return $result
    }
    
    proc getCredit {vid} {
      global credits
      set result ""
      getKey credits "*" $vid result 0
      return $result
    }
    
    proc getSws {vid} {
      global sws
      set result ""
      getKey sws "*" $vid result 0
      return $result
    }
    
    proc getAssessment {lang vid} {
      global assessment
      set result ""
      getKey assessment "${lang}_*" $vid result 1
      return $result
    }
    
    proc getKategorie {lang vid} {
      global kategorie
      set result ""
      getKey kategorie "${lang}_*" $vid result 1
      return $result
    }
    
    proc getUnterkategorie {lang vid} {
      global unterKategorie
      set result ""
      getKey unterKategorie "${lang}_*" $vid result 2
      return $result
    }
    
    proc getTitel {lang vid} {
      global titel
      set result ""
      getValues titel "${lang}_${vid}" result
      return [join [join $result]]
    }
    
    proc getBeschreibung {lang vid} {
      global beschreibung
      set result ""
      getValues beschreibung "${lang}_${vid}" result
      return [join [join $result]]
    }
    
    proc getKommentar {lang vid} {
      global kommentar
      set result ""
      getValues kommentar "${lang}_${vid}" result
      return [join $result]
    }
    
    #-----------------------------------------------------------------------------
    # Modulname    :  Gruppe II
    # Beschreibung :  Ermittlung der zu einer bestimmten VeranstaltungsID geh”renden
    #                 Daten
    #
    # Parameter    :  in | out   Name       Datentyp       Beschreibung
    #                 verschieden
    #
    # globaler Zugriff :  Variablenname   Lesezugriff   Schreibzugriff
    #                     jeweilige Indexstruktur +           -
    #
    #-----------------------------------------------------------------------------
    proc getReferenz {vid} {
      global referenz
      set result ""
      getValues referenz "$vid" result
      return [join $result]
    }
    
    proc getPartner {vid} {
      global partnerveranstaltung
      set result ""
      getValues partnerveranstaltung "$vid" result
      return [join $result]
    }
    
    proc getLanguage {vid} {
      global lang
      set result ""
      getValues lang "$vid" result
      return $result
    }
    
    proc getPruefungsordnung {vid} {
      global pruefungsordnung
      set result ""
      getmyKey pruefungsordnung "*_${vid}" result 1
      return $result
    }
    
    proc getMitarbeiter {vid} {
      global mitarbeiter id
      set resultList ""
      foreach index [array names mitarbeiter] {
        getMitarbeiterInfo $index z a b c d
        if { [lsearch $d $vid] > -1 } {
          lappend resultList [join $index "_"]
        }
      }
      return $resultList
    }
    
    proc getMitarbeiterPlusHREF {vid} {
      global mitarbeiter id
      set resultList ""
      foreach index [array names mitarbeiter] {
        getMitarbeiterInfo $index z a b c d
        if { [lsearch $d $vid] > -1 } {
          lappend resultList <a href=${c}>${a}</a>
        }
      }
      return $resultList
    }
    
    #-----------------------------------------------------------------------------
    # Modulname    :  getPruefungsordnungsInfo
    # Beschreibung :  Ermittelt die Daten einer bestimmten Prfungsordnung
    #
    # Parameter    :  in | out   Name       Datentyp       Beschreibung
    #                 verschieden
    #
    # globaler Zugriff :  Variablenname   Lesezugriff   Schreibzugriff
    #                     jeweilige Indexstruktur +           -
    #
    #-----------------------------------------------------------------------------
    proc getPruefungsordnungsInfo {pid vid ref_ss ref_ws} {
      global pruefungsordnung
      upvar $ref_ss ss
      upvar $ref_ws ws
      set result ""
      getValues pruefungsordnung "${pid}_${vid}" result
      set result [join $result]
      set ss [lindex $result 0]
      set ws [lindex $result 1]
      return
    }
    
    proc getPruefungsordnungen {vid val_hoererstatus} {
      global pruefungsordnung
      set resultList ""
      foreach pid [getAllPruefungsordnungen] {
        set ss ""
        set ws ""
        getPruefungsordnungsInfo $pid $vid ss ws
        switch $val_hoererstatus {
          ss  { if {[string compare $ss ""] == 0} {set ss "-"}
                lappend resultList [list $pid $ss]  }
          ws  { if {[string compare $ws ""] == 0} {set ws "-"}
                lappend resultList [list $pid $ws] }
        }
      }
      return $resultList
    }
    
    #-----------------------------------------------------------------------------
    # Modulname    :  getMitarbeiterInfo
    # Beschreibung :  Ermittelt die Daten eines bestimmten Mitarbeiters
    #
    # Parameter    :  in | out   Name       Datentyp       Beschreibung
    #                 verschieden
    #
    # globaler Zugriff :  Variablenname   Lesezugriff   Schreibzugriff
    #                     jeweilige Indexstruktur +           -
    #
    #-----------------------------------------------------------------------------
    proc getMitarbeiterInfo {id ref_kuerzel ref_name ref_titel ref_url ref_toDo} {
      global mitarbeiter
      upvar $ref_kuerzel kuerzel
      upvar $ref_name   name
      upvar $ref_titel  titel
      upvar $ref_url    url
      upvar $ref_toDo   toDo
      set result ""
      getValues mitarbeiter "$id" result
      set result [join $result]
      set kuerzel [lindex $result 0]
      set name  [lindex $result 1]
      set titel [lindex $result 2]
      set url   [lindex $result 3]
      set toDo  [lindex $result 4]
      return 
    }
    
    #-----------------------------------------------------------------------------
    # Modulname    :  Gruppe III
    # Beschreibung :  Ermittelt s„mtliche VeranstaltungsID auf die das Thema paát
    #
    # Parameter    :  in | out   Name       Datentyp       Beschreibung
    #                 verschieden
    #
    # globaler Zugriff :  Variablenname   Lesezugriff   Schreibzugriff
    #                     jeweilige Indexstruktur +           -
    #
    #-----------------------------------------------------------------------------
    proc getSemesterIDs {topic} {
      global semester id
      set result ""
      if {[string compare $topic alle] != 0} {
        getValues semester "$topic" result
      } else {
        set result $id
      }
      return [join $result]
    }
    
    proc getStundenVorlesungIDs {topic} {
      global stundenVorlesung id
      set result ""
      if {[string compare $topic alle] != 0} {
        getValues stundenVorlesung "$topic" result
      } else {
        set result $id
      }
      return $result
    }
    
    proc getStundenPruefungIDs {topic} {
      global stundenPruefung id
      set result ""
      if {[string compare $topic alle] != 0} {
        getValues stundenPruefung "$topic" result
      } else {
        set result $id
      }
      return $result
    }
    
    proc getCreditIDs {topic} {
      global credits id
      set result ""
      if {[string compare $topic alle] != 0} {
        getValues credits "$topic" result
      } else {
        set result $id
      }
      return $result
    }
    
    proc getSwsIDs {topic} {
      global sws id
      set result ""
      if {[string compare $topic alle] != 0} {
        getValues sws "$topic" result
      } else {
        set result $id
      }
      return $result
    }
    
    proc getKategorieIDs {lang topic} {
      global kategorie id
      set result ""
      if {[string compare $topic alle] != 0} {
        getValues kategorie "${lang}_${topic}" result
      } else {
        set result $id
      }
      return [join $result]
    }
    
    proc getKategorieUnterkategorieIDs {lang ober unter} {
      global unterKategorie id
      set result ""
      if {[string compare $ober alle] == 0} {
        set result $id
      } else {
        if {[string compare $unter alle] == 0} {
          getValues unterKategorie "${lang}_${ober}_*" result
        } else {
          getValues unterKategorie "${lang}_${ober}_${unter}" result
        }
      }
      return [join $result]
    }
    
    proc getAssessmentIDs {lang topic} {
      global assessment id
      set result ""
      if {[string compare $topic alle] != 0} {
        getValues assessment "${lang}_${topic}" result
      } else {
        set result $id
      }
      return [join $result]
    }
    
    #proc getTitelID {lang topic} {
    #  global titel id
    #  set result ""
    #  if {[string compare $topic alle] != 0} {
    #    getKeys titel "${lang}_*" $topic result 1
    #  } else {
    #    set result $id
    #  }
    #  return $result
    #}
    
    proc getPruefungsordnungsIDs {topic} {
      global pruefungsordnung id
      set resultList ""
      if {[string compare $topic alle] != 0} {
        getmyKey pruefungsordnung "${topic}_*" resultList 2
      } else {
        set resultList $id
      }
      return [join $resultList]
    }
    
    proc getLanguageIDs {topic} {
    }
    
    proc getMitarbeiterIDs {topic} {
      global mitarbeiter id
      set resultList ""
      if {[string compare $topic alle] != 0} {
        getMitarbeiterInfo $topic z a b c d
        set resultList $d
      } else {
        set resultList $id
      }
      return [join $resultList]
    }
    
    #-----------------------------------------------------------------------------
    # Modulname    :  Gruppe IV
    # Beschreibung :  Ausgabe aller relevanten Daten eines Themas
    #
    # Parameter    :  in | out   Name       Datentyp       Beschreibung
    #                 verschieden
    #
    # globaler Zugriff :  Variablenname   Lesezugriff   Schreibzugriff
    #                     jeweilige Indexstruktur +           -
    #
    #-----------------------------------------------------------------------------
    proc getAllSemester {} {
      global semester
      set result ""
      getmyKey semester "?*" result 0
      return [lsort -increasing $result]
    }
    
    proc getAllStundenVorlesung {} {
      global stundenVorlesung
      set result ""
      getmyKey stundenVorlesung "?*" result 0
      return [lsort -increasing $result]
    }
    
    proc getAllStundenPruefung {} {
      global stundenPruefung
      set result ""
      getmyKey stundenPruefung "?*" result 0
      return [lsort -increasing $result]
    }
    
    proc getAllCredits {} {
      global credits
      set result ""
      getmyKey credits "?*" result 0
      return [lsort -increasing $result]
    }
    
    proc getAllSws {} {
      global sws
      set result ""
      getmyKey sws "?*" result 0
      return [lsort -increasing $result]
    }
    
    proc getAllKategorien {language} {
      global kategorie
      set result ""
      getmyKey kategorie "${language}_?*" result 2
      return [lsort -increasing $result]
    }
    
    proc getAllUnterkategorien1 {language} {
      global unterKategorie
      set result ""
      getmyKey unterKategorie "${language}_?*" result 3
      return [lsort -increasing $result]
    }
    
    proc getAllUnterkategorien2 {language kategorie} {
      global unterKategorie
      set result ""
      getmyKey unterKategorie "${language}_${kategorie}_?*" result 3
      return [lsort -increasing $result]
    }
    
    proc getAllAssessments {language} {
      global assessment
      set result ""
      getmyKey assessment "${language}_?*" result 2
      return [lsort -increasing $result]
    }
    
    proc getAllTitel {language} {
      global titel
      set result ""
      getValues titel "${language}_*" result
      return [lsort -increasing $result]
    }
    
    proc getAllLanguages {} {
      global lang
      return [lsort -increasing $lang()]
    }
    
    proc getAllPruefungsordnungen {} {
      global pruefungsordnung
      return [lsort -increasing $pruefungsordnung()]
    }
    
    proc getAllMitarbeiter {} {
      global mitarbeiter
      set resultList {}
      getmyKey mitarbeiter "?*" resultList 0
      return [lsort -increasing $resultList]
    }
    
    proc getAllHoererStati {} {
      global hoererStati
      return [lsort -increasing $hoererStati]
    }
    
    proc getAllIDs {} {
      global id
      return $id
    }
    
    #-----------------------------------------------------------------------------
    # Modulname    :  getIDs
    # Beschreibung :  Durchsucht die Indexstrukturen der Selektionskriterien und gibt
    #                 die VeranstaltungsIDs zurck, auf die die ausgew„hlen Selektions-
    #                 kriterien passen
    #
    # Parameter    :  in | out   Name       Datentyp       Beschreibung
    #                    x       x          x              x
    #                    x       x          x              x
    #
    # globaler Zugriff :  Variablenname   Lesezugriff   Schreibzugriff
    #                     alle Indexstrukturen +              -
    #
    #-----------------------------------------------------------------------------
    proc getIDs {} {
      global id semester kategorie unterKategorie assessment mitarbeiter pruefungsordnung
      global val_language val_kategorie val_unterkategorie val_assessment val_mitarbeiter val_pruefungsordnung val_semester
    
            #Ermittlung der in Frage kommenden IDs je Kategorie, wobei die krzeste Liste
            #die erste Liste ist
            set allLists {}
            ordne allLists [getKategorieUnterkategorieIDs $val_language $val_kategorie $val_unterkategorie] 
            ordne allLists [getAssessmentIDs $val_language $val_assessment] 
            ordne allLists [getMitarbeiterIDs $val_mitarbeiter]  
            ordne allLists [getPruefungsordnungsIDs $val_pruefungsordnung] 
            ordne allLists [getSemesterIDs $val_semester] 
    
            set allX [llength $allLists]
    
            foreach element [lindex $allLists 0] {
              set tmp(${element}) { x }
            }
    
            foreach sublist [lrange $allLists 1 end] {
              foreach element $sublist {
                if { [array names tmp $element] != ""} {
                  lappend tmp(${element}) x
                }
              }
            }
    
            set resultList ""
            foreach element [array names tmp] {
              if { [llength $tmp(${element})] == $allX } {
                lappend resultList $element
              }
            }
            
            return $resultList
    }
    
    proc allChange {data default} {
      if {[string compare $data alle] == 0} {
        return $default
      } else {
        return $data
      }
    }
    
    
    






    htmlSites.tcl

    ##############################################################################
    #
    # Dateiname    : htmlSites.tcl
    # Import       : toolbox.tcl
    #                part.tcl
    #
    # Beschreibung : Module zum Erzeugen und Verarbeiten von HTML-Seiten
    #
    # Prozeduren : createStartSite {filename cgi_url}                   
    #              modell {liste} 
    #              lersetze {liste topic new} 
    #              datafields {rows cols ...
    #              aufzaehlung {header elements key seite request what}
    #              myaufzaehlung {language header ...
    #              htmljezeile {liste} 
    #              getVeranstaltungsInfo {language vid array}           
    #
    #
    # globale Variablen : -
    #
    ##############################################################################
    
    #-----------------------------------------------------------------------------
    # Importanweisungen
    #-----------------------------------------------------------------------------
    
    source toolbox.tcl
    source part.tcl
    
    #-----------------------------------------------------------------------------
    # Modulname    :  createStartSite
    # Beschreibung :  Erzeugt eine HTML-Seite namens  im Verzeichnis ,
    #                 die ein CGI-Link enth„lt.
    #                 Wenn Verzeichnis nicht existiert, wird neues angelegt.
    #                 
    # Fehlercodes  :  -1:  Gleichnamige Datei existiert schon
    #
    #
    # Parameter    :  in | out   Name       Datentyp       Beschreibung
    #                    in      filename   string         Dateiname
    #                    in      cgi_url    string         URL des Links
    #
    #-----------------------------------------------------------------------------
    proc createStartSite {filename cgi_url} {
      if {[string compare [file exists ${filename}] 0] != 0} {
        return -1  
      }
    
      set text "
            
              
                fenstertitel
              
               
                
                  <a href=${cgi_url}>klick hier</a>
                
    " set tmpfile [open $filename w] puts $tmpfile $text close $tmpfile return 0 } #----------------------------------------------------------------------------- # Modulname : modell # Beschreibung : Ersetzt im String alle Leerzeichen durch einen Unterstrich # bzw. dem Pluszeichen. # # Parameter : in | out Name Datentyp Beschreibung # in text string zu modifizierender String # # Rckgabewert : Modifizierter String # #----------------------------------------------------------------------------- proc mykonform {text} { set argl [split $text " "] return [join $argl "_"] } proc konform {text} { set argl [split $text " "] return [join $argl "+"] } #----------------------------------------------------------------------------- # Modulname : modell # Beschreibung : Erstellt eine CGI-Anfrage aus einer Liste, die wie folgt auf- # gebaut ist, wobei Listen, die per CGI bergeben werden sollen, # durch Pluszeichen verbunden werden. # set liste { {key value} {key1 value1} ... {keyn valuen} } # modell $liste -> key=value key1=value1 ... keyn=valuen # # Parameter : in | out Name Datentyp Beschreibung # in liste Liste zu modifizierende Liste # #----------------------------------------------------------------------------- proc modell {liste} { set result "" for {set i 0} {$i < [llength $liste]} {incr i} { set sublist [lindex $liste $i] append result [lindex $sublist 0] = [konform [lindex $sublist 1]] & } return [string range $result 0 [expr [string length $result] - 2]] } #----------------------------------------------------------------------------- # Modulname : lersetze # Beschreibung : Ersetzt in einer Liste, die wie folgt aufgebaut ist, den # Wert einer Subliste. # set liste { {key value} {key1 value1} ... {keyn valuen} } # set new [lersetze $liste key1 xx] # puts $new -> { {key value} {key1 xx} ... {keyn valuen} } # # Parameter : in | out Name Datentyp Beschreibung # in liste liste zu modifizierende Liste # in topic string Schlssel (im Beispiel key1) # in new string neuer Wert (im Beispiel xx) # # Rckgabewert : modifizierte Liste #----------------------------------------------------------------------------- proc lersetze {liste topic new} { set i 0 while {$i <= [llength $liste]} { set sublist [lindex $liste $i] if {[string compare [lindex $sublist 0] $topic] == 0} { set newSublist [lreplace $sublist 1 1 $new] set liste [lreplace $liste $i $i $newSublist] break # Annahme keine weiteren Sublisten mit gleichem Key } incr i } if {[string compare $topic language]} { } return $liste } #----------------------------------------------------------------------------- # Modulname : aufzaehlung # Beschreibung : Erstellt die Auswahlliste fr das Selektionskriterium
    # # Parameter : in | out Name Datentyp Beschreibung # in header string šberschrift der Auswahlliste # in elements list Elemente die aufgelistet werden sollen # in request list Liste der aktuellen CGI-Parameter (Sublisten) # in key string erstes Element einer Subliste # gibt an, welches nachfolgende Element ersetzt werden soll # in seite string zweites Element einer Subliste # neuer Wert # in what string erstes Element einer Subliste # in default string zweites Element einer Subliste # # Rckgabewert : string (HTML-Seite) # #----------------------------------------------------------------------------- proc aufzaehlung {header elements key seite request what default} { global cgi_script set text "
    $header

    " set request [lersetze $request seite $seite] #Listeneintrag: alle Elemente ausgeben #bei Sprachauswahl und Anfeanger Link "alle" nicht mit anzeigen if { ([string compare $what language] != 0) && ([string compare $what hoererstatus] != 0) } { set request [lersetze $request $what alle] append text "<a href =$cgi_script?[modell $request]>
  • ${default}</a>" } set unsortedList {} foreach index $elements { set request [lersetze $request $what $index] #Tcl-Sortierfunktion ausnutzen set info "<a href=$cgi_script?[modell $request]>
  • ${index}</a>" lappend unsortedList [list ${index} $info ] } # sortiere Listen in aufsteigender Reihenfolge anhand des Titels set sortedList [lsort -index 0 -increasing $unsortedList] # Titelangabe in den Sublisten entfernen foreach element $sortedList { append text [lindex $element 1] } return $text } #----------------------------------------------------------------------------- # Modulname : myaufzaehlung # Beschreibung : Erstellt die Auswahlliste fr das Selektionskriterium
    # # Parameter : in | out Name Datentyp Beschreibung # in header string šberschrift der Auswahlliste # in elements list Elemente die aufgelistet werden sollen # in request list Liste der aktuellen CGI-Parameter (Sublisten) # in key string erstes Element einer Subliste # gibt an, welches nachfolgende Element ersetzt werden soll # in seite string zweites Element einer Subliste # neuer Wert # in what string erstes Element einer Subliste # in default string zweites Element einer Subliste # # Rckgabewert : string (HTML-Seite) # #----------------------------------------------------------------------------- proc myaufzaehlung {language header elements key seite request what hoerer default} { global cgi_script set text "
    $header

    " set request [lersetze $request seite $seite] #Listeneintrage: alle Elemente ausgeben set request [lersetze $request titel alle] set request [lersetze $request $what $elements] append text "
  • <a href=${cgi_script}?[modell $request]>${default}</a>" set unsortedList {} foreach index $elements { set currTitle [join [getTitel $language $index]] set request [lersetze $request $what $index] #Tcl-Sortierfunktion ausnutzen set info "
  • <a href=${cgi_script}?[modell $request]>${currTitle}</a>" lappend unsortedList [list $currTitle $info ] } # sortiere Listen in aufsteigender Reihenfolge anhand des Titels set sortedList [lsort -index 0 -increasing $unsortedList] # Titelangabe in den Sublisten entfernen foreach element $sortedList { append text [lindex $element 1] } return $text } #----------------------------------------------------------------------------- # Modulname : getVeranstaltungsInfo # Beschreibung : Gibt den Body der HTML-Veranstaltungsseite zurck # # Parameter : in | out Name Datentyp Beschreibung # in language string Sprache, der sprachab- # h„ngigen Anteile der zu # generierenden HTML-Seite # in vid string Veranstaltungsnummer # # globaler Zugriff : Bezeichner und Werte # #----------------------------------------------------------------------------- proc max {v1 v2} { if {$v1 > $v2} { return $v1 } return $v2 } proc getVeranstaltungsInfo3 {language vid} { global val_fenstertitel val_sws val_semester val_stundenVorlesung global val_stundenPruefung val_credit val_titel val_beschreibung global val_kommentar val_mitarbeiter val_kategorie val_unterkategorie global val_assessment val_referenz val_partner val_pruefungsordnungen global val_hoererstatus val_sprache global lit_fenstertitel lit_sws lit_semester lit_stundenVorlesung global lit_stundenPruefung lit_credit lit_titel lit_beschreibung global lit_kommentar lit_mitarbeiter lit_kategorie lit_unterkategorie global lit_assessment lit_referenz lit_partner lit_pruefungsordnung global lit_hoererstatus lit_alle lit_sprache lit_vorlesungen global lit_arbeitsaufwand #Anzahl Spalten fr Fachbereiche set cntFachbereiche [llength ${val_pruefungsordnungen}] # wenn z.B. keine Fachbereiche vorhanden, damit unterkategorie eine Spalte erh„lt und # Tabellenaufbau in Ordnung bleibt set col2 [max 1 ${cntFachbereiche}] set text "" append text "" if {$cntFachbereiche > 0} { foreach sublist $val_pruefungsordnungen { append text "" } } else { for { set i 0 } { $i < $col2 } {incr i} { append text "" } } append text "" if {$cntFachbereiche > 0} { foreach sublist $val_pruefungsordnungen { append text "" } } else { for { set i 0 } { $i < $col2 } {incr i} { append text "" } } append text "
    $lit_titel: $val_titel
    $lit_kategorie /
    $lit_unterkategorie:
    $val_kategorie $val_unterkategorie
    $lit_credit $lit_semester / $lit_sws $lit_mitarbeiter $lit_assessment[lindex $sublist 0] 
    $val_credit $val_semester / $val_sws $val_mitarbeiter $val_assessment[lindex $sublist 1] 
    $lit_beschreibung: $val_beschreibung
    $lit_referenz $val_referenz
    $lit_kommentar: ${val_partner}$val_kommentar
    $lit_arbeitsaufwand: $lit_stundenVorlesung: $val_stundenVorlesung $lit_stundenPruefung: $val_stundenPruefung
    " return $text } #----------------------------------------------------------------------------- # Modulname : htmljezeile # Beschreibung : Gibt einen String zurck, der aus den Elementen einer Liste # besteht, deren Elemente mit
    verbunden sind. # # Parameter : in | out Name Datentyp Beschreibung # in liste liste Liste deren Elemente verbunden werden sollen # #----------------------------------------------------------------------------- proc htmljezeile {liste} { set text "" foreach element $liste { append text ${element}
    } return $text } proc htmllinkjezeile {liste cgi_script old_request} { set text "" foreach element $liste { append text "[list <a href=${cgi_script}?[modell [lersetze $old_request titel [lindex $element 0]]]]>[mykonform [lindex $element 1]]</a>
    " } return $text }



  • toolbox.tcl

    ##############################################################################
    #
    # Dateiname    : toolbox.tcl
    # Import       : -
    # Beschreibung : Funktionsbibliothek
    #
    # Prozeduren   : car {liste} 
    #                cdr {liste} 
    #                lprepend {ref_liste element}
    #                push {ref_stack} 
    #                pull {ref_stack} 
    #                allEqualList {list1 list2} 
    #                sortSublist {listenliste} 
    #
    # globale Variablen : -
    #
    ##############################################################################
    
    
    #-----------------------------------------------------------------------------
    # Modulname    :  car
    # Beschreibung :  Der Rckgabewert ist das erste Element der Liste .
    #                 Wenn die Liste leer ist, wird ein leerer String zurckge-
    #                 liefert.
    #
    # Parameter    :  in | out   Name       Datentyp       Beschreibung
    #                    in      liste      Liste          Liste mit Elementen
    #
    # Rckgabewert und
    # Fehlerbehandlung : siehe Modulbeschreibung
    #
    #-----------------------------------------------------------------------------
    proc car {liste} {
      return [lindex $liste 0] }
    
    
    #-----------------------------------------------------------------------------
    # Modulname    :  cdr
    # Beschreibung :  Gibt die Liste  vermindert um deren ersten Element
    #                 zurck. Wenn die Liste leer ist, wird die leere Liste
    #                 zurckgeliefert.
    #
    # Parameter    :  in | out   Name       Datentyp       Beschreibung
    #                    in      liste      Liste          Liste mit Elementen
    #
    # Rckgabewert und
    # Fehlerbehandlung : siehe Modulbeschreibung
    #
    #-----------------------------------------------------------------------------
    proc cdr {liste} {
      return [lrange $liste 1 end] }
    
    
    #-----------------------------------------------------------------------------
    # Modulname    :  lprepend
    # Beschreibung :  Fgt das Element  an den Kopf der Liste
    #                  ein.
    #
    # Parameter    :  in | out   Name       Datentyp       Beschreibung
    #                  in/out    ref_liste  Liste          Liste, in die das
    #                                                      Element eingefgt
    #                                                      werden soll
    #                    in      element                   Element, das in die
    #                                                      Liste eingefgt werden
    #                                                      soll.
    #
    # Rckgabewert und
    # Fehlerbehandlung : siehe Modulbeschreibung
    #
    #-----------------------------------------------------------------------------
    proc lprepend {ref_liste element} {
      upvar $ref_liste liste
      set liste [linsert $liste 0 $element]
      return
    }
    
    #-----------------------------------------------------------------------------
    # Modulname    :  lprepend
    # Beschreibung :  Fgt ein Element  an das Ende der Liste
    #                  an.
    #
    # Parameter    :  in | out   Name       Datentyp       Beschreibung
    #                  in/out    ref_liste  Liste          Liste, in die das
    #                                                      Element eingefgt
    #                                                      werden soll
    #                    in      element                   Element, das in die
    #                                                      Liste eingefgt werden
    #                                                      soll.
    #
    # Rckgabewert und
    # Fehlerbehandlung : siehe Modulbeschreibung
    #
    #-----------------------------------------------------------------------------
    proc prepend {ref_text element} {
      upvar $ref_text text
      append element $text
      set text $element
      return
    }
    
    #-----------------------------------------------------------------------------
    # Modulname    :  push
    # Beschreibung :  Fgt den getrimmten String  an den Kopf der Liste
    #                  ein. (Stackfunktion)
    #
    # Parameter    :  in | out   Name       Datentyp       Beschreibung
    #                  in/out    ref_stack  Liste          Liste, in die das
    #                                                      Element eingefgt
    #                                                      werden soll
    #                    in      data                      Element, das in die
    #                                                      Liste eingefgt werden
    #                                                      soll.
    #
    # Rckgabewert und
    # Fehlerbehandlung : siehe Modulbeschreibung
    #
    #-----------------------------------------------------------------------------
    proc push {ref_stack data} {
      upvar $ref_stack myStack
      lprepend myStack [string trim $data]
      return
    }
    
    #-----------------------------------------------------------------------------
    # Modulname    :  pull
    # Beschreibung :  L”scht das erste Element aus der Referenzliste 
    #                 und gibt es als Funktionsrckgabewert zurck. (Stackfunktion)
    #
    # Parameter    :  in | out   Name       Datentyp       Beschreibung
    #                  in/out    ref_stack  Liste          Liste, in die das
    #                                                      Element eingefgt
    #                                                      werden soll
    #                    in      element                   Element, das in die
    #                                                      Liste eingefgt werden
    #                                                      soll.
    #
    # Rckgabewert und
    # Fehlerbehandlung : siehe Modulbeschreibung
    #
    #-----------------------------------------------------------------------------
    proc pull {ref_stack} {
      upvar $ref_stack myStack
      set data [car $myStack]
      set myStack [cdr $myStack]
      return $data
    }
    
    #-----------------------------------------------------------------------------
    # Modulname    :  allEqualList
    # Beschreibung :  Gibt die Schnittmenge der Elemente der Listen  und
    #                  zurck.
    #
    # Parameter    :  in | out   Name       Datentyp       Beschreibung
    #                    in      list1      Liste          Vergleichsliste 1
    #                    in      list2      Liste          Vergleichsliste 2
    #
    # Rckgabewert und
    # Fehlerbehandlung : siehe Modulbeschreibung
    #
    #-----------------------------------------------------------------------------
    proc allEqualList {list1 list2} {
      set returnList ""
      foreach element1 $list1 {
          set isin 0
          foreach element2 $list2 {
            if {[string compare $element1 $element2] == 0} {
              set isin 1                                                                                         
              break
              # nicht notwendig die restliche Liste zu durchsuchen, wenn bereits Element in der Liste gefunden
            }               
          }                             
          if { ($isin == 1) && ([lsearch $returnList $element1] == -1) } {
            lappend returnList $element1
          }
      }
      return $returnList
    }
    
    #-----------------------------------------------------------------------------
    # Modulname    :  sortSublist
    # Beschreibung :  Die Liste  besteht aus mehreren Sublisten.
    #                 Es wird eine neue Liste zurckgegeben in der die Sublisten
    #                 anhand ihrer L„nge nach aufsteigend sortiert sind.
    #
    # Parameter    :  in | out   Name        Datentyp       Beschreibung
    #                    in      listenliste Liste          Liste mit Sublisten
    #
    # Rckgabewert und
    # Fehlerbehandlung : siehe Modulbeschreibung
    #
    #-----------------------------------------------------------------------------
    proc sortSublist {listenliste} {
      # erzeuge neue Liste, die aus zweielementigen Sublisten besteht, wobei das
      # zweite Element eine Subliste der  und das erste Element die
      # L„nge dieser Subliste darstellt
      set allListsLength ""
      foreach element $listenliste {
        lappend allListsLength [list $element [llength $element]]
      }
    
      # sortiere Listen in aufsteigender Reihenfolge anhand der L„ngenangabe
      set allListsLength [lsort -increasing -index 1 $allListsLength]
    
      # L„ngenangabe in den Sublisten entfernen
      set result ""
      foreach element $allListsLength {
        lappend result [lindex $element 0]
      }
    
      return $result
    }
    
    #-----------------------------------------------------------------------------
    # Modulname    :  ordne
    # Beschreibung :  H„ngt new_list an den Kopf der Liste  an, wenn
    #                 sie krzer ist, ansonsten an das Ende
    #
    # Parameter    :  in | out   Name       Datentyp     Beschreibung
    #                  in/out    ref_list   Liste        alte Liste
    #                    in      new_list   Liste        anzuh„ngende Liste
    #
    #-----------------------------------------------------------------------------
    proc ordne {ref_result new_list} {
      upvar $ref_result result
      if {[llength $new_list] < [llength [lindex $result 0]]} {
        lprepend result $new_list
      } else {
        lappend result $new_list
      }
      return
    }
    
    
    

    gen_xml.pl

    ##############################################################################
    # Import         : locale
    #                  DBI
    # Datei          :  gen_xml.pl
    # Beschreibung   :  Generiert aus der Datenbank ein XML-Dokument mit allen 
    #                   Veranstaltungen
    #                 
    #
    # Programmierer  : Mario Busche
    # Änderungen     : Datum             Beschreibung
    #                  20.07.1999        Erstellung (letzte Änderung)
    ##############################################################################
    
    use locale;
    use strict; # damit Variablen mit my definiert werden muessen
    use DBI; # Datenbankschnittstelle
    
    # String mit allen aktuellen Studienordnungen.wird in den SQL-Statements zur Selektion bnutzt
    my $AktuellePO = "('AI10.0', 'DI10.0', 'II10.0', 'MI10.0', 'PI10.0', 'WI10.0', 'EA10.4', 'EA12.0', 'IA10.3', 'IA12.0', 'PA10.2', 'PA12.0')";
    my $AnzahlVeranstaltungen = 0;
    my $ODBC = 'dbi:ODBC:mbu';
    my $data = "";
    
    # Verbindung zur Datenbank herstellen
    my $dbh = DBI->connect( $ODBC,
                            {
                              RaiseError => 1
                            }
                           ) 
    	|| die "Database connection not made: $DBI::errstr";
    
    #Puffer fuer BLOB Felder setzen, damit diese auch gelesen werden
    $dbh->{LongReadLen} = 3048; 	
    
    #Variablen fuer die Tabelle Veranstaltungen definieren
    my( $Semester, $Ver_ID_Veranstaltung, $SWS, $ECTS_Grade, $ECTS_Punkte, $ECTS_Assessment,
    		$ECTS_LT_Stunden, $ECTS_PE_Stunden, $ID_Veranstaltung, $Dummy);
    		
    # Selektiere alle Veranstaltungen der aktuellen Stdudienordnungen
    my $sql = "SELECT DISTINCT v.ID_Veranstaltung, v.Semester, v.Ver_ID_Veranstaltung, v.SWS,\
                               v.ECTS_Grade, v.ECTS_Assessment, v.ECTS_LT_Studen, v.ECTS_PE_Studen,\
                               v.name\
               FROM     veranstaltungen v,\
                        veranstaltung_gruppe vg,\
                        fb_obergruppen_soplan fos,\
                        prufungsordnung po\
               WHERE    v.id_veranstaltung = vg.id_veranstaltung\
                        and vg.fogr_id = fos.fogr_id\
                        and fos.prufungsordnung_id = po.prufungsordnung_id\
                        and po.po_nr in ".$AktuellePO."\
               ORDER BY v.name";
    
    
    my $sthVeranstaltungen = $dbh->prepare( $sql );
    $sthVeranstaltungen->execute();
    $sthVeranstaltungen->bind_columns(  undef,
                                        \$ID_Veranstaltung,
    									                  \$Semester,
    									                  \$Ver_ID_Veranstaltung,
    									                  \$SWS,
    									                  \$ECTS_Grade,
    									                  \$ECTS_Assessment,
    									                  \$ECTS_LT_Stunden,
    									                  \$ECTS_PE_Stunden,
    									                  \$Dummy);
    
    # XML Datei oeffnen
    open (fh, "> veranstaltungen.xml");
    
    # Header der XML-Datei generieren
    $data = << "HEADER";
    
    
    
    HEADER
    
    
    #while( $sthVeranstaltungen->fetch() && ($AnzahlVeranstaltungen < 10) ) {
    while( $sthVeranstaltungen->fetch() ) {  
        ++$AnzahlVeranstaltungen;
        print "$AnzahlVeranstaltungen\n";   
    #    $data .= "\t\n";    
        $data .= "\t\t$SWS\n";  
        $data .= "\t\t$ECTS_Grade\n";  
        $data .= "\t\t$ECTS_LT_Stunden\n";  
        $data .= "\t\t$ECTS_PE_Stunden\n";
    
    	# Textfelder je Sprache einfuegen
    	my( $Name, $Category, $SubCategory, $Description, $Comments, $Sprache);
    	$sql = "SELECT * FROM Veranstaltungen_T WHERE ID_Veranstaltung = ?";
    	my $sthZusatz = $dbh->prepare( $sql );
    	$sthZusatz->bind_param(1, $ID_Veranstaltung, DBI::SQL_INTEGER );  		
    	$sthZusatz->execute();
    	$sthZusatz->bind_columns( undef,
    	                          \$Dummy,
    	                          \$Sprache,
    	                          \$Name,
    	                          \$Category,
            					          \$SubCategory,
            					          \$Description,
            					          \$Comments);
            					 
    	while( $sthZusatz->fetch() ) {	
    		$data .= "\t\t\n";
    		$data .= "\t\t\t".&normalize($Category)."\n";		
    		$data .= "\t\t\t".&normalize($SubCategory)."\n";		
    		$data .= "\t\t\t".&normalize($Name)."\n";
    		$data .= "\t\t\t".&normalize($Description)."\n";		
    		$data .= "\t\t\t".&normalize($Comments)."\n";		
    
      	# Assessment je Sprache einfuegen
       	my( $AssessmentName);
       	my $sql = "SELECT * FROM Assessment WHERE ID_Assessment=? AND ID_Sprache = ?";
       	my $sthAssessment = $dbh->prepare( $sql );
       	$sthAssessment->bind_param(1, $ECTS_Assessment);  		
       	$sthAssessment->bind_param(2, $Sprache);  		    	
       	$sthAssessment->execute();
       	$sthAssessment->bind_columns( undef,
       	                              \$Dummy,
       	                              \$Dummy,
       	                              \$AssessmentName);
       	$sthAssessment->fetch();
        $data .= "\t\t\t".&normalize($AssessmentName)."\n";
        $sthAssessment->finish();
    		$data .= "\t\t\n";	    
    	}
    	
    	$sthZusatz->finish();
    
    	# Referenzen einfügen
    	my( $Reference);
    	$sql = "SELECT * FROM Veranstaltungen_R WHERE ID_Veranstaltung = ?";
    	my $sthReference = $dbh->prepare( $sql );
    	$sthReference->bind_param(1, $ID_Veranstaltung, DBI::SQL_INTEGER );  		
    	$sthReference->execute();
    	$sthReference->bind_columns(undef,
    	                            \$Dummy,
    	                            \$Dummy,
    	                            \$Reference);
    	                            
    	while( $sthReference->fetch() ) {	
    		$data .= "\t\t".&normalize($Reference)."\n";
    	}
    	
    	$sthReference->finish();
    
    	# Mitarbeiter einfügen
    	my( $Kurzel, $Titel, $Vorname, $Nachname);
    	$sql = "SELECT m.Kurzel, m.Titel, m.Vorname, m.Nachname FROM Mitarbeiter m, MA_hat_Veranst v WHERE v.ID_Veranstaltung = ? AND m.Kurzel = v.Kurzel";
    	my $sthMitarbeiter = $dbh->prepare( $sql );
    	$sthMitarbeiter->bind_param(1, $ID_Veranstaltung, DBI::SQL_INTEGER);  		
    	$sthMitarbeiter->execute();
    	$sthMitarbeiter->bind_columns(undef,
    	                              \$Kurzel,
    	                              \$Titel,
    	                              \$Vorname,
    	                              \$Nachname);
    	                              
    	while( $sthMitarbeiter->fetch() ) {	
    	    $Kurzel = lc($Kurzel);
    		$data .= "\t\t".&normalize($Nachname)."\n";
    		$data .= "\t\t\n";
    	}
    	
    	$sthMitarbeiter->finish();
    
      # zugeordnete Veranstaltung
      if ( $Ver_ID_Veranstaltung != "" ) {
          $sql = "SELECT name FROM Veranstaltungen";
          my $sthV = $dbh->prepare( $sql );
          $sthV->execute();
          $sthV->bind_columns(undef,
                              \$Name);
          $sthV->fetch();
    	    $data .= "\t\t\n".&normalize($Name);    
    	    $data .= "\t\t\n";    	
          $sthV->finish();    
      }
    
      # Veranstaltungen eines Scheines suchen
      my ($id_pfach, $ref_id);
      $sql = "SELECT  pf.id_pfach\
              FROM    veranstaltungen v,\
                      prufungsfach pf,\
                      unterfacher_studienordnung uf,\
                      stundenplan_veranstaltungen sv\
              WHERE   pf.id_pfach = uf.id_pfach\
                      and uf.id_ufach = sv.id_ufach\
                      and sv.id_veranstaltung = v.id_veranstaltung
                      and v.id_veranstaltung = ?";
                
      my $sthV = $dbh->prepare( $sql );
    	$sthV->bind_param(1, $ID_Veranstaltung, DBI::SQL_INTEGER);  		    
      $sthV->execute();
      $sthV->bind_columns(  undef, \$id_pfach);
      $sthV->fetch();
      $sthV->finish();
      
      $sql = "SELECT  v.id_veranstaltung, v.name\
              FROM    veranstaltungen v,\
                      prufungsfach pf,\
                      unterfacher_studienordnung uf,\
                      stundenplan_veranstaltungen sv\
              WHERE   pf.id_pfach = uf.id_pfach\
                      and uf.id_ufach = sv.id_ufach\
                      and sv.id_veranstaltung = v.id_veranstaltung\
                      and v.id_veranstaltung <> ?\
                      and pf.id_pfach = ?";
                
      $sthV = $dbh->prepare( $sql );
    	$sthV->bind_param(1, $ID_Veranstaltung, DBI::SQL_INTEGER);  		    
      $sthV->bind_param(2, $id_pfach, DBI::SQL_INTEGER);  		    	
      $sthV->execute();
      $sthV->bind_columns(  undef, \$ref_id, \$Name);
    
    	while( $sthV->fetch() ) {	
    	  $data .= "\t\t\n".&normalize($Name);    
    	  $data .= "\t\t\n";    	
    	}
    
    	$sthV->finish();
    
    
      # Pruefungsordnung
    	my( $po_nr, $ht_ws, $ht_ss);
      $sql = "SELECT  po.po_nr, sv.ht_ws, sv.ht_so  \
              FROM    prufungsordnung po,\
                      prufungsfach pf,\
                      unterfacher_studienordnung uf,\
                      stundenplan_veranstaltungen sv\
              WHERE   po.prufungsordnung_id = pf.prufungsordnung_id\
                      and pf.id_pfach = uf.id_pfach\
                      and uf.id_ufach = sv.id_ufach\
                      and sv.id_veranstaltung = ?\
                      and po.po_nr in ".$AktuellePO."\
             ORDER BY po.po_nr desc";
                
      my $sthpo = $dbh->prepare( $sql );
    	$sthpo->bind_param(1, $ID_Veranstaltung, DBI::SQL_INTEGER);  		    
      $sthpo->execute();
      $sthpo->bind_columns(  undef, \$po_nr, \$ht_ws, \$ht_ss );
    
    	while( $sthpo->fetch() ) {	
    		$data .= "\t\t$po_nr \n";
            $ht_ws = "-" if $ht_ws == "";
            $ht_ss = "-" if $ht_ss == "";        
    		$data .= "\t\t\t $ht_ws \n";		
    		$data .= "\t\t\t $ht_ss \n";				
    		$data .= "\t\t\n";
    	}
    
    	$sthpo->finish();
    
    	$data .= "\t\n";
    	print fh $data;
    	$data = "";
    }
    
    $sthVeranstaltungen->finish();
    $dbh->disconnect();
    print fh "";    
    close  fh;
    
    
    sub normalize {
      my $string = @_[0];
      if ($string eq "") {
        $string = "-";
      } else {
        $string =~ s/[<>&']/&con_sonderzeichen($&)/ge;
      }
       
      return $string;
    }
    
    sub con_sonderzeichen {
      my $char = @_[0]; #Sonderzeichen
      
      SWITCH: {
        if ($& eq "<") { $char = "<"; last SWITCH; }
        if ($& eq ">") { $char = ">"; last SWITCH; }
        if ($& eq "&") { $char = "&"; last SWITCH; }
        if ($& eq "'") { $char = "'"; last SWITCH; }
      }
      
      return $char;
    }
    



    zurück: Programmorganisation
     

      Inhaltsverzeichnis   Programmierhandbuch