supernewb: ASP MSAccess - input type file - wert in DB nicht ändern, wenn nichts verändert

Hallo liebe SELFHTMLer 😀

Ich hätte da mal wieder ein Problem ... Mittlerweile lässt sichs nur noch schwer zählen, wie oft ihr mir schon geholfen habt. Dafür vorab nochmal ein dickes dickes Dankeschön.

Nun zum Sachverhalt

Ich betreibe eine inventurdatenbank in access, die ich nun nach und nach in ein frontend bauen möchte. Da wir im Intranet noch mit ASP arbeiten (und ich eigentlich gar nicht entwickeln kann), nutze ich auch ASP für meine Datenbank.

Ich habe also eine Datenbank mit etlichen Einträgen für Technik und deren Eigenschaften. (PC, Marke, CPU, Arbeitsspeicher, Rechnung, etc. pp )

hierfür habe ich eine Seite erstellt, die mir alle eingetragenen Rechner und deren wichtigsten Daten zeigt, sowie eine Detailseite die nur einen Datenbankeintrag mit allen Werten anzeigt. Auf der Detailseite habe ich ein INPUT TYPE FILE feld eingebunden, um den Pfad einer Rechnung anzuhängen. Diese Rechnungen liegen alle bereits im firmeneigenen Netzwerk, sodass ein tatsächlicher Upload Redundant und Sinnfrei wäre. Daher übergebe ich wie folgt lediglich den Pfad der gewählten Datei :

...…
<form action="PCspeichern.asp" method="post">
...…

<tr><td><b>Rechnungsnummer</b></td><td><input type="text" name="Rechnungsnummer" value="<%=(rs_Inventur.Fields.Item("Rechnungsnummer").Value) %>"</td> 
	<% IF rs_Inventur.Fields.Item("Rechnungspfad").Value <> "" THEN %><a href="<%=(rs_Inventur.Fields.Item("Rechnungspfad").Value) %>" target="_blank"><b><u>Rechnungsablage</u></b> </a> <% ELSE %> <b>Rechnungsablage</b> <% END IF %> 
	<form method="post"><input class="button" id="Rechnungspfad" name="Rechnungspfad" type="file" size="1" ></form><label for="Rechnungspfad"><% IF rs_Inventur.Fields.Item("Rechnungspfad").Value <> "" THEN %>Rechnung &auml;ndern<% ELSE %> Rechnung w&auml;hlen <% END IF %> </label></tr></form>

Abgeschickt wird über "PCSpeichern.asp"

` MM_editCmd.CommandText = "UPDATE PC_Technik SET Standort = ?, Strasse = ?, Art = ?, Bezeichnung = ?, Hersteller = ?, Lieferant = ?, Seriennummer = ?, Tag_Nummer = ?, Neupreis = ?, Anschaffungsdatum = ?, Anschaffungsart = ?, BA_Nummer = ?, Rechnungsnummer = ?, Rechnungspfad = ?, Bemerkungen = ?, Bildschirm = ?, Prozessor = ?, Taktung = ?, Arbeitsspeicher = ?, Festplattentyp = ?, Festplattengroesse = ?, Grafikkarte = ?, Grafikspeicher = ?, Soundkarte = ?, Schnittstellen = ?, Laufwerke = ?, Betriebssystem = ?, Office_Version = ?, Browser = ?, Zimmer = ?, Einsatz = ?, Mitarbeiter = ?, Netzwerkkarte = ?, MAC = ?, Anlagennummer = ?, interneNummer = ?, Virenscanner = ?, letzteAenderung = ? WHERE ID = " & Session("strID") & ""`

So, der Käse funktioniert sogar. Es werden alle gewünschten Daten in die DB geschrieben. Sogar der INPUT TYPE FILE wird korrekt als voller Pfad in die DB geschrieben.

Jetzt kommt aber das aber ... Da ALLE Daten beim Druck auf den "submit" abgeschickt werden, schickt auch der INPUT TYPE FILE einen Wert raus, selbst wenn ich nur, beispielsweise, Änderungen am Standort oder sonstigen Feldern vornehme. Und dieser Wert ist null. Das heißt, dass mein zuvor gespeicherter Link beim Ändern irgendeiner anderen Zeile mit nichts überschrieben wird. Das ist natürlich nicht so gewünscht 😂

Kann ich das irgendwie vorher abfragen? Alá

"WENN DB EINTRAG NICHT NULL, DANN FORM = (rs_Inventur.Fields.Item("Rechnungspfad").Value)"

Oder muss ich nur für den Pfad eine komplett neue Abfrage bauen?

Ich hoffe, ihr könnt mir - erneut - weiter helfen

Grüße

akzeptierte Antworten

  1. Hallo

    Ich habe also eine Datenbank mit etlichen Einträgen für Technik und deren Eigenschaften. (PC, Marke, CPU, Arbeitsspeicher, Rechnung, etc. pp )

    hierfür habe ich eine Seite erstellt, die mir alle eingetragenen Rechner und deren wichtigsten Daten zeigt, sowie eine Detailseite die nur einen Datenbankeintrag mit allen Werten anzeigt.

    Auf der Detailseite habe ich ein INPUT TYPE FILE feld eingebunden, um den Pfad einer Rechnung anzuhängen. Diese Rechnungen liegen alle bereits im firmeneigenen Netzwerk, sodass ein tatsächlicher Upload Redundant und Sinnfrei wäre. Daher übergebe ich wie folgt lediglich den Pfad der gewählten Datei :

    ...…
    <form action="PCspeichern.asp" method="post">
    ...…
    
    <tr><td><b>Rechnungsnummer</b></td><td><input type="text" name="Rechnungsnummer" value="<%=(rs_Inventur.Fields.Item("Rechnungsnummer").Value) %>"</td> 
    	<% IF rs_Inventur.Fields.Item("Rechnungspfad").Value <> "" THEN %><a href="<%=(rs_Inventur.Fields.Item("Rechnungspfad").Value) %>" target="_blank"><b><u>Rechnungsablage</u></b> </a> <% ELSE %> <b>Rechnungsablage</b> <% END IF %> 
    	<form method="post"><input class="button" id="Rechnungspfad" name="Rechnungspfad" type="file" size="1" ></form><label for="Rechnungspfad"><% IF rs_Inventur.Fields.Item("Rechnungspfad").Value <> "" THEN %>Rechnung &auml;ndern<% ELSE %> Rechnung w&auml;hlen <% END IF %> </label></tr></form>
    

    Abgeschickt wird über "PCSpeichern.asp"

    ` MM_editCmd.CommandText = "UPDATE PC_Technik SET Standort = ?, Strasse = ?, Art = ?, Bezeichnung = ?, Hersteller = ?, Lieferant = ?, Seriennummer = ?, Tag_Nummer = ?, Neupreis = ?, Anschaffungsdatum = ?, Anschaffungsart = ?, BA_Nummer = ?, Rechnungsnummer = ?, Rechnungspfad = ?, Bemerkungen = ?, Bildschirm = ?, Prozessor = ?, Taktung = ?, Arbeitsspeicher = ?, Festplattentyp = ?, Festplattengroesse = ?, Grafikkarte = ?, Grafikspeicher = ?, Soundkarte = ?, Schnittstellen = ?, Laufwerke = ?, Betriebssystem = ?, Office_Version = ?, Browser = ?, Zimmer = ?, Einsatz = ?, Mitarbeiter = ?, Netzwerkkarte = ?, MAC = ?, Anlagennummer = ?, interneNummer = ?, Virenscanner = ?, letzteAenderung = ? WHERE ID = " & Session("strID") & ""`
    

    So, der Käse funktioniert sogar.

    Da ALLE Daten beim Druck auf den "submit" abgeschickt werden, schickt auch der INPUT TYPE FILE einen Wert raus, selbst wenn ich nur, beispielsweise, Änderungen am Standort oder sonstigen Feldern vornehme. Und dieser Wert ist null. Das heißt, dass mein zuvor gespeicherter Link beim Ändern irgendeiner anderen Zeile mit nichts überschrieben wird. Das ist natürlich nicht so gewünscht 😂

    Kann ich das irgendwie vorher abfragen?

    Mit einer If-Else-Kontrollstruktur kannst du den String der SQL-Queries natürlich unterschiedlich erstellen, mal mit, mal ohne Aktualisierung des Dateipfades. Du kannst alternativ auch eine Stored Procedure auf dem SQL-Server aufrufen und dort herinnen die Unterscheidung vornehmen. Das hätte auf ASP-Seite den Vorteil eines in jedem Fall gleichen Vorgehens, du solltest dich dann aber auch mit den Möglichkeiten von T-SQL auf deiner SQL-Server-Version auskennen.

    Tschö, Auge

    --
    Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
    Hohle Köpfe von Terry Pratchett
    1. Hy, und danke zunächst für deine beteiligung

      wie aber könnte die IF ELSE struktur aussehen?

      1. Hallo

        Hy, und danke zunächst für deine beteiligung

        wie aber könnte die IF ELSE struktur aussehen?

        Ich kenne mich mit ASP nicht aus. Grundsätzlich muss der Pfad ja in einem Formularfeld stecken, dessen Namen du kennst. Wurde in diesem Feld ein Wert != NULL übergeben, rufe den Query mit Update des Feldes für den Pfad auf, wenn nicht, dann den ohne Berücksichtigung des Feldes.

        Wie die Syntax dafür aussieht, musst du wissen. Wie gesagt, ich kenne ASP nicht.

        Tschö, Auge

        --
        Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
        Hohle Köpfe von Terry Pratchett
        1. Das Problem ist leider, dass ich mich selbst nicht gut aus kenne. Ich bin kein Entwickler. Ich versuche das langsam, nach und nach zu verstehen und zu erlernen. Schulungen sind noch nicht drin, daher versuche ich in Eigeninitiative zu verbessern, was sich verbessern lässt

          Ich habe jetzt versucht in "PCSpeichern.asp" den Update Command folgend anzupassen

          IF (Session("Rechnungspfad") <> "") THEN
          		MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param14", 201, 1, 500, MM_IIF(Request.Form("Rechnungspfad"), Request.Form("Rechnungspfad"), null)) ' adLongVarWChar
          	Else
          		MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param14", 201, 1, 500, MM_IIF(rs_Inventur.Fields.Item("Rechnungspfad").Value, rs_Inventur.Fields.Item("Rechnungspfad").Value, null)) ' adLongVarWChar
          	End If
          

          Die Idee war, dass die Session Variable nicht leer sein darf, um den Wert der Variable aus der Form in die Datenbank zu schreiben Ist sie leer, soll der aktuell in der Datenbank vorhandene Wert verwendet werden

          Leider funktioniert das scheinbar nicht mit dem direkten Aufruf der DB Einträge über rs_Inventur.Fields.Item("Rechnungspfad").Value Daraufhin habe ich einen INPUT TYPE TEXT mit Namen RechnungspfadALT erstellt, als value den wert rs_Inventur.Fields.Item("Rechnungspfad").Value eingetragen und die Abfrage erneut verändert IF (Session("Rechnungspfad") <> "") THEN MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param14", 201, 1, 500, MM_IIF(Request.Form("Rechnungspfad"), Request.Form("Rechnungspfad"), null)) ' adLongVarWChar Else MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param14", 201, 1, 500, MM_IIF(Request.Form("RechnungspfadALT"), Request.Form("RechnungspfadALT"), null)) ' adLongVarWChar End If

          Jetzt muss ich einen Denkfehler drin haben, da jetzt immer null gespeichert wird (ohne Fehlermeldung, immerhin)

          1. Jetzt habe ich dieses Konstrukt :

            	IF (Request.Form("Rechnungspfad") <> "") THEN
            		MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param14", 201, 1, 500, MM_IIF(Request.Form("Rechnungspfad"), Request.Form("Rechnungspfad"), null)) ' adLongVarWChar
            	Else
            		MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param14", 201, 1, 500, MM_IIF(Request.Form("RechnungspfadALT"), Request.Form("RechnungspfadALT"), null)) ' adLongVarWChar
            	End If
            

            und dazu diese Formen :

            <b>Rechnungsablage</b> <input class="button" name="Rechnungspfad" type="text" value="<%=Session("Rechnungspfad") %>" size="50"> <input type="text" name="RechnungspfadALT" value="<%=(rs_Inventur.Fields.Item("Rechnungspfad").Value) %>" </tr> 
            

            Beim wählen einer Datei, wird der Pfad gespeichert. Wenn ich nichts wähle, wirds wieder null :-/

            1. Hallo

              	IF (Request.Form("Rechnungspfad") <> "") THEN
              	End If
              

              Beim wählen einer Datei, wird der Pfad gespeichert. Wenn ich nichts wähle, wirds wieder null :-/

              Ich möchte mal die Frage in den Raum stellen, ob ein leeres Feld beim Absenden des Formulars überhaupt übermittelt wird? Wenn ich die Auswertung der Eingaben deines Formulars in PHP implementieren würde, würde ich auf $_POST["Rechnungspfad"], was deinem Request.Form("Rechnungspfad") entspricht, prüfen.

              if (!empty($_POST["Rechnungspfad"])) {
                  # für das Feld mit dem Pfad wurde ein Wert übergeben
                  # eventuelle weitere Prüfungen, Query mit Pfad
              } else {
                  # das Feld mit dem Pfad wurde nicht übergeben
                  # eventuelle weitere Prüfungen, Query ohne Pfad
              }
              

              Die Funktion empty prüft auf einen nicht leeren Wert einer Variablen, setzt aber deren Existenz voraus. Wurde $_POST["Rechnungspfad"] nicht übergeben, wird der Else-Zweig ausgeführt.

              Ich befürchte, deine Prüfung (Request.Form("Rechnungspfad") <> "") geht immer in den IF-Zweig (wenn ASP davon ausgeht, dass ein nicht vorhandenes Request.Form("Rechnungspfad") etwas anderes ist, als ein leerer String ("")), setzt dann aber null, weil für IIF Request.Form("Rechnungspfad") nicht existiert.

              Tschö, Auge

              --
              Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
              Hohle Köpfe von Terry Pratchett
              1. Hallo Auge,

                das ist kein PHP, sondern ASP. Das wird mit einem BASIC Dialekt (VBScript) gesteuert.

                Eine fertige Lösung habe ich aber auch nicht, weil mein ASP und VBScript dafür nicht reicht. Ich sehe nur, dass der OP sehr seltsame Dinge tut, z.B. ein Button "RechnungsText" statt zuvor ein File-Upload Control. Ein Button ist dann in Request.Form enthalten, wenn das Form über diesen Button submittet wurde, sonst nicht.

                Es ist auch sehr merkwürdig, dass beim File Upload der Pfad zur Datei übergeben wird, das sollte nicht sein, das ist eine Information über den Computer des Anwenders, die nicht vom Form gepostet werden sollte. Ebenfalls außergewöhnlich ist die Idee, einen Dateinamen mittels File Upload zu übergeben, weil das nämlich nicht nur den Namen, sondern die ganze Datei hochlädt. Wenn die nicht zu groß ist, kann man das vermutlich hinnehmen.

                Wenn man eine Datei auswählen soll, auf die der Server Zugriff hat, wäre ein Dialog sinnvoll, der vom Server gesteuert die Auswahl einer Datei ermöglicht. Das setzt aber mehr Knowhow voraus als der OP sich selbst zugesteht.

                Was Request.Form("Rechnungspfad") liefert, wenn der Rechnungspfad leer ist, kann ich nur vermuten. Ich würde annehmen, dass es Null ist. Diesen Wert fragt man mit IsNull ab:

                IF (IsNull(Request.Form("Rechnungspfad")) THEN
                   ' Pfad nicht ändern
                ELSE
                   ' Pfad ändern
                END IF
                

                Ein Input Element, in dem der "alte Rechnungspfad" steht, sollte im Browser übrigens readonly gemacht werden (wenn man ihn denn sehen können soll). Wenn nicht, gibt's auch type="hidden". Eine tolle Lösung ist das aber nicht, weil man damit den Wert dem Client anvertraut und sich darauf verlassen muss, dass der Client ihn nicht beliebig manipuliert (was mittels F12 Entwicklerwerkzeuge ganz schnell gemacht ist). Besser wäre es, zwei Update-Varianten vorzuhalten. Eine ändert den Rechnungspfad, die andere nicht.

                Rolf

                --
                sumpsi - posui - clusi
                1. Hallo

                  das ist kein PHP, sondern ASP. Das wird mit einem BASIC Dialekt (VBScript) gesteuert.

                  Das weiß ich, das habe ich – so dachte ich zumindest – mit „Wenn ich die Auswertung der Eingaben deines Formulars in PHP implementieren würde[1] auch zum Ausdruck gebracht. Aber was weiß ich schon.

                  Die Programmiersprache meines Beispiels ändert aber ü.ber.haupt.nichts am Browserverhalten bei der (Nicht)-Übermittlung von ausgefülten oder eben nicht ausgefüllten Formularfeldern.

                  Was Request.Form("Rechnungspfad") liefert, wenn der Rechnungspfad leer ist, kann ich nur vermuten. Ich würde annehmen, dass es Null ist. Diesen Wert fragt man mit IsNull ab:

                  IF (IsNull(Request.Form("Rechnungspfad")) THEN
                     ' Pfad nicht ändern
                  ELSE
                     ' Pfad ändern
                  END IF
                  

                  Ein Input Element, in dem der "alte Rechnungspfad" steht, sollte im Browser übrigens readonly gemacht werden (wenn man ihn denn sehen können soll). Wenn nicht, gibt's auch type="hidden". … Besser wäre es, zwei Update-Varianten vorzuhalten. Eine ändert den Rechnungspfad, die andere nicht.

                  Sag' ich doch die ganze Zeit. Fallunterscheidung, entweder im ASP-Skript oder in einer aufzurufenden SP auf dem SQL-Server. Der alte Pfad sollte übrigens in einem Nicht-Formular-Element angezeigt werden. Schon ist die eventuelle Manipulation im Client kein Problem mehr. In der Feldliste, die beim Submit übergeben wird, ist der Pfad dann auch nicht drin.

                  Tschö, Auge

                  --
                  Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
                  Hohle Köpfe von Terry Pratchett

                  1. Hervorhebung in der hiesigen Wiedergabe des Zitats von mir. Sie ist im Original nicht enthalten. ↩︎

                  1. Hallo Auge,

                    Das weiß ich, das habe ich (...) auch zum Ausdruck gebracht.

                    Ja. Hast Du. Und ich hab's überlesen. Sorry.

                    Rolf

                    --
                    sumpsi - posui - clusi
                2. Hallo Rolf, ja, ich muss leider mit den Mitteln kämpfen die ich habe, und das sind nicht sonderlich viele ;)

                  Zur Erklärung nochmal: Die Website ist nur für mich und meinen Kollegen. Wir machen und verwalten die EDV. Die Website und Datenbank sollen uns helfen zu inventarisieren, Lizenznachweise zu bringen etc pp.

                  Für den Lizenznachweis eines PC System's benötige ich die Rechnung. Daher habe ich für jedes System eine EDIT Page mit allen Daten des Systems (OS,CPU,SSD,....) sowie einer Möglichkeit die Rechnung zu verlinken. Ich möchte keinen UPLOAD, da die Rechnungsdateien bereits im internen Netz liegen. Das wäre albern Redundant. Ich hätte jetzt einen jeweils fertigen Link für die Rechnungen anhand der Rechnungsnummer (die eindeutig sind) bauen können. Das erfordert aber stets genaues Arbeiten beim Anlegen neuer Ordner und benennen der Dateien. Macht man einen Fehler, funktioniert der Link nicht, und beim Audit gibts dann große Augen.

                  Daher empfand ich den input type file mit lediglicher Pfadübergabe als durchaus sinnvoll. Es wird lediglich der Pfad mit Dateiname in meine Datenbank geschrieben. Diesen Datenbankwert baue ich in ein a href konstrukt, und fertig. Für mich war das eine total saubere Lösung (Laie halt ...)

                  Einen Button Rechnungstext gibt es übrigens nicht (?)

                  Habe mal einen Screenshot gemacht : http://prntscr.com/n4hv17

                  Nun habe ich die UPDATE parameter wie folgt geändert

                  IF (IsNull(Request.Form("Rechnungspfad"))) THEN
                  		MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param14", 201, 1, 500, MM_IIF(Request.Form("RechnungspfadALT"), Request.Form("RechnungspfadALT"), null)) ' adLongVarWChar
                  	Else
                  		MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param14", 201, 1, 500, MM_IIF(Request.Form("Rechnungspfad"), Request.Form("Rechnungspfad"), null)) ' adLongVarWChar	
                  	End If
                  

                  Da ich mit Session Variablen arbeite, habe ich auch anstatt der Request.Form die Session Variable versucht abzufragen. Aber das Ergebnis ist immer das selbe. Ohne eine manuelle Wahl des Inputs, bleibt das Feld leer Die Form RechnungspfadALT ruft als <input type hidden> den value aus der datenbank ab, sollte also den korrekten wert enthalten

                  1. Die Lösung Deines Problems besteht darin, zwischen insert und update zu unterscheiden. MFG

                    1. Hallo pl,

                      nein. Er muss zwischen Update mit Pfad zur Rechnung und Update ohne Pfad zur Rechnung unterscheiden.

                      Rolf

                      --
                      sumpsi - posui - clusi
                      1. Hi Rolf,

                        ja. aber daran scheiterts irgendwie. Ich habe jetzt das Konstrukt:

                        IF (Request.Form("Rechnungspfad") <> "" ) THEN
                        	
                        		MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param14", 201, 1, 500, MM_IIF(Request.Form("Rechnungspfad"), Request.Form("Rechnungspfad"), null)) ' adLongVarWChar	
                        		
                        	Else
                        		MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param14", 201, 1, 500, MM_IIF(Request.Form("RechnungspfadALT"), Request.Form("RechnungspfadALT"), null)) ' adLongVarWChar
                        		
                        	End If
                        

                        Und Ende nun mit einem vollkommen neuen Fehler in einer ganz anderen Zeile, der vorher nicht da gewesen ist.

                         POST /inventur/PCs/PCspeichern.asp |87|800a0d5d|Die_Anwendung_verwendet_für_den_aktuellen_Vorgang_einen_Wert_vom_falschen_Typ
                        

                        Die betreffende Codezeile hat aber überhaupt nichts mehr mit dem "Rechnungspfad" zu tun, und wurde auch vorher nicht angemeckert

                        MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param35", 202, 1, 50, MM_IIF(Request.Form("Anlagennummer"), Request.Form("Anlagennummer"), null)) ' adChar 
                        
                        1. Hallo supernewb,

                          warum du bei der Anlagennummer auf einmal auf die Nase fliegst, kann ich Dir nicht sagen. Ist das Eingabefeld im HTML in der Nähe vom Rechnungspfad und du hast durch einen HTML Fehler erreicht, dass die Anlagennummer auf einmal nicht gesendet wird?

                          Was ist eigentlich MM_IIF? Ist das eine Funktion von Dir? Wie sieht die aus? Ich glaube nämlich, dass man da einiges vereinfachen kann und den IF für den Rechnungspfad auch loswerden kann.

                          Rolf

                          --
                          sumpsi - posui - clusi
                          1. Hallo Rolf, das Problem mit der Anlagennummer hat sich lösen lassen, in dem ich den Wert dahinter in der Tabelle einfach gelöscht habe. Ich kann nun auch wieder neue Werte eintragen, ohne Fehler. Keine Ahnung was mit dem Wert nicht mehr in Ordnung gewesen ist. Hatte auf jeden Fall rein gar nichts mit dem eigentlichen Problem zu tun, war nur blöder Zufall.

                            Ich habe jetzt nochmal aufgeräumt und die Codezeilen neu erstellt. Jetzt geht es, auch mit dem IF für den Pfad

                            IF (Request.Form("Rechnungspfad") <> "" ) THEN
                            	
                            		MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param14", 201, 1, 500, MM_IIF(Request.Form("Rechnungspfad"), Request.Form("Rechnungspfad"), null)) ' adLongVarWChar	
                            		
                            	Else
                            		MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param14", 201, 1, 500, MM_IIF(Request.Form("RechnungspfadALT"), Request.Form("RechnungspfadALT"), null)) ' adLongVarWChar
                            		
                            	End If
                            

                            Alle Prozeduren (MM_XXX) kommen vom Dreamweaver. Das Original Intranet, dass ich übernommen habe, wurde 1904 im Dreamweaver erstellt. Ich habe nun stets versucht das geschriebene zu verstehen (als absoluter HTML LAie), und habe die Prozeduren einfach beibehalten.

                            Das MM_IIF wird hier implementiert :

                            Function MM_IIf(condition, ifTrue, ifFalse)
                              If condition = "" Then
                                MM_IIf = ifFalse
                              Else
                                MM_IIf = ifTrue
                              End If
                            End Function
                            

                            Ich bin mir sogar ganz sicher, dass man den Quelltext vereinfachen könnte, aber dazu fehlen mir bei weitem noch die notwendigen Skills :/

                            Dieses Problem hier aber ist gelöst, und dafür danke ich euch sehr :)

                            1. Hallo supernewb,

                              was tut man nicht alles für SelfHTML - sogar ASP lernen 😂

                              Ich schreibe jetzt ein paar Sachen mehr auf, um Dir etwas mehr Verständnis zu verschaffen.

                              Aaalso - Request.Form("...") liefert ein sogenanntes IStringList Objekt. Dieses Objekt kann im Prinzip drei Dinge: (1) Sagen, wieviele Einträge drin sind, (2) den i-ten Eintrag liefern und (3) einen Enumerator liefern.

                              Um herauszufinden, ob ein <input name="foo"> gepostet wurde, verwendest Du die erste Eigenschaft - sie heißt Count

                              IF Request.Form("foo").Count > 0 THEN
                                 ist da
                              ELSE
                                 ist nicht da
                              ENDIF
                              

                              Um auf beispielsweise den ersten Eintrag zuzugreifen, verwendest Du - um ganz korrekt zu sein - die zweite Eigenschaft:

                              fooWert = Request.Form("foo")(1)
                              

                              Nun ist es aber auch noch so, dass VBScript zwei Arten der Zuweisung unterscheidet: Wertezuweisung und Objektzuweisung. Wertezuweisung passiert immer, wenn Du nichts anderes sagst, das letzte Beispiel macht also eine Wertezuweisung.

                              Und wenn man ein Objekt per Wertezuweisung bewegt, können interessante Dinge passieren. Im Fall einer IStringList wird sie in einen String konvertiert! Deswegen funktioniert es problemlos, wenn man das (1) weglässt und schreibt:

                              fooWert = Request.Form("foo")
                              Response.Write(Typename(fooWert))   ' String
                              

                              Würde es das Feld foo zweimal im Form geben, würde diese Konvertierung beide Feldinhalte zusammenkleben. Angenommen, im einen Feld steht "A" und im anderen steht "B", dann wäre nachher der String "A, B" in fooWert.

                              Um die IStringList in eine Variable zu bekommen, muss man die Objektzuweisung verwenden. Die bekommt man mit dem SET Befehl:

                              SET fooWert = Request.Form("foo")
                              Response.Write(Typename(fooWert))   ' IStringList
                              

                              Wenn Request.Form("foo").Count den Wert 0 liefert, kann das verschiedene Gründe haben.

                              1. Die Seite wurde als GET-Request abgerufen und nicht durch Absenden des Form gepostet. In diesem Fall gibt es keinen POST-Body und logischerweise sind alle Form-Werte leer. Diesen Fall erkennst Du aber besser über Request.ServerVariables("REQUEST_METHOD") = "GET"
                              2. Es gibt kein Eingabefeld mit name="foo" im Form
                              3. Es gibt einen Button dieses Namens und der Button wurde nicht zum Senden des Forms verwendet
                              4. Es gibt Checkboxen oder einen Radiobuttons dieses Namens, aber nichts davon war checked.

                              Was heißt das jetzt für Dich?

                              • Um zu erkennen, ob jemand beim POST eine Datei ausgewählt hat, ist die Prüfung auf einen Leerstring richtig.
                              • Deine MM_IIF Funktion könntest Du in eine MM_NichtLeer Funktion umbenennen und so aufbauen:
                              FUNCTION MM_NichtLeer(a, b)
                                 IF IsNull(a) OR a = "" THEN MM_NichtLeer = b ELSE MM_NichtLeer = a
                              END FUNCTION
                              

                              Du musst dann den ersten Parameter nicht immer doppelt übergeben (was ich derzeit ständig bei Dir sehe).

                              • Deinen Werteretter für den Dateinamen könntest Du über
                                MM_NichtLeer(Request.Form("Rechnungspfad"), RequestForm("RechnungspfadALT"))
                                realisieren

                              Was allerdings nicht dauerhaft funktionieren wird, ist das Speichern des vollständigen Pfades. Das ist eine Eigenschaft des Internet-Explorers, und der ist tot, tot, tot. Es ist nicht sinnvoll, eine Anwendung zu erstellen, die bestimmte Eigenschaften des IE voraussetzt. Und das Übermitteln des Pfades bei einem Upload gehört dazu. Das ist ein schweres Sicherheitsloch im IE und alle anderen Browser geben sich größte Mühe, den Pfad zur Datei vor der Webanwendung zu verstecken!

                              Quellen (alles englisch)

                              Rolf

                              --
                              sumpsi - posui - clusi
                      2. Für ein Update werden üblicherweise beim Laden des Forms bereits vorhandene Werte in Felder übernommen. Was bei input type file bekanntlich nicht geht. Das ist das Problem. MFG

  2. input type="file" überträgt keine lokalen Pfade. Wenn das der Fall sein sollte ist es ein veralteter IE und ein Sicherheitsproblem. Des Weiteren wird das Feld nur übermittelt wenn eine Datei bzw. mehrere Dateien anhänglich sind. GG

    1. hallo pl

      wenn das feld nur übermittelt wird bei Dateiübergabe, dann müsste die Variable dahinter doch NULL sein, oder?

      1. HTTP kennt kein NULL. Es gibt höchstens Parameter ohne Wert und da ist es eine Frage Deiner Implementierung ob das als Leerstring oder NULL interpretiert wird.

        MFG

        1. aufgrund des Hinweises von pl habe ich jetzt mal probiert, selbiges über den Google Chrome zu erreichen .. Und tatsächlich, der Chrome gibt mir den Pfad nicht weiter. Lediglich den Dateinamen. Das ist nicht sehr zukunftsorientiert. Gibt es eine andere Möglichkeit, den Pfad übergeben zu können ?

          1. Dein ganzes Konzept ist nicht zukunftorientiert. Du hast Netzlaufwerke und Pfade die sich ändern können. Wenn dieser Fall eintritt sind alle Deine Daten inkonsistent.

            Von daher gibt es schon immer andere Verfahren zur Identifikation von Dateien: Checksummen. Über eine zentrale Repository könntest Du auch eine Versionsverwaltung setzen. Wenn wir also von Zukunftsorientierung reden, dann von von sowas. MFG

          2. Tach!

            Und tatsächlich, der Chrome gibt mir den Pfad nicht weiter. Lediglich den Dateinamen. Das ist nicht sehr zukunftsorientiert. Gibt es eine andere Möglichkeit, den Pfad übergeben zu können ?

            Vermutlich nicht mit Webtechniken. Bei einem File-Upload interessiert den Server nicht, wo die Datei auf dem Client lag. Deswegen wirst du da nicht rankommen, die Browser werden dich bei diesem Vorhaben nicht unterstützen.

            dedlfix.

          3. Hallo supernewb,

            es gab früher mal Möglichkeiten, aus der Browser-Sandbox auszubrechen. Java Applets, Silverlight-Applets, Flash, all das stirbt aus, weil es einfach zu riskant ist um in der weiten Welt eingesetzt zu werden.

            Dass die Welt in Intranets anders aussieht, weiß ich, und das wissen auch Google, Microsoft und andere, aber auch in Intranets könnte ein bösartiges Applet - das irgendwoher gekommen ist - Schaden anrichten. Deswegen wird auch da der Weg versperrt.

            Per Browser eine Referenz auf eine im Netz existierende Datei - das wirst Du nicht dauerhaft möglich machen können.

            Ich weiß nicht ob ich das schon mal gefragt habe - aber Du sagst die Dateien stehen im Netz. Hat der Webserver Zugriff auf die Ablageorte dieser Dateien? Gibt es eine Systematik, wie sie abgelegt sind, so dass man ggf. nicht alle Ablageorte zur Auswahl anbieten muss?

            In dem Fall könnte man zur Auswahl der Datei eine Art serverseitig getriebenen Dateibrowser programmieren, statt das File Control zu verwenden. D.h. der Server liefert eine Liste von Dateien zur Auswahl, und der User wählt eine davon. DANN kennt der Server den Pfad. Sowas kann man beliebig kompliziert und komfortabel anbieten.

            Rolf

            --
            sumpsi - posui - clusi
            1. Hallo Rolf, und Danke für deine Bemühungen.

              Wie würde das aussehen? Hast du ein Beispiel für mich, dass mir der der Vorstellung hilft? Grundlegend aber befindet sich das Netzlaufwerk nicht direkt im Webserver, sodass dieser keinen Zugriff "lokal" auf die Daten hat. Da ich selber am Webserver nichts machen darf, komme ich dort auch nicht weiter.

              Das der jetzige, meinige Weg nicht zukunftsorientiert ist, weiß ich - habe das ja selbst angemerkt. Nun ist die Frage, wie man dieses unterfangen ohne redundanten Upload geschickt und gesichert umsetzen kann. Eine Möglichkeit wäre die Pfade nach immer dem selben Schema auszurichten und zu benennen. Machbar, aber sehr aufwändig und bei archivierten Daten schon etwas schwieriger.

              Der Hinweis von pl bezüglich Checksummen ist für mich jetzt erstmal rätselhaft. Wie hilft mir das weiter? Wie würden über ein repo die zugriffe aussehen?

              1. Hallo supernewb,

                ich glaube, das Thema wird als Forensupport arg komplex.

                Es ist jedenfalls nicht wichtig, ob das Laufwerk mit den Dateien im Webserver ist. Wichtig ist nur, dass der Webserver darauf zugreifen kann. Er muss ja auch gar nicht die Dateien auslesen können, es reicht, das Verzeichnis lesen zu dürfen. Und es ist wichtig, dass sich die Ordner mit den Dateien darin für alle User gleich präsentieren. Wenn der eine dafür Laufwerk K hat und der andere Laufwerk Q:, ist es schon schwierig. Hier helfen UNC Pfade (\\myserver\myshare\dir1\dir2\datei.dat), aber die gehen kaputt wenn der Server umbenannt wird. Wenn man über längere Zeit von einer Anwendung aus Dateien referenzieren will, braucht man ein Ablagekonzept, das auch Serverumzüge übersteht. Wieviele Ordner habt ihr? Gibt es eine Systematik? Wenn es bspw. nur 20 Ablageorte gibt, könnte man deren Pfade im Web konfigurieren - und wenn ein Ordner umzieht, die Konfiguration anpassen.

                Wenn die Dateien irgendwie kreuz und quer verteilt liegen, habt ihr eventuell sowieso ein Ablageproblem und ein Archivier-Upload auf eine zentrale Instanz könnte nützlich sein. Ein Upload mit ASP ist allerdings wieder ein neues Problem, denn im Gegensatz zu bspw. PHP oder ASP.NET gibt es keine Unterstützung, Du musst den multipart-Datenstrom selbst parsen. Dafür kann man Komponenten im Netz finden (die habe ich nämlich gefunden als ich nach "Upload mit ASP" gesucht habe).

                Wenn Du einen File Selektor bauen willst, ist es nicht so schlimm dass du selbst am Server nichts machen darfst. Es muss nur ein Admin da sein, der mitmacht. Wenn Du DEN nicht hast und nur über Fileupload von ASP Dateien herumfummeln darfst, dann wird es mühsam bis unmöglich. Zugriffe müssen berechtigt werden, dafür brauchst Du den Admin.

                Ein Webserver kann durchaus auf File Shares im Netz zugreifen, wenn der User, unter dem die Website läuft (sprich: Der für den Application Pool eingestellte User) im Netzwerk Rechte hat. Wenn ihr ein Active Directory Netz habt, heißt das: Es muss ein Domänen-User sein. Sowas ist ohnehin nützlich, wenn man externe Services wie Webservices oder Datenbanken nutzt, weil man dann mit Integrated Authentication arbeiten kann und keine technischen User/Passwörter in der Anwendung hinterlegen braucht. Und einen Domain User kann man dann auf die Ordner lesend berechtigen, wo die Dateien liegen. Es ist natürlich nicht ganz trivial, und es muss mit den Admins besprochen sein.

                Wenn ihr ein Arbeitsgruppen-Netz habt, sieht die Berechtigererei etwas anders aus, ist aber auch möglich. Nur hab ich damit keine Erfahrung.

                Wenn Du die Rechte hast, dann gibt es in ASP es das Server Objekt. Mittels Server.CreateObject("System.FileSystemObject") kommst Du an das FileSystemObject heran und damit kannst Du Verzeichnisse lesen.

                Basierend darauf kannst Du dann eine Dateiauswahl anbieten. Ein Beispiel habe ich nicht, dazu müsste ich mich jetzt erstmal in ASP hineinhängen und etwas bauen...

                Rolf

                --
                sumpsi - posui - clusi
                1. Hallo Rolf, unglaublich, wieviel Mühe du hier reinsteckst. Vielen, vielen Dank.

                  Ich sehe mir das FileSystemObject mal an. Zudem denke ich mir eine sinnvolle Struktur aus, um den Upload umgehen zu können.

                  Mal sehen, was ich finde.

                  Wir arbeiten mit einer AD und entsprechender Domäne

                  1. AD klingt nach LDAP. Es würde mich wundern wenn MS keine Clientanwendungen hierzu hätte. Da musst Du das Rad nicht neu erfinden. MFG

                    1. Hallo pl,

                      korrekt, LDAP wäre eine Notation, um Abfragen auf das AD zu formulieren. Das ist für Supernewbs Programmierung aber nicht nötig, es sei denn, er fängt auf einmal mit rollenbasierenden Berechtigungen an, die über die Zugehörigkeit zu AD Gruppen gesteuert werden (sowas muss ich tun, aber glücklicherweise nicht mit ASP und VBScript, sondern mit ASP.NET und C#).

                      Clientanwendungen gibt's natürlich für das AD, aber wenn man tatsächlich das AD anprogrammieren muss hilft das nichts. Unter ASP braucht man dann die COM Komponente ADODB.Connection und den Provider ADsDSOObject. Das habe ich gegoogelt, gemacht habe ich es noch nie. Ich kenne nur die Directory-Objekte aus der .net Runtime. Möglicherweise greifen die unter der Haube auch auf diese COM Komponente zu.

                      Aber wie auch immer, die Frage, ob das Netz mit einer AD Domäne aufgebaut ist, ist hier lediglich für die Frage relevant, wie man die nötigen Rechte administriert. Und dafür gibt's Tools, die die Admins verwenden. AD-Tools und IIS-Tools.

                      Rolf

                      --
                      sumpsi - posui - clusi
                      1. So isses. Im Prinzip gibt es alles schon. Sogar Versionsverwaltungen für Dateien. MFG