Doppelte Einträge in der Datenbank verhindern

  • Themenstarter Themenstarter Meitli
  • Beginndatum Beginndatum
Hi

wenn es aus einem Formular kommt, dann spielt der Scriptcode keine Rolle mehr.
Ansonsten kannst Du es so (hab gerade noch die ASP-Tags hinzugefügt, hatte ich vergessen), wie es ist, dort einbauen, wo das Feld im Formular angelegt ist.

Wenn das Textfeld leer ist, wird die UnterlagenID aus irgendeinem Grund nicht übertragen. Poste doch nochmal das Formular, woraus das übertragen wird.

Du brauchst es nicht als Anhang zu schicken, einfach den Scirptcode hier reinschreiben.

War da nicht schon mal irgendwas mit UnterlageID und UnterlagenID ? Einfach nochmal die richtige Schreibweise aller Felder nachprüfen.
 
Zuletzt bearbeitet:
Das Formular befindet sich au in diesem Scriptcode, denn ich scho als Anhang geschickt habe.

Hier nochmals:

Code:
       <form name="form1" method="post" action="">
              <table width="100%" border="0" cellspacing="1" bordercolor="#CCCCCC" ID="Table6">
                  <tr bgcolor="#B7C2D0"> 
                    <td width="25%"><font face="Arial, Helvetica, sans-serif" size="2"><b>Unterlagen: 
                      </b></font></td>
                    <td width="75%"> <font face="Arial, Helvetica, sans-serif" size="2"> 
                      <select name="sUnter" ID="Select4">
                        <option value="no" selected>
                        <% 'Unterlagen in Auswahlmenu einlesen %>
                        </option>
                        <%
			  Set rs = KPLcon.Execute("SELECT * FROM Unterlagen")
			  do until rs.EOF%>
                        <option value="<%response.write(rs("UnterlagenID"))%>">  
						<%response.write(rs("Unterlagen"))%>
                        &nbsp; 
                         <%response.write(rs("Speicherort"))%>
                        </option>
                        <%rs.MoveNext
			  loop
			  rs.close %>
                      </select>
                      </font></td>
                  </tr>
                  <tr bgcolor="#B7C2D0"> 
                    <td width="25%"> <font face="Arial, Helvetica, sans-serif" size="2"> 
                      <input type="hidden" name="KursID" value=<%Response.Write(Request("KursID"))%>>
                      <input type="hidden" name="UnterlagenID" value=<%Response.Write(Request.Form("UnterlagenID"))%>>
                       </font></td>                  
                    <td width="75%"> <font face="Arial, Helvetica, sans-serif" size="2"> 
                      <input type="submit" name="Submit" value="&Uuml;bernehmen" ID="Submit1">
                      </font></td>
                  </tr>
                </table>
        </form>

Lg Meitli
 
Hi

ja, das ist schon korrekt, aber wenn der Wert in diesem Formular leer ist, dann wird er schon hierhin nicht korrekt übertragen.

Du speicherst ihn hier in diesem hiddenfeld.

<input type="hidden" name="UnterlagenID" value=<%Response.Write(Request.Form("UnterlagenID"))%>>

Meine Frage war, wo kommt dieser Wert her? Wie übergibst Du den Wert, dass er in diesem Formular gespeichert werden kann. Wenn er nämlich nicht dadrin ist, dann muss man die Suche noch auf Stationen vorher konzentrieren. ;)
 
Hi

Der Forminhalt kommt aus der Datenbank aus der Tabelle Unterlagen. Dies funktioniert auch problemlos, sie werden angezeigt. Diie Unterlagen kann man somit im Formular anwählen.

Mit diesem Select werden die Unterlagen aus der Tabelle geholt:

Code:
Set rs = KPLcon.Execute("SELECT * FROM Unterlagen")

Die UnterlagenID sollte von dieser Unterlagen stammen, welche im Formular ausgewählt ist.

Der Insert nach dem Abschicken des Formulars funktioniert problemlos, und genau dort wird auch die Variabel UnterlagenID verwendet.
Hier der Code diese Select-Statments:

Code:
Set rs = KPLcon.Execute("INSERT INTO Kursunterlagen (KursID, UnterlagenID) VALUES (" & Request.Form("KursID") & ", " & Request.Form("sUnter") & ")")


Warum wird ein Mal die Variabel übertragen, dass andere Mal nicht? :confused:

Wenn ich folgender Code (Änderung rot) verwende, kommt keine Fehlermeldung mehr, heisst das er hat UnterlagenID gefunden?

Code:
sql= "SELECT * FROM Kursunterlagen WHERE KursID = " & Request("KursID") & " AND UnterlagenID = " & Request.Form("sUnter")
Set rs = KPLcon.Execute(sql)

Der nächste Fehler ist dann bei der Überprüfung ob der Record Set leer ist!
 
Zuletzt bearbeitet von einem Moderator:
Hi

ich stecke in in diesem Vorgang nicht drin und blicke durch Deine Überlegungen langsam nicht mehr durch. Ich bin aber davon überzeugt, dass hier ein Denkfehler vorliegt und kein Scriptfehler.

Ich kann aber nur sagen, was Dein Scriptcode hier zeigt und kann mir daraus einen möglichen Ablauf kontruieren. Ich bin mir auch sicher, dass Du den Vorgang verstehst, Du hast es ja erstellt, aber für einen Außenstehenden ist hier einfach Schluss.

Tatsache ist, dass der Wert nicht übertragen werden kann, weil das Feld leer bleibt.
Wenn das Formularfeld leer ist, hat es einen Grund. Entweder wird kein Wert über den Request.Form("UnterlagenID") in das hiddenfeld transportiert, oder der Wert kann nicht gelesen werden, weil er aus einer URL (QueryString) übertragen wird oder einer Session() oder aus der Datenbank gelesen wird, wie Du bereits im letzten Posting angedeutet hast.

Wenn das der Fall ist, dann frag ich mich allen Ernstes, warum Du das Feld nicht als Feld aus der Datenbank einliest? Warum der Request.Form("UnterlagenID")? Liegt da u.U. der Denkfehler?
 
1. Danke, dass du mir immer noch hilfst. Ich weiss ich bin manchmal echt kompliziert.
2. Sorry tut mir echt leid, dass du wegen mir den Überblick verloren hast.

3. Nochmal von vorn:

Ich hab ein Print Screen gemacht, dass es übersichtlicher wird.

Als erste werden die Unterlagen, welche schon dem Kurs zugeordnet sind aufgelistet. Danach kommt das Formular, wo man weitere Unterlagen hinzufügen kann. Das Problem ist, das Unterlagen doppelt vorkommen können, was ich verhindern möchte.

Fügt man eine Unterlage hinzu, werden KursID und UnterlagenID in die Datenbanktabelle Kursunterlagen hinzugefügt, welche folgende Attribute enthält: KursunterlagenID (wird automatisch vergeben), KursID und UnterlagenID. Dieser Insert funktioniert!
Code:
Set rs = KPLcon.Execute("INSERT INTO Kursunterlagen (KursID, UnterlagenID) VALUES (" & Request.Form("KursID") & ", " & Request.Form("sUnter") & ")")

Nun zum überprüfen ob eine Unterlage schon zugeordnet ist:

Mit diesem Code frage ich die Tabelle Kursunterlagen ab ob scho ein Eintrag vorhanden ist.
Code:
sql= "SELECT * FROM Kursunterlagen WHERE KursID = " & Request("KursID") & " AND UnterlagenID = " & Request.Form("UnterlagenID")
Set rs = KPLcon.Execute(sql)

Jetzt habe ich genau diesen Code abgeändert:
Code:
sql= "SELECT * FROM Kursunterlagen WHERE KursID = " & Request("KursID") & " AND UnterlagenID = " & Request.Form("sUnter")
Set rs = KPLcon.Execute(sql)
Dieser löst keine Fehlermeldung mehr aus.

Ich vermute dass es so funktioniert, bin mir aber nicht sicher. War dies der Fehler?

Ich hoffe, dass du jetzt wieder einen Überblick hast. Wenn nicht, was bereitet dir noch Probleme?

Lg Meitli
 

Anhänge

Hi

so ein Screenshot bringt absolut nix.

Ich weiss, wie das Formular aussieht.

Die Abfrage lautet im Select auf Kursid and UnterlagenID, das heißt, wenn es keinen Datensatz gibt, der beide Werte explizit enthält, wird er lt. Deiner Abfrage immer einen neuen Datensatz anlegen.

Ob Du jetzt über die Listbox den Wert, den Du ursprünglich haben willst, richtig übergibst, und ob es der ist, den Du überhaupt willst, das weisst nur Du.

Lass Dir einfach mal das SQL-Statement auf dem Bildschirm anzeigen, dann siehst Du, was übergeben wird oder nicht

sql = "SELECT * FROM Kursunterlagen WHERE KursID = " & Request("KursID") & " AND UnterlagenID = " & Request.Form("sUnter")
'Set rs = KPLcon.Execute(sql)
Response.write sql
Response.end
 
Das mit dem Screen Shot merke ich mir.

Mit deinem Code, konnte ich das SQL-Statement ausgeben. Es funktioniert :-)

Danke für deine Hilfe Ich wünsch dir noch einen schönen Tag
:p
 
Hi

nicht falsch verstehen, das ist nur übliche Ausgabe eines Statements, um zu sehen, was da falsch ist. Der Scriptcode wird in dem Fall NICHT ausgeführt, also es passiert nix.

Es ist lediglich nur eine Möglichkeit der Fehlersuche.

Wenn Du es ausführen möchtest, musst Du es wieder rückgängig machen

sql = "SELECT * FROM Kursunterlagen WHERE KursID = " & Request("KursID") & " AND UnterlagenID = " & Request.Form("sUnter")
Set rs = KPLcon.Execute(sql)
' --- Response.write sql
' --- Response.end
 
Ich weiss, dass das nur eine Möglichkeit zum Fehlerüberprüfen ist!

Aber ich habe das ganze natürlich getestet, und jetzt werden keine doppelten Einträge mehr gemacht, es kommt die vorgesehene Meldung!

Lg Meitli
 
Zurück