supernewb: ADO - ASP und Access - Datenbankeintrag mehrfach duplizieren

hi ich suche einen Weg in meiner Datenbank einen Eintrag zu duplizieren. Das ginge jetzt grundlegend ganz einfach mit einem INSERT. Aber ich möchte ihn gerne x-mal kopieren? Es handelt sich um eine Inventurdatenbank, in der ich Hardware aufliste. Wenn ich nun beispielsweise 20 Laptops geliefert bekomme und diese übers WebIF in die Datenbank eintragen möchte, würde ich gerne einen Eintrag erstellen und diesen dann 19 mal kopieren, sodass ich nur noch Daten ändern muss die die entsprechenden Geräte einzigartig machen (Seriennummer, MAC/IP Adresse, etc.. )

Da fehlt mir jetzt die Idee, wie ich z.B. auf Knopfdruck 19 INSERTs machen kann

Habt ihr einen Vorschlag für mich ?

Danke ;)

Grüße

akzeptierte Antworten

  1. Tach!

    Da fehlt mir jetzt die Idee, wie ich z.B. auf Knopfdruck 19 INSERTs machen kann

    Ein Insert in einer Schleife, die 19 Durchläufe hat. Sowas muss ja nicht super ausgeklügelt sein. Ein Computer macht auch stupide Wiederholarbeit ohne zu murren. Zur Not geht auch ein Insert-Statement 19x kopiert. Kopieren ist aber schlecht wenn man mal eine Änderung vornehmen möchte.

    dedlfix.

    1. hy dedlfix und danke für deine Antwort :)

      Die 19 war jetzt freilich nur ein Beispiel. Der echte Wert müsste aus einem Textfeld geholt werden. Mal sind es 20 Notebooks, und mal nur 4. Die Schleife wäre eine gute Idee. Lässt sich das im INSERT realisieren ?

      Wie könnte das aussehen? Bin da leider nicht so der Profi

      1. Tach!

        Die Schleife wäre eine gute Idee. Lässt sich das im INSERT realisieren ?

        Nein, die Schleife muss drumherum gebaut werden. Beim Programmieren zerlegt man üblicherweise das Problem in kleine Schritte und kombiniert diese dann für das gewünschte Ergebnis. Und so sind die Anweisungen auch meist aufgebaut, dass sie nicht alles selbst können, aber miteinander verwendet werden können.

        Wie könnte das aussehen? Bin da leider nicht so der Profi

        Das kann ich dir für Access nicht sagen, aber Schleifen sind grundlegendes Handwerkszeug, dazu findest du garantiert Beispiele im Netz.

        dedlfix.

        1. ich hab's nun mal so versucht

          Dim i
          DO until i = Session("Eintraege") "INSERT INTO ...." 
          Loop
          

          Session("Eintraege") kommt aus einem input Feld

          Leider gibt es einen Syntaxfehler. Sowas hatte ich schon erwartet :D

          1. Hallo,

            ich hab's nun mal so versucht

            Dim i
            DO until i = Session("Eintraege") "INSERT INTO ...." 
            Loop
            

            Session("Eintraege") kommt aus einem input Feld

            Leider gibt es einen Syntaxfehler. Sowas hatte ich schon erwartet :D

            Ich habe deinen Code-Schnipsel mal als solchen ausgezeichnet, ohne zu wissen, welche Sprache es ist.

            Deine Schleife benötigt einen Zähler (das i), der eben auch hochgezählt werden muss.

            Außerdem sollte die Abbruch-Bedingung (das until) auch als Vergleich notiert sein. Im Moment sieht es wie eine Zuweisung aus.

            Gruß
            Kalk

            1. hi kalk :)

              die sprache ist asp bzw vbscript. Datenbank ist access

              ich dachte auch das ich evtl was falsch hatte beim do until. Daher habe ich jetzt eine FOR schleife probiert Aber hier kommt das selbe raus :-/

              FOR i = 0 To Session("Eintraege")
              MM_editCmd.CommandText = "INSERT INTO ...."
              i = i + 1  
              	Next
              

              damit kommt zwar kein Fehler mehr, aber der INSERT Befehl wird nur 1x durchgeführt

              1. Hallo,

                Aber hier kommt das selbe raus :-/

                Das ist dann der Zeitpunkt, debugging zu betreiben. Also Schritt für Schritt guggen, ob der Code das Erwartete tut. Da hat vermutlich sogar vbscript Tools dafür…

                Gruß
                Kalk

                1. mh, dann mach ich mich mal schlau

                  wahrscheinlich aber wirds wohl einen workaround geben müssen

                  danke kalk

              2. Hallo supernewb,

                du betreibst das doch nun schon eine ganze Weile, und bist immer noch so unbeholfen mit VBScript? Daran musst Du dringend arbeiten. Wie man Schleifen programmiert und Befehle voneinander abgrenzt, das ist absolutes Grundwissen. Kennst Du den ASP Teil von W3Schools?

                1. Eine FOR Schleife zählt den Zähler für Dich automatisch, da musst Du ihn nicht selbst zählen (wenn Du es doch tust, würde die Schleife in Zweierschritten springen).

                2. Eine DO Schleife prüft nur eine Bedingung, da hättest Du selbst zählen müssen. Eine DO Schleife, wo Du nicht selbst zählst, läuft endlos. Die FOR-Schleife ist für deinen Zweck die einfacherere Lösung.

                3. DO until i = Session("Eintraege") ist grundsätzlich richtig in VBScript. Der Einwand von Tabellenkalk, dass das wie eine Zuweisung aussähe und deswegen falsch wäre, gilt nur für Sprachen der C-Familie (wozu auch C#, Java und JavasSript gehören).

                4. Wenn in Session("Eintraege") die Anzahl von INSERTs steht, die ausgeführt werden sollen, dann darfst Du die FOR Schleife nicht bei 0 beginnen lassen. Beispielsweise lässt FOR i=0 TO 3 die Schleife für i=0, 1, 2, 3 laufen, also 4 Durchläufe. Du musst mit i=1 beginnen. VB hat 6 Schleifenvarianten, und man muss das Verhalten jeder einzelnen genau beachten, sonst hat man einen Durchlauf zu viel oder zu wenig.

                5. Der Steuerbefehl für eine Schleife und die Befehle in der Schleife sind zwei verschiedene Dinge, diese Befehle müssen voneinander getrennt werden. Das ist vermutlich der Syntaxfehler in

                Dim i
                DO until i = Session("Eintraege") "INSERT INTO ...." 
                Loop
                

                Entweder muss hinter dem Test ein Doppelpunkt kommen (neuer Befehl in der gleichen Zeile) oder der INSERT-Befehl muss in eine eigene Zeile.

                1. Du kannst nicht einfach einen SQL Befehl in Anführungszeichen notieren. Da musst Du, wie auch sonst, ein SQL-Statement erzeugen und ausführen. Aber ich nehme einfach mal an, dass Du Dir die Schreibarbeit sparen wolltest und nur das SQL notiert hast.

                Rolf

                --
                sumpsi - posui - clusi
                1. Hallo Rolf (:

                  Ja, dass stimmt wohl leider. Ich beschäftige mich immer nur alle jubeljahre damit Dann ist oft so viel Zeit dazwischen, dass ich das alt-gelernte schon wieder vergessen habe Ich hatte noch nie was mit Programmierung am Hut, und will das auch eigentlich gar nicht.

                  Ich kann aber der Tatsache nichts entgegen tun, dass es wirklich toll ist eine solche Inventurliste (nur beispiel) selbst zu kreieren, genau so, wie es MIR am besten passt. daher ärgere ich mich selbst sehr, dass ich immer wieder in Schwierigkeiten komme. Wobei ich die letzten fünftausend probleme ohne SELFHTML lösen konnte :D

                  Ich habe oft probleme mit den Syntaxen. Wie schreibt man wo was, wo darf ich das und wo nicht Einfache FOR Schleifen kenne und kann ich schon aus dem Scripting. Aber im ASP/VBSCRIPT/HTML Bereich ist das eben alles anders Datenbank ist übrigens ACCESS, kein SQL

                  Dim zaehler
                  	zaehler = 1
                  	
                  	MM_editCmd.CommandText = 
                  	FOR zaehler = 1 To Session("Eintraege") 
                  	"INSERT INTO ...."
                  Next
                  

                  So habe ich das jetzt aufgebaut, und erhalte einen syntaxfehler. mit sicherheit, da ich einen break nach MM_editCmd.CommandText = habe, ohne sofort den INSERT Befehl zu geben

                  Deinen Hinweis mit dem Doppelpunkt habe ich leider nicht geschnallt ... Wo soll der hin ?!

                  Sorry :/

                  Und Danke

                  1. Hallo supernewb,

                    Datenbank ist übrigens ACCESS, kein SQL

                    SQL bedeutet Structured Query Language. Das ist also die Sprache, in der (bzw. im passenden Dialekt) Anweisungen für dein Datenbanksystem geschrieben werden müssen. Auch Access versteht SQL, und zwar (mit Einschränkungen) SQL-92.

                    Bis demnächst
                    Matthias

                    --
                    Pantoffeltierchen haben keine Hobbys.
                    ¯\_(ツ)_/¯
                    1. Danke für die Aufklärung :) Ich nahm an, wir sprachen von MySQL

                  2. Hallo,

                    So habe ich das jetzt aufgebaut, und erhalte einen syntaxfehler.

                    Du bekommst doch nicht nur „Syntaxfehler!“ vor den Latz geknallt, oder?

                    mit sicherheit, da ich einen break nach MM_editCmd.CommandText = habe, ohne sofort den INSERT Befehl zu geben

                    Zwei grundsätzliche Vorgehensweisen: Entweder in der Schleife ein langes Statement für alle Inserts zusammenbauen und dann anschließend ausführen
                    oder
                    innerhalb der Schleife jeweils ein Insert ausführen.

                    Du scheinst irgendein Mittelding zu versuchen.

                    Gruß
                    Kalk

                    1. Hallo,

                      So habe ich das jetzt aufgebaut, und erhalte einen syntaxfehler.

                      Du bekommst doch nicht nur „Syntaxfehler!“ vor den Latz geknallt, oder?

                      tatsächlich doch :-/ 2019-08-02 09:15:12 10.0.10.31 POST /inventur/PCs/PCspeichernNeu.asp |42|800a03ea|Syntaxfehler 80

                      1. Hallo,

                        tatsächlich doch :-/ 2019-08-02 09:15:12 10.0.10.31 POST /inventur/PCs/PCspeichernNeu.asp |42|800a03ea|Syntaxfehler 80

                        Da hab ich jetz noch die kleine, aber unbegründete Hoffnung, dass entweder die 42 oder die 80 ein dezenter Hinweis auf die Zeilennummer sein soll…

                        Gruß
                        Kalk

                        1. richtig. Die 42 zeigt die Zeile. Und das wiederrum ist die

                          MM_editCmd.CommandText =
                          
                          1. Hallo,

                            Ok

                            Da sind wir dann wieder bei der grundsätzlichen Vorgehensweise. Dem MM... musst du was zuweisen?!

                            Gruß
                            Kalk

                            Edith flüstert: da darf jedenfalls keine Schleife zugewiesen werden

                            1. hinter den command text kommt die anweisung

                              ich habe keinen schimmer, wie ich da die schleife drum bastle :/

                              1. Hallo,

                                hinter den command text kommt die anweisung

                                und zwar, wenn ich das richtig verstehe, als String. Den kann man mit Stringoperationen so zusammenbauen, wie man ihn braucht. Wenn man im String Teile mehrfach benötigt, macht man das innerhalb der Schleife, den Rest erledigt man außerhalb.

                                Gruß
                                Kalk

                        2. Hallo Tabellenkalk,

                          Da hab ich jetz noch die kleine, aber unbegründete Hoffnung, dass entweder die 42 oder die 80 ein dezenter Hinweis auf die Zeilennummer sein soll…

                          und die andere Zahl ein dezenter Hinweis auf den Fehlercode.

                          Bis demnächst
                          Matthias

                          --
                          Pantoffeltierchen haben keine Hobbys.
                          ¯\_(ツ)_/¯
                        3. Hallo Tabellenkalk,

                          Hallo,

                          tatsächlich doch :-/ |800a03ea|Syntaxfehler 80

                          https://www.computerperformance.co.uk/error-codes/800a03ea/

                          Bis demnächst
                          Matthias

                          --
                          Pantoffeltierchen haben keine Hobbys.
                          ¯\_(ツ)_/¯
                  3. Hallo supernewb,

                    ich weiß ja nicht, warum die anderen hier das nicht sehen...

                    Dim zaehler
                    	zaehler = 1
                    	
                    	MM_editCmd.CommandText = 
                    	FOR zaehler = 1 To Session("Eintraege") 
                    	"INSERT INTO ...."
                    Next
                    

                    das ist ja sowas von Syntaxerror. CommandText ist eine Eigenschaft der ADODB.Command Objektes, dem musst Du einen String zuweisen, wo genau ein SQL Statement drin steht. Du kannst einer Eigenschaft keine Schleife zuweisen. Das Command könnte damit überhaupt nichts anfangen.

                    Das muss andersrum gemacht werden: Baue eine Schleife, und in jedem Durchlauf erzeugst Du ein Command-Objekt, setzt den CommandText auf das SQL statement und führst das Command-Objekt aus. Den Zähler eigens auf 1 setzen brauchst Du nicht, das macht der FOR Befehl für Dich. Das ADODB.Command-Objekt kannst Du meines Wissens vor der Schleife erzeugen und pro Durchlauf wiederverwenden.

                    Dim zaehler, insertCmd
                    
                    SET insertCmd = CreateObject("ADODB.Command")
                    insertCmd.ActiveConnection = ...
                    
                    FOR zaehler = 1 To Session("Eintraege") 
                      insertCmd.CommandText = 	"INSERT INTO ...."
                      insertCmd.Execute()
                    Next
                    

                    Rolf

                    --
                    sumpsi - posui - clusi
                    1. Rolf ... du hast mir hier schon so oft geholfen ... Ich liebe Dich 🤗

                      So funktioniert das jetzt. Absolut super

                      Deine Erklärung kann ich auch nachvollziehen.

                      Ich Danke Dir 😀