Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Positionsnummer aktualisieren

Begonnen von tismo, November 05, 2012, 19:57:27

⏪ vorheriges - nächstes ⏩

tismo

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?  ???


Beaker s.a.

#1
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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

tismo

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

Beaker s.a.

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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

tismo

... 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.

Beaker s.a.

Hallo Achim,
Und was sagen die Werte im Einzelschrittmodus?
Versuche es heute Abend mal nachzustellen.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Beaker s.a.

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]
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

tismo