Tom: Problem mit ASP und Access

Beitrag lesen

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 26

Zeile 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