none
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é

    Montag, 16. Juli 2012 21:20

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
    Donnerstag, 26. Juli 2012 14:40
    Moderator

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)

    Dienstag, 17. Juli 2012 08:41
  • 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 If

    Beim 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é


    Dienstag, 17. Juli 2012 12:20
  • Hallo Netwolf

    Kannst du mir evtl. sagen wie du das den mit den Bordmitteln im Report direkt lösen würdest; unten siehst du was ich machen muss. Bin empfänglich für gute Ideen; lerne gerne dazu...

    VielenDank und Gruss

    René

    Mittwoch, 18. Juli 2012 08:41
  • 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 If

    Ich 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

    Mittwoch, 18. Juli 2012 10:28
    Moderator
  • 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é

    Sonntag, 22. Juli 2012 09:55
  • 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

    Dienstag, 24. Juli 2012 15:25
    Moderator
  • 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é

    Donnerstag, 26. Juli 2012 14:15
  • 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
    Donnerstag, 26. Juli 2012 14:40
    Moderator
  • 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é

    Montag, 30. Juli 2012 19:10