PDA

Vollständige Version anzeigen : Ich habe mit nen Bericht den virtuellen Arbeitsspeicher gesprengt!!


Burgerking
03.09.2002, 16:06
Servus,

mittlerweile funktioniert meine Datenbank mit den Bildern soweit sehr gut. Ich habe jetzt meine .jpg- bilder als Dateiverweis in die Datenbank eingepflegt. Nach dem komprimieren der Datenbank hat die dann auch wieder eine Annehmbare größe angenommen.

Aber ich habe mir jetzt nen Bericht erstellen lassen, der erheblichen meinen Arbeitsspeicher killt.

Das Drucken ist dann noch mal ne ganz kritsiche Angelegenheit. Dann sprengt er ziemlich flott die 500 MB virtuellen Speicher. Ich könnte zwar mehr freigeben, aber die DB soll nachher noch auf anderen Rechnern laufen.....

Was kann ich machen, damit der Bericht weniger Arbeitsspeicher braucht?

Hondo
03.09.2002, 17:06
Hallo Ingo,
was soll ich dir auf deine Frage antworten? Hebe mal den Telefonhörer an den Bildschirm damit man den Bericht sieht.
Also so kann höchstens Gott dein Problem lösen, sofern er in Access firm ist.
Du musst schon beschreiben was du im Bericht hast, welchen Code du ausführst, etc.
Eventuell auch eine Bildschirmkopie machen und posten.
Gruß Andreas

Burgerking
03.09.2002, 17:23
O.k. ich gebe dir schon recht <img src="graemlins/grins.gif" border="0" alt="[grins]" /> an deiner Aussage ist was dran.

Das mit ner Bildschirmkopie sieht leider schlecht aus, die kann ich dir wohl nicht direkt hier einfügen.

Aber dafür habe ich den Code, mit dem ich die Bilder in den Bericht einfüge:

Me.Ansicht1.Picture = "blabla, Dateipfad" & Me.Bild_1

Me.Ansicht1.Visible = True

Wobei vorher noch eine Abfrage durchgeführt wird, ob in Bild 1 was drinsteht oder nicht.

Das wird dann insgesamt mit 3 Bildern pro Datensatz durchgeführt und es werden 2 Datensätze pro Seite Bericht aufgelistet.

Der Bericht besteht bis jetzt aus 14 Seiten, wobei sich im Schnitt ca. 4 Bilder auf jeder Seite befinden, also insgesamt ca. 56 Bilder.

Ich habe die Bilder in einen externen Ordner mit einer Auflösung von ca. 640 x 480 pixel abgelegt.

Ich hoffe das reicht jetzt
:idee: :idee:

Burgerking
04.09.2002, 10:59
Um noch einmal ein paar Eckdaten zu nennen:

Wenn ich den Bericht öffne, belegt der ca. 200 MB Arbeitsspeicher

Wenn ich auf die letzte Seite der 14 Seiten springe dann kommen noch einmal 100 MB dazu, und wenn ich die letzte Seite drucken will dann haut er noch mal ca. 100 - 150 MB drauf.

Ich habe schon die möglichkeit gefunden, die Bilder als tmp- Dateien abzulegen. Das ist mir aber noch ein wenig wüst. Außerdem soll man sich möglichst die Datenbank von der CD aus ansehen können.

immelmann
04.09.2002, 11:44
Hallo,
das liegt daran, daß Access die Bilder intern unkomprimiert (also bmp-Format) ablegt, auch wenn die "eigentlichen" Bilder extern liegen. Durch die Verknüpfung werden sie ja in den Bericht eingebunden.
Da hilft nur folgendes:
Kann die Auflösung reduziert werden? (bei 4 Bildern pro Seite machen es auch 300x200 oder kleiner)
Muß es Highcolor sein oder tun's 256 Farben?
Wieviel dpi haben die Bilder? (200dpi reichen für einen ansehlichen Ausdruck allemals.)

Gruß Torsten

Burgerking
04.09.2002, 11:51
Ich habe die Bilder schon auf eine 500 er Breite gebracht, damit es überhaupt funktioniert.....

Ist es wirklich die einzig gut umsetzbare Lösung? Oder gibt es noch irgendwie ne andere Chance.

Gibt es ggf. die Chance die Bilder im Bericht nicht anzuzeigen, sondern nur beim Drucken? Bringt das was?

meldread
06.11.2002, 09:19
Hallo!

Hab den Thread mal wieder nach oben geschaufelt, da ich genau das selbe Problem habe.

Ich habe nen ziemlich umfangreichen Bericht mit 136 Seiten. Auf jeder Seite befinden sich zwei pfadgebundene Bilder.
Wenn er aufgerufen wird, lädt er auch richtig lange und alle Bilder werden brav importiert. Im Bericht selbst bleiben dann aber alle Bilderfelder leer...

Gibt es keine Tricks, den Bericht vielleicht nur ansatzweise oder Schritt für Schritt aufzurufen?

Gruß
meldread

Gustav Kurz
06.11.2002, 09:31
<font size="2" face="verdana">Hallo Burgerking + Meldread,

wie ihr sicherlich bereits bemerkt habt wird beim Öffnen eines Berichts immer die gesamte Berichts-Datenquelle geöffnet, und wenn die viele Bilder enthält dann werden eben alle Bilder ins *.bmp - Format konvertiert weswegen dann der Arbeitsspeicher in die Knie geht.

Mir fällt dazu eigentlich nur die Lösung den Bericht gefiltert aus einem Formular heraus zu öffnen - oder eben wenn der Bericht mit allen Datensätzen/Bildern gedruckt werden soll - dann via Recordset auf die Datenquelle des Berichts Datensatz für Datensatz den Bericht gefiltert öffnen und drucken, dann wieder schließen lassen.

Wäre vielleicht einen Versuch wert.

Gruß
Gustav

meldread
06.11.2002, 10:06
Hallo Gustav!

Vor allem dein letzter Vorschlag mit dem Recordset hört sich gut an. Sowas hatte ich mir auch Gedacht. Der Bericht wird Schritt für Schritt geöffnet (eventuell gedruckt) und dann wieder geschlossen. Dann dürfte es keine Speicherengpässe geben.
Nur, kannst du mir ein paar Ansätze geben, wie ich das bewerkstellige? Bin noch ein ziemlicher VBA-Neuling.

Du hattest übrigens mal etwas wegen einer Pause gepostet, um den Arbeitsspeicher wieder freizumachen, z.B. beim Drucken: <a href="http://www.ms-office-forum.net/forum/showthread.php?s=&threadid=69522&" target="_blank">Laufzeitfehler 2024???</a>

Würde das in diesem Falle auch etwas bringen?

Ansonsten habe ich <a href="http://support.microsoft.com/default.aspx?scid=kb%3Bde%3BD35098" target="_blank">hier</a> vorbeigeschaut. Aber die raten einem ja eher, also zu kürzen und zu vereinfachen. Das kann es ja auch nicht sein. Nur die beiden letzten Tipps hören sich ganz vielversprechend an...

Gruß
meldread

Sascha Trowitzsch
06.11.2002, 13:22
...Versteh nicht ganz, wieso DoEvents Speicher frei macht...

Ein Bericht stellt eine Grafik dar. Stell dir den Bericht als eine Grafik vor, in der die einzelnen Seiten aneinandergehängt sind. Was würde eine Bildbearbeitung dazu sagen?
Beim Drucken muss der Spooler noch mal ein treiberspezifisches Abbild der Grafik im Speicher schaffen.

Die Lösung ist tatsächlich nur, einzelne Berichtsseiten nacheinander zu erstellen/drucken.
(Siehe OH zu OpenReport: Filterkriterium.)

Ciao, Sascha

Gustav Kurz
06.11.2002, 13:42
<font size="2" face="verdana">Hallo meldread,

Dein 2. Link auf die Microsoft Knowledge Base bringt tatsächlich nur was bei sehr komplexen Berichten.
Das Problem bei Deinem Bericht ist eher die Speicherbeanspruchung.

Zum Seitenweisen (gefilterten) Öffnen/Drucken des Berichts könntest du in etwa so vorgehen:

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre>
<span class="TOKEN">Dim</span> rs <span class="TOKEN">As</span> DAO.Recordset
<span class="TOKEN">Set</span> rs = CurrentDb.Openrecordset ("DeineBerichtsDatenquelle", dbOpenSnapshot)

<span class="TOKEN">Do</span> <span class="TOKEN">Until</span> rs.EOF
DoCmd.OpenReport "DeinBericht", acViewPreview, , "[EindeutigeIDImBericht]=" & Rs![EindeutigeIDImBericht]
DoCmd.OpenReport "DeinBericht"
DoCmd.Close acReport, "DeinBericht"
rs.MoveNext
<span class="TOKEN">Loop</span>

rs.close
<span class="TOKEN">Set</span> rs = <span class="TOKEN">Nothing</span></pre></div>

@Sascha - eine Zeitschleife zwischen wiederholten Öffnen von sehr komplexen bzw. sehr Arbeitsspeicheraufwändigen Berichten oder bei Berichten die via PDF-Creator in ein PDF-File umgewandelt werden gibt der Anwendung wohl etwas mehr Zeit die Vorgänge abzuarbeiten.

Jedenfalls ist bei mir die Rate der Fehler/Fehlermeldungen (kein Arbeitsspeicher frei bzw. Fehlerhafte PDF-Erstellungen) seitdem stark zurückgegangen.

...lasse mich aber auch eines besseren belehren ;)

Gruß
Gustav

meldread
06.11.2002, 15:58
Danke für den Code!

Hoffentlich finde ich morgen die Zeit, um mich mit dem Problem nochmal ausgiebig zu befassen. Ist aber nur aufgeschoben. Ich melde mich bestimmt nochmal... ;)


Gruß
meldread

Sascha Trowitzsch
06.11.2002, 18:13
@Gustav: Lasse mich ebenfalls belehren ;)

Kann schon sein, dass DoEvents den Taskscheduler von Windows etwas beruhigt bzw. die Message Queue etwas geordneter abarbeiten lässt...

Ciao, Sascha

meldread
08.11.2002, 10:43
Moin!

Meine Frage bezieht sich auf den oben geposteten Code.
Hier der entsprechende Auszug, der mich beschäftigt:

"[EindeutigeIDImBericht]=" & Rs![EindeutigeIDImBericht]

Kann mir jemand sagen, was in das Feld "EindeutigeIDImBericht" eingetragen werden muß? Ist mir nicht ganz klar...

Gruß
meldread

PS: Oder ist das eine Variable, die ich noch definieren muß? Da fehlt ja noch der Anfangs- und Endcode. Wann muß der Code aufgerufen werden, beim Anzeigen, beim Drucken oder ist eines ausreichend? Kann mir da jemand auf die Sprünge helfen?

Gustav Kurz
08.11.2002, 11:45
<font size="2" face="verdana">Hallo,

da ich nicht die genauen Felddefinitionen in Deinen Tabellen bzw. Gruppierungen im Bericht kenne kann ich Dir dazu auch nicht mehr sagen.

Das "[EindeutigeIDImBericht]=" & Rs![EindeutigeIDImBericht] stellt jedenfalls den Berichtsfilter her und musst Du durch Deine Gruppierung erstezen.

Gruß
Gustav

meldread
08.11.2002, 12:14
*hüstel*
Könntest du mir noch etwas auf die Sprünge helfen?
:rolleyes:

1. Mein Berichtsfilter, meine Gruppierung?? Mir ist schon klar, daß der Bericht gefilterte Daten der Tabelle wiedergibt, aber wo bekomme ich die Info her, von der du geredet hast? Also "EindeutigeIDImBericht".

2. Welche Ereignisprozedur brauche ich, um den Bericht seitenweise aufrufen zu können?

Ich hoffe, ich belästige dich nicht zu sehr mit solchen banalen Fragen, aber VBA ist mir immer noch ziemlich neu/fremd... :D

Gustav Kurz
08.11.2002, 12:27
<font size="2" face="verdana">Hallo meldread,

vielleicht kannst Du uns etwas mehr Infos zum Bericht und zu dessen Datenquelle (Bitte SQL-Anweisung bzw. Felddefinitionen der zugrundeliegneden Tabelle posten) geben.

Der Code wird am Besten mittels eines Buttons in einem Formular gestartet.

Mal angenommen Du hast als Datenquelle des Berichts eine Tabelle "tblBilder", in dieser Tabelle gibt es ein Textfeld "Pfad" in dem der Pfad zum Bild festgehalten ist.

Du möchtest jetzt den Bericht jeweils gefiltert mit nur einem Bild in der Vorschau öffnen, drucken, schließen - dann zum nächsten Bild und so weiter...

Dann wäre der Code dafür:

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Dim</span> rs <span class="TOKEN">As</span> DAO.Recordset
<span class="TOKEN">Set</span> rs = CurrentDb.Openrecordset ("tblBilder", dbOpenSnapshot)

<span class="TOKEN">Do</span> <span class="TOKEN">Until</span> rs.EOF
DoCmd.OpenReport "DeinBericht", acViewPreview, , "[Pfad]='" & Rs![Pfad] & "'"
DoCmd.OpenReport "DeinBericht"
DoCmd.Close acReport, "DeinBericht"
rs.MoveNext
<span class="TOKEN">Loop</span>

rs.close
<span class="TOKEN">Set</span> rs = <span class="TOKEN">Nothing</span></pre></div>

Gruß
Gustav

meldread
08.11.2002, 13:22
Ahh, jetzt ist bei mir der Groschen gefallen!

Allerdings gibt es noch eine Fehlermeldung:
"Benutzerdefinierter Typ nicht definiert"

Dieser Bereich ist gelb markiert:
Private Sub Befehl21_Click()

Folgender Bereich ist normal markiert und auf den kommt es bestimmt an:
Dim rs As DAO.RecordsetSet
(erst ab rs... markiert)

Dann noch was. Du hattest den Code ja jetzt zweimal gepostet und da ist mir ein kleiner Unterschied aufgefallen.

Einmal hast du den Code so geschrieben:
"[EindeutigeIDImBericht]=" & Rs![EindeutigeIDImBericht]

Beim zweiten mal so:
"[Pfad]='" & Rs![Pfad] & "'"

Bei dem oberen fehlen die "'". Hat das eine besondere Bedeutung?

Gruß
meldread

Gustav Kurz
08.11.2002, 13:41
<font size="2" face="verdana">Hallo meldread,

ja - das mit den Hochkommatas har seinen Grund:
Wenn das Vergleichsfeld in der Tabelle den Datentyp Zahl hat braucht man keine Kommas, wenn Text dann muß die Vergleichsvariable in Hochkommas eingeschlossen sein.

Beispiel:

"KundenID=5" .....aber
"KundenName='Müller'"

Gruß
Gustav

meldread
08.11.2002, 13:51
Habs, das Recordset hatte noch ein "Set" und noch ein paar Kleinigkeiten, die ich wohl mit den zwei Codes vertauscht habe... :rolleyes:

meldread
08.11.2002, 14:24
So, es funktioniert!

Es gibt aber noch ein paar Sachen, die ich gerne noch modifizieren würde.

1. Es wird immer nur 1 Datensatz pro Seite ausgedruckt. Beim Bildschirmbericht passen zwei Datensätze auf eine Seite.

2. Auf jeder Seite steht immer Seite 1 von 1.

3. Ich will den Bericht nicht sofort drucken, sondern ihn mir auch am Bildschirm Seite für Seite anschauen.

Wäre schön, wenn du mir bei dem einen oder anderen Problem noch zur Hand gehen könntest. Bei 1 und 2 stehe ich im Dunkeln.

Ansonsten aber schonmal vielen Dank!!

Ich werde erst am Montag weitermachen. Jetzt gehts ins WE!!! :cool: