PDA

Vollständige Version anzeigen : DLookUp - ungewolltes Verhalten


Maximilian
07.10.2001, 15:36
Hallo Leute,

In einem Unterformular (Endlosformular) zur Berechnung von Abwesenheitszeiten habe ich 2 gebundene Felder zur Eingabe von Datumswerten (von, bis - tblAbwesenheiten). Damit wird in den 3 weiteren Feldern mittels Function die Anzahl der Abwesenheitstage, der Feiertage sowie die Urlaubstage berechnet. Soweit so gut. In einer Abfrage wird nun aufgrund der SollArbeitszeiten (tblBeschäftigungsausmaß) die Abwesenheit nach Stunden berechnet (was auch funktioniert). Ich möchte nun das Ergebnis dieser Abfrage (StundenAbwesenheit) in ein 4. gebundenes Textfeld (tblAbwesenheiten) einfügen und habe dies mit DLookUp versucht.

Nun zu meinem Problem:
Die Berechnung der Abwesenheitstage sowie der Abwesenheitsstunden ist an das Ereignis "nach Aktualisierung" des Datumsfeldes "bis" gebunden. Eigenartiger Weise werden nur die Abwesenheitstage (Abwesenheit, Feiertage, Urlaub) aktualisiert. Das Feld Abwesenheitsstunden bleibt leer. Nur wenn ich das Enddatum nochmals eingebe erscheint das korrekte Ergebnis. Ich habe den Aufruf der Prozedur auch an das Ereignis "nach Verlassen" gebunden was kein anderes Ergebnis erbracht hat. Kann mir jemand sagen woran das liegt?

Nachstehend meine verwendete Syntax:

Private Sub bis_Exit(Cancel As Integer)
If Not IsNull(Forms![frmUrlaubAbwesenheit].[ufoUrlaubAbwesenheit]!von) And _
(Forms![frmUrlaubAbwesenheit].[ufoUrlaubAbwesenheit]!bis) Then

Me.txtWerktage = AnzWerktage3(von, bis)
Me.txtNettoarbeitstage = AnzWochenTage(von, bis)
Me.txtFeiertage = Me.txtNettoarbeitstage - Me.txtWerktage
Me.txtAbwesenheitStd = StdBerechn (AbwesenheitID) 'Aufruf der unten angeführten Function
Me.Requery
Else

MsgBox "Sie müssen ein Start- und ein Enddatum eingeben!", vbOKOnly, _
"Berechnungsgrundlage fehlt!"

If vbOKOnly = vbOK Then
Me.Undo
End If
End If
End Sub

*****

Public Function StdBerechn(AbwesenheitID As Long)

StdBerechn = DLookup("AbwesenheitStunden", "abfAbwesenheit", "AbwesenheitID=" & AbwesenheitID)

End Function

Danke
Max

uke
07.10.2001, 19:48
Hi Maximilian,
vmtl durchschaue ich Deinen Code nicht ganz, weil ich Deine DB-Struktur nicht ganz kenne. Aber mir scheint, Du drehst Dich hier mit Deiner Abfrage im Kreis. Wo kommt die z.B. die AbwesenheitID her? Hast Du Deine Abfrage abfAbwesenheit einfach mal im Abfrageeditor angeschaut, kommen denn da Deine Felder (AbwesenheitStunden und AbwesenheitID) ordentlich ausgefüllt vor? Könnte es sein, daß die Daten, die abfragst, vielleicht noch gar nicht in einer Tabelle gespeichert sind, weil Du noch im Formular stehst und die Daten nicht zurückgeschrieben sind?
Leider lässt sich da aus der Ferne nur rätseln...

Uke

Maximilian
08.10.2001, 19:44
Hy Uke,

"AbwesenheitID" ist das Primärschlüsselfeld der Tabelle "Abwesenheiten".

Nun zur Struktur. Folgende Tabellen sind in die Berechnung eingebunden:
1) tbl Mitarbeiter
2) tbl Abwesenheiten
3) tbl Abwesenheitsgrund
4) tbl Beschäftigungsausmaß

Zur Darstellung und Berechnung der erforderlichen Abwesenheitszeiten habe ich folgende Abfragen erstellt

1) uabfAbwesenheitStd (tblAbwesenheiten, tbl Abwesenheitsgrund, tblBeschäftigungsausmaß)
2) abfAbwesenheiten (tblMitarbeiter, uabfAbwesenheitStd)

In der uabfAbwesenheitStd werden mittels Function aufgrund des Anfang- und des Enddatums die div. Abwesenheitstage berechnet sowie aufgrund des Beschäftigungsausmaßes die Abwesenheiten in Stunden. Diese daraus errechneten Abwesenheitstage und Abwesenheitsstunden sollen nun in meinem Unterformular dargestellt werden.

Ich habe mir im Abfrageeditor nochmals die Ergebnisse angeschaut und nach Eingabe des Anfangs- und des Enddatums werden die entsprechenden Werte korrekt und "gleichzeitig" berechnet. Nur in meinem Unterformular werden die Abwesenheitsstunden nicht zeitgleich mit den Abwesenheitstagen reingeschrieben und ich muss (wie schon beschrieben) nochmals mein Ereignis auslösen, um auch die Abwesenheitsstunden korrekt im Unterformular darzustellen.

Ich dachte mir daher, dass es event. mit der DLookup-Funktion zusammenhängt, bin mir aber nicht sicher; hast Du ne Idee?

Gruß
Max

uke
09.10.2001, 10:34
Hallo Maximilian,
ich war ein bißchen auf Tour, so daß ich erst heute wieder dazu komme, Dir zu antworten.
Grundsätzlich ist die Dlookup-Abfrage korrekt, aber ich frage mich schon (wie gesagt, ganz habe ich Dein DB-Modell nicht kapiert, mir scheint, da hat es auch noch Ungereimtheiten drin :-)), ob die Zuweisung über Dlookup überhaupt notwendig wird. Wenn es ein gebundenes Feld ist, sollte diese Zuweisung nicht notwendig sein, denn Du berechnest ja bereits in einer anderen Funktion diesen Wert und schreibst ihn dort zurück. Es sollte max. ein Requery oder Refresh notwendig werden. Wenn das nicht reicht, ist das das erste Indiz dafür, dass Dein DB-modell eine (zumindest) kleine Macke hat.
Doch davon mal abgesehen: es könnte auch noch ein Timing-Problem geben; habe meherere DBs am Laufen, bei denen etliche Rechenprozesse so viel Zeit an sich und dann auch noch zum aktualisieren der Tabelle brauchen, dass die nächste Abfrage bereits ausgeführt wird wobei die erste Aktualisierung noch nicht ganz fertig ist (so ne Art Multi-Threading) Bau mal der Gaudi halber einfach mal ein kleine Warteschleife von ca 0,1 sek rein. Es kann sein, dass das Dein Problem dann schon löst (oberflächlich zumindest :-))

Lass mich Dein Ergebnis wissen

Uke

Maximilian
11.10.2001, 17:54
n'abend uke,

kurze Erläuterung: für die Berechnung der Abwesenheitszeiten in meinem Unterformular verwende ich meine Abfrage "abfAbwesenheiten". Mein Haupt- und Unterformular haben keinerlei Verbindung zu dieser Abrage. Die DLookup-Function berechnet die jeweiligen Abwesenheitszeiten eines Mitarbeiters auf Basis dieser Abfrage und schreibt diese in die Tabelle zurück. Schlag mich, aber ich (als Laie) denke, dass das keine schlechte Lösung ist. Mag sein dass das der Grund für mein Problem ist, aber eine andere Lösung ist mir auch nicht eingefallen. Für jede Hilfe bin ich sehr dankbar, da die kleine Warteschleife auch nichts gebracht hat.

Danke für Deine Mühe
Max

uke
11.10.2001, 21:03
Also mit dem Schlagen ist das so ne Sache... das könnte sich auch als Bummerang erweisen, weiß ich wie groß und stark Du bist???
Auf die Schnelle weiß ich keinen Rat, wenn Du aber willst, kannst Du mir mal einen Extrakt aus Deiner DB schicken, dann schau ich mir das mal an. Wenn ich das Ding sehe, sollten wir schon hinkriegen...
Ist nur ein Angebot...

Uke