PDA

Vollständige Version anzeigen : Zeiterfassung / Timer


Mattes
04.11.2001, 20:14
Hallo Forum,

ich hab ein Problem mit einer Zeiterfassung. Das Programm habe ich vor längerer Zeit, na sagen wir "gestrickt", laäuft aber sehr zuverlässig. Also Mitarbeiter kommt, zieht Magnetkarte durch, Uhrzeit und Personalnummer werden erfasst, es gibt verschiedene Auswertungsfuntionen. Alle Datensätze landen in einer Tabelle.

Leider hat es sich gezeigt, da die DB auf einer alten Maschine mit 98 läuft, das der ein oder andere Mitarbeiter wohl doch auf die Uhr zugreift.

Nur soviel: Eine Sperrung der Uhr über POLEDIT soll derzeit nicht erfolgen :-)

Meine Überlegung: Jeder Datensatz hat eine ID(AutoWert) Der DS 2041 kann also keine frühere Zeit bei KOMMEN haben als der DS 2040! Ist Dem so, hat der Mitarbeiter, dem ich den DS 2040 zuordnen kann, die Uhr manipuliert.

Ich würde nun gerne über eine von der Uhr unabhängige Funktion ( ich dachte an TIMER ) in der Zeit von 07:00 - 08:00 alle 5 Minuten automatisch einen Testdatensatz in der Haupttabelle anlegen ( mit mir als Mitarbeiter ).

Dann hätte ich auch die Möglichkeit eine evtl. Manipulation der Uhr vor eintreffen eines anderen Mitarbeiters nachzuweisen. ( z.B. erster Mitarbeiter kommt um 7:15, stellt die Uhr auf 7:05, loggt ein, stellt die Uhr zurück auf 7:15 ) Mein DS um 7:10 würde ihn aufgrung der DS-Nummer dann verraten.

Also, wie kann ich mit dem Timer alle 5 Minuten einen neuen DS anlegen, in dem alle Felder mit "Testdaten" gefüllt sind?

Kurt aus ABG
04.11.2001, 21:25
Hallo Mattes.

Kann dir sicher helfen, bin aber in Makroprogrammierung sattelfester.

Mit der Aktion SetzeWert kannst Du beim Aufruf des Hauptformulars oder eines unsichtbaren Hilfsformulars den Zeitgeberintervall auf eine Zeit in ms setzen.
z.B.
Aktion:
SetzenWert
Feld:
Formulare!DeinFormular.zeitgebenintervall
Ausdruck: 180000
2. Aktion SetzenWert
Feld:
Formulare!DeinFormular.BeiZeitgeber
Ausdruck:
"Makro oder Code" als Sring setzen.

So kannst Du aller 3 Min. die aktuelle Zeit mit Time() abfragen und auswerten. In der Zeit zwischen 7:00 und 8:00 Uhr mußt du den Zeitgeberintervall auf 300000 erhöhen und BeiZeitgeber eine andere Aktion setzen, um deinen Datensatz zu erzeugen. Nach 8:00 setzt du den Zeitgeberintervall und bei Zeitgeber zurück.

Hoffe du kommst klar.
Gruß Kurt aus AGB

Mattes
05.11.2001, 07:35
Hi Kurt,

hmm das probier ich mal aus. Wenn ich mit Time() die Zeit abfrage, fragt er dann die Zeit des Zeitgebers im unsichtbaren Formular ab? Die Funktion darf nicht auf die Systemuhr zugreifen! Wie kann ich denn zwischen 7:00 und 8:00 das Intervall erhöhen? (automatisch)?

MarioR
05.11.2001, 07:56
Hallo Mattes,

so als Denkansatz:

Du könntest zu einer "sicheren" Zeit (z.B. 6.00 Uhr) den Timer initialisieren und dann die Zeit selbst bilden. Also mit einem Intervall von 5 Min. sind nach 24 Timerereignissen 2 Std. vergangen.

Die Frage ist aber: Orientiert sich Acc bei der Bildung der Intervalle an der Systemuhr? Dann hauen die Leute beim Verstellen der Uhr auch die Timerintervalle durcheinander!
Das müsstest Du mal probieren.

Mattes
05.11.2001, 08:39
Hm, ist das alles umständlich.

Könnte es Eurer Meiung nach klappen, wenn ich doch auf die Systemuhr zugreife? Ich könnte doch kleinere Intervalle nehmen, sagen wir drei Minuten. Der "Benutzer" stellt die Uhr ja wieder zurück. Also: Test DS um 07:09, "Benutzer" kommt um 7:10, ...

müßte doch klappen?

Wenn ja, wie kann ich das in Code packen?

erwin
05.11.2001, 08:57
wieso überhaupt so kompliziert - du brauchst doch nur BEVOR du den DS speicherst den Client wieder mit der Serveruhrzeit synchronisieren - dafür gibt's doch genug Tools - dann kann dein "lieber User" gar nicht mehr manipulieren.

so long erwin...

Mattes
05.11.2001, 09:01
@erwin:

Das ist der "Bank-Internet-Zeiterfassungs-Ausprobier-Rechner", und der hängt nicht im Netz, weil das:"Ja viel zu gefährlich wegen den Daten ist" :-)

*Seufz*

erwin
05.11.2001, 09:14
na dann lös' es so:

1) psychologisch - du designst ein knallrotes Vollbildformular "An diesem Rechner wurde die Uhrzeit manipuliert" und sorgst dafür, dass jeder davon erfährt.

2) du schreibst per hidden Formular (+Timer) alle Minuten in eine neue Tab. (mit einem DS) das/die akt. Datum/Zeit unter vorheriger Überpfüfung, ob das/die zuvor im Feld befindliche Datum/Zeit kleiner als das neue ist - wenn nein - Anzeige des unter 1) erwähnten Forms + Sperren sonstiger Funktionen.

HTH erwin...

Mattes
05.11.2001, 10:40
... ich komm irgendwie nicht weiter.

@erwin:

wie schreibe ich denn ein hidden Form mit Timer? in dem... unter Prüfung...

das ist doch gerade mein Problem.

AWSW
05.11.2001, 11:23
Hallo Mattes,
mit dem Syntax hier könnte das VERSTECKTE ÖFFNEN gehen:

<h3>DoCmd.OpenForm "DeinFormular", , , , , acHidden</h3>

Das Timerereinnis wie Erwin beschrieben hat ganz normal in dieses Formular rein bauen. Es geht wie ich verstanden habe nur darum das ExtraForm zu verstecken um die Angriffsfläche da nicht zu ermöglichen...

Klar ??? Sonst bau ich auch gerne schnell ein Beispiel zusammen...

Mattes
05.11.2001, 11:39
@Kurt, @AWSW:

ja, jetzt, klaptt endlich.

Ich hab jetzt ein verstecktes Form, das ein Ereigniss bei Zeitgeber auslöst.

@AWSW:

Du schon wieder... :-))

@Alle:

KAnn mir jemand bei VBA helfen? Wie füge ich einen DS in eine Tabelle ein? Felder sollen feste Werte haben, z.B. Testdatensatz. ID(Autowert) soll sich in die vorhandene Tabelle einfügen, Zeit soll die Sysytemzeit sein.


???

MarioR
05.11.2001, 11:47
Hallo nochmal,

neuen DS am besten über Recordset:

Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("DeineTabelle")
rs.AddNew
rs!DeinZeitFeld = Now()
rs!NochEinFeld = "Test"
rs.Update
rs.Close
Set rs = Nothing

Mattes
05.11.2001, 12:04
...nah dran!

den Rest krieg ich hin. Danke an Euch Alle!

(I Love you all! )

:-))))

Mattes
06.11.2001, 09:13
Kurze Erfolgsmeldung:

Verstecktes Formular mit Timer, an das Ereignis Timer folgenden Code gebunden:

Private Sub Form_Timer()

Dim db As DAO.Database
Dim rs As DAO.Recordset

Set db = CurrentDb()
Set rs = db.OpenRecordset("Zeiten", dbOpenDynaset)
rs.AddNew
rs("Kommen") = Now()
rs("Personalnummer") = "123"
rs("Datum") = Date
rs.Update
rs.Close
Set rs = Nothing
Set db = Nothing

End Sub

... funzt hervorragend.

Vielen Dank für Eure Tipps.