2017-12-29 26 views
0

Ich habe ein ziemlich kniffliges Problem, das ich nicht lösen kann.Aktualisieren/bearbeiten mehrere Datensätze in der Listbox mit Wert aus dem Textfeld

Ich habe eine Access-Datenbank von Werkzeugen in einem Lagerhaus gespeichert, die von ihm an die Produktionsstätte ausgeliehen werden. Ich habe eine Tabelle, die die Daten der Ausleihe und die Rückgabe der Artikel an das Lager speichert (mit anderen Daten wie Arbeiter ID usw.). Während sich das Element außerhalb des Warehouse befindet, ist das Feld returning_date in der Tabelle leer.

So erstellte ich eine Abfrage, die nur zeigt Datensatz mit returning_date Feld leer und ein Formular mit einem (Mehrfachauswahl) Listbox, die Daten aus Abfrage und einem Textfeld, das Datum formatiert ist. Nun, was ich erreichen möchte, ist in der Lage zu sein, mehrere Datensätze in der Listbox auszuwählen und ausgewählte zu aktualisieren, die ein Datumsfeld mit einem Datum aus dem Textfeld zurückgeben. Das Problem, das ich habe, ist, dass ich nicht weiß, wie das bestimmte Feld in ausgewählten Datensätzen aufgerufen wird, um die Daten dort einzufügen. Ist das möglich, wie ich gekommen bin? Wenn nicht, wie kann ich dieses Problem lösen?

Edit: für den Iterationsprozess habe ich versucht, zwei Arten von Iteration zu verwenden:

For Each varItm In Me.Listbox.ItemsSelected 
'update statement should go here 
Next varItm 

und die zweite:

For i = 0 to Listbox.ItemsSelected.Count - 1 
'update statement 
Next i 

Ich hatte einige Probleme mit Variablen und fehlende Objekte (Laufzeit Fehler 424), aber das Hauptproblem ist, dass ich nicht weiß, wie man die Daten in bestimmte Felder ausgewählter Zeilen einfügt.

+0

Verwenden Sie VBA. Iterieren durch das ausgewählte Element (ItemsSelected) und führen eine Aktualisierungsanweisung für jedes ausgewählte Element aus. Verweisen Sie in der Anweisung auf das Formularfeld, das die Rückgabedaten darstellt. Fügen Sie das Rückgabedatenfeld in der Kopfzeile Ihres Formulars ein. Probieren Sie es zuerst selbst aus. – Rene

+0

Danke für die Antwort. Ich weiß, dass ich für jedes ausgewählte Element iterieren muss, aber welche Update-Anweisung sollte ich verwenden? Ich dachte über die Verwendung von Recordset, aber immer noch, ich weiß nicht, wie Sie auf die ausgewählten Elemente verweisen –

+0

Haben Sie den Iterationscode? Bearbeiten Sie Ihre Frage, um sie anzuzeigen. – June7

Antwort

1

Ihre Listbox sollte mindestens zwei Spalten enthalten, die Daten aus der Quellabfrage bereitstellen. Der erste sollte die ToolID sein und der zweite der ToolName (oder was auch immer Ihr Feld heißt, das den Namen des Werkzeugs enthält). Eine Schaltfläche in der Nähe kann die oben beschriebene Routine ausführen, um sicherzustellen, dass sie erst dann ausgeführt wird, wenn alle Elemente richtig ausgewählt wurden. Identifizieren Sie dann die columns-Eigenschaft, um die ID-Nummer abzurufen, für die die Abfrage ausgeführt werden soll. Beachten Sie jedoch, dass in Access die erste Spalte 0 ist, genau wie der erste Datensatz in einer Listbox 0 ist (daher haben Sie am Ende der Liste eine -1).

Hier ist eine Methode, wenn Sie die Update-Routine für jede ID einzeln anrufen möchten:

Dim ToolID as Long 
Dim strSQL as String 
For i = 0 To Me.lsbTools.ListCount - 1 
    If Me.lsbTools.Selected(i) Then 
     ToolID = Me.lsbTools.Column(0, i) 
     strSQL = "UPDATE tblTool SET ReturnDate=#" & me.txbDateReturned & "# WHERE ToolID=" & ToolID 
     DoCmd.RunSQL strSQL 
    End If 
Next 

Sie können jedoch auch die SQL-Konstrukt eine Zeit laufen und all jene enthalten, wie dies zu aktualisieren:

Dim ToolID as Long 
Dim strSQL as String 
'The hashtags around the dates ONLY work in MS ACCESS and will not work in T-SQL. you will have to edit the syntax to use this on a SQL-server linked table 
strSQL = "UPDATE tblTool SET ReturnDate=#" & me.txbDateReturned & "# WHERE ToolID IS IN(" 

For i = 0 To Me.lsbTools.ListCount - 1 
    If Me.lsbTools.Selected(i) Then 
     ToolID = Me.lsbTools.Column(0, i) 
     strSQL = strSQL & ToolID &", " 
    End If 
Next 
'This checks to make sure the last two characters are a comma and space, and removes them 
If Right(strSQL,2) = ", " Then     
    strSQL = Left$(strSQL, Len(strSQL)-2) & ")" 
    DoCmd.RunSQL strSQL     'This runs the SQL statement 
End if 
+0

Vielen Dank für Ihre Hilfe. Ich verstehe eine Sache nicht, ich benutzte die erste Methode und es würde nicht auf einem meiner Computer funktionieren, sondern auf der zweiten. Der einzige Unterschied, den ich sehe, ist, dass eine Version von Access in polnischer Sprache und die zweite in Englisch ist. Ich bekomme Syntaxfehler in der polnischen Version (Laufzeitfehler 3075, Syntaxfehler im Abfrageausdruck '# 31.12.2017'. - Das Datum nach dem Hashtag ist das Datum, das ich in das Datumstextfeld eingegeben habe). Haben Sie eine Idee, was dieses Problem verursacht? –

+0

Okay, ich habe die Datumseinstellungen in Windows geändert, um ein kurzes Datum mit Bindestrichen anzuzeigen, nicht mit Punkten. Die erste Methode funktioniert wie ein Zauber, danke! Wie auch immer, in der zweiten Methode, was nach 'IS IN' Ausdruck sein sollte in: strSQL = "UPDATE tblTool SET ReturnDate = #" & me.txbDateReturned & "# WHERE ToolID IS IN ("? Ich hatte einige Syntaxfehler in diese Methode auch –

Verwandte Themen