PDA

Vollständige Version anzeigen : Formular für Mehrfacheinträge per Textfeldarray


werda
28.03.2006, 09:11
Hallo,

Ich möchte gern ein Formular erstellen, welches in einer bestimmten Tabellenspalte Mehrfacheinträge vornehmen kann, also mehrere Datensätze untereinander. Dazu habe ich ein Formular mit mehreren Textfeldern (Text0 Text1 Text2 ...) erstellt.
Nun würde ich das per Klick auf einen Button auslesen und per Schleife auslesen lassen und in die entsprechende Tabelle eintragen lassen. Leider scheint es in VBA nicht so einfach zu sein, Textfelder als Schleife auslesen zu lassen. ich hätte mit das in etwas so gedacht:
---
For k = 0 To k = 2
tf = "Text" & k
If tf.Value <> "" Then
DoCmd.RunSQL "INSERT INTO Teilnehmer (Name) VALUES(" & tf.Value & ");"
End If
Next k
---

Funktioniert nicht. Wie kann mann aber die Textfelder über Variablen ansteuern, damit diese der Reihe nach eingetragen werden

Anne Berg
28.03.2006, 09:21
Wärst du da nicht mit einem (gebundenen) Endlosformular besser bedient?

Die korrekte Syntax wäre:
If Me(tf) <> "" ... bzw. direkt Me("Text" & k)


...ach ja, und dann im Insert fehlen wahrscheinlich noch Hochkommata (wg. Text)
... VALUES('" & Me(tf) & "');"

werda
28.03.2006, 09:46
Hallo, danke erstmal soweit. Ich habe in dem Formular noch eine Kombobox, welches eine weitere Spalte des Datensatzes einträgt, was dann aber für alle gleich sein soll, deshalb habe ich diese Variante gewählt.

Ich habe es jetzt mit deiner Lösung versucht und ich werde immerhin schon zweimal gefragt, ob ich einen Datensatz wirklich einfügen will, beim dritten (also k=2) bekomme ich die Meldung, dass 1 Datensatz wegen Schlüsselverletzungen nicht eingetragen werden kann. In der Tabelle stehen dann zwar 3mal die Werte aus der Kombobox, aber nichts aus den Textfeldern.

Anne Berg
28.03.2006, 09:58
Die Speicherungs-Rückfrage kannst du vermeiden, indem du die Warnmeldungen vorübergehend abschaltest und den RunSql-Befehl in DoCmd.SetWarnings False und DoCmd.SetWarnings True einschließt. Eine empfehlenswerte Alternative wäre aber die Ausführung des SQL-Codes mit der Execute-Methode: CurrentDB.Execute sqlString [, dbFailOnError]. Da hast du dann auch gleich die Möglichkeit, einen evtl. Fehler abzufangen.

Wie sind denn die Tabellenfelder angelegt, handelt es sich tatsächlich um Text? Wie sieht dein Code jetzt aus?

PS:
Ich rate dir, von vornherein jegliche überflüssigen Fehlerquellen auszuschließen und Bezeichnungen wie "Name" zu vermeiden! (reservierte Namen: dbwiki-Artikel (http://www.dbwiki.de/wiki.php?title=Access_Anf%E4nger:_Reservierte_Worte_in_Feldausdr%FCcken) !)

werda
28.03.2006, 10:22
Also, es geht um eine LAN. Ich habe 2 Tabellen

Teilnehmer (ID [Autowert, PS], Name [Text], Clan* [Zahl], Flat [Ja/Nein])
Clan (ID* [Autowert, PS], Clan [Text])
*=Verknüpfung

Im Formular sind derzeit 3 Textfelder, ungebunden (für Teilnehmer.Name) und ein Kombinationsfeld, welches die Clanliste anzeigt (für Teilnehmer.Clan). Ausserdem ein Button, welcher bei Klick eine Ereignisprozedur zugeweisen bekommen hat:
---
Private Sub Umschaltfläche9_Click()

Dim k As Long
Dim tf As String

For k = 0 To k = 2

tf = "Text" & k
If Me(tf) <> "" Then
DoCmd.SetWarnings False
DoCmd.RunSQL "INSERT INTO Teilnehmer (Clan) VALUES(" & cmbClan.Value & ");"
DoCmd.SetWarnings True
DoCmd.SetWarnings False
DoCmd.RunSQL "INSERT INTO Teilnehmer (Name) VALUES('" & Me(tf) & "');"
DoCmd.SetWarnings True
End If
Next k

End Sub
---

Ich habe mal die Tabelle Teilnehmer neu erstellt und derzeit trägt Access da unregelmässig neue Datensätze mit der richtigen Clannummer ein, aber ohne Name und nur ein, maximal zwei Datensätze, immer mit ungerader ID.

Anne Berg
28.03.2006, 10:29
Wie gesagt: verabschiede dich von der Bezeichnung "Name"!
(dann sehen wir weiter)


Und was die Abfrage betrifft, so hast du auch dort meinen Rat nicht befolgt. :rolleyes:
Das ganze lässt sich außerdem noch folgendermaßen vereinfachen:On Error Resume Next ' oder Fehlerbehandlung anspringen
CurrentDB.Execute "INSERT INTO Teilnehmer (Clan, TeilnName) VALUES(" & Me!cmbClan.Value & ", '" & Me(tf) & "');", dbFailOnError
If Err.Number <> 0 Then
MsgBox "Einfügen nicht erfolgreich:" & vbcrlf & err.Description
End If

PS:
Man sollte doch genauer hinschauen. :eek:
Mit deinen beiden Befehlen fügst du ja auch zwei neue Datensätze ein. Bleibt lediglich herauszufinden, wo der Fehler mit dem Textfeld liegt. - Aber dazu habe ich dir meine Meinung ja schon gesagt... ;)

werda
28.03.2006, 10:40
Sorry, hatte ich tw. übersehen, der Code sieht jetzt so aus:

---
Private Sub Umschaltfläche9_Click()

Dim k As Long
Dim tf As String

For k = 0 To k = 2

tf = "Text" & k
If Me(tf) <> "" Then
CurrentDb.Execute "INSERT INTO Teilnehmer (Clan, NickName) VALUES(" & cmbClan.Value & ", '" & Me(tf) & "');"

End If
Next k

End Sub
---

Jetzt klappt es auch, dass er ins Feld Nickname etwas einträgt, aber nur vom Textfeld Text0, also nur vom Ersten.

werda
28.03.2006, 10:48
War wohl wieder zu schnell, also, aktueller Code:
---
Private Sub Umschaltfläche9_Click()

Dim k As Long
Dim tf As String

For k = 0 To k = 2

tf = "Text" & k
If Me(tf) <> "" Then

On Error Resume Next
CurrentDb.Execute "INSERT INTO Teilnehmer (Clan, NickName) VALUES(" & Me!cmbClan.Value & ", '" & Me(tf) & "');", dbFailOnError
If Err.Number <> 0 Then
MsgBox "Einfügen nicht erfolgreich:" & vbCrLf & Err.Description
End If


End If
Next k

End Sub
---

Eingetragen wird, wie gesagt nur das erste Textfeld, eine Fehlermeldung erscheint nicht.

Anne Berg
28.03.2006, 10:49
<s>Gibt es denn eine Fehlermeldung? </s>Sind alle Textfelder gefüllt?

... ist der Code kompiliert?!

(IMHO müsste es heißen: For k = 0 to 2)

werda
28.03.2006, 10:50
alle Felder sind ausgefüllt, Fehlermeldung, wie gesagt erscheint nicht.

werda
28.03.2006, 10:54
>>> (IMHO müsste es heißen: For k = 0 to 2)

Danke, genau daran lag es, hatte daran gar nicht gedacht, dächte, dass ich Schleifen immer so schreibe.

Danke dir vielmals für deine Geduld mit mir.

Anne Berg
28.03.2006, 11:29
For I = 0 To I = 2 : das ist schon interessant!

der Compiler meckert das nicht an, aber beim Ausführen läuft folgendes ab:
1. Mal: (I =) 0 wird verglichen mit 0 (da I=2 Falsch!)
2. Mal: (I =) 1 wird verglichen mit 0 (da I=2) immer noch Falsch!) - und aus ist's!

Ist schon irgendwie logisch, wenn man's erstmal durchschaut hat! ;)