1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

[Access] Update/Insert Via addnew oder Sql Statment/Schleife

Dieses Thema im Forum "Office-Anwendungen" wurde erstellt von Willi_Kaiser, 16. Februar 2012.

  1. Willi_Kaiser

    Willi_Kaiser Grünschnabel

    Hallo liebe Community,

    ich habe mal eine Frage. Ich habe eine Benutzeroberfläche in Access.
    Dort werden per Abfrage Datensätze aus einer Datenbank selektiert und in Textfelder reinkopiert. Nun sollte ich an den Textfeldern Änderungen machen und dann die Datensätze updaten. Jetzt mein Problem:

    Hatte es mit einer Schleife gemacht, dort waren 1 Update Abfrage und 2 Insert Abfragen drinne. (Ist für die Bearbeitung notwendig)
    Das ganze dauerte aber für 5 oder 20 Datensätze ca. 26 Sekunden.
    Und das ist viel zu lang. So ich habe im Internet gelesen, dass man es per addnew und update machen kann/soll. Ich habe es angewendet, aber es dauert teilweise noch länger.
    Ich weiß jetzt nicht direkt, wo mein Fehler ist. Ich poste mal meine Daten vielleicht wisst ihr das ja.

    Ich benutze Access 2007 auf Windows 7 Home Premium, 4 Gb Ram und einer schnellen Internet Leitung.


    Nun zum Code:

    Code (Text):
    1.  
    2.  
    3. Set Conn = CurrentProject.Connection
    4. Set DBS = New ADODB.Recordset
    5.    
    6. DBS.Open "Tabelle", Conn, adOpenKeyset, adLockOptimistic
    7.                
    8.                
    9. DBS.AddNew
    10. DBS.Fields("Feld1") = Inhalt
    11. DBS.Fields("Feld2") = Inhalt
    12. DBS.Fields("Feld3") = Inhalt
    13. DBS.Fields("Feld4") = Inhalt
    14.  
    15. DBS.Update
    16. DBS.Close
    17.  
    18.  

    Code (Text):
    1.  
    2. Do While Not rs.EOF
    3. 'rec.Open "UPDATE Tabelle SET XXX = XXXX , cnn, adOpenStatic, adLockBatchOptimistic
    4.  
    5. 'rec.Open "INSERT Tabelle (XXXXXX) cnn, adOpenStatic, adLockBatchOptimistic
    6.  
    7. 'rec.Open "insert into Tabelle (XXXXXXX), cnn, adOpenStatic, adLockBatchOptimistic
    8. '
    9.  Loop
    10.  
    11.  
    So sieht es ungefähr aus, an den Update Befehlen ansich könnte es eigentlich nicht liegen, da ich an derer Stelle die selben Befehle benutze, nur ohne Schleife.
    Eigentlich habe ich die Frage fast selbst beantwortet würden jetzt einige sagen, aber ich weiß einfach nicht was an der schleife sein könnte.

    Danke fürs lesen und eure Tipps
  2. Yaslaw

    Yaslaw n/a Moderator

    item: im zweiten code. Was ist rs? Greift das auf dieselbe Tabelle zu die du Updaten willst?

    item: Ebenfalls im Zweiten. Was ist Rec?

    item: Immer noch zum 2. Das sind ganz komische Statements die du da auskommentiert hast. Keiens davon scheint mir sauber zu sein.
  3. Willi_Kaiser

    Willi_Kaiser Grünschnabel

    rec ist definiert als recordset:
    Dim rec As ADODB.Recordset
    Set rec = New ADODB.Recordset

    und rs, da habe ich mich verguckt, es war eine andere Sache. eigentlich steht da eine For schleife die bis 5 geht.
  4. Yaslaw

    Yaslaw n/a Moderator

    Du mischst da aber etwas. Ein Recordset ist ekin UPDATE oder INSERT
    Code (Visual Basic):
    1. Do While Not rs.EOF
    2.      'rec.Open "UPDATE Tabelle SET XXX = XXXX , cnn, adOpenStatic, adLockBatchOptimistic
    3.     'rec.Open "INSERT Tabelle (XXXXXX) cnn, adOpenStatic, adLockBatchOptimistic
    4.     'rec.Open "insert into Tabelle (XXXXXXX), cnn, adOpenStatic, adLockBatchOptimistic
    5. Loop
    Was willst du damit?

    Ein Update würde so aussehen
    Code (Visual Basic):
    1. Dim sql As String
    2.  
    3. sql = _
    4.     "UPDATE myTable " & _
    5.     "SET " & _
    6.     "    [Feld1] = '" & myForm!var1 & "', " & _
    7.     "    [FELD2] = '" & myForm!var2 & "' " & _
    8.     "WHERE ID = " & myForm!id
    9.  
    10. Call currentdb.Execute(sql)
  5. Willi_Kaiser

    Willi_Kaiser Grünschnabel

    Hmm... jetzt wo du es sagst, leuchtet ein. Ich probiere es mal so umzuschreiben und sage dann wie es ausschaut.
  6. Willi_Kaiser

    Willi_Kaiser Grünschnabel

    Wow ich habe es so umgesetzt, wie du es gesagt hast und nun habe ich die abfrage die vorher für 5 Datensätze 26 Sekunden gedauert hat nur 5 Sekunden gedauert und für 20 Datensätze nur 15 Sekunden. Vielen vielen Dank!

    Habe alles jetzt so wie du oben geschrieben hast umgesetzt.

    Code (Text):
    1.  
    2. Dim sql As String
    3.  
    4. sql = _
    5.     "UPDATE myTable " & _
    6.     "SET " & _
    7.     "    [Feld1] = '" & myForm!var1 & "', " & _
    8.     "    [FELD2] = '" & myForm!var2 & "' " & _
    9.     "WHERE ID = " & myForm!id
    10.  
    11. Call currentdb.Execute(sql)
    12.  
  7. Willi_Kaiser

    Willi_Kaiser Grünschnabel

    Hallo nochmal,

    ich bins noch mal.
    Das Thema will einfach nicht locker lassen. Ich habe eine Schleife die bis zu 5 mal durchlaufen wird, das dauert ca. 5 Sekunden, was irgendwie ziemlich lang ist. Ich habe hier 3 Statements die jeweil beim durchlaufen ausgeführt werden. Die Schleife ist eine For Schleife.

    Code (Visual Basic):
    1.  
    2. sql = "UPDATE Tabelle SET Spalte = 20, Spalte = 125,Spalte=now() WHERE Spalte = 38857"
    3. Call CurrentDb.Execute(sql)
    4.  
    5. sql = "INSERT INTO Tabelle (Spalte,Spalte,Spalte,Spalte)SELECT 38857,20,10026,904757 FROM  Bestellung Where Spalte = 38857"
    6. Call CurrentDb.Execute(sql)
    7.  
    8. sql = "insert into Tabelle (Spalte,Spalte,Spalte,Spalte)SELECT 38857,10026,125,904757 FROM  Bestellung Where Spalte = 38857"
    9. Call CurrentDb.Execute(sql)
    10.  
    Je nachdem wie oft er die schleife durchläuft dauert es bei 20 Durchgängen bis zu 25 Sekunden.
    an was könnte das den liegen ?
  8. Yaslaw

    Yaslaw n/a Moderator

    Code (SQL):
    1. INSERT INTO Tabelle (Spalte,Spalte,Spalte,Spalte)SELECT 38857,20,10026,904757 FROM  Bestellung WHERE Spalte = 38857
    Warum ein SELECT wenn du nur Werte ahst?

    Code (SQL):
    1. INSERT INTO Tabelle
    2. (Spalte,Spalte,Spalte,Spalte)
    3. VALUES(38857,20,10026,904757)
    Zuletzt von einem Moderator bearbeitet: 23. Mai 2014
  9. Willi_Kaiser

    Willi_Kaiser Grünschnabel

    Entschuldigung in diesem Beispiel wird das Falsch dargestellt.
    Eigentlich werden die per "Select" herausgefunden.

    hier das Original:
    Code (Visual Basic):
    1.  
    2. Sql = "insert INTO log_inter (Artikel_ID,Operator,Inter_Status,Artikelnummer)SELECT Artikel_ID,'" & Forms!Anmeldung!Tf_PIN & "',125,Artikelnummer FROM  Bestellung Where Katalog='H&M' and Inter_Status=120 "
    3. Call CurrentDb.Execute(Sql)
    4.  
  10. Yaslaw

    Yaslaw n/a Moderator

    Wie gross sind die Tabellen?
    Hast du in der Tabelle Bestellung ein Index auf Katalog&Inter_Status?

Diese Seite empfehlen