T. Jogsch: Mehrspaltiges Listenfeld

Hallo zusammen,

anbei eine kurze Beschreibung meines Problemes:

Ich habe eine MySQL-DB mit folgenden Tabelle
  - Gebäude
  - Etagentypen
  - Etagen
  - Raumtypen
  - Raum

In der Tabelle Gebäude lege ich die Gebäude des Standortes fest.
z.B. Hauptgebäude
In der Tabelle Etagentypen lege ich die Etagen unabhängig vom Gebäude fest.
z.B. Erdgeschoss
In der Tabelle Etage ordne ich dem jeweiligen Gebäude die entsprechenden Etagentypen zu.
z.B.Hauptgebäude - Erdgeschoss
Jeder Eintrag/Zuordnung kann nur einmal eingegeben werden.
In der Tabelle Raum möchte ich nun einer bestimmten Etage in dem dazu gehörigem Gebäude einen Raum zuordnen. Über ein Listenfeld "Auswahl Etage" wird mir derzeit die Etage zur Auswahl angeboten. Das klappt auch alles.

Mein Problem:
Wenn ich nun mit unterschiedlichen Gebäuden arbeite kann es vorkommen, dass das Erdgeschoss auch hier vergeben wird. In der Tabelle Etage wird nun dem neuen Gebäude die jeweilige Etage aus der Tabelle Etagentyp zugeordnet.
z.B. Nebengebäude - Erdgeschoss
Wenn ich nun in der Tabelle Raum eine eine Etage über das Listenfeld auswähle, wird mir ein zweiter Eintrag Erdgeschoss angezeigt. Das ist auch richtig, denn diese Etage gibt es in zwei unterschiedlichen Gebäuden.
Ist es möglich in diesem Listenfeld noch eine zweite Spalte einzufügen, die mir das Gebäude mit anzeigt?
z.B. derzeitiges Listenfeld     Erdgeschoss
                                Erdgeschoss
angedachtes Listenfeld          Hauptgebäude - Erdgeschoss
                                Nebengebäude - Erdgeschoss

Es handelt sich hierbei um ein Schulprojket und darum benötige ich schnellmöglich eine Rückantwort.

Vielen Dank im voraus.

  1. hi,

    Es handelt sich hierbei um ein Schulprojket und darum benötige ich schnellmöglich eine Rückantwort.

    das macht deine frage in keinster weise wichtiger als jede andere hier - also unterlasse doch bitte zukünftig solche drängeleien.

    gruß,
    wahsaga

    --
    "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
  2. Hallo,

    Ist es möglich in diesem Listenfeld noch eine zweite Spalte einzufügen, die mir das Gebäude mit anzeigt?
    z.B. derzeitiges Listenfeld     Erdgeschoss
                                    Erdgeschoss

    Wer erstellt das Auswahllisten-Element?

    <select name="etagen" size="1">
    <option value="hg-eg">Erdgeschoss</option>
    <option value="ng-eg">Erdgeschoss</option>
    </select>

    angedachtes Listenfeld          Hauptgebäude - Erdgeschoss
                                    Nebengebäude - Erdgeschoss

    Derjenige bzw. diejenige Software müsste folgendes Auswahllisten-Element erstellen:
    <select name="etagen" size="1">
    <option value="hg-eg">Hauptgebäude - Erdgeschoss</option>
    <option value="ng-eg">Nebengebäude - Erdgeschoss</option>
    </select>

    viele Grüße

    Axel

    1. Hallo,

      das Script sieht derzeit wie folgt aus:

      ...JavaScript...

      </head>
      <body>
      <form  onsubmit="if( !checkForm(this, true) ) return false; else alert('Eingabe OK!');">
      <table>
      <p><br><H4>Eine neue Etage hinzufügen:<H4></p>
      <form action="<?=$PHP_SELF?>" method="post">

      <tr><td>Gebäude:</td><td>
      <select name="geb_id" size="1" class="check">
      <option selected  value="" >Bitte auswählen</option>
      <option value="">---------------</option>
      <?
      $gebaeude=@mysql_query("select id, geb_bez, geb_kur_bez from gebaeude order by geb_bez");
      while($abfrage=mysql_fetch_array($gebaeude))
      {
      $geb_id=$abfrage[0];
      $agebaeude=htmlspecialchars($abfrage[1]);
      echo("<option value='$geb_id'>$agebaeude</option>\n");
      }
      ?>
      </select>
      </tr>

      <tr><td>Etage:</td><td>
      <select name="eta_typ_id" size="1" class="check">
      <option selected  value="" >Bitte auswählen</option>
      <option value="">---------------</option>
      <?
      $etagentyp=@mysql_query("select id,eta_txt,eta_bez,eta_kur_bez from etagentyp order by eta_txt");
      while($abfrage=mysql_fetch_array($etagentyp))
      {
      $eta_typ_id=$abfrage[0];
      $aetagentyp=htmlspecialchars($abfrage[1]);   //Hier wird derzeit das Angezeigte Feld (Etage "eta_txt")ausgewählt.
      echo("<option value='$eta_typ_id'>$aetagentyp</option>\n");
      }
      ?>
      </select>
      </tr>

      Was müsste hier angepasst werden ?

      1. Hallo,

        das Script sieht derzeit wie folgt aus:

        ...JavaScript...

        *g* Bist Du sicher, dass Du genügend Grundkenntnisse besitzt, um dieses Script sinnvoll zu verändern? Das _einzige_ JavaScript im unten stehenden Quelltext steht innerhalb des onsubmit-Attributes und das hat mit Deinem Problem nichts zu tun.

        </head>
        <body>
        <form  onsubmit="if( !checkForm(this, true) ) return false; else alert('Eingabe OK!');">

        ^Hier fehlt das action-Attribut.

        <table>
        <p><br><H4>Eine neue Etage hinzufügen:<H4></p>

        ^Ein P-Element darf nicht direkt innerhalb eines TABLE-Elements stehen.

        <form action="<?=$PHP_SELF?>" method="post">

        ^Auch ein FORM-Element nicht (siehe P).

        <tr><td>Gebäude:</td><td>
        <select name="geb_id" size="1" class="check">
        <option selected  value="" >Bitte auswählen</option>
        <option value="">---------------</option>
        <?
        $gebaeude=@mysql_query("select id, geb_bez, geb_kur_bez from gebaeude order by geb_bez");
        while($abfrage=mysql_fetch_array($gebaeude))
        {
        $geb_id=$abfrage[0];
        $agebaeude=htmlspecialchars($abfrage[1]);

        ^Warum speicherst Du HTML-Code in der Datenbank?

        echo("<option value='$geb_id'>$agebaeude</option>\n");
        }
        ?>
        </select>
        </tr>

        ^Wo ist das </td>?

        <tr><td>Etage:</td><td>
        <select name="eta_typ_id" size="1" class="check">
        <option selected  value="" >Bitte auswählen</option>
        <option value="">---------------</option>
        <?
        $etagentyp=@mysql_query("select id,eta_txt,eta_bez,eta_kur_bez from etagentyp order by eta_txt");

        In der Tabelle etagentyp stehen die Etagentypen doppelt? Nach Deiner vorherigen Beschreibung, sollte das  die Tabelle etage sein.

        while($abfrage=mysql_fetch_array($etagentyp))
        {
        $eta_typ_id=$abfrage[0];
        $aetagentyp=htmlspecialchars($abfrage[1]);   //Hier wird derzeit das Angezeigte Feld (Etage "eta_txt")ausgewählt.

        ^siehe oben

        echo("<option value='$eta_typ_id'>$aetagentyp</option>\n");
        }
        ?>
        </select>
        </tr>

        ^siehe oben.

        Was müsste hier angepasst werden ?

        Gibt es eine Beziehung zwischen den Tabellen gebaeude und etage, eventuell auch über die Tabelle etagentyp? Wenn ja, dann kannst Du mit Hilfe eines SQL-Joins folgende Felder aus den Tabellen holen:

        etage.id, gebaeude.geb_bez, etagetyp.eta_txt

        Diese kannst Du dann wie folgt verwenden:
        ...
        <option value='[hier etage.id einsetzen]'>[hier eine Verkettung aus gebaeude.geb_bez und " - " und etagetyp.eta_txt einsetzen]</option>
        ...

        viele Grüße

        Axel

        1. Hallo,

          das Script sieht derzeit wie folgt aus:

          ...JavaScript...

          Sorry. Ich hab grade nochmal gelesen und sehe, dass Du hiermit meinst, dass dort oben JavaScript im HEAD-Element steht. Du weißt also, dass Dein eigentliches Problem im PHP-Code liegt?

          Trotzdem ist zunächst die Frage der Tabellenstruktur zu klären:

          Gibt es eine Beziehung zwischen den Tabellen gebaeude und etage, eventuell auch über die Tabelle etagentyp? Wenn ja, dann kannst Du mit Hilfe eines SQL-Joins folgende Felder aus den Tabellen holen:

          etage.id, gebaeude.geb_bez, etagetyp.eta_txt

          http://dev.mysql.com/doc/mysql/en/JOIN.html

          Diese kannst Du dann wie folgt verwenden:
          ...
          <option value='[hier etage.id einsetzen]'>[hier eine Verkettung aus gebaeude.geb_bez und " - " und etagetyp.eta_txt einsetzen]</option>
          ...

          viele Grüße

          Axel

          1. Hallo,

            das Script sieht derzeit wie folgt aus:

            ...JavaScript...
            Sorry. Ich hab grade nochmal gelesen und sehe, dass Du hiermit meinst, dass dort oben JavaScript im HEAD-Element steht. Du weißt also, dass Dein eigentliches Problem im PHP-Code liegt?

            Trotzdem ist zunächst die Frage der Tabellenstruktur zu klären:

            Gibt es eine Beziehung zwischen den Tabellen gebaeude und etage, eventuell auch über die Tabelle etagentyp? Wenn ja, dann kannst Du mit Hilfe eines SQL-Joins folgende Felder aus den Tabellen holen:

            Ja. In der Tabelle Gebäude lege ich die einzelenen Gebäude an.
            In der Tabelle Etagentyp lege ich die einzelenen Etagentypen an.
            In der Tabelle Etagen erstelle ich dann aus den Tabellen Gebäude und Etagentyp eine Campusstruktur. Diese Tabelle wird über ein Listenauswahlfeld gepflegt. Ergebnis: Das Gebäude xyz hat folgende Etagentypen. Jede kombination Gebäude mit Etage kann nur einmal vorkommen. Aus diesem Campuspool (Tabelle "Etage") von Gebäude und Etagendaten/Zuordnung möchte ich meine weitere Doku aufbauen.
            Die Beziehung der Tabellen untereinander besteht also.

            etage.id, gebaeude.geb_bez, etagetyp.eta_txt

            http://dev.mysql.com/doc/mysql/en/JOIN.html

            Diese kannst Du dann wie folgt verwenden:
            ...
            <option value='[hier etage.id einsetzen]'>[hier eine Verkettung aus gebaeude.geb_bez und " - " und etagetyp.eta_txt einsetzen]</option>
            ...

            viele Grüße

            Axel

            1. Hallo,

              Ja. In der Tabelle Gebäude lege ich die einzelenen Gebäude an.
              In der Tabelle Etagentyp lege ich die einzelenen Etagentypen an.
              In der Tabelle Etagen erstelle ich dann aus den Tabellen Gebäude und Etagentyp eine Campusstruktur. Diese Tabelle wird über ein Listenauswahlfeld gepflegt. Ergebnis: Das Gebäude xyz hat folgende Etagentypen. Jede kombination Gebäude mit Etage kann nur einmal vorkommen. Aus diesem Campuspool (Tabelle "Etage") von Gebäude und Etagendaten/Zuordnung möchte ich meine weitere Doku aufbauen.
              Die Beziehung der Tabellen untereinander besteht also.

              Ok ein Beispiel:

              Tabelle gebaeude
              id  text
              1   Hauptgebäude
              2   Nebengebäude
              3   Schuppen

              Tabelle etagentyp:
              id  text
              0   Keller
              1   Erdgeschoss
              2   1. OG
              3   2. OG
              4   3. OG

              Tabelle etagen:
              id  geb_id  etag_typ_id
              1   1       0
              2   1       1
              3   1       2
              4   1       3
              5   2       1
              6   2       2
              7   2       3

              Dann ergibt:

              SELECT etagen.id, gebaeude.text, etagentyp.text
              FROM etagentyp INNER JOIN (gebaeude INNER JOIN etagen ON gebaeude.id = etagen.geb_id) ON etagentyp.id = etagen.etag_typ_id
              ORDER BY gebaeude.id, etagentyp.id;

              id  gebaeude.text  etagentyp.text
              1   Hauptgebäude   Keller
              2   Hauptgebäude   Erdgeschoss
              3   Hauptgebäude   1. OG
              4   Hauptgebäude   2. OG
              5   Nebengebäude   Erdgeschoss
              6   Nebengebäude   1. OG
              7   Nebengebäude   2. OG

              viele Grüße

              Axel

              1. Ich werde es später testen.

                Vielen Dank für die schnelle ERSTVERSORGUNG.

                Es könnte sein, dass ich mich später (nicht unbediengt heute) noch mal melde.

                Danke.

              2. Hallo,

                Ja. In der Tabelle Gebäude lege ich die einzelenen Gebäude an.
                In der Tabelle Etagentyp lege ich die einzelenen Etagentypen an.
                In der Tabelle Etagen erstelle ich dann aus den Tabellen Gebäude und Etagentyp eine Campusstruktur. Diese Tabelle wird über ein Listenauswahlfeld gepflegt. Ergebnis: Das Gebäude xyz hat folgende Etagentypen. Jede kombination Gebäude mit Etage kann nur einmal vorkommen. Aus diesem Campuspool (Tabelle "Etage") von Gebäude und Etagendaten/Zuordnung möchte ich meine weitere Doku aufbauen.
                Die Beziehung der Tabellen untereinander besteht also.

                Ok ein Beispiel:

                Tabelle gebaeude
                id  text
                1   Hauptgebäude
                2   Nebengebäude
                3   Schuppen

                Tabelle etagentyp:
                id  text
                0   Keller
                1   Erdgeschoss
                2   1. OG
                3   2. OG
                4   3. OG

                Tabelle etagen:
                id  geb_id  etag_typ_id
                1   1       0
                2   1       1
                3   1       2
                4   1       3
                5   2       1
                6   2       2
                7   2       3

                Dann ergibt:

                SELECT etagen.id, gebaeude.text, etagentyp.text
                FROM etagentyp INNER JOIN (gebaeude INNER JOIN etagen ON gebaeude.id = etagen.geb_id) ON etagentyp.id = etagen.etag_typ_id
                ORDER BY gebaeude.id, etagentyp.id;

                id  gebaeude.text  etagentyp.text
                1   Hauptgebäude   Keller
                2   Hauptgebäude   Erdgeschoss
                3   Hauptgebäude   1. OG
                4   Hauptgebäude   2. OG
                5   Nebengebäude   Erdgeschoss
                6   Nebengebäude   1. OG
                7   Nebengebäude   2. OG

                viele Grüße

                »»Genau so sieht meine Tabelle aus. Nun soll im Listenfeld bei der Zuordnung Raum (in Tabelle Raum) zu Etage nicht nur das Auswahlfeld Etage stehen, sondern auch das Gebäude davor. Der Eintrag in die Tabelle Raum bezieht sich auf die Tabelle Etagen. Ich möchte lediglich im Listenfeld wissen, welche Gebäude sich hinter der Auswahl der entsprechenden Etage befindet.
                Z.B. wenn ich das Listenfeld anklicke erscheint
                Hauptgebäude - 1.OG
                Hauptgebäude - 2.OG
                Nebengebäude - 1.OG
                usw.
                Ich wähle nun die entprechnede Zeile per Mausklick aus.
                Derzeit sehe ich nur
                1.OG
                2.OG
                1.OG
                Das Gebäude davor ist mir also unbekannt.

                Axel

                1. Hallo,

                  SELECT etagen.id, gebaeude.text, etagentyp.text
                  FROM etagentyp INNER JOIN (gebaeude INNER JOIN etagen ON gebaeude.id = etagen.geb_id) ON etagentyp.id = etagen.etag_typ_id
                  ORDER BY gebaeude.id, etagentyp.id;

                  »»Genau so sieht meine Tabelle aus. Nun soll im Listenfeld bei der Zuordnung Raum (in Tabelle Raum) zu Etage nicht nur das Auswahlfeld Etage stehen, sondern auch das Gebäude davor.

                  Ja, dann wende in Deinem Script https://forum.selfhtml.org/?t=91998&m=553981 in der MySQL-Query das oben angegebene Select an und Verwende das Ergebnis als Datenquelle für das SELECT-Objekt.

                  https://forum.selfhtml.org/?t=91998&m=554013
                  Diese kannst Du dann wie folgt verwenden:
                  ...
                  <option value='[hier etagen.id einsetzen]'>[hier eine Verkettung aus gebaeude.text und " - " und etagetyp.text einsetzen]</option>
                  ...

                  viele Grüße

                  Axel

                  1. Hallo,

                    ich habe das Problem gestern Abend wie folgt gelöst:

                    .....
                    <tr><td>Etage:</td><td>
                    <select name="eta_id" size="1" class="check">
                    <option selected value="">Bitte auswählen</option>
                    <option value="">---------------</option>
                    <?
                    //$etage=@mysql_query("select id,geb_id,eta_typ_id txt from etage order by eta_typ_id");
                    $etage=@mysql_query("select etage.id,gebaeude.geb_bez,etagentyp.eta_txt
                         from etage ,gebaeude ,etagentyp
                         where etage.geb_id=gebaeude.id and etage.eta_typ_id=etagentyp.id order by gebaeude.geb_bez,etagentyp.eta_txt");

                    while($abfrage=mysql_fetch_array($etage))
                    {
                    $eta_id=$abfrage[0];
                    //$aetage=htmlspecialchars($abfrage[2]);
                    $aetage=htmlspecialchars($abfrage [geb_bez] ." " ."<-->"." ". $abfrage [eta_txt]);
                    echo("<option value='$eta_id'>$aetage</option>\n");
                    }
                    ?>
                    ......

                    Vielen Dank für die Unterstützung.