Historie für Feld in Access (Mitarbeiterkariere in Personaldatenbank)
Hallo!
Ich habe eine Personaldatenbank. Für jeden Mitarbeiter gibt es einen Datensatz. Dort ist abgelegt unter Postision, welche Stelle der Mitarbeiter bekleidet. In einem zweiten Feld ist dann abgelegt seit wann er diese Position ausübt.
Ich möchte, wenn sich die Position des mitarbeiters im Unternehmen ändert (beförderung etc.), dass man in einer Art Historie oder Lebenslauf den Werdegang des Mitarbeiter verfolgen kann. Z.B.
seit 1997 Sachbearbeiter
seit 1999 stellv. teamleiter
seit 2003 Teamleiter
Das könnte man natürlich auch händsich eintragen, aber vielleicht findet jemand von Euch ja einen eleganteren Weg. Ich stelle mir vor, dass man auf eine Schaltfläche klickt "neue Position eingeben" daruf hin wird der Inhalt des Feldes "Position" und des Feldes "seit" in die Historie übertragen in den Felder "Position" und "seit" können die neuen Angaben dann eingetragen werden.
Wäre super spitze, wenn mir jemand da einen groben Bauplan zu schildern könnte!
Grüße!
Inka
Antwort schreiben
Antwort 1 von Marie vom 12.12.2019, 12:40 Options
na bei Änderung des entsprechenden Feldes schreibst Du Me!seit = Year(Date)
Private Sub neudatum_AfterUpdate()
Me!seit = Year(Date)
End Sub
und genauso nacch Aktualisierung des anderen Feldes
Private Sub neuePosition_AfterUpdate()
Me!Position = Me!neuePosition
End Sub
Gruß Marie
Antwort 2 von Inka2007 vom 12.12.2019, 13:25 Options
Das ging ja fix! Danke Marie!
Ist aber leider nicht ganz das was ich suche. Jedes Mal wenn ich das Feld neuePosition wieder aktualisiere wird der vorher ins altePositionen über tragene Wert wieder überschrieben. Ich brauche aber alle alten Werte nicht nur den letzten in einer Art Liste.
Ich probier jetzt mal hin und her, aber wär super wenn jemand ne direkte Lösung für hätte!
Inka
Antwort 3 von Teddy7 vom 12.12.2019, 13:51 Options
Hallo Inka !
Du hast m.E. nur eine Chance, wenn Du den Datensatz duplizierst, einen auf das Tagesdatum als "gültig ab" änderst und in dem anderen "gültig bis" setzt.
Das macht man am besten mit VBA-Code.
Gruß
Teddy
Antwort 4 von Inka2007 vom 12.12.2019, 16:28 Options
Hm, gleich ein ganzer DS?
Ich hatte jetzt die Idee, dass ich weitere Steuerelement mit den Namen altPosition1, als Position2, altPosition3 einfüge, die ich dann im Formular unsichtbar mache.
Ich dachte man könnte soetwas in dieser Richtung in VBA schreiben:
bei Klick auf Schaltfläche neuer "Eintrag"
wenn altPosition1 schon einen Wert enthält schreibe den Wert aus neuePosition in das Feld altPosition2
sonst altPosition1=neue Position
wenn altPosition2 schon einen Wert enthält, dann schreibe den Wert aus neue Position in das Feld aldPosition3
sonst altPosition2=neuePosition
Das heir habe probiert, klappt natürlich nicht :(
Private Sub neueEingaben_Click()
If altFunktion1 = " " Then
Me!altFunktion2 = Me!Funktion
Else
Me!altFunktion1 = Me!Funktion
End If
End Sub
Die Felder alt Position1 bis altPositionX kann man dann ja in einem Textfeld zusammenfassen, oder? Dann wäre das sowas wie eine Auflistung.
Man merkt meine Ahnung in VBA liegt faktisch bei Null.
Mein Chef will aber unbedingt so eine Historie, ahh!
Antwort 5 von Teddy7 vom 12.12.2019, 18:53 Options
Es gibt grundsätzlich 2 Möglichkeiten.
Entweder der ganze Datensatz, oder eine zweite Tabelle, in die man den Schlüssel, den Feldnamen, alterWert, neuerWert, geändert von und geändert am speichert.
Der Code sieht dann etwa so aus:
Dim i1 As Integer
Dim ktab1 As String
Dim ttab1 As DAO.Recordset
Set ttab1 = CurrentDb.OpenRecordset("Select * from tblÄnderungen", dbOpenDynaset)
if AltePosition <> Position then
ttab1.AddNew
ttab1!Schlüssel = PersonalNr
ttab1!Feldname = "Position"
ttab1!alterWert = AltePosition
ttab1!neuerWert = Position
.....usw......
ttab1.Update
end if
..........und das für jedes relevante Feld...............
ttab1.Close
Set ttab1 = Nothing
Natürlich muß man sich beim Anzeigen die alten Werte wegspeichern.
Gruß
Teddy
Antwort 6 von Inka2007 vom 13.12.2019, 10:46 Options
Hallo Tedddy!
Muss ich denn von einezuerst neue Tabelle erstellen? Passiert das allein durch diesen Code? An welcher Stelle geb ich den Code denn ein? Ich versteh das versteh irgendwie nicht. Ist doch zum verzweifeln.
Ich habe das jetzt mal so versucht:
Private Sub neueEingaben_Click()
Dim i1 As Integer
Dim ktab1 As String
Dim ttab1 As DAO.Recordset
Set ttab1 = CurrentDb.OpenRecordset("Select * from tblNeueingaben", dbOpenDynaset)
if AltFunkion1 <> Funktion then
ttab1.AddNew
ttab1!Schlüssel = AutoWert
..bes gibt keine Personalnummern in der DB...
ttab1!Feldname = "Funktion"
ttab1!alterWert = altFunktion1
ttab1!neuerWert = Funktion
ttab1.Update
end if
ttab1.Close
Set ttab1 = Nothing
End Sub
Der stört sich am DAO.Recordset (wenn ich DAODB.Recordset eingebe ist der Fehler weg. Dann stört er sich aber am OpenDynaset. Ich weiß echt nicht weiter. Und was ist bitte "ktab1" und "i1"?
Muss ich für jede alte Funkion einen Code schreiben? Ich brauche immer Platz für 3 bis 10 alte Funktionen des
Mitarbeiters.
Wenn es dir nicht aus machst, könntes du mir das mal etwas genauer beschreiben?
Danke!
Antwort 7 von Marie vom 13.12.2019, 12:22 Options
Zitat:
Der stört sich am DAO.Recordset (wenn ich DAODB.Recordset eingebe ist der Fehler weg. Dann stört er sich aber am OpenDynaset.
Bitte nicht schreiben "Der stört sich am", bitte den genauen fehlertext immer schreiben, damit nicht unzählige Rückfragen notwendig sind.
In diesem Fall vermute ich (ich weiss es aber nicht, weil Du den Fehlertext nicht geschrieben hast), dass Du keinen Verweis auf die DAO gesetzt hast.
Allerdings müsste man dann auch erstmal wissen welche Accessversion Du verwendest.
Geh mal in Module, Entwurf, und klick dann im Menü auf Extras Verweise und klick mal die Microsoft DAO 3.51 Object Library an.
Gruß Marie
Antwort 8 von Inka2007 vom 13.12.2019, 12:36 Options
Hi!
Ich habe den Haken jetzt wie beschrieben auf DAO 3.51 gesetzt und es kommen keine Fehlermeldungen mehr. Jedoch passiert jetzt nach dem klicken auf "neueEingaben" schlicht gar nichts. Hab ich noch was vergessen, oder wo finde ich die altFunktion jetzt?
Das ist hier mein jetziger Code:
Private Sub neueEingaben_Click()
Dim i1 As Integer
Dim ktab1 As String
Dim ttab1 As DAO.Recordset
Set ttab1 = CurrentDb.OpenRecordset("Select * from tblÄnderungen", dbOpenDynaset)
If altFunktion1 <> Funktion Then
ttab1.AddNew
ttab1!Schlüssel = AutoWert
ttab1!Feldname = "Funktion"
ttab1!alterWert = altFunktion1
ttab1!neuerWert = Funktion
ttab1.Update
End If
ttab1.Close
Set ttab1 = Nothing
End Sub
Was muss ich nun machen?
Antwort 9 von Teddy7 vom 13.12.2019, 13:17 Options
1) Tabelle anlegen
2) ktab1 und i1 kannst Du löschen
3) beim Anzeigen mußt Du den alten Wert aller Felder zwischenspeichern
4) der Code muß ausgeführt werden nach Änderung - also entweder für jedes einzelne Feld (dann kann man vielleicht eine function daraus machen), oder beim verlassen des Formulars, oder ........
5) Du solltest Dich schon mit VBA beschäftigen. Es ist sehr gefährlich VBA-Code einzusetzen, ohne zu wissen, was der macht
Antwort 10 von Inka2007 vom 13.12.2019, 16:30 Options
Es geht! Supi! Danke für eure Nerven!
Schaut jetzt so aus:
Private Sub neueEingaben_Click()
Dim ttab1 As DAO.Recordset
Set ttab1 = CurrentDb.OpenRecordset("Select * from tblÄnderungen", dbOpenDynaset)
ttab1.AddNew
ttab1!Schlüssel = AutoWert
ttab1!Name = Me!Name
ttab1!Vorname = Me!Vorname
ttab1!seit = Me!seit
ttab1!Abteilung = Me!Abteilung
ttab1!Funktion = Me!Funktion
ttab1.Update
ttab1.Close
Set ttab1 = Nothing
Me![Mitarbeiterhistorie].Form.Requery
End Sub
Habe das ganze als Unterformular "Mitarbeiterhistorie" in mein Hauptformular hinein gebastelt!
@Teddy: Naja, manchmal kapier ich VBA nich auf Anhieb -alles was ich weiß, hab ich mir selbst irgendwie durch nachlesen und abgucken beigebracht. Habe aber noch soooone Lücken und lerne jeden Tag neu dazu.
Das wars denn jetzt auch von mir!
Antwort 11 von Inka2007 vom 17.12.2019, 16:08 Options
Hallo nochmal!
Ich habe jetzt ein neues Problem, was mit meiner Historie (s.o) zusammenhängt.
Ich möchte gerne die Daten zu einem Mitarbeiter in einem Bericht (eine Art Kartei) drucken. Ich habe dazu einen Button angelegt und dahinter einen Code, dass der aktuell im Formular angezeigte Datensatz gedruckt /bzw. angezeigt werden soll.
Das sieht so aus:
Private Sub Karteiansehen_Click()
If Auswahl = 1 Then
Dim stDocName As String
Dim sMyFilter As String
sMyFilter = "AutoWert =" & Me!AutoWert
stDocName = "Karteikarte"
DoCmd.OpenReport stDocName, acPreview, , sMyFilter
Else
sMyFilter = "AutoWert =" & Me!AutoWert
stDocName = "Karteikarteohne"
DoCmd.OpenReport stDocName, acPreview, , sMyFilter
End If
Exit_Karteikarte_Click:
Exit Sub
Err_Karteikarte_Click:
MsgBox Err.Description
Resume Exit_Karteikarte_Click
End Sub
Ich habe um den Datensatz zu identifizieren den Autowert genommen. Das Problem ist, dass er mir nun auch für jeden Datensatz mit Autowert im Unterformular (Historie) einen Bericht anzeigt. Das Unterformular ist über den Autowert mit dem Hauptformular verknüpft. Das ist auch logisch, aber kann mir jemand sagen, wie er nur einen Bericht druckt. Gibt es eine Möglichkeit ihm zu sagen, dass er nur den ersten Datensatz als Bericht anzeigen soll oder nicht auf Autowerte im Unterformular zurück greifen soll. Ist nämlich unpraktisch, wenn ich jedesmal die gleiche Kartei x-mal ausdrucken muss mit den gleichen Inhalten.
Ich hoffe, das war halbwegs vertändlich.
Gruß Inka
Antwort 12 von Teddy7 vom 17.12.2019, 16:48 Options
1)
Dim stDocName As String
Dim sMyFilter As String
dann erst
If Auswahl = 1 Then
2) wo ist denn der Knopf ? Me..... sagt ja nur, der Autowert steht im gerade aktiven Formular.
Das Feld Autowert im Hauptformular sollte ja anders heißen als der Autowert im UF.
Dieser Feldname muß mitgegeben werden.
Gruß
Teddy
Antwort 13 von Inka2007 vom 17.12.2019, 16:53 Options
Huhu!
1) habe ich geändertm acht aber irgendwie keinen Unterschied
2) Der Button ist auf dem Hauptformular wo auch das Unterformular eingebaut ist.
Im Hauptformular heißt das feld Autowert, im Unterformular heißt das damit vernüpfte Feld aber Schlüssel.
Antwort 14 von Teddy7 vom 18.12.2019, 13:05 Options
Und wie sieht die Datenquelle des Berichts aus ?
Antwort 15 von Inka2007 vom 18.12.2019, 13:12 Options
Die Daten stammen aus der Tabelle "Personaldatenblatt" die mit Hilfe des Hauptformulars "Personaldaten" gespeist wird. Ich habe in dem Bericht allerding auch noch einen Unterbericht mit der Mitarbeiterhistorie, welches aus der Tabelle "tbl.Änderungen" gespeist wird.
Ich hoffe, das ist das was du wissen wolltest.
Gruß
Antwort 16 von Teddy7 vom 18.12.2019, 15:16 Options
Ich nehme mal an, dass Dein Problem aus diesem Unterbericht resultiert. Vielleicht ist da die Zuordnung nicht in Ordnung.
Kopier doch mal den Bericht und schmeiß in der Kopie den Unterbericht raus.
Kommen jetzt immer noch falsche "Autowerte" ?
Gruß
Teddy
Antwort 17 von Inka2007 vom 18.12.2019, 17:43 Options
Huhu,
das brints auch nicht. Ich schätze mal, dass das daran liegt, das die Tabellen Personaldaten mit der Tabelle Änderung über den Autowert bzw. den Schlüssel mit einander veknüft sind. Bei Personaldaten ist der Autowert ein Primärschlüssel, daher dürfte er zu jedem Autowert nur einen Datensatz anzeigen. Das Feld Schlüssel in der tblÄnderung ist aber kein Primärschlüssel. Darf er auch nicht sein, weil sonst funktioniert die Historie nicht. Ich glaube fast ich muss mich zwischen meiner Historie und der Karteikarte (Bericht) entscheiden oder auf anderem Weg zu meiner Karteikarte kommen... weiß nur nicht wie.
Danke, aber dass du dir über mein Problem Gedanken machst.
Antwort 18 von Teddy7 vom 18.12.2019, 18:31 Options
Wenn nur die Tabellen miteinander verknüpft sind kanns das nicht sein.
Wenn Du aber eine Abfrage als Datenquelle des Berichts hast, in der beide Tabellen miteinander verknüpft sind, dann ist das der Fehler.
Aber das ist jetzt wie Stochern im Nebel.
Wenn Du willst kannst Du mir ausnahmsweise eine Kopie der DB mal zumailen.
Dann aber nur Testdaten drinlassen und gezippt senden.
Schade, dass Du kein Mitglied bist, dann könnte ich Dir über das interne Mitteilungssystem meine mail-Adresse mitteilen.
Gruß
Teddy
Antwort 19 von Inka2007 vom 19.12.2019, 11:58 Options
Hallo Teddy,
kann mich von der Arbeit aus nicht anmelden. Ich werd mich heute Abend anmelden, wenn ichs schaffe. Dann kann ich dir die Datenbank an deine Adresse mailen, hoffe, dass ich das vorm Urlaub noch schaffe, sonst komme ich in der zweiten Januarwoche auf dich zurück.
Gruß Inka