Hallo zusammen!
ich bin dabei meine Datensätze in einem Unterformular mit automatischen Positionsnummern zu versehen.
Dazu habe ich in der Tabelle des Unterformulars ein Zahlenfeld mit dem Namen Position eigegeben.
Anschließend im Unterformular unter 'Vor Eingabe' folgenden Code eigegeben:
Private Sub Form_BeforeInsert(Cancel As Integer)
On Error GoTo ErsterDatensatz
If IsNull(Me!Position) Then
Me.RecordsetClone.MoveLast
Me!Position = Me.RecordsetClone![Position] + 1
End If
Exit Sub
ErsterDatensatz:
Me!Position = 1
End Sub
Die neuen Datensätze in den Positionen werden nun automatisch mit den fortlaufenden Positionsnummern versehen. Klappt super :)
Nun das Probem:
wie Schaffe ich es, dass die Positionsnummern aktualisiert werden, wenn ein oder mehere Datensätze gelöscht werden? ???
Hallo Tismo,
Am einfachsten ist es alle Positionen neu
durch zu nummerieren.
Luftcode:
Dim z as Integer
Dim rst as DAO.Recordset
Set rst = Me.RecordsetClone
rst.MoveFirst
For z = 1 to rst.Recordcount
Me!Position = z
If Not rst.EOF Then rst.MoveNext
Next z
hth
gruss ekkehard
Edit
Passendes Ereignis = AfterDelConfirm
/Edit
Hallo Ekkehard,
danke für den Lösungsansatz.
der Code funktioniert soweit ich den vorletzen Datensatz lösche. Wenn ich jedoch von z.B. von 4 Datensätzen den ersten oden den zweiten lösche wird in Position automatisch die Position 3 angezeigt.
Der Code ist im Ufo. bei Ereignis 'nach Löschbestätigung' eingefügt.
Gruß,
Tismo
Hallo Tismo,
Hm, evtl. ist der RecordCount nicht korrekt.
Ich war der Meinung, das es bei einem Clone
nicht nötig ist, aber versuche mal ein
rst.MoveLast vor dem MoveFirst, also
...
Set rst = Me.RecordsetClone
rst.MoveLast
rst.MoveFirst
...
Setze auch mal einen Haltepunkt in diese
Zeile und schau dir die Werte (RecordCount und
z) im Einzelschrittmodus an.
hth
gruss ekkehard
... negativ.
es ändert sich leider nicht
ich habe 5 Datensätze und lösche DS 2 dann wird der ehem. DS 3 zu DS 4 und es bleiben noch die DS mit Zahlen 4 & 5, Der gelöschte DS 2 wird nicht neu belegt.
vorher: Position 1 2 3 4 5
lösche Position 2
dann: Position 1 4 4 5
bei Hinzufügen kommt Position 6 usw.
Hallo Achim,
Und was sagen die Werte im Einzelschrittmodus?
Versuche es heute Abend mal nachzustellen.
gruss ekkehard
Hallo Achim,
Interessante Sache das.
Habe ein bisschen rumgetestet, und bin das
erste Mal auf Probleme gestossen wenn
Formularfeld und gebundenes Tabellenfeld
den gleichen Namen haben.
Ich hatte ein Beispiel gebastelt (s. Anlage)
und aus Faulheit beim entscheidenen Feld
das Control nicht umbenannt. Da hatte ich
das gleiche Verhalten wie von Dir beschrieben.
Dann habe ich den Code folgendermassen
geändert:
rst.MoveFirst
For z = 1 To rst.RecordCount
rst.Edit
rst.Fields("Position") = z
rst.Update
If Not rst.EOF Then rst.MoveNext
Next z
Das funzte auf Anhieb, und brachte mich dann
auch auf die "Idee" das Control umzubenennen.
Es funzt dann auch so wie Anfangs vorgeschlagen.
For z = 1 To rst.RecordCount
Me.Controls("txtPosition") = z
If Not rst.EOF Then rst.MoveNext
Next z
Zur Verdeutlichung des Unterschiedes habe ich
die Felder explizit über deren Auflistung referenziert.
Benenne also Dein Formularfeld mit der Pos-Nr.
abweichend vom Tabellenfeld (Steuerelemente-Inhalt).
Dann sollte es auch bei Dir klappen (mit dem Nachbarn ;) )
Das früher mal vorgeschlagene rst.MoveLast ist
definitiv überflüssig.
gruss ekkehard
[Anhang gelöscht durch Administrator]
mille grazie ;D