Schleife für jede Zeile in Kombifeld

Hallo Zusammen,

Ich arbeite mit Access 2003.
Ich möchte für jede Zeile in einem Kombinationsfeld:

  1. Den Wert in das gleiche Kombifeld schreiben
  2. Wenn nötig das Formular aktualisieren
  3. bestimmte Werte die sich jetzt errechnet haben (auf grund des eintrages im Kombinationsfeld) in eine Tabelle schreiben.

Folgenden Code habe ich bereits:

Private Sub alle\_DS\_Endabr\_Click()

If Nz(Me!Abfrage\_Abrechnungszeitraum) = "" Then
 MsgBox "Bitte einen Abrechnungszeitraum eingeben"
 Exit Sub
Else
 For i = 0 To Me!Abfrage\_Mitglied.ListCount - 1
 'Me!Abfrage\_Mitglied = Me!Abfrage\_Mitglied.ItemData(i)
 Me!Abfrage\_Mitglied = Me!Abfrage\_Mitglied.Column(i)

 With CurrentDb().OpenRecordset("tab\_Endabrechnung", dbOpenDynaset, dbAppendOnly)
 .AddNew
 !Abrechnungszeitraum = Me!Abfrage\_Abrechnungszeitraum
 !Mitglied = Me!Abfrage\_Mitglied
 !Betrag = Me!Gesamtbetrag
 .Update
 End With

 Next i
End If

End Sub

Also der letzte Schritt funktioniert bereits
wenn ich beim kombifeld die zeilen nacheinander auswähle und händisch den code zwischen With und End With ausführe wird die eine zeile in die tabelle geshrieben.
Aber wie mache ich das jetzt für jede zeile im Kombinationsfeld.

Gruß MPunkt

Hallo getrennt,

Ich arbeite mit Access 2003.

Ich möchte für jede Zeile in einem Kombinationsfeld:

jede Zeile in der KombifeldLISTE?

  1. Den Wert in das gleiche Kombifeld schreiben

warum?

  1. Wenn nötig das Formular aktualisieren

warum? Was zeigt das Form denn an (Datenherkunft) ?

  1. bestimmte Werte die sich jetzt errechnet haben (auf grund
    des eintrages im Kombinationsfeld) in eine Tabelle schreiben.

was wird wann berechnet ? (Ereignisprozedur des Kombis) ?

Folgenden Code habe ich bereits:

Private Sub alle_DS_Endabr_Click()

If Nz(Me!Abfrage_Abrechnungszeitraum) = „“ Then ’ ist der Zeitraum ein Text??

MsgBox „Bitte einen Abrechnungszeitraum eingeben“

Exit Sub

Else

For i = 0 To Me!Abfrage_Mitglied.ListCount - 1

'Me!Abfrage_Mitglied =
Me!Abfrage_Mitglied.ItemData(i)

Me!Abfrage_Mitglied = Me!Abfrage_Mitglied.Column**(0,i)**

With CurrentDb().OpenRecordset(„tab_Endabrechnung“,
dbOpenDynaset, dbAppendOnly)

.AddNew

!Abrechnungszeitraum =
Me!Abfrage_Abrechnungszeitraum

!Mitglied = Me!Abfrage_Mitglied

!Betrag = Me!Gesamtbetrag 'woher kommt der Betrag?

.Update

End With

Next i

End If

End Sub

Also der letzte Schritt funktioniert bereits

wenn ich beim kombifeld die zeilen nacheinander auswähle und
händisch den code zwischen With und End With ausführe wird die
eine zeile in die tabelle geshrieben.

Aber wie mache ich das jetzt für jede zeile im
Kombinationsfeld.

Vielleicht so:

’ In JEDEM ModulKOPF OPTION EXPLICIT schreiben

Private Sub alle\_DS\_Endabr\_Click()
Dim i as long 
If Nz(Me!Abfrage\_Abrechnungszeitraum,"") = "" Then 
 MsgBox "Bitte einen Abrechnungszeitraum eingeben"
 Exit Sub
Else
 For i = 0 To Me!Abfrage\_Mitglied.ListCount - 1
 With CurrentDb().OpenRecordset("tab\_Endabrechnung",dbOpenDynaset, dbAppendOnly)
 .AddNew
 !Abrechnungszeitraum = Me!Abfrage\_Abrechnungszeitraum
 !Mitglied = Me!Abfrage\_Mitglied.Column(0,i) ' wenn das Mitglied (Nummer, Name ?? ) in der ersten Spalte der K-Liste steht
 !Betrag = \>
 .Update
 End With
 Next i
End If
End Sub

Viele Grüße vom Bodensee
Franz, DF6GL

Hallo getrennt,

*gg*

Ich arbeite mit Access 2003.

Ich möchte für jede Zeile in einem Kombinationsfeld:

jede Zeile in der KombifeldLISTE?

  1. Den Wert in das gleiche Kombifeld schreiben

warum?

Weil dann im Formular nur mehr die Datensätze angezeigt werden die mit der Auswahl übereinstimmen.

  1. Wenn nötig das Formular aktualisieren

warum? Was zeigt das Form denn an (Datenherkunft) ?

  1. bestimmte Werte die sich jetzt errechnet haben (auf grund
    des eintrages im Kombinationsfeld) in eine Tabelle schreiben.

was wird wann berechnet ? (Ereignisprozedur des Kombis) ?

Berechnet wird der Gesamtbetrag der gesamten Datensätze mit:
=Summe([Betrag])
(Es steht in jedem Datensatz in der letzten Spalte ein Betrag)

Der Code des Kombinationsfeldes ist folgender, hab ich jetzt aber direkt in der anderen Sub eingebaut:

 sql = "SELECT abf\_Einnahmen.\* FROM abf\_Einnahmen"
 sql = sql & " WHERE (((abf\_Einnahmen.Mitglied) Like '" & Me.Abfrage\_Mitglied & "'))"

 Me.RecordSource = sql

Vielleicht so:

Viele Grüße vom Bodensee

Franz, DF6GL

Danke erstmal, das wars
folgender Code funktioniert einmal soweit:

Private Sub alle\_DS\_Endabr\_Click()


If Nz(Me!Abfrage\_Abrechnungszeitraum) = "" Then ' ist der Zeitraum ein Text??
 MsgBox "Bitte einen Abrechnungszeitraum eingeben"
 Exit Sub
Else
 For i = 0 To Me!Abfrage\_Mitglied.ListCount - 1
 'Me!Abfrage\_Mitglied = Me!Abfrage\_Mitglied.ItemData (i)
 Me!Abfrage\_Mitglied = Me!Abfrage\_Mitglied.Column(0, i)

 sql = "SELECT abf\_Einnahmen.\* FROM abf\_Einnahmen"
 sql = sql & " WHERE (((abf\_Einnahmen.Mitglied) Like '" & Me.Abfrage\_Mitglied & "'))"

 Me.RecordSource = sql

 'Me.Requery
 'Sleep 2000 '100 ms = 1/10 s

 If Nz(Me!Gesamtbetrag) = "" Then
 MsgBox "Kein Gesamtbetrag vorhanden"
 Exit Sub
 Else

 With CurrentDb().OpenRecordset("tab\_Endabrechnung", dbOpenDynaset, dbAppendOnly)
 .AddNew
 !Abrechnungszeitraum = Me!Abfrage\_Abrechnungszeitraum
 !Mitglied = Me!Abfrage\_Mitglied
 !Betrag = Me!Gesamtbetrag 'woher kommt der Betrag?
 .Update
 End With
 End If
 Next i
End If


End Sub

Jetzt hab ich noch folgendes Problem:
Wenn über die Schleife, im Kombifeld etwas ausgewählt ist, bei dem viele Datensätze angezeigt werden, wird im Feld in dem der Gesamtbetrag berechnet wird, nichts eingetragen und dementsprechend nichts in die Tabelle geschrieben.
Habs schon mit ein oder zwei Sekunden warten probiert und mit Formular aktualisieren. Hilft aber nichts.
Man merkt auch wenn man im Kombifeld die besagten Zeilen händisch auswählt, dass der Gesamtbetrag etwas verzögert berechnet wird (so 1/2 sec).

Wie sag ich dem Feld jetzt über VBA dass es die Berechnung „sicher“ durchführen soll?

mfg MPunkt

Hallo,

mir kommen da starke Zweifel am grundlegenden Aufbau de Db…

  1. Es handelt sich hier ja nicht um ein Auswahlkombi, sondern ein Suchkombi, das Datensätze (aus abf_Einnahmen) für ein Formular filtert. (Was steht im Steuerelementinhalt des Kombis?).

  2. Um nur die Summe der Beiträge eines Mitgliedes zu berechnen, wird für jedes Mitglied ein neuer Recordset für das Form generiert, d. h. die Recordsource wird aktualisiert und das Form berechnet dabei in einem Textfeld die Summe der BEiträge für dieses Mitglied.
    Das ist nun so ziemlich unperformant, wie es überhaupt geht…

  3. Erst jetzt wird der Gesamtbetrag mit einem neuen Datensatz in einer anderen Tabelle hinzugefügt.

  4. Wo wird Bezug auf den Abrechnungzeitraum genommen?

  5. Das Schreiben der Gesamtbeträge in eine Tabelle ist genauso fragwürdig. (Dazu kenne ich aber nicht das Ablaufkonzept der DB)

Vorschlag ohne den Heckmeck über das Form:

Abfrage („abf_SummeBeträge“) erstellen und abspeichern:

Select Sum(„Betrag“) as GesamtBetragProMitglied , Mitglied from abf_Einnahmen Group by Mitglied having Abrechnungszeitraum = Forms!DeinAktuellesForm!Abfrage_Abrechnungszeitraum

'bzw. statt der Abfrage die Tabelle benutzen…

Private Sub alle_DS_Endabr_Click()
Dim db as Database, rs as Dao.Recordset
set Db = Currentdb

set rs= db.OpenRecordset(„tab_Endabrechnung“, dbOpenDynaset, dbAppendOnly)

If isNull(Me!Abfrage_Abrechnungszeitraum)
MsgBox „Bitte einen Abrechnungszeitraum eingeben“
Exit Sub
Else
With rs
.AddNew
!Abrechnungszeitraum = Me!Abfrage_Abrechnungszeitraum
!Mitglied = Me!Mitglied
!Betrag = db.Openrecordset(„select GesamtBetragProMitglied from abf_SummeBeträge where Mitglied = '“ & me!Mitglied & „’“, dbOpensnapshot)(0)
.Update
End With
End If
Next i
End If

rs.Close
set rs=Nothing
set db=Nothng

End Sub

Dabei wird das Mitglied berücksichtigt, das akt. im Form angezeigt wird.

Dieser Vorschlag ist aber auch noch nicht das „Optimum“. Das Hinzufügen des Gesamtbetrages in die Tabelle könnte auch mit einer einzigen Abfrage mit Unterabfrage (zusammengebauter SQl-String , ausgeführt mit DB.Execute ) erledigt werden…

Viele Grüße vom Bodensee
Franz, DF6GL

Viele Grüße vom Bodensee
Franz, DF6GL