Auswertung vom dbf Chaos die 2te ( Arbeitszeit)

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

Ich habe ein problem nach einem fund Eingangstür Aussen eine EIngangstür innen zu finden ? hast du da ne idee ?
das problem unten ist auch noch da.

mfg jonny

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Joe,

Ätzend, ich dachte schon ich hatte da nen fehler im Format !!

„N“ das war ja wieder …

*gg*

Ich habe nun noch das Problem das wenn ich
Data2.Recordset.Delete
kurz vorm ende der Kopieren Sub durchführen möchte sagt VB das
Data2 Schreibgeschützt ist. Aber wer hat da noch Zugriff auf
die Data2 ?

Du hast doch bestimmt noch nen guten Tip oder ?

Ich nehme an (heißt nicht genau wissen) daß das an der Abfrage mit DISTINCT liegt. So sind die Datensätze nicht eindeutig zuzuordnen.

Mach das löschen auf der Tabelle, nicht auf der Abfrage, dann wird es gehen. Die fehlerhaften datensätze werden ja nicht benötigt, die kann man unmittelbar nach dem Kopieren schon aus der Rabelle entfernen, noch bevor das erste rs erstellt wird.

Da fällt mir ein, schließen wir eigentlich auch mal ein Recordset oder die Datenbank? Ich denke nein, die bleiben alle die ganze Zeit offen.

Bau das mal ein, wenn ein Recordset nicht mehr benötigt wird, ein rs.close, vor dem Beenden des Programms ein DB.Close (In Ereignis QueryUnload der Form). Das habe ich völlig vernachlässigt. :smile: Man reiche mir die Asche …

Gruß Rainer

ich habe meinen Code nun wieder gelöscht … habe schonwieder rumgefuscht.

Mach das löschen auf der Tabelle, nicht auf der Abfrage, dann
wird es gehen. Die fehlerhaften datensätze werden ja nicht
benötigt, die kann man unmittelbar nach dem Kopieren schon aus
der Rabelle entfernen, noch bevor das erste rs erstellt wird.

Wie würdest du es machen ? oder besser WO ?

Bau das mal ein, wenn ein Recordset nicht mehr benötigt wird,
ein rs.close, vor dem Beenden des Programms ein DB.Close (In
Ereignis QueryUnload der Form). Das habe ich völlig
vernachlässigt. :smile: Man reiche mir die Asche …

halb so wild, das mache ich später. ich finde keinen punkt wo ich prüfe ob die person die kommt auch wieder geht …

mfg jonny

Hi Joe,

Problem: Löschen von Datensätzen.

Nach dem Kopieren steht die Tabelle ja im Recordset in Data2.
Anschließend habe ich Data2 mit den Abfragen verbunden und die veränderungen sehen zu können. Das hat und sie Probleme bereitet.

Ich habe nun einfach ein weiteres Data-Steuerelement eingefügt, nun haben wir drei:

1.) Originaldaten der DBase Datenbank
2.) Kopie der Daten in der ACCESS-Datenbank, da können wir auch löschen.
3.) Abfragen in der ACCESS-Datenbank.

Lade Dir bitte noch mal die neue, geänderte Vesion. (Link hast Du ja noch) Das Programm läuft, ob die Berechnung mit den Daten passiert, die Du möchtest, musst Du noch selbst prüfen, ich habe Kommentare im Code.

Wenn die Daten in Ordnung sind, greift das Programm auch nicht ein, verändert nichts. (Wenn ich nichts falsch gemacht habe. :smile:)

Gruß Rainer

a Hoi Rainer,
So, Kind ist im Bett (2J) und ich habe mir den Code mal angeschaut.
Danke für die Kommentare :stuck_out_tongue: es gab ein paat stellen wo ich mir nicht ganz sicher war was dort passiert. Naja die eine oder andere gibt es immer noch.

Kurze frage zu :
'Kontrolle ob Eingang und Ausgang am selben Tag sind
'entfernt, Nachtschichtproblem, Dafür wird geprüft, ob die
'schicht länger als 16 stunden gedauert hat und der Wert dann
'aus unglaubwürdig verworfen.

Was passiert wenn eine Person das gebäude bis 23.59 nicht verlassen hat ? Wird geschaut ob das nächste Event mit dem namen "ein Ausgang ist " ??

Die Angaben auf der Form2.FlexGrid sollen in Stunden mit 2 kommerstellen geschrieben werden. WIr haben die beiden zeilen.

If DateDiff("n", MSFlexGrid3.TextMatrix(r, 4), MSFlexGrid3.TextMatrix(r + 1, 4)) 
Das muss ja in die Zeile mit rein :/ wie kann ich hier sagen das, das ergebniss aus dem Datediff in Stunden mit 2 kommerstellen ausgegben wird. Oder kann das Datediff H schon ?

Und nun noch ein brocken ?
Wenn auf dem FlexGrid in Form2 steht Fehler. Würde ich gern die spalter anklicken(also die person) und in einer List box nochmal alle ein & Ausgänge auflisten. Aber ist nicht möglich in einem flexgrid eine Spalte auszuwählen oder ?

mfg jonny

Hi Joe,

So, Kind ist im Bett (2J) und ich habe mir den Code mal
angeschaut.
Danke für die Kommentare :stuck_out_tongue: es gab ein paat stellen wo ich mir
nicht ganz sicher war was dort passiert. Naja die eine oder
andere gibt es immer noch.

Du kannst ja fragen. Ich denke immer, der Code spricht für sich, wenn etwas unklar ist, musst Du fragen, ich weiß das sonst nicht.

Kurze frage zu :
'Kontrolle ob Eingang und Ausgang am selben Tag sind
'entfernt, Nachtschichtproblem, Dafür wird geprüft, ob die
'schicht länger als 16 stunden gedauert hat und der Wert dann
'aus unglaubwürdig verworfen.

Was passiert wenn eine Person das gebäude bis 23.59 nicht
verlassen hat ? Wird geschaut ob das nächste Event mit dem
namen "ein Ausgang ist " ??

Ja, das Datum wird ignoriert, es geht nur noch darum, ob dem Eintrag ‚Eingang‘ ein Eintrag ‚Ausgang‘ innerhalb von maximal 16 Stunden folgt, es muss der nächste Datensatz sein.

Die Angaben auf der Form2.FlexGrid sollen in Stunden mit 2
kommastellen geschrieben werden. WIr haben die beiden zeilen.

If DateDiff(„n“, MSFlexGrid3.TextMatrix(r, 4),
MSFlexGrid3.TextMatrix(r + 1, 4))
Das muss ja in die Zeile mit rein :confused: wie kann ich hier sagen
das, das ergebniss aus dem Datediff in Stunden mit 2
kommerstellen ausgegben wird. Oder kann das Datediff H schon ?

Nein, Datediff(„h“, … gibt nur ganze Stunden an, ignoriert die Minuten. Du kannst doch das erhebnis aus Datediff an eine Variable übergeben und in Stunden mit Kommastelle (oder Doppelpunkt) umrechnen. Daß das immer zwei Stellen sind, kannst Du entweder mit einer Stringmanipulation … ( Ergebnis = Right(„00“ + CStr(Wert),2) ) … oder mit der Ausgabe al FormatString … Ergebnis = Format(Wert, „#:00“) … erledigen. Das ist Geschmackssache.

Und nun noch ein brocken ?
Wenn auf dem FlexGrid in Form2 steht Fehler. Würde ich gern
die spalter anklicken(also die person) und in einer List box
nochmal alle ein & Ausgänge auflisten. Aber ist nicht möglich
in einem flexgrid eine Spalte auszuwählen oder ?

Ja, Du hast ja schon in der Schleife die Abfrage für die Daten nur einer Person in einem Monat. Die Abfrage musst Du verwenden, den ausgewählten Namen übergeben … (Steht in Flexgrid,Textmatrix(0,Flexgrid.Row)) … die ab Data3.Recordset übergeben, refreshen, Form2 verstecken (hide) und Flexgrid3 anzeigen.

Nicht vegessen, dann immer Form1. davor zu schreiben, denn den Code schreibst Du ja in der Form2 in MsFlexgrid1.Klick (oder Doubleklick).
Das wäre die Falle an der szelle, weiter fallen mir nicht ein. :smile:

Gruß Rainer

Moin Rainer,
habe gerade die letzten Einträge von mir gelesen und „Schluck“
was ein deutsch/Buchstabensalat :open_mouth:O

Ich versuche gerade die umrechnung in std. zu machen.
Erst wollte ich es in die Zeile schreiben die mit dem FlexGrid arbeitet. Aber diese ließt den Wert ja immer wieder ein und addiert werte. also ist das eine schlechte stelle.
unter der Schleife wäre es eigentlicht ganz gut, hier muss nur geschaut werden ob der wert >0 oder instr(Fehler) steht oder. mit Fehler334 kann ja keiner rechnen.
Kann eine Integer Variable so einen wert ausgaben 3:33 ? doch lieber ein string oder ?
frohes schaffen mfg jonny

If DateDiff("n", MSFlexGrid3.TextMatrix(r, 4), MSFlexGrid3.TextMatrix:frowning:r + 1, 4)) \> 2 Then
 If DateDiff("n", MSFlexGrid3.TextMatrix(r, 4), MSFlexGrid3.TextMatrix(r + 1, 4)) 0 Then
 MIV = Form2.MSFlexGrid1.TextMatrix(Day, i)
 MIH = CStr(MIV \ 60) + ":" + CStr(MIV - ((MIV \ 60) \* 60))

 End If

 Else
 'Differenzen 

Moin Joe,

Ich versuche gerade die umrechnung in std. zu machen.
Erst wollte ich es in die Zeile schreiben die mit dem FlexGrid
arbeitet. Aber diese ließt den Wert ja immer wieder ein und
addiert werte. also ist das eine schlechte stelle.
unter der Schleife wäre es eigentlicht ganz gut, hier muss nur
geschaut werden ob der wert >0 oder instr(Fehler) steht
oder. mit Fehler334 kann ja keiner rechnen.

Ja, gute Idee, das ist die richtige Stelle für die Umrechnung.
Du kannst die Zahlen im Fehlerfall ja auch weg lassen, dann steht da nur noch ‚Fehler‘.

Kann eine Integer Variable so einen wert ausgaben 3:33 ? doch
lieber ein string oder ?

Da bin ich nicht ganz sicher, ich glaube das geht ohne String nicht, würde ich mit String machen.

If DateDiff(„n“, MSFlexGrid3.TextMatrix(r, 4),
MSFlexGrid3.TextMatrix:frowning:r + 1, 4)) > 2 Then
If DateDiff(„n“,
MSFlexGrid3.TextMatrix(r, 4), MSFlexGrid3.TextMatrix(r + 1,
4)) 0 Then
MIV =
Form2.MSFlexGrid1.TextMatrix(Day, i)
MIH = CStr(MIV \ 60) + „:“ +
CStr(MIV - ((MIV \ 60) * 60))

End If

Else
'Differenzen

da fehlt noch die Behandlung: Wenn das Ergebnis OK ist, aber schon ‚Fehler‘ in der Zelle steht, dann nicht addieren … sonst stürzt das Programm irgendwann an der Stelle ab.

Gruß Rainer

Hi Joe,

etwas grundsätzliches noch, vom aktuellen Programm mal komplett abgekoppelt.

Wenn Du das länger verwenden möchtest, musst Du Dir noch Gedanken machen, was Du mit den bereits verarbeiteten Daten tust, wie die verarbeiteten Rohdaten behandelt werden.

Einfach wegwerfen geht grundsätzlich nicht, die musst Du archivieren, sicherstellen, daß nichts verlorengeht.

Immer alle Daten der Vergangenheit einlesen, verarbeiten geht natürlich auch nicht. Im Moment sind das schon Daten von mehreren Monaten, sogar aus dem Vorjahr werden noch Daten mit übergeben. Das macht das Programm langsam. In zwei Jahren wird die Zeit nicht mehr akzeptabel sein.

Gruß Rainer

A Hoi Rainer,
habe es nun wie Folgt gelöst.

Form2.MSFlexGrid1.TextMatrix(Day, i) = „Fehler“
End If

If Form2.MSFlexGrid1.TextMatrix(Day, i) = „Fehler“ Then

Else
If Form2.MSFlexGrid1.TextMatrix(Day, i) > 0 Then
MIV = Form2.MSFlexGrid1.TextMatrix(Day, i)
MIH = CStr(MIV \ 60) + „,“ + CStr(MIV - ((MIV \ 60) * 60))
Form2.MSFlexGrid1.TextMatrix(Day, i) = MIH
End If

Nun muss ich nochmal schauen wie ich das mit dem Spaltenklick in der Form2 mache.

Ascho, Grunsätzlich:
In 2 Jahren ist das Tool denn so lagsam wie das alte mit den jetzigen daten. Aber es ist wohl am Einfachsten zbsp. zum JAhreswächsel die perslog.dbf zu Archivieren. ich werde das mal im hinterkopf behalten.

danke!!!

mfg jonny

Hi Joe,

habe es nun wie Folgt gelöst.

ist also erledigt, gut. Dann … hab ich’s schon wieder vergessen. :smile:

Nun muss ich nochmal schauen wie ich das mit dem Spaltenklick
in der Form2 mache.

Die Abfrage mit dem Namen hast Du ja da. Den Namen bekommst Du in Sub Form2.MsFlexgrid2_Klick () aus Form2.MsFlexgrid1.Textmatrix (0, Form2.MsFlexgrid2.Col)

Ascho, Grunsätzlich:
In 2 Jahren ist das Tool denn so lagsam wie das alte mit den
jetzigen daten.

Ganz so grob nicht, aber länger als eine Sekunde dauert es ja jetzt auch schon, das ist schon zu lang. :smile: Wenn die Daten alle zwei - drei Monate archiviert werden, geht das schneller.

Aber es ist wohl am Einfachsten zbsp. zum
JAhreswächsel die perslog.dbf zu Archivieren. ich werde das
mal im hinterkopf behalten.

Gut. :smile:

Gruß Rainer

Eine frage hätte ich da noch …

Wenn Person X am 19.4.2008 um 20 Uhr anfängt zu arbeiten und am 20.4.2008 um 4 Uhr die arbeit beendet werden die Stunden dem 19.4.2008 gutgeschrieben. Gibt es eine Möglichkeit nun noch zu sagen das die 4 Stunden nach 23.59 auch dem dazugehörigen tag gutgeschreiben werden ?

ob das wichtig ist, muss ich noch klären. erstmal die frage des aufwands.

mfg jonny

Hi Joe,

Wenn Person X am 19.4.2008 um 20 Uhr anfängt zu arbeiten und
am 20.4.2008 um 4 Uhr die arbeit beendet werden die Stunden
dem 19.4.2008 gutgeschrieben. Gibt es eine Möglichkeit nun
noch zu sagen das die 4 Stunden nach 23.59 auch dem
dazugehörigen tag gutgeschreiben werden ?

klar geht das. Der Tag steht ja dabei und wenn die Tage in den beiden Datensätzen nicht gleich sind, berechnest Du die beiden Differenzen zu Null-Uhr und trägst sie in die richtige Zeile ein.

ob das wichtig ist, muss ich noch klären. erstmal die frage
des aufwands.

Das ist kein großer Aufwand, aber unüblich. Die Nachtschicht von heute beginnt heute um 22:00 Uhr. Die Zeit bis 06:00 Uhr zählt mit zu heute.

Gruß, Rainer

Moin Rainer,

Ich habe mir eine SUB gebaut um die extra Auswerung in die Listbox zu bekommen. Aber ich habe wohl noch einen fehler in der zeile:
Form2.List1.AddItem Data2.Recordset(„NAME“) & Data2.Recordset(„Month“)
Ich habe erstmal nur Name und Monat genommen, zum testen.
mfg jonny

Public Sub Person()
 Dim Year As String
 Dim SqlStr As String
 Dim NAMex As String
 Dim db As Database
 Dim Month As String
 Form2.List1.Clear
 NAMex = Form2.MSFlexGrid1.TextMatrix(0, Form2.MSFlexGrid1.Col)

 Dim rs As DAO.Recordset
 Set db = OpenDatabase(App.Path + "\Perslog.mdb")
 Year = cboYear.List(cboYear.ListIndex)
 Month = cboMonth.List(cboMonth.ListIndex)

 NAMex = Form2.MSFlexGrid1.TextMatrix(0, Form2.MSFlexGrid1.Col)
 SqlStr = "SELECT DISTINCT NAME FROM Perslog WHERE NAME '" + NAMex + "' AND ACCESS LIKE 'Hinter\*' AND YEAR = '" + Year + "' AND MONTH = '" + Month + "' ORDER BY NAME"
 Set rs = db.OpenRecordset(SqlStr)

 rs.MoveFirst
 While Not rs.EOF

 Form2.List1.AddItem Data2.Recordset("NAME") & Data2.Recordset("Month")
 rs.MoveNext
 Wend

 End Sub

Hi Joe,

Public Sub Person()

Public? Dann steht die Sub also in einem Modul …

Dim rs As DAO.Recordset
Set db = OpenDatabase(App.Path + „\Perslog.mdb“)
Year = cboYear.List(cboYear.ListIndex)
Month = cboMonth.List(cboMonth.ListIndex)

Dann fehlt hier bei den Comboboxen schon die Angebe, welche Form.

Form2.List1.AddItem Data2.Recordset(„NAME“) & Data2.Recordset(„Month“)

und hier für Data2 ebenfalls. Das könnte es zwei mal geben, auf jeder Form ein mal und dann miss VB schon wissen, wer gemeint ist.

Warum eigentlich Public? In der Prozedur auf Form2 hätte IMO genügt. Der Fehler wäre aber der Selbe gewesen. :smile: Das Klickereignis passiert aber nun mal auf Form2, die Anzeige auf Form1.

Gruß Rainer

Hallo Rainer,

Hi Joe,

Public Sub Person()

Public? Dann steht die Sub also in einem Modul …

Noe, ich rufe die Sub aus der Form2 auf. deshalb Public. Sie befindet sich in Form 1.

ABer die Ausgabe in die Listbox passt nicht. http://www.ichbinderfelix.de/filter.zip
http://www.ichbinderfelix.de/filter.zip
http://www.ichbinderfelix.de/filter.zip

mfg joe

Hi Joe,

Noe, ich rufe die Sub aus der Form2 auf. deshalb Public. Sie
befindet sich in Form 1.

warum?

ABer die Ausgabe in die Listbox passt nicht.

 While Not rs.EOF 
 Form2.List1.AddItem Data2.Recordset("NAME") & Data2.Recordset("Month")
 rs.MoveNext
 Wend

Kann auch nicht. :smile:

Du baust ein recordset (das nur einen Namen enthält, ist das Absicht?)kurbelst das von Start bis ende durch (obwohl da nur ein Datensatz sein kann) und gibst dann zwei Felder … Eines anderen Recordsets !!! aus.

Wenn der Code Sinn machen würde, sollte der wohl so aussehen:

 While Not rs.EOF 
 Form2.List1.AddItem rs("NAME") & rs("Month")
 rs.MoveNext
 Wend

Nicht wundern, daß das nicht geht. Im SQL-String legst Du fest, daß das Recordset nur aus einem Feld ‚Name‘ besteht, ‚Month‘ gibt es im SQL-String nicht, deshalb kannst Du das auch nicht ausgeben.

Mit Genau einem bestimmten Namen und einem bestimmten Monat und keinen weiteren Feldern kann das Recordset auch nur aus einem Datensatz bestehen, so kannst Du auch gleich die Daten ausgeben und kannst Dir das Recordset sparen.

Ich hoffe, daß die Abfrage nur jetzt so aussieht, weil Du nach dem Fehler gesucht hast.

Eigentlich wolltest Du ja diesen SQL String verwenden und die Daten an Form1.Data2 übergeben. Mit einem Data2.Refresh werden die dann auch angezeigt.

SqlStr = "SELECT DISTINCT NAME, DATE, TIME, ACCESS, TIMESTAMP FROM Perslog WHERE NAME = '" + MA + " ' AND ACCESS LIKE 'Hinter\*' AND YEAR = '" + Year + "' AND MONTH = '" + Month + "' ORDER BY NAME, DATE, TIME;"

Gruß Rainer