Auswertung vom dbf Chaos die 2te ( Arbeitszeit)

Moin,
vor einiger zeit habe ich hier das Problem mit Rainer und Alex schonmal durchgekaut, nun war meine Temporäre Lösung doch nicht so Optimal wie ich es mir erhoft hatte. Aber ich wusste es ja besser und wollte nicht auf Rainer hören…
Zum Problem :Ich habe ein DBase file mit Daten von einem Ein/Ausgangsleser. Dieser dient zur Arbeitszeiterfassung. Seit dem letzten Thema hat sich nun soviel getan das in der Liste das Personal einmal kommt und einmal geht. niemand kommt 2 mal zu unterschiedlichen zeiten! Leider macht der leser beim Karte ranhalten manchmal meherer Zeitstempel mit der gleichen zeit die rausgefiltert werden müssen.

Mein Altes tool ist leider sobald es mehr als 3000 Datensätze sind … sehr sehr langsam … ein weiters Problem ist das mein tool nur arbeitszeiten berechnen kann die am gleichen tag geleistet werden… wenn nun ein mitarbeiter länger als 0 Uhr arbeitet. kann es die zeit nicht erfassen. hier der code zum alten programm

http://www.ichbinderfelix.de/dbf filter.zip

Rainer sagte das ein SQL String wohl die beste Lösung ist ?
was ich brauche ist:
Einlesen der Datei unter Auswahl eines Monats. In diesem Monat werden alle Mitarbeiter angezeigt die den Leser Passiert haben. Nun kann eine Person ausgewählt werden und eine genaue auflistung wird dargestellt. also wieviele stunden hat person x am tag geleistet + überstunden die über 0 gehen. Am ende sollte eine Monatssummer der arbeitsstunden erstellt werden. diese daten müssten in ein txt file oder ein excel files gespeichert werden …

ich vermute das ich mein tool komplett neu gestalten / programmieren muss oder ? die Datei mit den zeiten ist in dem ZIP File.
mfg jonny

Hi Joe,

ufffff. Das hatte ich zum Glück schon wieder vergessen.
Du erinnerst Dich an das Hauptproblem, fehlende Daten? Ist das gelöst?

http://www.ichbinderfelix.de/dbf filter.zip

hmmmm, geht der Pfad ohne Leerzeichen? Dann klappt auch der Link.

ich vermute das ich mein tool komplett neu gestalten /
programmieren muss oder ? die Datei mit den zeiten ist in dem
ZIP File.

Das denke ich auch. Na dann, auf ein neues. :smile:

Vom ersten Versuch erinnere ich mich noch, daß Vieles mit .dbf gar nicht ging. Deshalb würde ich als ersten Schritt die Daten erst mal in eine .mdb übertragen, dann geht die Verarbeitung viel bequemer und schneller. Noch habe ich nichts geladen, im Moment lenkt mich erst mal die EM ab. :smile:

Gruß Rainer

Ja Moin,

ufffff. Das hatte ich zum Glück schon wieder vergessen.
Du erinnerst Dich an das Hauptproblem, fehlende Daten? Ist das
gelöst?

Ja, Es gibt keine Fehlenden daten mehr. abgesehen von den überstunden nach 0 uhr … es gibt hier keine fehlenden daten aber die person geht rst am nächsten tag.

http://www.ichbinderfelix.de/dbf filter.zip

Sollte mit Leerzeichen gehen also kopie paste hat gerade funktioniert

ich vermute das ich mein tool komplett neu gestalten /
programmieren muss oder ? die Datei mit den zeiten ist in dem
ZIP File.

Das denke ich auch. Na dann, auf ein neues. :smile:

Vom ersten Versuch erinnere ich mich noch, daß Vieles mit .dbf
gar nicht ging. Deshalb würde ich als ersten Schritt die Daten
erst mal in eine .mdb übertragen, dann geht die Verarbeitung
viel bequemer und schneller. Noch habe ich nichts geladen, im
Moment lenkt mich erst mal die EM ab. :smile:

Ist doch Klar wer gewinnt !! also mach den Fernseher aus :stuck_out_tongue:P

gruß jonny

Gruß Rainer

Hi Ralf,

hieß das nicht Hey Joe? :smile:))

Jaaaa, OK, ich gewöhn mich um. :smile:

http://www.ichbinderfelix.de/dbf filter.zip

hmmmm, geht der Pfad ohne Leerzeichen? Dann klappt auch der
Link.

mit http://www.ichbinderfelix.de/dbf%20filter.zip klappt es.

Danke! Ich hab’ einfach mal kopiert. :smile:

Mehr kann ich leider nicht beitragen :frowning:

Macht nix, ich hab’ schon etwas.

Gruß Rainer

Hey Joe,

(gute Idee von Ralf. :smile:)

ufffff. Das hatte ich zum Glück schon wieder vergessen.
Du erinnerst Dich an das Hauptproblem, fehlende Daten? Ist das
gelöst?

Ja, Es gibt keine Fehlenden daten mehr.

Das ist doch schon mal etwas.

abgesehen von den
überstunden nach 0 uhr … es gibt hier keine fehlenden daten
aber die person geht rst am nächsten tag.

Das macht dann nichts.

http://www.ichbinderfelix.de/dbf filter.zip

Sollte mit Leerzeichen gehen also kopie paste hat gerade
funktioniert

Ja, bei mir auch. :smile:

Noch habe ich nichts geladen, im
Moment lenkt mich erst mal die EM ab. :smile:

Ist doch Klar wer gewinnt !! also mach den Fernseher aus :stuck_out_tongue:P

Jetzt ja. :smile:

OK. ich habe erst mal mit dem ‚VisualDataManager‘ von VB eine MDB gebaut, vom Code aus war mir das zu umständlich.

Die MDB heißt Perslog.mdb, die Felder:
DATE
TIME
NAME
ACCESS

Die anderen felder sind im Moment ja ungenutzt, wozu die auch mit kopieren? Das kannst Du aber auch ändern, wenn Du magst, der Code ist ja einfach.

Dann kommt das neue Programm:

Auf der Form liegen erst mal zwei Steuerelemente ‚Data‘ (Data1 und Data2). Dazu drei Commandbutton (Command1, Command2 und Command3) und noch zwei Flexgrid (MsFlexgrid1 und MsFlexgrid2). Bei Data1 musst Du noch die Eigenschaft ‚Connect‘ auf DBASE III stellen.

Data1 wird in den Eigenschaften mit der DBASE-Datei verbunden, Data2 mit der MDB, Flexgrid1 mit Data1 und Flexgrid2 mit Data2. OK?

Dann der Code:

Option Explicit

Private Sub Command1\_Click()
 Dim i As Long, n As Long
 Data1.Recordset.MoveFirst
 While Data1.Recordset.EOF = False
 Data2.Recordset.AddNew
 Data2.Recordset(0) = Data1.Recordset(0)
 Data2.Recordset(1) = Data1.Recordset(1)
 Data2.Recordset(2) = Data1.Recordset(2)
 Data2.Recordset(3) = Data1.Recordset(4)
 Data2.Recordset.Update
 Data1.Recordset.MoveNext
 Wend
 Data2.Refresh
End Sub

Private Sub Command2\_Click()
 Data2.Recordset.MoveLast
 Do
 Data2.Recordset.Delete
 Data2.Recordset.MovePrevious
 Loop While Data2.Recordset.BOF = False
 Data2.Refresh
End Sub

Private Sub Command3\_Click()
 Dim SqlStr As String
 Dim db As Database
 Dim rs As DAO.Recordset
 Set db = OpenDatabase(App.Path + "\Perslog.mdb")
 SqlStr = "SELECT DISTINCT NAME, DATE, TIME, ACCESS FROM Perslog WHERE NAME '' ORDER BY NAME, DATE, TIME;"
 Set rs = db.OpenRecordset(SqlStr)
 Set Data2.Recordset = rs
 Data2.Refresh
End Sub

Private Sub Form\_Load()
 Command1.Caption = "Daten kopieren"
 Command2.Caption = "MDB leeren"
 Command3.Caption = "MDB filtern"
End Sub

Alex wird mich dafür prügeln, aber es ist erst mal wenig Code.

Als Ergebnis hast Du schon mal doppelte Daten ausgefiltert, Datensätze ohne Namen ausgefiltert und die Datensätze nach Name, Datum, Zeit sortiert.

Nun noch mit Datediff() die Zeitdifferenzen berechnen … wird doch nicht mehr so schwer, oder?

Gruß Rainer

Nachtrag
Hi,

ich hab’ mir die Namen mal mit diesem Filter …

 SqlStr = "SELECT DISTINCT NAME FROM Perslog WHERE NAME '' ORDER BY NAME;"

… angesehen, wo kommen die denn her? Mindestens ein Name tauch in mindestens vier verschiedenen Schreibweisen auf. Ich würde da wohl als ‚Herr Fischer‘ ‚Fischer Rainer‘ ‚Rainer Fischer‘ und ‚Reiner Fischer‘ auftauchen. Ohne das alles manuell zu bearbeiten schaffst Du es nie, das auszuwerten.

Gruß Rainer

Hi,

ich hab’ mir die Namen mal mit diesem Filter …

SqlStr = „SELECT DISTINCT NAME FROM Perslog WHERE NAME
‚‘ ORDER BY NAME;“

Ich kann dich beruhigen! Es gab Anfangs unstimmigkeiten wie die namen den Karten zugeweisen werden. Es bleibt aber dabei das Jeder Name So wie er geschrieben ist eindeutig bleibt. wenn es im Januar noch „Herr Mustermann“ war und nun „Frank Mustermann“ ist, ist das nicht unser problem.

mfg jonny

… angesehen, wo kommen die denn her? Mindestens ein Name
tauch in mindestens vier verschiedenen Schreibweisen auf. Ich
würde da wohl als ‚Herr Fischer‘ ‚Fischer Rainer‘ ‚Rainer
Fischer‘ und ‚Reiner Fischer‘ auftauchen. Ohne das alles
manuell zu bearbeiten schaffst Du es nie, das auszuwerten.

Gruß Rainer

Moin Rainer,

Als Ergebnis hast Du schon mal doppelte Daten ausgefiltert,
Datensätze ohne Namen ausgefiltert und die Datensätze nach
Name, Datum, Zeit sortiert.

Nun noch mit Datediff() die Zeitdifferenzen berechnen … wird
doch nicht mehr so schwer, oder?

Wieso klingt es so einfach ?
ich fahre gleich nach hause das ganze mal testen. DANKE soweit.

mfg jonny

Gruß Rainer

Hallo,

Ich kann dich beruhigen! Es gab Anfangs unstimmigkeiten wie
die namen den Karten zugeweisen werden. Es bleibt aber dabei
das Jeder Name So wie er geschrieben ist eindeutig bleibt.
wenn es im Januar noch „Herr Mustermann“ war und nun „Frank
Mustermann“ ist, ist das nicht unser problem.

OK. Dann überarbeite ich als erstes mal die Daten und sorge für ‚einheitliche Namen‘. ‚Frau‘ und ‚Herr‘ werfe ich weg, entferne Tippfehler, bis jeder Name nur noch in einer Schreibweise auftaucht. Mit Programm unterstützung wird das nicht schwer, dann sind die Daten so, wie sie künftig kommen. Im Mai hat das noch nicht funktioniert, das kann ja nur besser werden. :smile:

Hast Du schon mal in den Code gesehen? Getestet? Das langsame ‚Einlesen‘ ist schon mal weg. Wenn die Namen bereinigt sind, schaffst Du es selbst, die Zeitdiggerenzen vernünftig zu berechnen? Durch die fehlerhaften Namen kann das z.Z. noch kein brauchbares Ergebnis liefern, das ist klar. Aber ist Dir der Code klar?

Ich werde als nächsten Schritt die Namen in ein Array schreiben und dann für jeden Namen eine Abfrage generieren … nacheinander, nicht gleichzeitig. :smile: Dann steht da eine Tabelle für genau einen Mitarbeiter und alle vorhandenen Zeiten. Dann kann man leicht die Differenzen ausrechnen, was größer als X-Stunden (12?) ist, kann keine Arbeitszeit sein … Summe bilden, als Kalender mit Anwesenheit und Zeiten + Zeit/Monat anzeigen, bei Bedarf drucken.

Erst zaubere ich aber mal auswertbare Daten. :smile:

Gruß Rainer

Hey Joe,

Wieso klingt es so einfach ?

Das ist so einfach. :smile:

Gruß Rainer

Moin Rainer,

Die MDB heißt Perslog.mdb, die Felder:
DATE
TIME
NAME
ACCESS

Ich erstelle die perslog.mdb und erstelle ein Table „perslog“ mit den oben gennanten Feldern richtig ?

Hast Du schon mal in den Code gesehen? Getestet? Das langsame
‚Einlesen‘ ist schon mal weg. Wenn die Namen bereinigt sind,
schaffst Du es selbst, die Zeitdiggerenzen vernünftig zu
berechnen? Durch die fehlerhaften Namen kann das z.Z. noch
kein brauchbares Ergebnis liefern, das ist klar. Aber ist Dir
der Code klar?

SOgar den SQL String habe ich verstanden OO:stuck_out_tongue:
testen konnte ich es nocht nicht wegen der mdb.

Ich werde als nächsten Schritt die Namen in ein Array
schreiben und dann für jeden Namen eine Abfrage generieren …
nacheinander, nicht gleichzeitig. :smile: Dann steht da eine
Tabelle für genau einen Mitarbeiter und alle vorhandenen
Zeiten. Dann kann man leicht die Differenzen ausrechnen, was
größer als X-Stunden (12?) ist, kann keine Arbeitszeit sein
… Summe bilden, als Kalender mit Anwesenheit und Zeiten +
Zeit/Monat anzeigen, bei Bedarf drucken.

Erst zaubere ich aber mal auswertbare Daten. :smile:

Gruß Jonny

Hallo Joe,

Die MDB heißt Perslog.mdb, die Felder:
DATE
TIME
NAME
ACCESS

Ich erstelle die perslog.mdb und erstelle ein Table „perslog“
mit den oben gennanten Feldern richtig ?

richtig. Ohne Schlüssel. :smile: Ach ja, die Datentypen! *gg*

Date - Long
Time - Date/Time
Name - String
Access - String

Hast Du schon mal in den Code gesehen? Getestet? Das langsame
‚Einlesen‘ ist schon mal weg. Wenn die Namen bereinigt sind,
schaffst Du es selbst, die Zeitdiggerenzen vernünftig zu
berechnen? Durch die fehlerhaften Namen kann das z.Z. noch
kein brauchbares Ergebnis liefern, das ist klar. Aber ist Dir
der Code klar?

SOgar den SQL String habe ich verstanden OO:stuck_out_tongue:

Na wunderbar!

testen konnte ich es nocht nicht wegen der mdb.

Klar.

Gruß Rainer

Hi,

DATE
TIME
NAME
ACCESS

was mir gerade durch den Kopf geht … eventuell doch gleich das Datum in Jahr, Monat, Tag zerlegen? Dann wird die Auswertung für einen bestimmten Monat eines bestimmten Jahres später leicher, dann ist das Datum schon zerlegt.

Um die Differenz zu berechnen müssen wir Datum und Zeit ja ohnehin zusammenfassen, das muss so aussehen: ‚19.06.2008 15:59:00‘ dann klappt 'DifferezInMinuten = Datediff(„n“, Zeitstempel1 ,Zeitstempel2 ) Ganz wunderbar, auch von 22:00 bis 06:00 Uhr, da kommen 480 Minuten zurück. :smile: Das Datum muss also ohnehin zerlegt werden.

Gruß Rainer

Irgendwie scheine ich die MDB falsch gebaut zu haben ?

http://www.ichbinderfelix.de/perslog.mdb
http://www.ichbinderfelix.de/perslog.mdb
http://www.ichbinderfelix.de/perslog.mdb

sieht doch gut aus oder ?

Hi,

Irgendwie scheine ich die MDB falsch gebaut zu haben ?

nichts wichtiges, nur die Reihenfolge der Felder.

http://www.ichbinderfelix.de/perslog.mdb

sieht doch gut aus oder ?

Ja, sieht sehr gut aus.

Mit der anderen reihenfolge der Felder müssen wir nur eine Kleinigkeit ändern, sonst kommen die Daten ins falsche Feld und nix geht mehr. :smile:

Aus …

 While Data1.Recordset.EOF = False
 Data2.Recordset.AddNew
 Data2.Recordset(0) = Data1.Recordset(0)
 Data2.Recordset(1) = Data1.Recordset(1)
 Data2.Recordset(2) = Data1.Recordset(2)
 Data2.Recordset(3) = Data1.Recordset(4)
 Data2.Recordset.Update
 Data1.Recordset.MoveNext
 Wend

… bauen machen wir einfach …

 While Data1.Recordset.EOF = False
 Data2.Recordset.AddNew
 Data2.Recordset("DATE") = Data1.Recordset("DATE")
 Data2.Recordset("TIME") = Data1.Recordset("TIME")
 Data2.Recordset("NAME") = Data1.Recordset("NAME")
 Data2.Recordset("ACCESS") = Data1.Recordset("ACCESS")
 Data2.Recordset.Update
 Data1.Recordset.MoveNext
 Wend

… und schon kann uns die Reihenfolge der Felder egal sein. :smile:

Gruß Rainer

Hmpf… so wenig Code, und schon der Wurm drin ?

NAch dem Klick auf „Daten Kopieren“
bekomme ich : Object Variable ow With block variable not set und er zeigt auf Data2.Recordset.AddNew

http://www.ichbinderfelix.de/arbeitszeit.zip
http://www.ichbinderfelix.de/arbeitszeit.zip
http://www.ichbinderfelix.de/arbeitszeit.zip

Normal müsste das Flexgrid2 schon beim starten den Inhalt der Mdb anzeigen oder ?

mfg jonny

Hi Joe,

Hmpf… so wenig Code, und schon der Wurm drin ?

NAch dem Klick auf „Daten Kopieren“
bekomme ich : Object Variable ow With block variable not set
und er zeigt auf Data2.Recordset.AddNew

http://www.ichbinderfelix.de/arbeitszeit.zip
http://www.ichbinderfelix.de/arbeitszeit.zip
http://www.ichbinderfelix.de/arbeitszeit.zip

Ich seh’s mir gleich an. Sicher hast Du mur das Recordset vergessen.

Normal müsste das Flexgrid2 schon beim starten den Inhalt der
Mdb anzeigen oder ?

nö, ist ja nichts drin.

Aber sieh Dir erst mal meins kurz an

http://www.winhome.de/Joe.zip

Bis gleich,

Gruß Rainer

Hi,

ja, nur der Klick auf ‚Recordsource‘ bei Data2 hat gefehlt. :smile:

Gruß Rainer

Nun haben wir wirklich alle datensätze die wir braucen und verwenden können.

SqlStr = „SELECT DISTINCT NAME, DATE, TIME, ACCESS FROM Perslog WHERE NAME ‚‘ and WHERE ACCESS = LIKE ‚hintereigang%‘ ORDER BY NAME, DATE, TIME;“

mal schauen ob ich nun diese auswerten kann.
mfg jonny

Hi Joe,

SqlStr = „SELECT DISTINCT NAME, DATE, TIME, ACCESS FROM
Perslog WHERE NAME ‚‘ and WHERE ACCESS = LIKE
‚hintereigang%‘ ORDER BY NAME, DATE, TIME;“

das ist nicht Access!

SqlStr = „SELECT DISTINCT NAME, DATE, TIME, ACCESS FROM Perslog WHERE NAME ‚‘ AND ACCESS LIKE ‚Hinter*‘ ORDER BY NAME, DATE, TIME;“

Kein Prozent, ein Asterisk. :smile:

Gruß Rainer