PDA

Vollständige Version anzeigen : Hourglass = True plötzlich wieder weg???


rbarth
05.07.2006, 10:06
Zum Start einer Prozedur habe ich die Sanduhr angeschalten (DoCmd.Hourglass = True). Nun wird während der Ausführung einer Prozedur die Sanduhr plötzlich wieder ausgeschaltet, obwohl die Prozedur noch gar nicht komplett abgearbeitet wurde und noch nicht der der Befehl zur Auflösung gegeben wurde (DoCmd.Hourglass = False).

Weiß jemand den Hintergrund oder kennt jemand dieses Phänomen?

Vielen Dank für Eure Mithilfe

Rainer

FW
05.07.2006, 10:11
... rekursiver Aufruf?

Anne Berg
05.07.2006, 10:54
Was läuft denn da an Code ab? Kannst du im Debugging Modus feststellen, an welcher Stelle das eintritt?

rbarth
05.07.2006, 12:02
Im Debugging Modus habe ich festgestellt, daß die Sanduhr genau in dem Moment weg geht, wenn ich eine SQL-Abfrage mit OpenRecordset starte. Ist das bekannt?

Anne Berg
05.07.2006, 12:07
So direkt kann ich die Frage jetzt nicht beantworten.

Kannst du mal ein bißchen von deinem Code zeigen? Wie sieht der Kontext aus, könnte die Abfrage auch anders ausgeführt werden? Wie wird das Ergebnis ausgewertet? ...

rbarth
05.07.2006, 13:23
Vielen Dank für Deine Mühe. Hier nochmals genauere Infos zum Problem:

Im folgenden eine Ereignisprozedur des Formulars <frm_Wertpapiere>
Die Prozedur wird gestartet nach dem Anklicken der Schaltfläche <SF_AbfrageAusführen>
Zwischen den beiden debug.print Befehlen wird die Sanduhr ausgeschalten (bei Ansicht des Formulars <frm_Wertpapiere> ohne daß der Befehl 'DoCmd.Hourglass False' erfolgt wäre. Der soll erst am Ende der Prozedur erfolgen.
Zwischen den beiden Debug.Print Befehlen vergehen ca. 3 Sekunden. In dieser Zeit soll die Sanduhr auf dem Formular angezeigt werden. Erst nach Ende der Abfrage und kurz bevor das Formular <frm_AnzeigeWertpapiere> geöffnet wird, soll die Sanduhr verschwinden. Dies geschieht aber nicht.

Der Prozedurcode für die Schaltfläche <SF_AbfrageAusführen>:
(Sorry, die Anzeige des Codes ist superblöde. Weshalb das so blöde formatiert wird versteh ich nicht. Ich hab es wie erläutert eingegeben. Mit den Buchstaben CODE und /CODE, in eckigen Klammern)



Private Sub SF_AbfrageAusführen_Click()
DoCmd.Hourglass True
Dim db as Database
Dim rs as Recordset
Dim strSQL as String
Dim strWKN as string
strWKN = Forms![frm_Wertpapiere]![TF_WKN].Value
Forms![frm_Wertpapiere]![BF_Info].Visible = True
Forms![frm_Wertpapiere].Repaint
strSQL = "SELECT Wertpapiere.* FROM Wertpapiere WHERE ((Wertpapiere.WKN)= """ & strWKN & """) "
Set db = CurrentDB
'''''''''''''''''''''''''''''''''''''''''''''''
Debug.Print "Zeit: " & Format(Now, "hh:mm:ss")
'''''''''''''''''''''''''''''''''''''''''''''''
Set rs = db.OpenRecordset(strSQL)
If rs.RecordCount = 0 Then
MsgBox "Keine Datensätze gefunden"
Else
'''''''''''''''''''''''''''''''''''''''''''''''
Debug.Print "Zeit: " & Format(Now, "hh:mm:ss")
'''''''''''''''''''''''''''''''''''''''''''''''
DoCmd OpenForm "frm_AnzeigeWertpapiere"
Forms![frm_AnzeigeWertpapiere].RecordSource = strSQL
DoCmd.Close acForm, "frm_Wertpapiere"
End If
DoCmd.Hourglass False
End Sub

Anne Berg
05.07.2006, 13:45
Erstens: zu Set DB ... und Set RS ...
diese Objekte unbedingt nach Gebrauch wieder mit DB.Close, RS.Close schließen. Meist wird auch noch ein Set DB = Nothing, Set RS = Nothing hinzugefügt.

Zum Code schlage ich folgende Alternative vor:strSQL = "SELECT Wertpapiere.* FROM Wertpapiere WHERE ((Wertpapiere.WKN)= """ & strWKN & """) "
<s>Set db = CurrentDB</s>
'''''''''''''''''''''''''''''''''''''''''''''''
Debug.Print "Zeit: " & Format(Now, "hh:mm:ss")
'''''''''''''''''''''''''''''''''''''''''''''''
<s>Set rs = db.OpenRecordset(strSQL)
If rs.RecordCount = 0 Then</s>
If DCount("*", strsql) = 0 Then
MsgBox "Keine Datensätze gefunden"
Else
'''''''''''''''''''''''''''''''''''''''''''''''
Debug.Print "Zeit: " & Format(Now, "hh:mm:ss")
'''''''''''''''''''''''''''''''''''''''''''''''
DoCmd OpenForm "frm_AnzeigeWertpapiere"
Forms![frm_AnzeigeWertpapiere].RecordSource = strSQL
DoCmd.Close acForm, "frm_Wertpapiere"
End If
Erklärung: keine ;)

(Wenn das DCount mit StrSql nicht geht, dann mit Tabelle und Kriterienteil versuchen.)

Anne Berg
05.07.2006, 13:49
Nachtrag:Zwischen den beiden debug.print Befehlen wird die Sanduhr ausgeschalten (bei Ansicht des Formulars ... Zwischen den beiden Prints wird aber nicht das Formular geöffnet!
Evtl. musst du die Eieruhr beim Öffnen/Laden erneut setzen und im Current wieder entfernen?!

FW
05.07.2006, 13:53
... evtl. befindet sich in dem Open-, Load- oder Activate-Ereignis des Formulars frm_AnzeigeWertpapiere ein DoCmd.Hourglass False...

rbarth
05.07.2006, 14:55
@ Anne: und FW:

Ablauf ist folgender:
- Formular 'frm_Wertpapiere' wird geöffnet
- Feld WKN wird vom Anwender ausgefüllt
- Anwender klickt auf Schaltfläche 'SF_AbfrageAusführen'
- Ereignisprozedur 'SF_AbfrageAusführen_Click' wird ausgeführt
- Formular 'frm_AnzeigeWertpapiere' wird geöffnet
- Formular 'frm_Wertpapiere' wird geschlossen

Der Befehl 'DoCmd.Hourglass True/False' wird definitiv nur beim Start/Ende der Prozedur 'SF_AbfrageAusführen_Click' ausgeführt.
Deshalb bleibt nach wie vor die Frage, weshalb bei Ausführung der SQL-Abfrage im Code auf dem Formular die Sanduhr verschwindet, obwohl die Prozedur noch nicht am Ende ist und obwohl an keiner anderen Stelle im Code auf den beiden Formularen der Hourglass-Befehl aufgerufen wird. Die Sanduhr verschwindet exakt an der Stelle, an welcher der Code-Befehl 'If rs.RecordCount = 0 Then' ausgeführt wird (siehe Zeitraum zwischen den beiden Debug.Print-Befehlen = 3 Sekunden)


Anne: 'Zwischen den beiden Prints wird aber nicht das Formular geöffnet!
Evtl. musst du die Eieruhr beim Öffnen/Laden erneut setzen und im Current wieder entfernen?!'


Das Formular ist bereits geöffnet. Der Code mit den beiden Debug.Prints
wurde ja aus diesem geöffneten Formular mit der Schaltfläche
'SF_AbfrageAusführen' gestartet. Es ist also bereits offen und für den Anwender sichtbar. Beim Klicken auf die Schaltfläche 'SF_AbfrageAusführen' kommt dann auch gleich die Eieruhr, aber sie verschwindet leider, bevor die Ereignisprozedur zu Ende ist. Verstehts Du, wie ich meine?

Anne Berg
05.07.2006, 15:22
Ja, ja - es ist schrecklich heiß, aber... :rolleyes:

Der Ablauf geht klar aus dem gezeigten Code hervor und musste jetzt nicht unbedingt noch einmal beschrieben werden. ;)

Nach dem zweiten Print wird das Formular 'frm_AnzeigeWertpapiere' zum Anzeigen der ausgewählten Daten per DoCmd.OpenForm geöffnet! Das ist sicherlich nicht dasselbe wie das F. in dem der Code abläuft! Also hatte ich dich schon ganz richtig verstanden. Wenn die Eieruhr zwischen den Prints verschwindet, hat es nichts mit dem Öffnen des Formulars zu tun, da das erst später erfolgt... (mehr wollte ich nicht zum Ausdruck bringen)

Nichts desto trotz: probier doch einfach mal meine Variante aus!

rbarth
06.07.2006, 09:57
@Anne

Tschuldigung, Anne. Ich dachte zunächst, daß ich es vielleicht nicht klar genug erklärt hätte.

Also ich habe es versucht mit Deinem Vorschlag. Allerdings funzt es mit DCount nicht. Da gibt es eine Fehlermeldung:

Fehlermeldung: 'Nr. 3078 Das Microsoft Jet-Datenbankmodul findet die Eingangstabelle oder Abfrage 'SELECT HDBV.* FROM HDBV WHERE (((HDBV.SysDatum)=#3/15/2006#) And ((HDBV.ISIN) = "FR0000570780")) ORDER BY HDBV.SysDatum DESC , HDBV.SysZeit DESC;' nicht. Stellen Sie sicher, dass sie existiert und der Name richtig eingegeben wurde.




Anne: 'Wenn das DCount mit StrSql nicht geht, dann mit Tabelle und Kriterienteil versuchen.'


Verstehe ich nicht. Wie meinst Du das mit Tabelle und Kriterienteil? Vielleicht stehe ich auf der Leitung!? (Blöde Eieruhr) :mad:

Übrigens, danke für den Tip mit dem 'rs.close'.
Kannst Du mir hierzu noch den Unterschied zwischen 'Set rs = Nothing' und 'rs.close' sagen? Muss man beides verwenden oder reicht 'rs.close'?

Anne Berg
06.07.2006, 10:18
Hallo,

wieso finde ich jetzt keinen Bezug zwischen dieser Fehlermeldung und dem bisher gezeigten Code? :confused:

Offensichtlich kann an der Stelle nur der Name einer Tabelle oder gespeicherten Abfrage eingesetzt werden. Also schreibst duDCount("*", "HDBV", "SysDatum=#3/15/2006# And ISIN='FR0000570780'")


... und was das Schließen betrifft, so sollte eigentlich Close genügen, aber mit Nothing gehst du auf "Nummer sicher"!

rbarth
06.07.2006, 12:53
@Anne

Der erste Code von mir war in etwas vereinfachter Form zum besseren Verständnis. Ich wollte Dich nicht verwirren. Beim zweiten Mal hab ich Dir den Originalcode gegeben.

Den untenstehenden Code hab ich zum Laufen gekriegt (Leider aber ohne Variable in Funktion dCount). Aber es ist kein Unterschied zu meiner Version mit 'If recordcount = 0'. Also genau dasselbe Problem mit der Eieruhr. Sie verschwindet einfach.


Set rs = db.OpenRecordset(strSQL)
If DCount("*", "HDBV", "SysDatum=#3/15/2006# And ISIN='FR0000570780'") = 0 Then
rs.Close
MsgBox "Keine Datensätze gefunden"
Forms![frm_H_Wertpapiere]![BF_Info].Visible = False
Forms![frm_H_Wertpapiere].Repaint
GoTo Programmende
Else
'Debug.Print "Zeit: " & Format(Now, "hh:mm:ss")
DoCmd.OpenForm "frm_KursabfrageRenten"
Forms![frm_KursabfrageRenten]![TF_Meldung].Value = "...bitte warten"
Forms![frm_KursabfrageRenten].RecordSource = strSQL
Forms![frm_KursabfrageRenten]![TF_Meldung].Value = ""
DoCmd.Close acForm, "frm_H_Wertpapiere"
rs.Close
Set rs = Nothing
End If


Weitere Frage:
läßt sich dCount nicht auch mit Variablen ausführen?


strA = "SysDatum=#3/15/2006# And ISIN='FR0000570780'"
If DCount("*", "HDBV", strA) = 0 Then


hat nicht funktioniert.

Anne Berg
06.07.2006, 13:09
Du solltest ja auch die Sache mit dem Recordset streichen! Das ist jetzt völlig überflüssig geworden.

Wenn das oben gezeigte DCount funktioniert, sollte es auch das untere. Du kannst die Bedingung, sowie alle anderen Parameter, durchaus als (String-)Variable übergeben.
Was hat denn da nicht funktioniert???

rbarth
06.07.2006, 13:45
okay, das Recordset hab ich gestrichen, DCount funktioniert nun auch mit Variable (war Fehler von mir) aber die Eieruhr schaltet sich immer noch aus sobald DCount losläuft und zählt.

Anne Berg
06.07.2006, 13:49
Tja, dann bin ich leider auch mit meinem Latein am Ende...

Ist dir evtl. damit geholfen, die Eieruhr direkt nach dem DCount nochmals einzuschalten?

rbarth
06.07.2006, 14:34
leider nicht, da ich sie ja während des Zählens benötige. Das sind die 'langen Sekunden' während der Anwender warten muss und wenn die Eieruhr sich während dieser Zeit ausschaltet, dann denkt der Anwender, dass das Programm schon fertig ist, obwohl dies ja nicht der Fall ist.

Aber ich danke Dir sehr für Deine Hilfe und Gedult. Das war grosse Klasse!!!

Anne Berg
06.07.2006, 14:54
Noch eine letzte Idee: wenn du das DCount nicht auf "*" sondern auf "Primär-Index" anwendest, könnte das die Sache evtl. beschleunigen.