PDA

Vollständige Version anzeigen : AUTOWERT WIEDER AUF NULL STELLEN


alex5872
03.08.2001, 07:50
hi,

ich habe ein kleines Problem, ich möchte einen Autowert in meiner tabelle wieder auf null stellen. aber auch meine Datensätze löschen. irgendwie klappt das bei mir nicht. Es wäre am schonsten ich könnte es ohne temporäre Tabelle lösen, VBA wäre mir am liebsten (oder kann man das irgendwo einstelen?). Danke für eure Hilfe

jojo

se7en
03.08.2001, 08:07
Lösche deine Datensätze -
Gib ein Testdatensatz ein -
Formatiere das AutoWertFeld als Zahl -
Lösche den Testdatensatz -
Formatiere das Zahlenfeld wieder als AutoWertFeld.

alex5872
03.08.2001, 08:57
Das hat nicht funktioniert, er fängt wieder dort zu zählen an wo er vorher aufgehört hat, wirklich komisch. wie kann er sich das merken.Vielleicht hilft das: ich arbeite mit Access 2000 und habe eine menge Autowerte die aber teilweise sowieso vom Benutzer nicht auf null gestell werden sollen und teilweise schon, als bräuchte ich eine Methode in VBA um es dem Benutzer zu ermöglichen die Datensätze zu löschen und den Autowert wieder auf null zu stellen.

Na ja, hat jemand eine Lösung bitte

alex

Kurt aus Kienitz
03.08.2001, 09:04
Hallo,

Kenne ich nur vom hörensagen, aber der Autowert soll auf 0 gestellt werden, wenn man die DB Komprimiert (nachdem man alle Datensätze aus der entsprechenden Tabelle gelöscht hat ;) ).

HTH

A.S.
03.08.2001, 09:05
Hallo Alex,

die Datenbank muß nach dem Löschen aller Autowert-Datensätze - und der damit verknüpften Daten (referentielle Integrität) - über das Menü "Extras / Datenbankdienstprogramme / Datenbank komprimieren" komprimiert werden. Dann steht der Autowert wieder auf 0.

Gruß

Arno

alex5872
03.08.2001, 09:21
Ok ich versuche es, nur wie soll ich das dem Benutzer sagen, Er soll zuerst alle Datensätze löschen und dann die Datenbank komprimieren und dann steht der Autowert wieder auf null, das kann doch nicht sein daß das nicht leichter geht.

Bitte bitte VBA, Trotzdem danke für den Hinweis.

Alex

A.S.
03.08.2001, 09:25
Hallo Alex,

der Autowert bedingt nun einmal das die Datenbank für das Rücksetzen leer ist. Ansonsten geht es nicht!

Wenn Du das Problem des Benutzers einmal ein wenig genauer schilderst, könnte sich vielleicht eine andere Lösung herauskristallisieren.

Will er zum Beispiel einen jährlich neu aufsetzenden Satzzähler haben oder was möchte er?

Gruß

Arno

alex5872
03.08.2001, 10:08
hi,

der Benutzer möchte einfach auf ein Button klicken und danach sind die Datensätze gelöscht und der Autowert fängt wieder bei null zu zählen an.

Du liegst richtig, der Autowert soll einfach nur ein Zahl sein die jedem neuen Mitarbeiter eine fortlaufende Zahl gibt.
Natürlich kann es vorkommen dass ein Mitarbeiter ausscheidet und dann soll die Zahl des Autowertes wieder vergeben werden können. Ich habe dem Benutzer schon beigebracht das es nicht so einfach ist, ich habe aber gesagt das wenn man die ganze Tabelle löscht der autowert wieder bei null anfängt, (was ich auch gedacht habe) und jetzt habe ich mein kleines Problem. Vielleicht gibt eine andere Möglichkeit eine automatische Zahl zu vergeben? ich weiß nicht, aber ich bin für jeden Vorschlag dankbar.

alex
PS: Die Tabelle ist sehr klein nur 15 Mitarbeiter deswegen ist das löschen kein Problem

Daniel Gyr
03.08.2001, 10:16
Wenn Access 2000 benutzt, kannst Du in der DB hinterlegen (Optionen), dass sie beim schliessen komprimiert werden soll. Das heisst für den User:
1. Datensätze löschen
2. DB verlassen
3. DB neu starten

Gruss Dani

A.S.
03.08.2001, 10:21
Hallo Alex,

zunächst gibt es zu Personalnummern (laufende Nummern für Mitarbeiter sind das gleiche ;) ) bzw. Personaldaten insgesamt folgendes zu sagen:

Für alle Personaldaten gilt eine gesetzliche Aufbewahrungspflicht von mindestens 10 Jahren. Teile der Datenbestände sind sogar noch länger aufzubewahren. Um einen Mitarbeiter auch später noch eindeutig identifizieren zu können, zum Beispiel anhand seiner Personalnummer, muß diese Eindeutig bleiben und darf somit nicht neu vergeben werden. Ansonsten findest Du unter der Personalnummer 0815 für den Mitarbeiter Hubert Meier aus dem Jahr 1998 im Jahr 2002 den Mitarbeiter Gregor Schulze. Wer das Ablagesystem nicht kennt, sagt dann den MA Hubert Meier hatten wir nie. Ausserdem erleichtert das Verbleiben der Mitarbeiterstämme im System die spätere Auskunftssuche, wenn Rückfragen der RV-Träger etc. bestehen.

Um aber zum Problem zurückzukommen: In der von Deinem Kollegen angestrebten Lösung darf kein Autowertfeld verwendet werden!

Es ist vielmehr eine Funktion zu erstellen, welche die Stammdatentabelle auf Lücken in der Nummernvergabe prüft und entweder freie Nummern oder die maximal vergebene Nummer + 1 zurückliefert. Gerade bei Mehrbenutzerbetrieb ist das aber eine gefährliche Angelegenheit. Wenn mehrere Benutzer gleichzeitig einen Mitarbeiter anlegen und die Funktion nicht, Beispielsweise per DDE, auf einem zentralen Rechner durchgeführt wird, so das eine Sicherstellung der eindeutigen Nummernvergabe erfolgen kann, ist diese Technik eine mehr als gefährlich Angelegenheit, da Nummern gleichzeitig mehrfach zurückgeliefert werden können.

Gruß

Arno

alex5872
03.08.2001, 10:30
Nun ja,jetz habe ich mehrere Möglichkeiten.

Danke Arno für deine Rechtsmittelbelehrung aber ich habe mich falsch ausgedrückt, die Mitarbeiter tabelle ist nur für den login, eine Access interne Tabelle, also hat nichts mit den Firmeninternen Daten zu tun.

Aber du (Arno) meinst ich sollt eine Art Schleife programmieren mit der Bedingung wenn feld leer ist und immer eins dazu zählen (mit er deinem kleinen Problem habe ich keins, es wird immer nur von einem Benützt. (oder?) hört sich logisch an.

Aber die Lösung von Daniel hört sich auch gut an. Ich bin mir beim Komprimieren nicht ganz sicher was Access da macht, denn was passiert beim Komprimieren genau? Nicht das mir da Prozeduren gelöscht werden die Access vielleicht für Sinnlos hält.

Alex,

Markus-Düsseldorf
03.08.2001, 10:33
Hi Alex,

wirst dir wohl ein eigenen zähler schreiben müssen, wenn der user zum löschen die DB schliesen und wiesder öffen muss fängt der best. wieder an zu nörgeln

'benutze das 'gotfocus' oder 'exit ereigniss, um das steuerelem. das sonst dein autowert war , mit einer 'globalen variabeln ' zu füllen

für eine globale variable erstellst du ein belibiges modul und deklariest dort:

Public anzahldat as integer


binde dann an das ereigniss exit oder gotfocus:

sub

anzahldat = anzahldat + 1
Me.steuerelem.value = anzahldat

end sub

mit dem löschen button setzt du 'anzahldat' wieder auf null

sub

anzahldat = 0

end sub

A.S.
03.08.2001, 10:33
Die Prüfung auf Lücken kann im übrigen so aussehen, das die Anzahl der Datensätze und die maximale Nummer ermittelt werden. Ist die Anzahl der Stammdatensätze = der maximalen Nummer, ist keine Lücke vorhanden. Wenn eine Lücke vorhanden ist, muß entweder eine blockweise (wiederrum mit der Anzahl und der maximalen Blocknummer) oder eine satzweise Prüfung auf Lücken durchgeführt werden. Bei der blockweisen Prüfung durchläuft man dann bei Abweichung den - wesentlich kleineren Block satzweise und ermittelt die Lücke. Kann bei großen Datenbeständen und entsprechender Spannweite der Blöcke durchaus eine Menge Laufzeit ersparen.

Gruß

Arno

A.S.
03.08.2001, 10:51
Hallo Alex,

das Komprimieren macht in dem Fall IMHO nicht viel Sinn. Es setzt den Zähler ja nur dann auf Null, wenn alle Benutzer aus Deiner LoginTabelle gelöscht wurden, was wiederrum keinen Sinn macht ;-))

!! Lücken werden durch bloses Komprimieren nicht geschlossen, der Autowert wird nur auf die Maximalzahl + 1 heruntergesetzt !!

Aber auch bei der Benutzertabelle sehe ich ein kleines Problem ;-)) Speichert Ihr die Benutzernummer (bzw. ID) in einem Änderungslog mit? Wenn ja, wie wollt Ihr später feststellen, welcher Benutzer wirklich die und die Änderung vorgenommen hat. Die Nummer ist ja in dem Fall nicht mehr Eindeutig, sondern kann im Laufe der Zeit von mehreren Benutzer genutzt worden sein.

Aber nichtsdestotrotz: Wenn sichergestellt ist, das die Nummern nur an einem Arbeitsplatz bzw. von einem Benutzer vergeben wird (ansonsten kann, wie bereits gesagt, eine mehrfache Vergabe von Nummern vorkommen), sollte Euch dieses Coding von Nutzen sein:

Dim RS As DAO.Recordset
Dim lngNr As Long
Dim lngLastID As Long
lngNr = 0
If NZ(DMax("[Nr]","tblBenutzer")) = 0 _
Then ' Noch keine Einträge in Benutzertabelle
lngNr = 1
Else ' Es sind bereits Benutzer eingetragen
Set RS = CurrentDB.OpenRecordset("tblBenutzer", dbOpenSnapshot)
RS.MoveFirst
lngLastID = 0
While Not ( RS.EOF Or lngNr > 0 )
If Not RS("ID") = ( lngLastID + 1 ) _
Then
lngNr = lngLastID + 1
Else
lngLastID = RS("ID")
End IF
RS.MoveNext
Wend
RS.Close
Set RS = Nothing
If lngNr = 0 _
Then
lngNr = DMax("[ID]","tblBenutzer")
End If
End If

------------------
HTH

Arno

Alex5872
03.08.2001, 12:47
Danke nochmal für eure vorschläge ich werde mir das übers Wochenende noch genau überlegen und im Falle eines falles kann ich doch auf euch zählen (oder)?

Alex

A.S.
03.08.2001, 12:49
Hallo Alex,

natürlich kannst Du dann auf uns zählen.

BTW: Bei meiner Lösung dürft Ihr kein Autowert-Feld benutzen sondern ein Feld vom Typ Zahl (Ausprägung Long Integer).

Gruß

Arno

alex5872
03.08.2001, 13:14
hi,

Ich habe es schon mal gesagt und sage es wieder ich finde es fantastisch das Leute die sich so gut auskennen wie Ihr (vorallem Arno, der mir nicht das erste mal geholfen hat) Ihre Dienste hier kostenlos zur Verfügung stellen.
Es gehört einfach einmal gesagt das es zeigt das Menschen auch noch etwas umsonst tun und nicht immer Ihren eigennen Vorteil suchen.
Also danke noch mal an alle und vielleicht kann ich mich einmal revanchieren.

C U, Alex