Aktualisierung von meherern Feldern

redwing78

Mitglied
Hallo! Ich betreue die Homepage eines Fussballclubs; die Spieler habe ich in einer Datenbank und die Abfragen funktionieren schon ganz gut.
Nun möchte ich die Daten der Spieler per Browser aktualisieren. Hierzu habe ich es schon geschafft, die Werte jeweils in Formularfelder schreiben zu lassen, sodaß man sie aktualisieren und dann abschicken kann.
Das sieht bislang folgendermaßen aus, z.B. :
Code:
50 <input type="text" name="GebDat" size="30" value="<% Response.Write objRS("GebDat") %>">

Wie kann ich durch Klicken auf die Schalfläche "Absenden" alle Werte in die Datenbank speichern?

Meine Datenbankverbindung sieht wie folgt aus:
Code:
12 <% Dim strCon, strDB, strTabelle, objCon, objRS, strSQL, strName
13 strName = Request.QueryString("SpielerID")
14 if strName = "" then Response.Write("Kein Spieler gewählt!")
15strDB = "Data Source=" & Server.MapPath("poley.mdb") ' Pfad und Dateiname der Datenbank
16 strCon = "Provider=Microsoft.Jet.OLEDB.4.0;" & strDB ' Parameter zum Öffnen der Datenbank
17 strTabelle = "fcreith" ' Name der Tabelle oder Abfrage, die geöffnet werden soll
18 Set objCon = Server.CreateObject("ADODB.Connection") ' Objekt für den Verbindungsaufbau mit der Datenbank
19 objCon.Open strCon
20 Set objRS = Server.CreateObject("ADODB.Recordset") ' Objekt für das Recordset-Objekt
21 strSQL = "SELECT * FROM [fcreith] WHERE SpielerID = " & strName
22 objRS.Open strSQL, objCon %>

Danke im Voraus für die Hilfe!
redwing78
 
Hi

es gibt da unterschiedliche Ansätze, aber alle haben eines gemein, Du wirst das update-Statement in einer Schleife Datensatz für Datensatz ausführen müssen.

Also eine Möglichkeit

Du baust dir ein ganz normales Selectstatement und liest die Felder, so wie Du es ja auch schon geschrieben hast, ein die inputs eins. Weiterhin setzt Du Dein Recordset so, dass Du die Anzahl der Datensätze auslesen kannst, die Dein Select abwirft (counter). Weiterhin hängst Du an jedes input-namen-Feld einen Zähler an den Namen (a).

Wichtig ist, dass sowohl der Counter als auch die eindeutige ID im Formular mitgeschickt werden.

Beispiel-Formular
Code:
<%		
	Dim  sql
	sql = "select id, feld from tabelle"
	Set RS = Server.CreateObject("ADODB.Recordset")
	RS.Open sql, objConn, 3,3
	dim counter, a
	counter = rs.recordCount
	a = 1
	%>
<form name="form1" method="post" action="updatseite.asp">
     <% while not rs.eof %>
     <input type="hidden" name="id<% = a%>" value="<%= rs(0)%>">
     <input type="text" value="<%= rs(1)%>" name="pz<% = a%>"><br>
  <% a = a + 1
	rs.movenext
	wend
	rs.close
	Set RS = Nothing 
	%>
 <input type="hidden" name="counter" value="<% = counter %>">
 <input type="submit" name="go" value="go">
 </form>

%>

Für das Updatestatement erstellst Du Dir eine For-Schleife und liest Dir die Felder mit dem Zähler zugeordnet ein das Updatestatement ein.

Code:
<%
for i = 1 to Request.Form("Counter")	
id = Request.Form("id" & i & "")
pz = Request.Form("pz" & i & "")

SQL = "update tabelle set feld = '" & pz & "' where id = " & id & "" 
objConn.Execute(sql)
next
%>
 
Hi

ich habe mir jetzt Dein Posting nochmals richtig durchgelesen und erst, sorry, auf den 2. Blick verstanden, was Du da eigentlich möchtest und ich habe wieder einen Schritt zuweit gedacht. Liegt vermutlich daran, dass diejenigen, die Fussballtabellen updaten wollen, die gesamte Tabelle updaten möchten. Sowas hatte ich irgendwie im Kopf

Fussball - alle Felder :p

Habe jetzt nicht weiter auf das Statement geachtet.

Willst Du nur einen Datensatz ändern, kannst Du dies via ADO machen oder über ein einfaches Update-Statement (ein solches habe ich auch bereits im Vorposting angegegeben) und das ganze Procedure ist wesenltich einfacher.

bsp.

update = "update tabelle set feld1 = '" & strVar1 & "', feld2 = '" & strVar2 & "' where id = " & id
objConn.Execute(update)

Die Variablen stehen jetzt natürlich für die Werten aus den Formularfeldern, die dortdrin gespeichert werden.

In Access ist es so, dass dort genau differenziert wird, was ist ein numerisches und was ist ein alphanumerisches Feld. Letzteres muss IMMER in Hochkomma gefasst werden (Ausnahme Datum und boolean-Felder)

Also nochmal, 1. Posting bezieht sich auf ein Update mehrerer Spieler gleichzeitig.
 
Zuletzt bearbeitet:
Hi Luzie!
Dankeschön für die ausführliche Hilfe. Ich werde es morgen vormittag gleich ausprobieren; ich hoffe, es funktioniert. Falls nicht, wirst Du evtl. wieder von mir hören ;-)
LG redwing78
 
Hallo!
Ich habe den Luzies Rat befolgt und die Update-Anweisung eingebaut. Allerdings erhalte
ich beim Aufruf am Server die Fehlermeldung:
Object required: '' (in Zeile 22) - da sind doch gar keine Anführungszeichen.

Hier der Code, mit dem die DB geöffnet wird bzw. SQL-Anweisung:
Code:
12 <% Dim strCon, strDB, strTabelle, objCon, objRS, strSQL, strName, update, objConn, fName, fSpitzname, fGebDat, fGroesse, fGewicht, rs, adUpdate
13 strName = Request.QueryString("SpielerID")
14 if strName = "" then Response.Write("Kein Spieler gewählt!")
15 strDB = "Data Source=" & Server.MapPath("poley.mdb") ' Pfad und Dateiname der Datenbank
16 strCon = "Provider=Microsoft.Jet.OLEDB.4.0;" & strDB ' Parameter zum Öffnen der Datenbank
17 strTabelle = "fckitz_spieler" ' Name der Tabelle oder Abfrage, die geöffnet werden soll
18 Set objCon = Server.CreateObject("ADODB.Connection") ' Objekt für den Verbindungsaufbau mit der Datenbank
19 objCon.Open strCon
20 Set objRS = Server.CreateObject("ADODB.Recordset") ' Objekt für das Recordset-Objekt
21 update = "UPDATE fckitz_spieler SET Name = '" & fName & "', Spitzname = '" & fSpitzname & "', GebDat = " & fGebDat & ", Groesse = " & fGroesse & ", Gewicht = " & fGewicht & " WHERE SpielerID = " & strName
22 objConn.Execute update %>

Die Formulare lauten z.B. wie folgt:
Code:
<input type="text" name="fSpitzname" size="30" value="<% Response.Write objRS("Spitzname") %>

Irgendwo muß noch ein Fehler sein - kann mir jemand helfen?
 
Hi

schau Dir bitte nachfolgenden Script genau an und achte auf die Kommentare.

Code:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<% 
Dim strCon, strDB, strTabelle
dim objConn, objRS, strSQL, strName, update
dim fName, fSpitzname, fGebDat, fGroesse, fGewicht, rs, adUpdate
strName = Request.QueryString("SpielerID")

' --- Diese Abfrage solltest Du in ein Gesamtabfrage packen
' --- Wenn kein Spielerid ausgewählt, dann Response.end anssonsten das update

if strName = "" then Response.Write("Kein Spieler gewählt!")

strDB = "Data Source=" & Server.MapPath("poley.mdb") ' Pfad und Dateiname der Datenbank
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;" & strDB ' Parameter zum Öffnen der Datenbank

' --- Hier hast Du einmal in Deinem Script eine andere Objektbezeichnung als 
' --- im Execute aufgerufen. Bitte vergleiche es mit Deinem alten Script

Set objConn = Server.CreateObject("ADODB.Connection")
 objConn.Open strCon

' --- Nachfolgendes ist jetzt für das Update überflüssig. Du brauchst kein RS zu definieren.
'Set objRS = Server.CreateObject("ADODB.Recordset") ' Objekt für das Recordset-Objekt

' --- An dieser Stelle fehlt die Abfrage in der For-Schleife
' --- Sh. Dir mein Beispiel bitte nochmals genau an.

update = "UPDATE fckitz_spieler SET Name = '" & fName & "', Spitzname = '" & fSpitzname & "', GebDat = " & fGebDat & ", Groesse = " & fGroesse & ", Gewicht = " & fGewicht & " WHERE SpielerID = " & strName
objConn.Execute(update)
 %>

Weiterhin schau Dir bitten mein Formular an und wie ich die Feldnamen definiert habe und das Feld Counter.
 
Zuletzt bearbeitet:
Hi! Ich habe Deine Hinweise eingebaut, erhalte aber die Fehlermeldung:
Microsoft JET Database Engine error '80040e14'
Syntax error in UPDATE statement.
/adlerhorstkitz/fckitz_admin_detail.asp, line 45

Das betrifft die update-Anweisung.

Ich kenn mich jetzt gar nicht mehr aus; vielleicht habe ich jetzt irgendwo ein falsches Deiner Beispiele eingebaut.
Könntest Du mir evtl. nochmal helfen? Wenn es leichter ist, kann ich Dir die ASP-Datei mailen; im Internet steht sie unter http://m.1asphost.com/adlerhorstkitz/fckitz.htm.

Wenn Du mir hilfst, es zustandezubringen, würde ich mich gern erkenntlich zeigen.

Liebe Grüsse,
Josef

Hier nochmal das gesamte bisherige Listing:

Code:
<%@Language="VBScript"%>
<% Option Explicit %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>

<head>
<title>FC Kitz - Spielerprofile</title>
</head>

<body>

<% dim objConn, objRS, strSQL, strConn, strName, strDB, update
dim fName, fSpitzname, fGebDat, fGroesse, fGewicht, id, pz, rs
dim counter, a, i
strName = Request.QueryString("SpielerID")
counter = "rs.recordCount"
a = 1

' --- Diese Abfrage solltest Du in eine Gesamtabfrage packen
' --- Wenn kein Spielerid ausgewählt, dann Response.end anssonsten das update

if strName = "" then Response.Write("Kein Spieler gewählt!")

strDB = "Data Source=" & Server.MapPath("poley.mdb") ' Pfad und Dateiname der Datenbank
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" & strDB ' Parameter zum Öffnen der Datenbank

' --- Hier hast Du einmal in Deinem Script eine andere Objektbezeichnung als 
' --- im Execute aufgerufen. Bitte vergleiche es mit Deinem alten Script

Set objConn = Server.CreateObject("ADODB.Connection")
 objConn.Open strConn
Set RS = Server.CreateObject("ADODB.Recordset")
 
' --- Nachfolgendes ist jetzt für das Update überflüssig. Du brauchst kein RS zu definieren.
'Set objRS = Server.CreateObject("ADODB.Recordset") ' Objekt für das Recordset-Objekt

' --- An dieser Stelle fehlt die Abfrage in der For-Schleife
' --- Schau Dir mein Beispiel bitte nochmals genau an.

for i = 1 to Request.Form("counter")	
id = Request.Form("id" & i & "")
pz = Request.Form("pz" & i & "")
next
update = "UPDATE fckitz_spieler SET Name = '" & fName & "', Spitzname = '" & fSpitzname & "', GebDat = " & fGebDat & ", Groesse = " & fGroesse & ", Gewicht = " & fGewicht & " WHERE SpielerID = " & strName
objConn.Execute(update) %>


<h1>Spieler bearbeiten</h1>

<form name="form1" method="post" action="fckitz_admin_detail.asp">
     <% while not rs.eof %>
     <input type="hidden" name="id<% = a%>" value="<%= rs(0)%>">
     <input type="text" value="<%= rs(1)%>" name="pz<% = a%>"><br>
  <% a = a + 1
	rs.movenext
	wend
	rs.close
	Set RS = Nothing %>
       
 <input type="hidden" name="counter" value="<% = counter %>">
     
     <table>
      <tr>
        <td>Name</td>
        <td><input type="text" name="fName" size="30" value="<% Response.Write objRS("Spitzname") %>"></td>
      </tr>
      <tr>
        <td>Spitzname</td>
        <td><input type="text" name="fSpitzname" size="30" value="<% Response.Write objRS("Name") %>"></td>
      </tr><tr>
        <td>GebDat</td>
        <td><input type="text" name="fGebDat" size="30" value="<% Response.Write objRS("GebDat") %>"></td>
      </tr><tr>
        <td>Groesse</td>
        <td><input type="text" name="fGroesse" size="30" value="<% Response.Write objRS("Groesse") %>"></td>
      </tr><tr>
        <td>Gewicht</td>
        <td><input type="text" name="fGewicht" size="30" value="<% Response.Write objRS("Gewicht") %>"></td>
      </tr>
    </table>
 <input type="submit" name="go" value="go">
 </form>

<% objRS.Close ' Recordsetobjekt schliessen
Set objRS = Nothing

objCon.Close ' Verbindungsobjekt schließen
Set objCon = Nothing %>
</body>
</html>
 
Zuletzt bearbeitet:
Hi

ich habe da auch etwas durcheinandergeworfen, sorry.

Im Script sind einige Fehler.
Hier mal ein Ansatz, den Du nutzen kannst.
Bitte posten, ob es geklappt hat, da ich es nicht testen kann.

Wichtig ist, dass Variablen den Wert aus den Formularfeldern bekommen.
Dann will Access das Datum im Format #mm/dd/yyyy#. Wenn es allerdings als String übergeben wird, sollte es beim Update keine Probleme machen, wenn doch, dann muss man es umschreiben. Ich habe es jetzt mal in Hochkomma gefasst.

Also, den ganzen Schleifensalat, wo ich Dich mit durcheinandergebracht habe, brauchst Du zum updaten eines Datensatzes nicht. Irgendwie hatte ich immer noch im Kopf, dass Du mehrere gleichzeitig updaten möchtest. ;-)

Code:
<%@Language="VBScript"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>

<head>
<title>FC Kitz - Spielerprofile</title>
</head>

<body>

<% dim objConn, objRS, strSQL, strConn, strName, strDB, update
dim fName, fSpitzname, fGebDat, fGroesse, fGewicht, id, pz, rs
dim counter, a, i

' --- Zuordnen der Formualrwerte

strName = Request("SpielerID")
fName = Request.Form("fName")
fSpitzname = Request.Form("fSpitzname")
fGebDat = Request.Form("fGebDat")
fGroesse = Request.Form("fGroesse")
fGewicht = Request.Form("fGewicht")

if strName = "" then Response.Write("Kein Spieler gewählt!")

' --- Verbindung zur Datenbank
strDB = "Data Source=" & Server.MapPath("poley.mdb") ' Pfad und Dateiname der Datenbank
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" & strDB ' Parameter zum Öffnen der Datenbank
Set objConn = Server.CreateObject("ADODB.Connection")
 objConn.Open strConn

' -- Update wenn Formular abgeschickt
 
 if Request.Form.count >0 then
  update = "UPDATE fckitz_spieler SET Name = '" & fName & "', Spitzname = '" & fSpitzname & "', GebDat = '" & fGebDat & "', Groesse = " & fGroesse & ", Gewicht = " & fGewicht & " WHERE SpielerID = " & strName
objConn.Execute(update) 
Response.write "alles gespeichert"

' --- ansonsten Recordset
else
Set RS = Server.CreateObject("ADODB.Recordset")
sql = "select * from fckitz_spieler where spielerID = " & strName
RS.Open sql, objConn
%>


<h1>Spieler bearbeiten</h1>

<form name="form1" method="post" action="fckitz_admin_detail.asp">
    <table>
      <tr>
        <td>Name</td>
        <td><input type="text" name="fName" size="30" value="<% = RS("Spitzname") %>"></td>
      </tr>
      <tr>
        <td>Spitzname</td>
        <td><input type="text" name="fSpitzname" size="30" value="<% = rs("Name") %>"></td>
      </tr><tr>
        <td>GebDat</td>
        <td><input type="text" name="fGebDat" size="30" value="<% = RS("GebDat") %>"></td>
      </tr><tr>
        <td>Groesse</td>
        <td><input type="text" name="fGroesse" size="30" value="<% = RS("Groesse") %>"></td>
      </tr><tr>
        <td>Gewicht</td>
        <td><input type="text" name="fGewicht" size="30" value="<% = RS("Gewicht") %>"></td>
      </tr>
    </table>
	<input type="hidden" name="spielerID" size="30" value="<% = RS("spielerid") %>">
 <input type="submit" name="go" value="go">
 </form>

<% RS.Close ' Recordsetobjekt schliessen
Set RS = Nothing
end if

objConn.Close ' Verbindungsobjekt schließen
Set objConn = Nothing %>
</body>
</html>

option explicit habe ich jetzt mal rausgenommen. Solltest Du aber auf jeden Fall wieder einsetzen und das Variablenvorkommen genau überprüfen. Das habe ich jetzt nicht getan.
 
Hi Luzie,
Du bist echt der Hammer! Der Code funktioniert wie geschmiert und man kann super die Datensätze bearbeiten. Ich möchte mir für Deine Hilfe bedanken und Dir dafür einen Amazon-Gutschein iHv 10 Euro zukommen lassen - wäre das okay?

Jetzt fehlt mir als letztes nur die Option, neue Datensätze einzufügen.
Habe es schon versucht, ich erhalte die Meldung Syntax Error (in der INSERT-Anweisung).
Kannst Du mir evtl. den Code kurz durchsehen? Das wäre echt lieb.

LG Josef

<%@Language="VBScript"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>

<head>
<title>FC Kitz - Spielerprofile</title>
</head>

<body>

<% dim strDB, objConn, strConn, strSQL
dim nName, nSpitzname, nGebDat, nGroesse, nGewicht

' --- Verbindung zur Datenbank

strDB = "Data Source=" & Server.MapPath("poley.mdb") ' Pfad und Dateiname der Datenbank
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" & strDB ' Parameter zum Öffnen der Datenbank
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open strConn

' --- Zuordnen der Formularwerte

nName = Request.Form("nName")
nSpitzname = Request.Form("nSpitzname")
nGebDat = Request.Form("nGebDat")
nGroesse = Request.Form("nGrosse")
nGewicht = Request.Form("nGewicht")

' -- Einfügen per SQL-Befehl

if Request.Form.count >0 then
strSQL = "INSERT INTO fckitz_spieler (Name, Spitzname, GebDat, Groesse, Gewicht) VALUES ('" & nName & "', '" & nSpitzname & "', '" & nGebDat & "', " & nGroesse & ", " & nGewicht & ")"
objConn.execute(strSQL)
Response.Write "Neuer Datensatz erfolgreich angelegt!"

else
Set RS = Server.CreateObject("ADODB.Recordset")
sql = "select * from fckitz_spieler"
RS.Open sql, objConn

%>

<form name="form1" method="post" action="fckitz_admin_neu.asp">
<table>
<tr>
<td>Name</td>
<td><input type="text" name="nName" size="30"></td>
</tr>
<tr>
<td>Spitzname</td>
<td><input type="text" name="nSpitzname" size="30"></td>
</tr><tr>
<td>GebDat</td>
<td><input type="text" name="nGebDat" size="30"></td>
</tr><tr>
<td>Groesse</td>
<td><input type="text" name="nGroesse" size="30"></td>
</tr><tr>
<td>Gewicht</td>
<td><input type="text" name="nGewicht" size="30"></td>
</tr>
</table>

<input type="submit" name="go" value="Speichern">
</form>

<%

RS.Close ' Recordsetobjekt schliessen
Set RS = Nothing
end if

objConn.Close ' Verbindungsobjekt schließen
Set objConn = Nothing %>
</body>
</html>
 
Hi

zuerst einmal, ich möchte echt nix für die Hilfe haben.
Es ist immer ein Geben und Nehmen. Auch ich nehme von anderen und bin froh, wenn man mir weiterhilft oder einen Tipp geben kann. Wenn Du mal eine Frage beantworten kannst, wirst Du das bstimmt auch tun.

Zum Script:

der Fehler liegt hier

nGroesse = Request.Form("nGrosse")

da ist ein Vertipper, fehlt das e in nGroesse

korrekt ist:

nGroesse = Request.Form("nGroesse")

Das kannst Du aber ganz leicht auch selbst feststellen, wenn Du Dir das Statement ausgeben lässt (Response.write) anstelle es auszuführen. Einfach nur zur Kontrolle, gerade wenn solche SQL-Fehlermeldungen kommen.

Code:
 if Request.Form.count >0 then
strSQL = "INSERT INTO fckitz_spieler (Name, Spitzname, GebDat, Groesse, Gewicht) VALUES ('" & nName & "', '" & nSpitzname & "', '" & nGebDat & "', " & nGroesse & ", " & nGewicht & ")"
Response.write strSQL
' --- objConn.execute(strSQL)
Response.Write "Neuer Datensatz erfolgreich angelegt!"

Das Recordset kannst Du Dir hier sparen. Es werden ja keine Daten per Select abgerufen.
 

Neue Beiträge

Zurück