PDA

Vollständige Version anzeigen : Seltsamer Fehler beim Form.Refresh()


DaniAndr
28.09.2005, 08:16
Hallo,
ich habe ein kniffliges Problem mit einer A2K-Datenbank. Frontend ist als MDE auf Clients, Backend auf Netzlaufwerk. Manche Clients benutzen die Runtime, manche die Vollversion. Alle benutzen aber den Schalter /Runtime, so dass letztendlich alle mit der Runtime zugreifen.

Auf dem Startbildschirm befindet sich ein (Endlos-)Unterformular mit einer Wiedervorlageliste. Die basiert auf einer komplizierteren Abfragekaskade und wird in der Activate-Methode aktualisiert, damit immer die brandaktuellen Daten auf dem Schirm sind, wenn man aus einem anderen Fenster kommt:

Private Sub Form_Activate()
On Error GoTo Err_Form_Activate
Me.Wiedervorlage_Endliste.Requery
Exit_Form_Activate:
Exit Sub

Err_Form_Activate:
MsgBox Err.Description
Resume Exit_Form_Activate
End Sub


Beim ersten Laden der Daten funktioniert es blendend, der Code läuft durch. Ab dem Zweiten Mal läuft der Code zwar noch durch, bei der Abfrage scheint dann aber was schief zu laufen (siehe Screenshot).
Das Problem tritt nur bei ganz wenigen Benutzern auf. Bei den meisten funktioniert alles wie gewollt.
Das Problem scheint rechnerabhängig zu sein. Wo es auftritt, ist es immer reproduzierbar.

Folgendes habe ich schon ausprobiert:
- Vollversion gegen Runtime austauschen und umgekehrt - bringt nix
- BE komprimieren und reparieren
- FE neu auf den Rechner kopieren
- FE mit Vollversion starten, auch die ursprüngliche MDB, auch frisch komprimiert
- Alle Datenbankobjekte in ein neues FE
- Anderen Benutzer am Rechner angemeldet

Zeigte alles keinen Erfolg.

Hat jemand eine Idee???

Grüße,
Andreas

rita2008
28.09.2005, 08:31
Probiere es mal mit

Me.Wiedervorlage_Endliste.Form.Requery

mfg Rita

DaniAndr
28.09.2005, 08:53
@Rita:
Danke für die Idee, aber leider hat es auch nicht geklappt. :(

@All:
Kann es sein, dass die JET-Engine irgendeine Art von Timeout erleidet oder ein Puffer volläuft oder so?

Grüße,
Andreas

DaniAndr
28.09.2005, 09:19
Update:
Bisher tritt der Fehler nur bei Benutzern mit Windows 2000 auf. Aber nicht bei allen.
XP-User haben keine Probleme.

Grüße,
Andreas

Morli
28.09.2005, 09:30
Tja, ich denke da müßten wir Deinen Code schon sehen um Dir weiterhelfen zu können. Poste Doch einfach mal Deinen Code.

Morli

DaniAndr
28.09.2005, 09:46
Hallo Morli,
mehr Code als den Refresh() gibt es nicht.
Ich kann aber mal den SQL-Code für die Abfragen posten. Das wird etwas komplizierter:
Dem (Unter-)formular liegt diese Abfrage zugrunde:

SELECT
Wiedervorlage_Alle.Posnr,
Wiedervorlage_Alle.ArtikelNr,
Wiedervorlage_Alle.Projektkunde,
Wiedervorlage_Alle.Projektname,
Wiedervorlage_Alle.Marktsegment,
Wiedervorlage_Alle.MaxMenge_n_Anlauf_gesch,
Wiedervorlage_Alle.UmsatzPotAng,
IIf([grund]=1,"Plausibilitätsprüfung",IIf([grund]=2,"WV am " & [TerminWiedervorlage] & ": " & [GrundWiedervorlage],IIf([grund]=3,"Bearbeitungsphase zu lang",IIf([grund]=4,"Prototypenphase zu lang",IIf([grund]=5,"Erstmusterphase zu lang",IIf([grund]=6,"Angebotsphase zu lang","SOP zu lange unbekannt")))))) AS WiedervorlageGrund
FROM Wiedervorlage_Alle
INNER JOIN
03_Anfrage
ON Wiedervorlage_Alle.Posnr = [03_Anfrage].Posnr
ORDER BY Wiedervorlage_Alle.Grund;


Dieser wiederum folgende Union-Abfrage:

SELECT* from Wiedervorlage_1
UNION SElect * from Wiedervorlage_2
UNION SElect * from Wiedervorlage_3
UNION SElect * from Wiedervorlage_4
UNION SElect * from Wiedervorlage_5
UNION SElect * from Wiedervorlage_6
UNION SElect * from Wiedervorlage_7;


Die anderen Abfragen sehen alle ähnlich aus. Hier ist als Beispiel die Wiedervorlage_3


SELECT
[03_Anfrage].Posnr,
[03_Anfrage].ArtikelNr,
[02_Kundenstamm].Projektkunde,
[05_Projekt].Projektname,
[05_Projekt].Marktsegment,
[13_Kaku].MaxMenge_n_Anlauf_gesch,
[03_Anfrage].UmsatzPotAng,
3 AS Grund
FROM ((02_Kundenstamm
RIGHT JOIN
(01_Artikelstamm
RIGHT JOIN
03_Anfrage
ON [01_Artikelstamm].ArtikelNr = [03_Anfrage].ArtikelNr
)
ON [02_Kundenstamm].KundenNr = [03_Anfrage].Kunde)
LEFT JOIN
05_Projekt
ON [03_Anfrage].Posnr = [05_Projekt].Posnr)
LEFT JOIN
13_Kaku
ON [03_Anfrage].Posnr = [13_Kaku].Posnr
WHERE
(
(
(
[03_Anfrage].StatusAnfrage
)
="Anfrage in Bearbeitung"
)
AND
(
(
[03_Anfrage].EingangAnfrage
)
>=#1/1/2004#
AND
(
[03_Anfrage].EingangAnfrage
)
<Now()-10
)
AND
(
(
[03_Anfrage].InterneWiedervorlage
)
Is Null
)
AND
(
(
[03_Anfrage].Bearbeiter
)
Like getanwendername()
)
)
OR
(
(
(
[03_Anfrage].StatusAnfrage
)
="Anfrage in Bearbeitung"
)
AND
(
(
[03_Anfrage].EingangAnfrage
)
>=#1/1/2004#
AND
(
[03_Anfrage].EingangAnfrage
)
<Now()-10
)
AND
(
(
[03_Anfrage].InterneWiedervorlage
)
Is Null
)
AND
(
(
[03_Anfrage].Segmentmanager
)
Like getanwendername()
)
)


Die dort verwendete Funktion getanwendername() ist in einem globalen Modul abgelegt und liest simpel eine ebendort angelegte globale Variable aus:


Dim Anwendername As String

Public Function getAnwendername() As String
getAnwendername = Anwendername
End Function


Grüße,
Andreas

DaniAndr
29.09.2005, 08:29
Hi, ich werde immer noch nicht schlau aus dem Problem. Habe mir mal mit dem Assistenten einen Daten-Aktualisieren Button erstellt, ganz banaler Code:


Private Sub Befehl23_Click()
On Error GoTo Err_Befehl23_Click


DoCmd.DoMenuItem acFormBar, acRecordsMenu, 5, , acMenuVer70

Exit_Befehl23_Click:
Exit Sub

Err_Befehl23_Click:
MsgBox Err.Description
Resume Exit_Befehl23_Click

End Sub


Beim Klick kommt der Fehler, initial werden die Daten anstandslos geladen.
Langsam komme ich hier ein wenig in Zeitdruck, hat keiner eine Idee?

Grüße,
Andreas

Anne Berg
29.09.2005, 09:12
Es wäre vielleicht mal interessant herauszufinden, wo genau dieser Fehler überhaupt auftritt und welches Objekt gemeint ist.

Bei A2000 solltest du es mit der Syntax etwas genauer nehmen, es sollte heißen:

Me!Wiedervorlage_Endliste.Form.Requery

wenn dieser Befehl im Hauptformular steht und "Wiedervorlage_Endliste" der Name des Unterformular-Steuerelements ist.

Nachtrag:
Wo liegt dieser Button? Wie sieht die Datenherkunft des Hauptformulars aus?

DaniAndr
29.09.2005, 09:25
Hallo Anne,
der Button liegt im Hauptformular und aktualisiert an meinem Rechner auch wunderbar das Unterformular mit. Aus diesem Grund habe ich den ursprünglichen Code durch


Me!Befehl2.SetFocus 'Focus auf irgendein Steuerelement des Hauptformulars setzen
DoCmd.DoMenuItem acFormBar, acRecordsMenu, 5, , acMenuVer70


Ersetzt.
Das Hauptformular ist an eine Tabelle gebunden, in der Windows-Anmeldenamen von Superusern stehen. Die dürfen die Anwendung mit der Access-Vollversion starten. Das prüfe ich beim Laden des Formulars.

Habe jetzt mit dem Admin ausgemacht, dass die betroffenen Rechner plattgemacht und auf Windows XP umgestellt werden, da dort das Problem (noch) nicht aufgetreten ist. Mal sehen, ob das was bringt.

Wenn Du aber noch einen heißen Tipp hast, nehme ich den gerne, das spart dem Admin arbeit ;)

Danke,
Andreas

Anne Berg
29.09.2005, 10:22
Ich habe mir gerade mal deinen Code genauer angesehen:
Die Abfrage scheint unvollständig zu sein, und zwar bei der Datumsabfrage. (Ausgesprochen schwer überschaubar durch die gewählte Darstellung!!)
Wo wird denn überhaupt "Anwendername" belegt?? (Ist ja keine globale Variable!)

DaniAndr
29.09.2005, 11:12
Hallo Anne,
sorry für die Darstellung ich hatte ursprünglich eine schönere, die hat er aber hier im Forum nicht richtig angezeigt...
Lange Rede, kurzer Sinn: In der Anwendung ist der Code korrekt. Ich versuchs nochmal:

SELECT
[03_Anfrage].Posnr,
[03_Anfrage].ArtikelNr,
[02_Kundenstamm].Projektkunde,
[05_Projekt].Projektname,
[05_Projekt].Marktsegment,
[13_Kaku].MaxMenge_n_Anlauf_gesch,
[03_Anfrage].UmsatzPotAng,
3 AS Grund
FROM ((02_Kundenstamm
RIGHT JOIN
(01_Artikelstamm
RIGHT JOIN
03_Anfrage
ON [01_Artikelstamm].ArtikelNr = [03_Anfrage].ArtikelNr
)
ON [02_Kundenstamm].KundenNr = [03_Anfrage].Kunde)
LEFT JOIN
05_Projekt
ON [03_Anfrage].Posnr = [05_Projekt].Posnr)
LEFT JOIN
13_Kaku
ON [03_Anfrage].Posnr = [13_Kaku].Posnr
WHERE
(
(
(
[03_Anfrage].StatusAnfrage
)
="Anfrage in Bearbeitung"
)
AND
(
(
[03_Anfrage].EingangAnfrage
)
>=#1/1/2004#
AND
(
[03_Anfrage].EingangAnfrage
)
<Now()-10
)
AND
(
(
[03_Anfrage].InterneWiedervorlage
)
Is Null
)
AND
(
(
[03_Anfrage].Bearbeiter
)
Like getanwendername()
)
)
OR
(
(
(
[03_Anfrage].StatusAnfrage
)
="Anfrage in Bearbeitung"
)
AND
(
(
[03_Anfrage].EingangAnfrage
)
>=#1/1/2004#
AND
(
[03_Anfrage].EingangAnfrage
)
<Now()-10
)
AND
(
(
[03_Anfrage].InterneWiedervorlage
)
Is Null
)
AND
(
(
[03_Anfrage].Segmentmanager
)
Like getanwendername()
)
)


Off Thread
...Siehst Du, der schneidet die Darstellung immer ab. Und wenn ich direkt hier rein paste, fehlt der <Now()- Teil (siehe Textdatei im Anhang). Wäre das nicht ein Fall für die Moderatoren oder gibts dafür einen Kniff
/Off Tread

Die globale Variable wird beim Laden des Hauptformulars beim ersten Aufruf der Methode getUserName() gesetzt. getUserName() liegt in einem globalen Modul. Das Auslesen erfolgt ja dann über getAnwendername(). Die ist Public und liefert auch immer das richtige Ergebnis. Habe es gerade noch mal auf einem betroffenen PC getestet.

Wenn Dir nicht noch ein heisser Tip einfällt, würde ich sagen, wir warten erstmal die Neuinstallation ab. Sind ja nur 3 Rechner betroffen und der Zahn der Zeit wird ja bald eh Windows 2000 und damit hoffentlich auch das Problem beseitigen :p

Grüße und Danke für die Mühe,
Andreas