supernewb: ASP ACCESS UPDATE Befehl - Formulare in Datenbank

hi liebes SELF HTML Forum, ich habe mal wieder ein (Verständnis-) Problem 😟

Ich habe mir eine Inventurübersicht in Access erstellt, und möchte diese über eine website auslesen und bearbeiten. Das Auslesen der Datenbank sowie das löschen von Primärschlüsselbehafteten Einträgen funktioniert ohne Probleme. Hier habe ich in den letzten Wochen bereits genügend schmerzhafte Erfahrungen sammeln können ;D

Nun geht es aber ums ÄNDERN von Einträgen.

Meine Datenbank enthält Daten zu PC Technik. U.a. verbaute Hardware, Geräte-Standort, interne Bezeichnungen usw usw. Summasummarum 38 columns pro zeile. Auf einer EDIT Seite möchte ich alle diese Daten auslesen und in einem TEXTFELD darstellen lassen, sodass die Einträge direkt bearbeitet werden können (im Textfeld). Das sieht ungefähr so aus :

<form action="PCspeichern.asp" method="post">
<table width="100%" id="news"><tr><td><b>Bezeichnung</b></td><td><input type="text" name="Bezeichnung" value="<%=(rs_Inventur.Fields.Item("Bezeichnung").Value) %>"></td></tr>
	<tr><td><b>Hersteller</b></td><td><input type="text" name="Hersteller" value="<%=(rs_Inventur.Fields.Item("Hersteller").Value) %>"></td></tr>
	<tr><td><b>Lieferant</b></td><td><input type="text" name="Lieferant" value="<%=(rs_Inventur.Fields.Item("Lieferant").Value) %>"></td></tr>
...
<input type="submit" value="speichern" onclick="submit">
</table>
</form>

Im oberen Teil habe ich nun Session Variablen festgelegt


Session("Bezeichnung") = Null
Session("Hersteller") = Null
Session("Lieferant") = Null

und wollte diesen dann den Werten aus dem Submit übergeben

Session("Bezeichnung") = Request.Form("Bezeichnung")
Session("Hersteller") = Request.Form("Hersteller")
Session("Lieferant") = Request.Form("Lieferant")

Die aufzurufende Seite "PCspeichern.asp" enthält dann den UPDATE Befehl

 MM_editCmd.CommandText = "UPDATE PC_Technik SET Bezeichnung = ?, Hersteller = ?, Lieferant = ? WHERE ID = ?"
 MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param1", 202, 1, 50, Request.Form("Bezeichnung ")) ' adVarWChar
    MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param2", 202, 1, 50, Request.Form("Hersteller ")) ' adVarWChar
    MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param3", 202, 1, 50, Request.Form("Lieferant ")) ' adVarWChar
    MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param4", 202, 1, 50, Request.Form("sID")) ' adVarWChar

Ändere ich jetzt Werte und nutze den submit der form, wird der Redirect geladen, aber nichts in die Tabelle geschrieben. Es gibt auch keinen Fehler. Irgendwo habe ich da grundlegend nen Denkfehler 😕

Kann mir jemand helfen ?

  1. Hallo supernewb,

    aber nichts in die Tabelle geschrieben.

    Diese Formulierung kann man auf zweierlei Art deuten:

    • Es gibt keinen Schreibvorgang (d.h. die Felder bleiben unverändert)
    • Es gibt einen Schreibvorgang, und in die Felder wird NICHTS geschrieben (d.h. sie sind nachher leer oder null).

    Was passiert bei Dir?

    Wie entwickelst Du ASP? Hast Du keinen Debugger, mit dem Du an der fraglichen Codestelle anhalten und inspizieren kannst, was los ist? Falls nicht: Welchen Webserver verwendest Du und welches Betriebssystem? Mit Versionsangaben bitte!

    Ansonsten hätte ich zwei Vermutungen:

    1. Falsche Schreibung

    Request.Form("Bezeichnung ")
    Request.Form("Bezeichnung")
    

    So wie ich Microsoft und deren Collections kenne, nehme ich mal an, dass das nicht das selbe ist. Ob die erste Version einfach einen Leerstring liefert oder das Script abbricht, weiß ich nicht.

    Wenn ein Leerstring, dann würde der Update durchgeführt, und NICHTS in die Felder schreiben. Naja, nicht NICHTS. Einen Leerstring oder einen Null-Wert.

    Wenn Abbruch, würde kein Update durchgeführt.

    2. Da fehlt was

    Nämlich die Ausführung des Update. Dein Code zeigt nur wie das Statement aufgebaut wird. Aber vermutlich hast Du den Teil einfach nicht kopiert. Oder? ODER?

    Rolf

    --
    sumpsi - posui - clusi
    1. ich entschuldige vielmals die späte Rückmeldung Der hinweis

      Request.Form("Bezeichnung ")

      War auf alle Fälle erstmal richtig. Zudem war mein UPDATE Befehl fehlerhaft. Am Ende waren es ganz viele Kleinigkeiten (Typos und Syntaxproblemchen).

      Jetzt funktioniert die Anweisung einwandfrei 😀 Vielen Dank Rolf, für deine Hilfe !

      Noch etwas ..

      Ich möchte demnächst noch eine "Verschrotten" Funktion einbauen. Bei dieser sollen auf Knopfdruck :

      Alle Daten eines Datensatzes aus einer Tabelle (PC_Technik) in eine andere Tabelle (Verschrottet) geschrieben werden. Die Tabelle befindet sich in der selben Datenbank. Also Kopieren (INSERT?) und anschließendes Löschen aus der aktuellen Tabelle (DELETE)

      Kann man das in eine Funktion bzw. in einen Befehl packen? Oder bräuchte es 2 separate Schritte ?

      1. Hallo supernewb,

        das kannst Du in eine selbstgeschriebene Funktion packen, die beide Befehle ausführt.

        Du hast ja sicherlich eine WHERE Bedingung, die den zu kopierenden Satz eindeutig identifiziert. Mit dieser Bedingung kannst Du so kopieren:

        INSERT INTO verschrottet
               SELECT * FROM PC_Technik WHERE (deine eindeutige Bedingung)
        
        DELETE FROM PC_Technik WHERE (deine eindeutige Bedingung)
        

        Das setzt natürlich eine strukturelle Identität von PC_Technik und Verschrottet voraus. Ist die nicht gegeben, musst Du die Spalten explizit angeben:

        INSERT INTO verschrottet (v1, v2, v3)
               SELECT t1, t2, t3 FROM PC_Technik WHERE (deine eindeutige Bedingung)
        
        DELETE FROM PC_Technik WHERE (deine eindeutige Bedingung)
        

        Dann wird Spalte t1 nach v1 kopiert, t2 nach v2, und so weiter.

        Rolf

        --
        sumpsi - posui - clusi
        1. Rolf, du bist spitze, Danke

          Ich setze mich direkt ran und probiere das mal aus :)

        2. hallo nochmal 😀

          Das Kopieren und Löschen klappt schonmal, allerdings mit 2 Anweisungen

          Nun habe ich nicht bedacht, dass noch 2 weitere Felder in "Verschrottet" befüllt werden sollen, nämlich "Grund der Verschrottung" und "Abgangsdatum". Irgendwie kriege ich das nicht eingebaut :-/

          Das hier funktioniert schon einmal gar nicht. Es werden lediglich komplett leere Felder erstellt

          MM_editCmd.CommandText = "INSERT INTO Verschrottet (LetzterStandort, Strasse, Art, Bezeichnung, Hersteller, Lieferant, Seriennummer, Tag_Nummer, Neupreis, Anschaffungsdatum, Anschaffungsart, BA_Nummer, Rechnungsnummer, Abgang, Grund, interneNummer, Anlagennummer) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 
          
          MM_editCmd.Prepared = true
              MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param1", 202, 1, 50, MM_IIF(Request.Form("Standort"), Request.Form("Standort"), null)) ' adVarWChar
              MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param2", 202, 1, 50, MM_IIF(Request.Form("Strasse"), Request.Form("Strasse"), null)) ' adVarWChar
              MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param3", 202, 1, 50, MM_IIF(Request.Form("Art"), Request.Form("Art"), null)) ' adVarWChar
              MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param4", 202, 1, 50, MM_IIF(Request.Form("Bezeichnung"), Request.Form("Bezeichnung"), null)) ' adVarWChar
              MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param5", 202, 1, 50, MM_IIF(Request.Form("Hersteller"), Request.Form("Hersteller"), null)) ' adVarWChar
              MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param6", 202, 1, 50, MM_IIF(Request.Form("Lieferant"), Request.Form("Lieferant"), null)) ' adVarWChar
              MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param7", 202, 1, 50, MM_IIF(Request.Form("Seriennummer"), Request.Form("Seriennummer"), null)) ' adVarWChar
              MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param8", 202, 1, 50, MM_IIF(Request.Form("Tag_Nummer"), Request.Form("Tag_Nummer"), null)) ' adVarWChar
              MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param9", 202, 1, 50, MM_IIF(Request.Form("Neupreis"), Request.Form("Neupreis"), null)) ' adVarWChar
              MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param10", 202, 1, 50, MM_IIF(Request.Form("Anschaffungsdatum"), Request.Form("Anschaffungsdatum"), null)) ' adVarWChar
              MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param11", 202, 1, 50, MM_IIF(Request.Form("Anschaffungsart"), Request.Form("Anschaffungsart"), null)) ' adVarWChar
              MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param12", 202, 1, 50, MM_IIF(Request.Form("BA_Nummer"), Request.Form("BA_Nummer"), null)) ' adVarWChar
              MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param13", 202, 1, 50, MM_IIF(Request.Form("Rechnungsnummer"), Request.Form("Rechnungsnummer"), null)) ' adVarWChar
          	MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param14", 202, 1, 50, MM_IIF(Request.Form("Abgang"), Request.Form("Abgang"), null)) ' adVarWChar
          	MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param15", 202, 1, 50, MM_IIF(Request.Form("Grund"), Request.Form("Grund"), null)) ' adVarWChar
          	MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param16", 202, 1, 50, MM_IIF(Request.Form("interneNummer"), Request.Form("interneNummer"), null)) ' adVarWChar
          	MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param17", 202, 1, 50, MM_IIF(Request.Form("Anlagennummer"), Request.Form("Anlagennummer"), null)) ' adVarWChar
          	
          	MM_editCmd.Execute
              MM_editCmd.ActiveConnection.Close
          

          Die text inputs gibts natürlich, und die sind auch nicht leer

          Das Kopieren und Löschen funktioniert so MM_editCmd.CommandText = "INSERT INTO Verschrottet (LetzterStandort, Strasse, Art, Bezeichnung, Hersteller, Lieferant, Seriennummer, Tag_Nummer, Neupreis, Anschaffungsdatum, Anschaffungsart, BA_Nummer, Rechnungsnummer, Abgang, Grund, interneNummer, Anlagennummer) SELECT Standort, Strasse, Art, Bezeichnung, Hersteller, Lieferant, Seriennummer, Tag_Nummer, Neupreis, Anschaffungsdatum, Anschaffungsart, BA_Nummer, Rechnungsnummer, letzteAenderung, Grund, interneNummer, Anlagennummer FROM PC_Technik WHERE ID = " & Session("strID") & " " MM_editCmd2.CommandText = "DELETE FROM PC_Technik WHERE ID = " & Session("strID") & ""

          Wenn ich jetzt aber noch einen dritten Befehl erstelle

          	' MM_editCmd3.CommandText = "INSERT INTO Verschrottet (Grund, Abgang) VALUES (?, ?) WHERE ID = " & Session("strID") & ""
          
          

          gakelt der mich voll, dass mir ein Semikolon im editCmd.Execute fehlt ?

          PCsverschrotten.asp ID=393|62|80040e14|Fehlendes_Semikolon_(;)_am_Ende_der_SQL-Anweisung.
          

          ohne diese Anweisung erhalte ich den Fehler nicht.

          Wie könnte ich jetzt am sinnvollsten noch 2 extra Felder die es in "Verschrottet" gibt, aber in "PC_Technik" nicht, mit übernehmen?

          1. Hallo supernewb,

            es gibt keine WHERE Klausel im INSERT Statement.

            Es gibt ein INSERT Statement, dessen Werte über ein SELECT ermittelt werden, und dieses SELECT kann ein WHERE haben. Löschst Du SELECT raus und lässt WHERE stehen, kommt statt SQL UQL heraus (Unsinniger Quatsch, Leider)

            Wenn Du in einer mit INSERT erzeugten Zeile noch zwei Spalten nachtragen willst, musst Du das UPDATE Statement bemühen. DAS kennt ein WHERE.

            Warum dein Prepared Insert nicht funktioniert, kann ich nicht sagen. Dazu kenne ich ACCESS zu wenig. Liegt es am Statement oder deinen Daten? Schon mal mit konstanten Werten statt den MM_IIFs getestet? Ansonsten müssest Du da mal Handbücher / Dokus studieren.

            Das Einfügen von Grund und Abgang könntest Du auch anders hineintricksen. Vereinfachtes Beispiel:

            INSERT INTO foo (col1, col2, extra1, extra2)
            SELECT col1, col2, 'extrawert1' as extra1, 411 as extra2
            FROM Dingsbums
            WHERE id=4711
            

            D.h. du kannst im SELECT auch Konstanten als SELECT-Spalte angeben. Das ist auf jeden Fall besser als ein zusätzliches Update-Statement. Ob du diese beiden Spalten per ? in ein prepared Statement einsetzen kannst, DAS weiß ich allerdings nicht. In der SELECT Liste sind normalerweise keine Parameter zulässig. Müsstest Du probieren.

            Viel Glück.

            Rolf

            --
            sumpsi - posui - clusi