Benutzer mit den meisten Antworten
Anspruchsvoller Report im Hintergrund

Frage
-
Hallo zusammen
Ich habe iwieder einmal eine kleine Nuss zu knacken und komme einfach nicth weiter...vielleicht gibts hier ja Hifle...
Ich habe einen sehr umfangreichen Report welcher für die Aufbereitung 1-2 Minuten Zeit braucht (sehr sehr viele Berchnungen und DCount, DMax, DMin usw. usw.)
Da der Rechner während dieser Zeit für den User nicht nutzbar ist, möchte ich den Report irgendwie im Hintergrund aufbereiten und erst nach vorne bringen, wenn alles gemacht ist. (der User soll davon nichts merken..)
Gibt es einen Weg ? (Der Report hat ca. 200 Felder und ca. 150 Rechnungsroutinen, welche via VBA Code in "On Format" aufbereitet werden.
Vielen Dank für eure Hilfe...
René
Antworten
-
Hallo,
René Stutz wrote:
Habe in der Zwischenzeit einiges probiert. Leider hat dein Ratschlag mit
dem OpenReport nichts gebracht, er dann einen Fehler bringt, dass er die
Werte nicht assignen kann.Sorry, nimm stattdessen Report_Load. Ansonsten, wenn das auch nicht
funktioniert, zeig mal bitte den kompletten Code.Me!ED5 ist dabei ein Feld im Report. Ich könnte vielleicht auch alle
Berechnungen in den Query reinlegen; bringt das was bezüglich
Performance ? Ich dachte an sich dass es auf dasselbe rauskommt;Solange du die Berechnungen per Domain-Funktion ausfuehrst, bringt das
wenig. Entscheidend ist aber, dass du die Berechnungen, obwohl sie keinen
Bezug zum Datensatz haben, bei jedem einzelnen Datensatz immer wieder
ausfuehren laesst, ohne dass sich am Ergebnis was aendert. Zumindest komme
ich zu dem Schluss aufgrund der 2 Zeilen, die du gezeigt hast.Wie löst man solche Dinge den am besten ? Kann man diesen Prozess in den
Hintergrund verlegen, damit der User weiterarbeiten kann und eine
Meldung bekommt, wenn die Sache gmacht ist ?Nein, einfach an der richtigen Stelle mit der richtigen Methode rechnen,
sollte nicht laenger als ein paar Sekunden dauern.Gruss - Peter
Mitglied im http://www.dbdev.org
FAQ: http://www.donkarl.com- Als Antwort markiert René Stutz Montag, 30. Juli 2012 19:05
Alle Antworten
-
Moin Moin,
du kannst den Report per DoCmd.OpenReport..... auch Hidden öffnen und später wieder sichtbar machen.
Deiner Beschreibung nach hast du bei der Entwicklung vom Report ggf. etwas viel VBA verwendet. Ich vermute mal (ohne deinen Report zu kennen), du nutzt nicht die gegebenen Möglichkeiten eines Reports.
Grüße aus Rostock
Wolfgang
(Netwolf)
-
Hallo Wolfgang
Nun, da hast du evtl. schon recht....
Anbei was ich mache: im Report unter On Format habe ich den folgenden Code: (dieser kommt ca. 40x vor in versch. Kostellationen aber immer gleich vom Prinzip her.
Me!ED5 = DSum("EndTot", "qManagementSummary", "Jahr='" & Forms!fManagementSummary!AuswahlJahr & "' AND Währ='" & "EUR" & "'")
Me!ED51 = DSum("EndTot", "qManagementSummary", "Jahr='" & (Forms!fManagementSummary!AuswahlJahr - 1) & "' AND Währ='" & "EUR" & "'")
If Me!ED51 <> 0 Then
Me!ED511 = (Me!ED5 - Me!ED51) / Me!ED51
End IfBeim Aufbereiten des Reports muss er also ca. 40 solcher Routinen durchlaufen, was natürlich ein wenig Zeit braucht.
Wäre es schneller wenn ich die Summen im Query bilde....?? Ich war der Meinung das komme auf das selbe raus..., oder ?
Ideen, das selbe Ergebnis zu erhalten im Hintergrund oder ähnlich.....wäre super !
Gruss
René
- Bearbeitet René Stutz Mittwoch, 18. Juli 2012 08:39
-
Hallo,
René Stutz wrote:
Anbei was ich mache: im Report unter On Format habe ich den folgenden
Code: (dieser kommt ca. 40x vor in versch. Kostellationen aber immer
gleich vom Prinzip her.
Me!ED5 = DSum("EndTot", "qManagementSummary", "Jahr='" & Forms!fManagementSummary!AuswahlJahr & "' AND Währ='" & "EUR" & "'")
Me!ED51 = DSum("EndTot", "qManagementSummary", "Jahr='" & (Forms!fManagementSummary!AuswahlJahr - 1) & "' AND Währ='" & "EUR" & "'")
If Me!ED51 <> 0 Then
Me!ED511 = (Me!ED5 - Me!ED51) / Me!ED51
End IfIch sehe in diesen Zeilen keinen Bezug zum aktuellen Datensatz. Daraus
wuerde sich ergeben, dass die Zeilen immer das gleiche Ergebnis liefern und
damit waere das pro Datensatz ausgefuehrte Ereignis OnFormat wohl nicht der
richtige Ort. Report_Open ist wohl besser geeignet.Gruss - Peter
Mitglied im http://www.dbdev.org
FAQ: http://www.donkarl.com- Als Antwort vorgeschlagen Gunter Avenius Sonntag, 29. Juli 2012 09:08
-
Hallo Peter
Jetzt habe ich mich wohl schlecht ausgedrückt.
Es gibt im Report ca. 40 von diesen Felder: Me!ED5, Me!ED6 usw.
Pro Feld wird dann dieser DSum-Wert zugewiesen.
Das Ergebnis das ich erhalte ist genau so wie gewollt, nur dass die Performance Probleme macht; also der User
1-2 Minuten warten muss, bis der Report da ist, und während dieser Zeit ist er blockiert. Daher meine Frage;
wie verfrachte ich einen solchen Job in den Hintergrund oder gibt es bessere Techniken...
Vielen Dank und Gruss
René
-
Hallo,
René Stutz wrote:
Jetzt habe ich mich wohl schlecht ausgedrückt.
Es gibt im Report ca. 40 von diesen Felder: Me!ED5, Me!ED6 usw. Pro Feld wird dann dieser DSum-Wert zugewiesen.Wenn die anderen 37 Felder auch keinen Bezug zum aktuellen Datensatz haben,
gilt meine Antwort: verschieb den Code nach Report_Open.Falls ein Bezug zum Datensatz existiert, zeig mal die Zeilen, damit wir
diskutieren koennen.Das Ergebnis das ich erhalte ist genau so wie gewollt, nur dass die Performance Probleme macht; also der User
Wenn meine Annahme zutrifft, wuerde sich am Ergebnis nichts aendern, wohl
aber an der Performance. ;-)Gruss - Peter
Mitglied im http://www.dbdev.org
FAQ: http://www.donkarl.com -
Hallo Peter
Habe in der Zwischenzeit einiges probiert. Leider hat dein Ratschlag mit dem OpenReport nichts gebracht, weil
er dann einen Fehler bringt, dass er die Werte nicht assignen kann.
Ich habe die Datenbasis mit dem qManagementSummary gefiltert und versuche nun, die Felder im Report zu befüllen mit den zahlreichen Detailberechnungen.
Me!ED5 = DSum("EndTot", "qManagementSummary", "Jahr='" & Forms!fManagementSummary!AuswahlJahr & "' AND Währ='" & "EUR" & "'")
Me!ED5 ist dabei ein Feld im Report. Ich könnte vielleicht auch alle Berechnungen in den Query reinlegen; bringt das was bezüglich Performance ? Ich dachte an sich dass es auf dasselbe rauskommt;
Wie löst man solche Dinge den am besten ? Kann man diesen Prozess in den Hintergrund verlegen, damit der User weiterarbeiten kann und eine Meldung bekommt, wenn die Sache gmacht ist ?
--> da ich ein PDF erstellen möchte, könnte man das elegant hidden machen, wenn man dann wüsste wie....smile...
besten Dank und Gruss
René
-
Hallo,
René Stutz wrote:
Habe in der Zwischenzeit einiges probiert. Leider hat dein Ratschlag mit
dem OpenReport nichts gebracht, er dann einen Fehler bringt, dass er die
Werte nicht assignen kann.Sorry, nimm stattdessen Report_Load. Ansonsten, wenn das auch nicht
funktioniert, zeig mal bitte den kompletten Code.Me!ED5 ist dabei ein Feld im Report. Ich könnte vielleicht auch alle
Berechnungen in den Query reinlegen; bringt das was bezüglich
Performance ? Ich dachte an sich dass es auf dasselbe rauskommt;Solange du die Berechnungen per Domain-Funktion ausfuehrst, bringt das
wenig. Entscheidend ist aber, dass du die Berechnungen, obwohl sie keinen
Bezug zum Datensatz haben, bei jedem einzelnen Datensatz immer wieder
ausfuehren laesst, ohne dass sich am Ergebnis was aendert. Zumindest komme
ich zu dem Schluss aufgrund der 2 Zeilen, die du gezeigt hast.Wie löst man solche Dinge den am besten ? Kann man diesen Prozess in den
Hintergrund verlegen, damit der User weiterarbeiten kann und eine
Meldung bekommt, wenn die Sache gmacht ist ?Nein, einfach an der richtigen Stelle mit der richtigen Methode rechnen,
sollte nicht laenger als ein paar Sekunden dauern.Gruss - Peter
Mitglied im http://www.dbdev.org
FAQ: http://www.donkarl.com- Als Antwort markiert René Stutz Montag, 30. Juli 2012 19:05
-
Hallo Peter
Vielen Dank für deine Ausführungen. Es gibt eben nicht verschiedene Datensätze, sondern
quasi einen einseitigen Report der ca. 40 berechnete Felder enthält. (für jedes dieser Felder
läuft eine separate Domain-Funktion; deshalb dauert das wohl solange.
Bin also noch nicht am Ziel; leider....
Gruss
René