Daten zu einem Datensatz in einer Selectbox ausgeben - funktioniert nicht

Jerinca

Erfahrenes Mitglied
Hallo Leute!

Ich arbeite mit Dreamweaver und erstelle ASP-Sites (zumindest versuche ich es).

Nun habe ich wieder mal ein Problem: Ich möchte auf einer Site die Reparaturen zu einer zuvor ausgewählten Maschine angezeigt bekommen. Allerdings sind die Reparaturbeschreibungen definiert in einer Tabelle und sollen deshalb in einer Selectbox angezeigt werden. Komischerweise lädt der Browser zu lange und bricht dann ab, wenn ich das folgendermaßen mache: Das ist meine Selectbox (mit Javascript drin zum Auslesen aller vorhandenen Einträge):
Code:
        <select name="select">
          <%
while (!Recordset.EOF)
{
%>
          <option value="<%=(Recordset.Fields.Item("RE_Beschreibung").Value)%>" >
<%=(RecordsetUFReparatur.Fields.Item("RE_Beschreibung").Value)%>
</option>
          <%
  Recordset.MoveNext();
}
if (Recordset.CursorType > 0) {
  if (!Recordset.BOF) Recordset.MoveFirst();
} else {
  Recordset.Requery();
}
%>
        </select>
Dann folgen da natürlich noch andere Textfelder und Checkboxes und um das alles herum steht eine While-Schleife, damit der ganze Bereich wiederholt wird, solange die Abfrage noch Daten hergibt:
Code:
<% while ((Repeat1__numRows-- != 0) && (!Recordset.EOF)) { %>

HIER STEHT DIE SELECTBOX UND DIE ANDEREN FELDER DRIN, DIE WIEDERHOLT WERDEN SOLLEN

    <%
  Repeat1__index++;
  Recordset.MoveNext();
}
%>
Und das ist die Fehlermeldung, die ich bekomme, wenn ich das ganze mit einer Selectbox mache:
Active Server Pages, ASP 0113 (0x80004005)
The maximum amount of time for a script to execute was exceeded. You can change this limit by specifying a new value for the property Server.ScriptTimeout or by changing the value in the IIS administration tools.
Jetzt kommt aber das wirklich paradoxe an der Sache: Wenn ich aus der Selectbox ein normales Textfeld mache mit den selben Daten drin, dann klappt's wunderbar! Aber dann kann ich halt nicht mehr aus den bestehenden Reparaturen auswählen! Deshalb brauche ich diese verflixte Selectbox!

Nun meine Frage: Warum kann ich den Bereich mit einem Textfeld wiederholen, aber mit einer Selectbox funktioniert es nicht :confused: Es sind doch die selben Daten drin, nur der input type ist ein anderer :( Ich kann mir das wirklich nicht erklären und bin am Ende :suspekt:
 
Hallo

Du vermischt da 2 Datensatzgruppen, auch in der Selectbox und Du setzt eine Schleife in die nächste und noch mit der gleichen Datensatzgruppe. Das geht nicht.

Du schreibst, dass vorher eine Maschine ausgewählt wurde. Ich vermute mal, das ist ein Datensatz. Warum eine Schleife?

Was sind die Reparaturen? haben diese einen Bezug zur Maschinentabelle? Sind die Tabellen miteinander verbunden?
 
Liebe gute Luzie (mein Fels in der Brandung)!

Zu jeder Maschine gibt es Reparaturen (deshalb steht sie in der Fehlerverwaltungsdatenbank). D.h., wenn man eine Maschine auswählt (z.B. Seriennummer 123), dann soll man alle Reparaturen angezeigt bekommen, die an dieser Maschine zu erledigen sind, und zusätzlich die Möglichkeit erhalten, eine neue Reparatur einzugeben.

Das ist der Grund, warum ich die Schleife brauche: Zeige mir alle Reparaturen, die an der Maschine 123 zu erledigen sind.

Das funktioniert - wie gesagt - mit Textfeldern gut, aber ich will ja noch die Möglichkeit haben, bestehende Reparaturen nachträglich zu verändern bzw. neue Reparaturen anzulegen. Und um es dem User einfacher zu machen, möchte ich, daß die Reparaturen in einer Selectbox ausgewählt werden können, anstatt sie von Hand eintragen zu müssen; ein Beispiel für eine Reparatur ist "Fußbremse - Riegel klemmt".

Die beiden Tabellen (eine für die Maschinen und eine für die Reparaturen) sind über die Seriennummer miteinander verbunden.

Wie gesagt: Das Komische daran ist, daß es mit Textfeldern funktioniert, aber mit einer Selectbox nicht, obwohl doch nur der Input Type verändert wird, nicht die Daten, die darin stehen sollen :suspekt:

Hintergrund :offtopic: : Ich bin in einer Firma und dort gibt es schon ein Frontend für diese Fehlerverwaltungsdatenbank - allerdings in Access 97, was ja total veraltet ist. Jetzt wollen die, daß ich das Ganze als Website aufziehe. Deshalb habe ich auch so konkrete Vorstellungen davon, wie das Ding laufen soll: Weil ich eben eine Vorlage in Access habe! Nur daß es da eben ab und zu (oder auch öfter :suspekt: ) Probleme gibt, weil - zumindest in meinen Augen - Vieles in Access einfacher zu bewerkstelligen ist als in ASP :offtopic:

Bitte, bitte hilf mir (!)
 
Also nochmal zum Verständnis

Du möchtest erstmal alle Maschinen, die in der Tabelle vorhanden sind (oder einer Abfrage) in einer While-Schleife aufgelistet haben. Weiterhin möchtest Du für jede Maschine die bisherigen Reparaturen in einer Selectbox auflisten und zusätzlich noch die Möglichkeit schaffen, eine neue Reparatur für die jeweilige Maschine einzufügen?

Tabelle Maschine und Reparaturen stehen über einen join in Beziehung?

Wenn dem so ist, hast Du 2 Möglichkeiten:
1. (die dreamweaverfreundliche aber schlechtere Lösung)
Du legst Dir 2 Recordset an. Eines für die Maschinen, eines für die Reparaturen.

In der Maschinen-Schleife generierst Du das 2. Recordset und filterst die Maschinen-Nr. Die Ausgabe dieses Recordsets Reparaturen legst Du in die Selectbox.

2. (die bessere Lösung, aber nicht im DW zusammenzuklicken)
Du generierst ein Recordset, setzt beide Tabellen über einen left join in Beziehung.
Bei der Ausgabe hast Du jetzt erstmal viele doppelte oder wiederkehrende Datensätze.
Die Abfrage dieser Datensätze erfolgt nun im Script

Du generierst eine x-beliebige Variable und vergleichst sie in der Schleife mit sich selbst bzw. dem Wert, der Ihr in einer Abfrage gegeben wird. Das Script vergleicht nun jeden Wert mit dem darauffolgenden, deswegen muss in der SQL ein order by maschinennummer eingefügt werden, das ist ganz wichtig.

Leider bin ich nicht fitt, was ASP/Javascript betrifft. Hast Du eine Grund, warum die Javascript bevorzugst? Gäniger ist vbscript, ich kenne sehr viele Tuts in vbscript geschrieben aber kaum eines, was mit Javascript zu tun hat. Verbreiteter ist auf jeden Fall vbScript. Vor allem, weil Du schreibst, dass Du mit Access arbeitest, vermutlich auch VBA.

Du musst Dir das dann umschreiben

Code:
<%
dim myvar
    myvar = ""
    while not rs.eof
	if myvar ="" or myvar <> rs("maschinennummer") then
	   Response.write rs("maschinennummer") & " " & rs("maschine") 'etc.
	myvar = rs("maschinennummer")
    end if
    ' hier müsste dann das Formular mit der Selectbox hinein und den entspr. Namen und Werten
    rs.movenxt
    wend
    %>
Dies ist nur ein einfaches Beispiel.

Warum dat nu mit Textfeldern funktioniert und mit selectboxen nicht, dass kann ich leider nicht nachvollziehen, da ich den Scriptcode ja nicht kenne.

Was jetzt die Neueingabe einer Reparatur betrifft, da müsstest Du Dir ein Extra-Textfeld anlegen und die Eingabe abfragen. Eine Neueingabe in eine Selectbox über ASP wie in Access ist meines Wissens nicht möglich.
 
Zuletzt bearbeitet:
Hallo nochmal!

Es tut mir echt leid, daß Du Dir immer so viel Mühe gibst und ich Dir trotzdem nicht folgen kann :rolleyes:

Also, das mit den aufgelisteten Maschinen, das passiert schon eine ASP-Site vorher. Wenn man dann eine Maschine auswählt (per Klick auf einen Link, d.h. die Seriennummer der Maschine ist bereits der Link), kommt man auf eine Bearbeiten-Site, wo nur die Daten zu einer (der ausgewählten) Maschine drin stehen.

Dort sollen für eine Maschine alle bisherigen Reparaturen in jeweils einer Selectbox angezeigt werden und darunter dasselbe, aber leer, damit man eine Reparatur neu anlegen kann. Die Anzeige könnte man auch in einem Textfeld machen (was - wie schonmal erwähnt - auch funktioniert), nur wäre es dann schwieriger für den User, nachträglich etwas an bestehenden Reparaturen zu ändern bzw. eine Neuanlage zu machen, weil die Reparaturmeldungen vordefiniert sind...

Deshalb also die Selectbox: Hier kann der User aus den bestehenden Reparaturmeldungen eine auswählen und die restlichen Textfelder muß er dann von Hand ausfüllen. Das Problem dabei: Bei der Anzeige der bestehenden Reparaturen soll zwar die zu einem Datensatz (in dem Fall ist jede Reparatur ein Datensatz! Primärschlüssel: eine fortlaufende Nummer + Sereinnummer der Maschine) gehörende Reparatur angezeigt werden, aber wenn man auf die Selectbox klickt, sollen einem alle Reparaturmeldungen angeboten werden!

Eigentlich gibt es sogar 3 Tabellen: Eine für die Maschinen, eine für die Reparaturen und eine für die Reparaturmeldungen.

Ach ja, die Tabellen stehen nicht über einen JOIN in Verbindung! Aber das kann man ja mit einem Recordset machen (wie Du es in Deinem Punkt 2 vorgeschlagen hast):

RecordsetReparatur:
Code:
SELECT *
FROM Maschine
LEFT JOIN Reparatur ON M_Seriennummer = R_Seriennummer
-- LEFT JOIN ReparaturMeldung ON M_Modell = RM_Modell -- optional!
ORDER BY M_Seriennummer

Allerdings komme ich mit Deinem Code nicht so ganz klar :(

Warum soll das Formular erst nach dem IF stehen und nicht im IF? Und was meinst Du mit dem Response.write im IF? Das wäre doch dann doppelgemoppelt, oder?

Ich habe mir das jetzt mal in JavaScript umgeschrieben und meine Selectbox sieht jetzt so aus:

Code:
<select name="select"> // Das ist der Anfang der Selectbox -> HTML

  <%              // Beginn JavaScript-Code
    var xyz;      // von Dir übernommen/übersetzt
    xyz = "";    // von Dir übernommen/übersetzt
    while (!RecordsetReparatur.EOF) // von Dir übernommen/übersetzt
    {
      if (xyz = "" OR xyz != RecordsetReparatur.Fields.Item("RE_Seriennummer").Value) // von Dir übernommen/übersetzt
      {
  %> // Ende JavaScript-Code

<option value="<%=(RecordsetReparatur.Fields.Item("RE_Beschreibung").Value)%>" ><%=(RecordsetReparatur.Fields.Item("RE_Beschreibung").Value)%></option> // Das ist das, was letztendlich in der Selectbox angezeigt wird -> HTML

  <% // Beginn JavaScript-Code
      } // Ende IF-Schleife
    RecordsetReparatur.MoveNext(); // von Dir übernommen/übersetzt
    } // Ende WHILE-Schleife
  %> // Ende JavaScript-Code

</select> // Ende Selectbox -> HTML

Das klappt aber nicht :mad:

Ich möchte wirklich nicht unverschämt wirken und ich weiß, wie es Dich anöden muß, daß ich mich nie kurz fassen kann, aber könntest Du mir da vielleicht nochmal weiterhelfen? Natürlich nur, wenn Du Zeit dafür hast (man wird ja noch träumen dürfen ;) )

Vielen Dank schonmal für Deine Mühen!

Gruß, Jerinca

:offtopic: Ich verwende JavaScript, weil ich am Anfang meines Projekts oft gelesen habe, daß JavaScript verbreiteter wäre als VBScript! Naja, darüber kann ich jetzt aber nicht mehr streiten, denn ich habe jetzt schon soviel gemacht, daß ich nicht einfach auf eine andere Skriptsprache umspringen kann... :offtopic:
 
Hi

dann habe ich Dich irgendwie missverstanden, ist auch alles nicht so einfach zu erklären und auf der anderen Seite nicht zu verstehen. Ich konnts mir irgendwie auch so nicht denken, aber möchlich wäre ja alles.

In dem Falle brauchst Du den von mir geposteten Code nicht. Das wäre nur, wenn alle Maschinen mit je einer Selectbox auf einer Seite aufgelistet werden.

Mach folgendes:
Setzt beide Tabelle in eine Beziehung zueinander.

select * from maschinen as m inner join reparaturen as r on m.maschinenid = r.maschinenid where m.maschinenid = 12345 (oder Variable)

Du baust nun ein Recordset und fügst Du alle Felder in unterschiedliche Variablen z.B.

dim maschinennummer
maschinennummer = Recordset1("maschinennummer") etc.

Das hat folgenden Grund, denn somit kannst Du die Werte auch vor und nach der Selectbox ausgeben. Definiert werden müssen diese aber alle vor der Selectbox, die ja jetzt in der Schleife steht.

Dann nochmal ausprobieren.

Wie geschrieben, um neue Reparaturen einzufügen, brauchst Du noch ein extra Textfeld. Ein neuer Wert wird vermutlich auch in die Tabelle Reparaturen mit der Maschinennummer gespeichert.

In dem Falle musst Du den Wert dieses Feldes vor dem Insert abfragen. Einfach mit einer If-Anweisung

Code:
<%
dim varReparatur
varRepartur = Request.Form("selectboxfeld")
  if Request.form("feldneuereparatur") <>"" then ' <> ist er Operator in vbscript für ungleich !=
   varReparatur = Request.form("feldneuereparatur")
end if
%>

Ist allso das neue Feld beschrieben, wird der Wert aus diesem Formularfeld genommen, wenn es leer ist, dann aus der selectbox.

Also das ASP/javascript verbreiteter ist, das kann ich gar nicht glauben. Ich programmiere jetzt seit fast 5 Jahren mit ASP und ich kann mich an kaum ein Tut erinnern, was speziall für Javascript geschrieben worden ist. Auch in den Internetforen und Mailinglisten wird standardmäßig von vbScript ausgegangen. :suspekt:

Man kann natürlich auch beides mischen. Man muss es halt in der language="vbscript" ansagen.
 
Hallo Luzie!

Ich glaube, ich wende mich doch lieber Deinem ersten Lösungsvorschlag zu :rolleyes:

Meine Frage nun: Was meinst Du genau mit:
In der Maschinen-Schleife generierst Du das 2. Recordset und filterst die Maschinen-Nr.

Sowas hier hab' ich schon:
Code:
SELECT *
FROM Maschine
WHERE M_Seriennummer = 'var1'

var1 = Request.QueryString("SN") // aus dem URL-Header ausgelesen
Aber wie soll da jetzt noch ein zweites Recordset generiert werden :confused:

Vielen Dank schonmal wieder für Deine Hilfe!

LG, Jerinca
 
Ui Luzie!

Habe so lange beim Editieren meiner neuen Frage gebraucht (noch Tee gekocht und mit Kollegen gelabert), daß Du tatsächlich in der Zwischenzeit schon wieder eine tolle Antwort gepostet hast - RESPEKT ;)

Deshalb lese ich Deine Antwort erst, nachdem ich schon wieder was Sinnloses vor mich hingebrabbelt habe :rolleyes: Hat also keinen Bezug zu Deiner Antwort!

Also, ich muß mich jetzt erst mal Deiner letzten Antwort zuwenden und eventuell hat sich dann MEIN letzter Post erledigt...

VIELEN, VIELEN DANK FÜR DEINE HILFE SCHONMAL!
 
Huhu

wenn Du nicht klar kommst, kannst mir auch mal Deine Daten schicken.

Ich denke, mit meinen php-Grundkenntnissen werde ich das ASP/javascript auch bezwingen. :p

Es ist wirklich nicht sehr schwer. Das Problem besteht meist darin, dass viele nicht wissen, dass man

1. über die SQL eine ganze Menge erledigen kann und somit im Scriptcode einiges sparen kann

2. ...wenn man eine Schleife innerhalb einer Ausgabe eines Recordset anlegen möchte, ganz egal wo, die Felder, die man unter der Schleife darstellen will, über eine Variable ausgegeben werden können.

Leider ist es immer sehr schwierig, sich in andere Datenbankdesigns einzudenken. Dein 3. Tabelle habe jetzt mal außen vor gelassen, weil ich nicht weiss, was dort hinein gehört.
 
Hallo Luzie!

Ich danke Dir wirklich schonmal dafür, daß Du Dir immer so viel Zeit nimmst :p

Erstmal danke für den Tipp mit den Variablen im Recordset; das ist echt eine stilistisch schönere und platzsparendere Methode :)

Es bleibt aber immer noch das Problem mit den Selectboxen! Wenn ich das Ganze in Textfeldern ausgeben lasse, funktioniert es gut! Ändere ich aber das Textfeld in ein dynamisches Menü (also Selectbox, Pulldown-Menü oder wie auch immer man das nennen mag), dann bekomme ich eine Fehlermeldung.

Aber es gibt ein Novum: Vorher habe ich die Fehlermeldung bekommen, daß der Browser-interne Timeout abgelaufen ist (irgendwas mit "maximum amount of time" blablabla). Nun bekomme ich folgende Fehlermeldung:
Code:
ADODB.Field (0x80020009)
Object is no longer valid.
/stammdaten_bearbeiten.asp, line 320

Zeile 320 ist die Zeile mit dem ersten Textfeld nach der Selectbox, 
in dem eine Variable aufgerufen wird
Das bringt mich zu der kühnen Hoffnung, daß mein Problem doch noch in den Griff zu bekommen ist :p

Ich habe dann einmal die Variablen im Recordset deklariert und einmal erst in der While-Schleife, aber die Fehlermeldung bleibt gleich: Ich bekomme das erste Textfeld mit Variable nach der Selectbox angezeigt...

Kannst Du mir da vielleicht nochmal einen kleinen Denkanstoß geben?

Ach ja, was meinst Du eigentlich mit "Daten schicken"? Daten aus den DB-Tabellen? Das wäre schlecht, weil geheim ;-] Oder Struktur bzw. Schema der DB-Tabellen? Ich würde Dir gerne mal ein paar Screenshots posten, aber das geht hier ja anscheinend nicht :(

Die Beziehung zwischen den 3 Tabellen ist so:
Tabelle Reparatur; Feld R_Seriennummer
Tabelle Maschine; Felder M_Seriennummer, M_Modell
Tabelle ReparaturMeldung; Feld RM_Modell

Verstehst Du? Die Tabelle Maschine steht über die Seriennummer mit der Tabelle Reparatur in Verbindung und über das Modell mit der Tabelle ReparaturMeldung.

Die Maschinen gehören nämlich zu allem Überfluss auch noch verschiedenen Modellen an und für jedes Modell gibt es ganz eigene Reparaturmeldungen.

Aber da brauchst Du Dir nicht auch noch den Kopf zu zerbrechen, denn wenn ich's erstmal geschafft haben sollte, mein erstes Problem zu bewältigen (Anzeige in Selectboxen), dann schaffe ich die Anbindung an die dritte Tabelle sicher auch noch *nicht-glauben-kann-was-ich-da-sag* Wäre ja dann nur noch eine Erweiterung der SQL-Abfrage, denke ich...

Vielen Dank schonmal wieder für all Deine Mühen!

LG, Jerinca
 

Neue Beiträge

Zurück