Problem mit ASP und Access
Viktor
- datenbank
Guten Morgen alle zusammen,
ich hab da ein Problem mit Access und ASP, bzw. mit der Ausgabe.
Folgendes:
Ich hab eine Accessdatenbank mit 2 Tabellen.
--> Tabelle Anrede
AnredeID
Anrede ( hier steht Herr und Frau drin )
--> Tabelle Adresse
...
AnredeID ( zeigt auf die ID )
Vorname
Nachname
Strasse
..
..
..
So. In Access kann ich sagen, zeige mir bei der Anrede nicht die ID an, sondern Herr bzw. Frau, also die Anrede (Spaltenbreite 0;1 usw.). Das funktioniert wunderbar. Wenn ich aber mit ASP die Adresstabelle auslese, dann steht dort die AnredeID (0,1,..) drin.
Auch wenn ich auf der ASP-Seite das Feld mit <%=rs.Fields("Anrede")%> auslese, also nicht die AnredeID, so bleibt die Seite leer.
Wenn ich nur das Feld Anrede in die Adress_Tabelle eintrage, so ist die Ausgabe korrekt. Ich hätte es aber schon gerne die AnredeID stehen gelassen, so kann ich die Anrede ändern und er ändert es in jedem Datensatz.
Was muß ich denn machen, damit ich bei der Ausgabe die Anrede zu sehen bekomme und nicht die ID? Die Verknüpfung der beiden Tabellen soll aber über die ID laufen.
Vielen Dank schon mal für Euer Hilfe. Ich hoffe, es war einigermaßen verständlich :o)
Gruß
Viktor
Guten Morgen alle zusammen,
ich hab da ein Problem mit Access und ASP, bzw. mit der Ausgabe.
Folgendes:
Ich hab eine Accessdatenbank mit 2 Tabellen.
--> Tabelle Anrede
AnredeID
Anrede ( hier steht Herr und Frau drin )--> Tabelle Adresse
...
AnredeID ( zeigt auf die ID )
Vorname
Nachname
Strasse
..
..
..So. In Access kann ich sagen, zeige mir bei der Anrede nicht die ID an, sondern Herr bzw. Frau, also die Anrede (Spaltenbreite 0;1 usw.). Das funktioniert wunderbar. Wenn ich aber mit ASP die Adresstabelle auslese, dann steht dort die AnredeID (0,1,..) drin.
Auch wenn ich auf der ASP-Seite das Feld mit <%=rs.Fields("Anrede")%> auslese, also nicht die AnredeID, so bleibt die Seite leer.
Wenn ich nur das Feld Anrede in die Adress_Tabelle eintrage, so ist die Ausgabe korrekt. Ich hätte es aber schon gerne die AnredeID stehen gelassen, so kann ich die Anrede ändern und er ändert es in jedem Datensatz.
Was muß ich denn machen, damit ich bei der Ausgabe die Anrede zu sehen bekomme und nicht die ID? Die Verknüpfung der beiden Tabellen soll aber über die ID laufen.
Vielen Dank schon mal für Euer Hilfe. Ich hoffe, es war einigermaßen verständlich :o)
Gruß
Viktor
Hi Viktor,
okay,
mach dir ne SQL-Abfrage
<%
query = "SELECT * FROM tabelle Adressen"
Set output = adodbconn.execute(query)
%>
<table>
<tr>
<td>Anrede</td>
<td>Vorname</td>
<td>Name</td>
.....
</tr>
<% DO until output.EOF
persID = output("AnredeID")
<% anrquery = "SELECT Anrede FROM tbl_anrede WHERE AnredeID = '" & persID & "'"
set ergebnis = adodbconn.execute(anrquery)
%>
<tr>
<td><%if ergebnis.EOF or ergebnis.BOF THEN RESPONSE.WRITE "xxxx" ELSE Response.Write ergebnis("Anrede") END IF %></td>
<td><%=output("Name")</td>
<td><%=output("Vorname")</td>
<td><%=output("Adresse")</td>
.....
</tr>
<% output.MoveNext
Loop %>
</table>
So damit müßte es funktionieren. Abfragen mußt du die ID's schon aber von Anzeigen hat niemand was gesagt.
Viel Spaß beim Ausprobieren.
Bye, Frank
Danke für den Tipp. Werde es mal ausprobieren
Ich hab da denn Fehler schon entdeckt, aber noch keine Lösung.
Das Feld Anrede steht in der Tabelle T_Anrede, der Rest in der Tabelle T_Adresse.
mit <%=rs.Fields("T_Anrede.Anrede")%> geht's nicht, hab es schon probiert.
Ich denke mal, er findet die Anrede nicht.
Vielleicht etwas weiter erklärt. Ich hab ein Formular. Die Daten werden über ASP in eine Access-Datenbank geschrieben und angezeigt.
Wiso geht T_Anrede.Anrede nicht??
Gruß
Viktor
Hi,
bringt ASP eine OLE Fehlermeldung? Wenn ja, welche?
T_adresse ist deine wichtigere Tabelle, T_anrede eine nebentabelle mit details. Du mußt ja die Leute nach Namen trennen, logische Denkweise -> [Name, Vorname] ist eindeutiger als [Anrede].
das ".fields" kannst du eigentlich weglassen ASP versteht das auch so
rs("Name")
T_Anrede.Anrede ist eine Access-Ausdruck, das ist so programmeigen für interne Verwendung im Access. ASP greift mittels ActiveX (ADODB-Object) auf eine ODBC-Datenbank zu. Und da ist der Standard wahrscheinlich - Asche auf mein Haupt wenn ich falsch liege - SQL Sprache (ist auch leichter nachvollziehbar - meines Erachtens).
Deine Erklärung ist aber auch sehr allgemein, das ist eine übliche Anwendung für ASP. Poste doch mal etwas von deinem Quelltext.
Gruß, Frank
Hi Frank,
ok, hier kommt der Quelltext. Da ich ein ASP-Anfänger bin, hab ich den Quelltext von irgendeiner ASP-Seite. Hab es dann nur noch ein wenig abgeändert.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Unbenannt</title>
</head>
<body>
<%
Set conn = Server.CreateObject("ADODB.Connection") ' --- Instanzieren einer neuen Verbindung
conn.open "anmeldung","","" ' --- Öffnen der angegebenen Verbindung
%>
<%
SQL = "Select * from T_Anmeldung where [TitelAbst] = '"&Request.Form("TitelAbst")&"'"
Set rs = Server.CreateObject("ADODB.Recordset") ' --- RecordSet-Objekt instanzieren
rs.Open sql, conn, 3, 3 ' --- Abfrage starten
%>
<%
if rs.bof and rs.eof then
response.write("Datensatz wird angelegt")
if rs.supports(adupdate+adaddnew) then
rs.addnew
rs.fields("AnredeID")=request.form("AnredeID")
rs.fields("Titel")=request.form("Titel")
rs.fields("Vorname")=request.form("Vorname")
rs.fields("Nachname")=request.form("Nachname")
rs.fields("Institution")=request.form("Institution")
rs.fields("Strasse")=request.form("Strasse")
rs.fields("PLZ")=request.form("PLZ")
rs.fields("Ort")=request.form("Ort")
rs.fields("Land")=request.form("Land")
rs.fields("E-Mail")=request.form("E-Mail")
rs.fields("Telefon")=request.form("Telefon")
rs.fields("Fax")=request.form("Fax")
'rs.fields("Verteilerliste")=request.form("Verteilerliste")
rs.fields("Handy")=request.form("Handy")
rs.fields("TitelAbst")=request.form("TitelAbst")
rs.fields("Autor")=request.form("Autor")
rs.fields("Abstract")=request.form("Abstract")
else
response.write("Aktualisierung nicht möglich")
end if
else
response.write("Titel des Abstracts ist bereits vorhanden")
end if
%>
<TABLE border=1>
<thead>
<TR>
<Th><B>Anrede</B></Th>
<Th><B>Titel</B></Th>
<Th><B>Vorname</B></Th>
<Th><B>Nachname</B></Th>
<Th><B>Institution</B></Th>
<Th><B>Strasse</B></Th>
<Th><B>PLZ</B></Th>
<Th><B>Ort</B></Th>
<Th><B>Land</B></Th>
<Th><B>E-Mail</B></Th>
<Th><B>Telefon</B></Th>
<Th><B>Fax</B></Th>
<Th><B>Handy</B></Th>
<Th><B>Titel Abstract</B></Th>
<Th><B>Autor</B></Th>
<Th><B>Abstract</B></Th>
</TR>
</thead>
<tbody>
<%rs.MoveFirst
do while Not rs.eof %>
<TR VALIGN=top>
<TD><%=rs.Fields("AnredeID")%></TD>
<TD><%=rs.Fields("Titel")%></TD>
<TD><%=rs.Fields("Vorname")%></TD>
<TD><%=rs.Fields("Nachname")%></TD>
<TD><%=rs.Fields("Institution")%></TD>
<TD><%=rs.Fields("Strasse")%></TD>
<TD><%=rs.Fields("PLZ")%></TD>
<TD><%=rs.Fields("Ort")%></TD>
<TD><%=rs.Fields("Land")%></TD>
<TD><a href="mailto:<%=rs.Fields("E-Mail")%>"><%=rs.Fields("E-Mail")%></a></TD>
<TD><%=rs.Fields("Telefon")%></TD>
<TD><%=rs.Fields("Fax")%></TD>
<TD><%=rs.Fields("Handy")%></TD>
<TD><%=rs.Fields("TitelAbst")%></TD>
<TD><%=rs.Fields("Autor")%></TD>
<TD><%=rs.Fields("Abstract")%></TD>
</TR>
<%
rs.MoveNext
loop
%>
</tbody>
</TABLE>
</body>
</html>
Hallo,
sorry, ich zerpflück dir mal deinen Quelltext.
Set conn = Server.CreateObject("ADODB.Connection") ' --- Instanzieren einer neuen Verbindung
conn.open "anmeldung","","" ' --- Öffnen der angegebenen Verbindung
%>
Kannst du die DB überhaupt öffnen, deine conn.open sieht etwas unvollständig aus :-(
<%
SQL = "Select * from T_Anmeldung where [TitelAbst] = '"&Request.Form("TitelAbst")&"'"
Set rs = Server.CreateObject("ADODB.Recordset") ' --- RecordSet-Objekt instanzieren
rs.Open sql, conn, 3, 3 ' --- Abfrage starten
%>
Spar dir das mit dem neuen Object "Recordset" und speichere das Objekt mittels set rs = conn.execute(SQL)
verkürzt den Quellcode dramatisch. :-)
<%
if rs.bof and rs.eof then
response.write("Datensatz wird angelegt")
if rs.supports(adupdate+adaddnew) then
rs.addnew
rs.fields("AnredeID")=request.form("AnredeID")
rs.fields("Titel")=request.form("Titel")
rs.fields("Vorname")=request.form("Vorname")
rs.fields("Nachname")=request.form("Nachname")
rs.fields("Institution")=request.form("Institution")
rs.fields("Strasse")=request.form("Strasse")
rs.fields("PLZ")=request.form("PLZ")
rs.fields("Ort")=request.form("Ort")
rs.fields("Land")=request.form("Land")
rs.fields("E-Mail")=request.form("E-Mail")
rs.fields("Telefon")=request.form("Telefon")
rs.fields("Fax")=request.form("Fax")
'rs.fields("Verteilerliste")=request.form("Verteilerliste")
rs.fields("Handy")=request.form("Handy")
rs.fields("TitelAbst")=request.form("TitelAbst")
rs.fields("Autor")=request.form("Autor")
rs.fields("Abstract")=request.form("Abstract")
else
response.write("Aktualisierung nicht möglich")
end if
else
response.write("Titel des Abstracts ist bereits vorhanden")
end if
%>
Hast du da nicht addupdate vergessen??? wenn schon denn schon. So wie du es formuliert hast, legt das Ding mittels addnew einfach nur einen Datensatz an, du gibst aber nicht den Befehl diesen Datensatz mit deinen Werten zu füllen.
also nach der letzten Zuweisung noch rs.adupdate einfügen. Dann sollte es auch nach deiner Version gehen.
Ich bevorzuge die Arbeit mit INSERT,SELECT,UPDATE,DELETE...
bei Recordsets mußt du eine öffnungsmethode angeben, sonst kannst du nur lesen.... adopendynamic. mittels INSERT umgehst du dies geschickt - ist reines SQL-Statement. die Recordsetdinger sind VB-Adaption.
<%rs.MoveFirst
do while Not rs.eof %>
Fehlerquelle: wenn die Abfrage leer ist, kein Ergebnis hat (EOF oder BOF true sind) bekommst du an dieser Stelle einen Fehler. ADODB setzt den Zeiger automatisch auf den ersten Datensatz. Hab ich zu Anfang auch gemacht um sicher zu gehen, bis mir es mal gesagt wurde. :-)
Do until ist logischer (m.E.n)... impliziert "hör auf wenns soweit ist" :-)
Wenn du alle Felder aus T_Adresse darstellen willst (m.o.ohne AnredeID) dann gibt es eine einfachere Form, vorausgesetzt du gehst diesen Weg:
set rs = conn.execute(SQL)
dann kannst du:
<% DO UNTIL rs.EOF or rs.BOF %>
<tr>
<% for each feld in rs.fields %>
<td><%=feld%></td> '<%=feld.name%> ist dann der Befehl für Spaltennamendarstellung
<% NEXT %>
</tr>
<% rs.MoveNext
Loop %>
is doch kürzer??? Oder??
Gruß, Frank
P.S: ich krisch zwar kee Geld für Bücherwerbung abor, das Buch "T.Weltner - ASP lernen und Beherrschen" - ISBN 3-86063-611-1
kannsch dir empfehln.
P.S.2: das war jetzt etwas gesächselt :-)) Ist für Newbies das beste Buch was ich kenne.
Hi auch :o)
Set conn = Server.CreateObject("ADODB.Connection") ' --- Instanzieren einer neuen Verbindung
conn.open "anmeldung","","" ' --- Öffnen der angegebenen Verbindung
%>Kannst du die DB überhaupt öffnen, deine conn.open sieht etwas unvollständig aus :-(
Ja, da ch weder Passwort noch Name abfrage. Daher die beiden leeren ""
if rs.bof and rs.eof then
response.write("Datensatz wird angelegt")
if rs.supports(adupdate+adaddnew) then
rs.addnew
rs.fields("AnredeID")=request.form("AnredeID")
Hast du da nicht addupdate vergessen??? wenn schon denn schon. So wie du es formuliert hast, legt das Ding mittels addnew einfach nur einen Datensatz an, du gibst aber nicht den Befehl diesen Datensatz mit deinen Werten zu füllen.
also nach der letzten Zuweisung noch rs.adupdate einfügen. Dann sollte es auch nach deiner Version gehen.
Nö, steht doch da. > > if rs.supports(adupdate+adaddnew) then
<%rs.MoveFirst
do while Not rs.eof %>Fehlerquelle: wenn die Abfrage leer ist, kein Ergebnis hat (EOF oder BOF true sind) bekommst du an dieser Stelle einen Fehler. ADODB setzt den Zeiger automatisch auf den ersten Datensatz. Hab ich zu Anfang auch gemacht um sicher zu gehen, bis mir es mal gesagt wurde. :-)
Stimmt, wie gesagt, bin kein Profi. Ich druck mir Deine Tipps schon fleisig aus. So viel vertshe ich davon zwar nicht, aber ich hab seit gestern ein Buch ( Microsoft Active Server Pages; Addison Wesley ). Hoffe, das ich Dir irgendwann mal ein paar Tipps geben kann :o)
P.S: ich krisch zwar kee Geld für Bücherwerbung abor, das Buch "T.Weltner - ASP lernen und Beherrschen" - ISBN 3-86063-611-1
kannsch dir empfehln.P.S.2: das war jetzt etwas gesächselt :-)) Ist für Newbies das beste Buch was ich kenne.
Das erste Buch was "Jetzt lerne ich ASP". Naja, als Einstieg ganz OK.
Hmmm, ich werd mal deine Tipps umsetzten, zumindest versuche ich es :o). Ich hab ja Deine Mailadi nd wen ich darf, nerve ich Dich per Mail hihihihi
Danke nochmals für Deine Hilfe.
Gruß
Viktor
Hi Viktor,
ja, kannst mich gern anmailen, ich helf gern.
Du fragst an sich nur ob das (adupdate) unterstützt wird. Aber du schreibst nur den Befehl rs.adaddnew -- dann sollten die Zuweisungen kommen und dann abschließend rs.adupdate... dann sollte es laufen.
Du testest sicher mit MS PWS auf fenster95 oder 98 + MS Ecksessel 97/2000 - ja da ist die ODBC-Verbindung ja bereits system-integriert.. das hatte mich im ersten Moment gewundert, weil ich hier NT4 SP6 mit SQL-Server etc zum Basteln hab...
Okay, bei Fragen MAIL mir... :-))
Du testest sicher mit MS PWS auf fenster95 oder 98 + MS Ecksessel 97/2000 - ja da ist die ODBC-Verbindung ja bereits system-integriert.. das hatte mich im ersten Moment gewundert, weil ich hier NT4 SP6 mit SQL-Server etc zum Basteln hab...
Die Datenbank läuft auf NT4 und dem IIS4. Eigentlich bräuchte ich keine ODBC-Verbindung, da es auch ohne geht. Ich denke mal, ODBC macht nur dann Sinn, wenn die Datenbank auf einem anderen Server leigt, oder lieg ich da falsch?
Gruß
Viktor
Du testest sicher mit MS PWS auf fenster95 oder 98 + MS Ecksessel 97/2000 - ja da ist die ODBC-Verbindung ja bereits system-integriert.. das hatte mich im ersten Moment gewundert, weil ich hier NT4 SP6 mit SQL-Server etc zum Basteln hab...
Die Datenbank läuft auf NT4 und dem IIS4. Eigentlich bräuchte ich keine ODBC-Verbindung, da es auch ohne geht. Ich denke mal, ODBC macht nur dann Sinn, wenn die Datenbank auf einem anderen Server leigt, oder lieg ich da falsch?
Gruß
Viktor
Ahhh, Access auf NT4 und IIS4.. die ODBC-Verbindung ist ja durch die Installation von Access und Konsorten eh gegeben... seitens des Systems halt. Wenn es funktioniert ohne extra was definieren zu müssen, gut... aber die praktikablität über das Internet dann?? Ich konnte bei meinen Versuchen cross-internet keinen SQL-Server finden... naja. egal.. wie gesagt in Hinblick auf ASP Fragen, kannst du dich per Mail gern an mich wenden.
Gruß und bye, Frank
Guten Morgen
Zuerst wird ein passendes SQL-Statement benötigt:
SELECT An.Anrede, Ad.Vorname, Ad.Nachname, Ad.Strasse FROM Anrede AS An, Adresse AS Ad WHERE An.AnredeID = Ad.AnredeID
Damit erhälst Du nur die Spalten Anrede, Vorname, Nachname und Strasse zurück, jedoch verknüpft über die AnredeID in beiden Tabellen.
Das Problem hier ist, dass Dir nur die Datensätze zurückgegeben werden, die im Feld AnredeID der Tabelle Adresse einen Wert enthalten.
Es werden folglich alle Datensätze ausgefiltert, bei denen das Feld Adresse.AnredeID NULL ist.
Um jedoch alle Datensätze aus der Tabelle Adresse zu erhalten, jedoch ggf. den Wert NULL in An.Anrede (falls Ad.AnredeID NULL ist) muss ein sogenannter Outer-Join verwendet werden.
Das ist eine besondere Verknüpfung der beiden Tabellen, bei der alle Datensätze der einen Tabelle angezeigt werden und nur die dazu passenden Datensätze aus der anderen Tabelle.
Der Outer-Join (je nach Richtung auch Left- oder Right-Join genannt) wird je nach DB-Engine unterschiedlich definiert.
Bei Access sieht dies so aus:
SELECT An.Anrede, Ad.Vorname, Ad.Nachname, Ad.Strasse FROM Adresse AS Ad LEFT JOIN Anrede AS An ON Ad.AnredeID = An.AnredeID
Zu Vollständigkeit: Das Gegenstück zu Outer-Join ist Inner-Join, und dies ist die normale Verknüpfung von Tabellen.
In Access werden dem entsprechend die normalen Verknüpfungen so definiert:
SELECT An.Anrede, Ad.Vorname, Ad.Nachname, Ad.Strasse FROM Adresse AS Ad INNER JOIN Anrede AS An ON Ad.AnredeID = An.AnredeID
Die ganz oben genannte Variante mit der Verknüpfung in der Where-Klausel ist jedoch bei allen SQL-Systemen verwendbar.
Mit diesem SQL-Statement solltest Du nun in der Lage sein, Dein Problem zu lösen.
Grüsse
Tom
Hi Tom,
also nach dem was Du geschrieben hast, mußte ich erstmal schlucken. Da war dann die Verwirrung perfekt. Die ganzen Abfragen die Du mir da vorgesclgane hast, gehen irgendwie nicht.
Ich hab es mal so versucht:
SQL = "Select * FROM T_Anmeldung INNER JOIN T_Anrede ON T_Anrede.AnredeID = T_Anmeldung.AnredeID where [TitelAbst] = '"&Request.Form("TitelAbst")&"'"
Das löst aber mein Problem nicht.
In meinem Formular übergebe ich die ID
<select name="AnredeID">
<option value="1" selected>Frau</option>
<option value="2">Herr</option>
</select>
So, wenn ich nun die Abfrage starte, meckert er an der Zeile:
rs.fields("AnredeID")=request.form("AnredeID")
Ich übergebe die ID an die Datenbank und möchte die Anrede auslesen. Da müßte doch das so aussehen:
Die ID wird an die Datenbank übergeben und mit
<%=rs.Fields("Anrede")%>
Die Fehlermeldung ist:
Datensatz wird angelegt
Microsoft OLE DB Provider for ODBC Drivers-Fehler '80040e21'
Es sind einige Fehler aufgetreten.
/anmeldung/anmeldung.asp, Zeile 26
Zeile 26 ist:
rs.fields("AnredeID")=request.form("AnredeID")
PAH, kapiere nix mehr :o(
Gruß
Viktor
Hallo Viktor
Ich weiss nicht, ob ich Dich richtig verstehe, aber ich versuchs mal.
Du möchtest ein HTML-Formular zur Bearbeitung für den Benutzer generieren. Dieses Formular soll mit den vorhandenen Werten aus der Datenbank vorbelegt werden.
Dieses Formular wird nach dem Absenden durch den Benutzer von einem weiteren ASP-Skript übernommen und die geänderten Werte in die DB eingetragen.
Ist diese Aufgabenstellung so richtig?
Du hast hier zwei Prozesse (= 2 ASP-Skripte), die unabhängig voneinander folgendes tun:
1. Daten aus der DB auslesen und HTML-Formular zur Bearbeitung generieren.
2. Nach Absenden des Formulars die Felder auswerten und in die DB abfüllen.
Gemäss Deinem Quellcode im Posting <92454.html> sprechen wir jetzt über den 1. Teilprozess.
Dazu benötigst Du das SELECT-Statement.
SQL = "Select * FROM T_Anmeldung INNER JOIN T_Anrede ON T_Anrede.AnredeID = T_Anmeldung.AnredeID where [TitelAbst] = '"&Request.Form("TitelAbst")&"'"
Besser wäre hier, wenn Du die Felder bennenen würdest, anstelle den * zu verwenden, da das Feld AnredeID 2x vorkommt.
z.B:
SQL = "Select T_Anrede.AnredeID, T_Anrede.Anrede, T_Anmeldung.AnmeldeID, T_Anmeldung.Name FROM T_Anmeldung INNER JOIN T_Anrede ON T_Anrede.AnredeID = T_Anmeldung.AnredeID where [TitelAbst] = '"&Request.Form("TitelAbst")&"'"
Je nach ausgewähltem Datensatz soll die Listbox mit 'Frau' oder 'Herr' vorbelegt sein.
Dies realisierst Du mit folgendem ASP-Code (VBScript):
<form action="AnmeldeUpdater.asp" Method="POST">
<table>
<% do Until rs.EOF %>
<tr>
<td>
<input type="hidden" name="AnmeldeID" value="<%= rs("AnmeldeID") %>"><br>
<select name="AnredeID">
<% if rs("AnredeID") = 1 then %>
<option value="1" selected>Frau</option>
<option value="2">Herr</option>
<% else %>
<option value="1">Frau</option>
<option value="2" selected>Herr</option>
<% end if %>
</select>
<br>
<input type="text" name="Name" value="<%= rs("Name")%>"
<!-- usw. -->
</td>
</tr>
<%
rs.MoveNext
loop
%>
</table>
</form>
So müste es funktionieren, ist jedoch ungetestet.
2. Schritt: Daten aus Formular in DB abfüllen.
So, wenn ich nun die Abfrage starte, meckert er an der Zeile:
rs.fields("AnredeID")=request.form("AnredeID")
Ich übergebe die ID an die Datenbank und möchte die Anrede auslesen. Da müßte doch das so aussehen:
Die ID wird an die Datenbank übergeben und mit
<%=rs.Fields("Anrede")%>
Die Fehlermeldung ist:
Datensatz wird angelegt
Microsoft OLE DB Provider for ODBC Drivers-Fehler '80040e21'
Es sind einige Fehler aufgetreten.
/anmeldung/anmeldung.asp, Zeile 26Zeile 26 ist:
rs.fields("AnredeID")=request.form("AnredeID")
Hier hast Du wohl etwas falsch verstanden.
Bei einem SELECT-Statement kannst Du keine Felder aktualisieren.
Dazu brauchst Du ein UPDATE-Statement.
Darum kommt auch die Fehlermeldung in der Zeile 26:
rs.fields("AnredeID")=request.form("AnredeID")
Das Vorgehen zum aktualisieren ist folgendes:
Du erstellst eine weitere ASP-Seite, deren einzige Aufgabe es ist, die Daten aus den Formularfelder in die Datenbank abzufüllen.
Diese Seite soll im Formulartag der ersten Seite als 'action' angegeben werden (AnmeldeUpdater.asp).
' DB-Connection initialisieren
Set db = Server.CreateObject("ADODB.Connection")
db.Open "deineDSN"
' Update-Stament zusammenbauen
SQL = "UPDATE T_Anmeldung SET "
SQL = SQL & "AnredeID = " & Request.Form("AnredeID") & ", "
SQL = SQL & "Name = '" & Request.Form("Name") & "'"
SQL = SQL & "WHERE AnmeldeID = " & Request.Form("AnmeldeID")
' Update-Statement ausführen
db.execute(SQL)
Damit sind die Daten aus dem Formular in die Datenbank übertragen.
Du hast hier kein Recordset-Objekt auf das Du zugreifen kannst.
Falls Fehler auftreten, so werden die in der Zeile mit "db.execute()" auftreten.
Allenfalls in der Zeile davor den SQL-String über response.write ausgeben.
Ich hoffe, dass Dir das ein Stück weiter hilft.
Grüsse
Tom
Hi Tom,
Du möchtest ein HTML-Formular zur Bearbeitung für den Benutzer generieren. Dieses Formular soll mit den vorhandenen Werten aus der Datenbank vorbelegt werden.
Dieses Formular wird nach dem Absenden durch den Benutzer von einem weiteren ASP-Skript übernommen und die geänderten Werte in die DB eingetragen.
Ist diese Aufgabenstellung so richtig?
Nicht ganz. Das Formular ist leer. Es findet nur ein Eintrag in eine Datenbank statt. Kein Update oder sonstiges.
Besser wäre hier, wenn Du die Felder bennenen würdest, anstelle den * zu verwenden, da das Feld AnredeID 2x vorkommt.
z.B:
SQL = "Select T_Anrede.AnredeID, T_Anrede.Anrede, T_Anmeldung.AnmeldeID, T_Anmeldung.Name FROM T_Anmeldung INNER JOIN T_Anrede ON T_Anrede.AnredeID = T_Anmeldung.AnredeID where [TitelAbst] = '"&Request.Form("TitelAbst")&"'"
Puh, das sind aber ein haufen. Das soll eine Anmeldung für einen Kongress werden, bei dem die Leute auch noch Abstracts eintragen können. Das sind so ca. 15-20 Felder. Deshalb isses mir lieber mit dem *.
Je nach ausgewähltem Datensatz soll die Listbox mit 'Frau' oder 'Herr' vorbelegt sein.
Dies realisierst Du mit folgendem ASP-Code (VBScript):
In dem Script gehst Du davon aus, das die Felder vorbelegt sind, oder? Wie gesagt, die Leute sollen sich nur eintragen. Nach dem Eintrag wird eine Seite mit den eingetragenem erstellt. Das macht eigentlich nur Sinn, wenn man diesen Eintrag noch ändern kann. Vielleicht werf ich das auch raus.
Die gepostete Seite ist die ASP-Seite, d.h. Die Formulardaten werden an diese Seite übertragen und von dort werden Sie in die Datenbank geschrieben.
Das funktioniert ja auch, das ist ja nicht das Problem. Das Problem war ja nur, das die AnredeID angezeigt wird und nicht die Anrede.
Ich übergebe über das formular die ID an AnredeID. Möchte aber die Anrede anzeigen lassen, also nach dem Eintrag.
Natürlich könnte man die ID beim Auslesen und Herr/Frau wandeln lassen, so nach der Art
if ID = 1 then Frau else Mann oder so ähnlich, aber geht es nicht allein über SELECT ..... ??
Gruß
Viktor
Hallo Viktor
Nicht ganz. Das Formular ist leer. Es findet nur ein Eintrag in eine Datenbank statt. Kein Update oder sonstiges.
Gut.
Dann entfällt Schritt 1, mit dem Du Daten aus der DB ausliest. An dessen Stelle kommt ein normales HTML-Formular zum Einsatz.
Puh, das sind aber ein haufen. Das soll eine Anmeldung für einen Kongress werden, bei dem die Leute auch noch Abstracts eintragen können. Das sind so ca. 15-20 Felder. Deshalb isses mir lieber mit dem *.
Je nach ausgewähltem Datensatz soll die Listbox mit 'Frau' oder 'Herr' vorbelegt sein.
Dies realisierst Du mit folgendem ASP-Code (VBScript):In dem Script gehst Du davon aus, das die Felder vorbelegt sind, oder? Wie gesagt, die Leute sollen sich nur eintragen. Nach dem Eintrag wird eine Seite mit den eingetragenem erstellt. Das macht eigentlich nur Sinn, wenn man diesen Eintrag noch ändern kann. Vielleicht werf ich das auch raus.
Im 2. Schritt wirst Du dann doch die Daten in die DB abfüllen und anschliessend den Datensatz (oder die Formularfelder) als Feedback an den Benutzer zurückgeben.
Denkbar ist auch die Variante, die Formulardaten zur Bestätigung an den Benutzer zurückzugeben, dabei das Update-Statement schon vorbereitet in einem hidden-Field mitzugeben und bei Bestätigung durch den Benutzer im 3. Schritt (= 3. ASP-Skript) die Daten in die DB zu schreiben.
Die gepostete Seite ist die ASP-Seite, d.h. Die Formulardaten werden an diese Seite übertragen und von dort werden Sie in die Datenbank geschrieben.
Das funktioniert ja auch, das ist ja nicht das Problem. Das Problem war ja nur, das die AnredeID angezeigt wird und nicht die Anrede.
Ich übergebe über das formular die ID an AnredeID. Möchte aber die Anrede anzeigen lassen, also nach dem Eintrag.
Natürlich könnte man die ID beim Auslesen und Herr/Frau wandeln lassen, so nach der Artif ID = 1 then Frau else Mann oder so ähnlich, aber geht es nicht allein über SELECT ..... ??
Richtig. Dazu muss etwas ASP-Code in die Seite rein:
<%
if AnredeID=1 then
response.write "Frau"
else
response.write "Herr"
end if
%>
Oder besser, also nicht "hard gecoded":
<%
Set rs = Server.CreateObject("ADODB.RecordSet")
SQL = "SELECT Anrede FROM T_Anrede WHERE AnredeID=" & AnredeID
rs.open SQL, db, adOpenDynamic
response.write rs("Anrede")
%>
Ich hoffe, damit Deinem Problem näher gekommen zu sein.
Grüsse
Tom