PDA

Vollständige Version anzeigen : Viele Register mit Unterformularen -> Laufzeit/Speicher-Problem


wschmso
24.03.2004, 12:53
Hallo Profis,

Dieser Beitrag richtet sich wohl an alle ACC-Top-Profis...

Ein Formular mit ca. 20 Registern ist ja grundsätzlich kein Problem, sofern man Register übersichtlich findet, was ich auch mal voraussetze...

Wenn nun beispielsweise in allen Registerseiten ein Unterformular - in Datenblattansicht (1:n-Datensätze) mit Datenherkunft, Vernküpfen von/bis, etc. - untergebracht wird, tritt folgendes Problem auf:
Beim Anzeigen eines Datensatzes im Hauptform werden nun alle UFs aller Registerkarten aktualisiert. Das führt dazu, dass
1) viel Laufzeit und
2) viel Hauptspeicher (20MB und mehr!)
für die Anzeige der Daten aus dem Hauptform und für die ANzeige der Daten aus NUR EINEM Register "verschwendet" wird.

Verschwendet meine ich deshalb, weil ja ohnehin zu einem Zeitpunkt nur eine Registerseite sichtbar ist. Wozu also alle Daten aller Registerseiten sofort laden???

Meine Idee:
Anstatt der automatischen Datenverknüpfung zwischen Haupt- und Unterforms sollten nur jene Unterforms geladen werden, deren Registerseiten gerade sichtbar sind.

Nun die Frage an die TOP 10 Access-Profis des deutschsprachigen Raumes:

KENNT IHR EINE MÖGLICHST STABILE LÖSUNG FÜR MEINE IDEE?

Für Tips wäre ich unendlich dankbar.

bg
Walter Schuster

reinir
24.03.2004, 13:47
also ich mach die Ufos in solchen Fällen "dynamisch" sichtbar und weise erst bei Registerwechsel die Datenherkunft den jeweiligen Ufos zu
wichtig hier vielleicht - die Datensatznavigation sollte in diesem Fall eher nicht aktiviert sein, da sonst das Ereignis des Registerwechsel eventuell nicht optimal fkt.

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Private Sub</span> TabDataEntry_Change()
<span class="REM"> ' Beispiel anhand einer Kundendatenbank</span>
<span class="REM"> ' Keine KD-Nummer - keine Daten in den UFOs sichtbar !!!</span>
<span class="TOKEN">If</span> IsNull(Me!KNr) <span class="TOKEN">Then</span> <span class="TOKEN">Exit Sub</span>
&nbsp;
<span class="REM"> ' Reg. Steuerelement hei&szlig;t in diesem Fall TabDataEntry !!!!</span>
Select Case Me.TabDataEntry.Pages.Item(Me.TabDataEntry.Value).Name
&nbsp;
Case &quot;Seite2&quot; <span class="REM">' Ufos sichtbar !!!!</span>
&nbsp;
Me.NameDeinesUfos.Form.RecordSource = &quot;DeineFecordsource&quot;
Me.NameDeinesUfos.Visible = <span class="TOKEN">True</span>
&nbsp;
Case &quot;Seite3&quot; <span class="REM">' Ufos sichtbar</span>
&nbsp;
Me.NameDeinesUfos.Form.RecordSource = &quot;DeineFecordsource&quot;
Me.NameDeinesUfos.Visible = <span class="TOKEN">True</span>
&nbsp;
Case &quot;Seite4&quot; <span class="REM">' Ufos sichtbar</span>
&nbsp;
Me.NameDeinesUfos.Form.RecordSource = &quot;DeineFecordsource&quot;
Me.NameDeinesUfos.Visible = <span class="TOKEN">True</span>
&nbsp;
<span class="TOKEN">End</span> Select
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span><hr></pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

Nouba
24.03.2004, 14:03
Schau mal in die FAQ 4.8 Unterformular wechseln (http://www.donkarl.com/FAQ/FAQ4Formulare.htm#4.8).

wschmso
24.03.2004, 14:32
@ Nouba

In dem erwähnten Beitrag steht:

1 Me!UFo-Element.SourceObject = "NächstesUFo"
2 Me!UFo-Element.LinkChildFields = NULL
3 Me!UFo-Element.LinkMasterFields = NULL
4 Me!UFo-Element.LinkChildFields = "FeldimUFo"
5 Me!UFo-Element.LinkMasterFields = "FeldimHauptFormular"

Jedoch wird nicht durch Zeile 1 mein Ufo mit allen Daten (!!!!) d Datailtabelle geladen?!?!?

Wird durch die Zuweisung der Zeilen 4 und 5 erneut das Ufo refresht?

bg
walter

Anne Berg
25.03.2004, 08:28
@reinir: Aus deinem Beispiel geht aber nicht hervor, dass du die Datenherkunft wieder zurücksetzt. Das heißt, wenn alle Registerkarten mal aktiviert wurden, werden auch alle Ufo aktualisiert bei Datensatzwechsel.
Oder hast du das auch irgendwie gelöst?

reinir
25.03.2004, 08:34
@anne
ja hab ich
für diesen Fall hab ich eine eigene Sub
Sub RegAusblenden()

die dieses erledigt - abhängig ob man den Save-Button oder Löschen-Button gedrückt hat

Da ich in meinen Formularen die Navigationsschaltflächen immer ausblende, muss der Benutzer eine Schaltfläche betätigen umzu speichern, oder löschen - die anderen Schaltflächen (suchen, neuer DS, Schließen) sind zu diesem Zeitpunkt deaktiviert

Nouba
25.03.2004, 08:41
Es ist auch logisch, dass an Stelle 1 alle Daten des UFoFormulars geladen werden und erst durch Setzen von LinkChildFields und LinkMasterFields die Bindung an das Hauptformular stattfindet.

Ist das ein Problem? Es dürfte jedoch schwer sein, Hinweise an dieser zu geben, wenn inhaltlich nichts vom Datenmodell bekannt ist.

wschmso
25.03.2004, 10:31
@Nouba

Meiner Meinung nach wird durch Schritt 1 (Setzen des SourceObjects) das Ofu mit allen Daten der Detailtabelle geladen. Das natürlich nur dann, wenn beim Ufo bereits beim Entwurf eine Datenherkunft gespeichert ist.
Denn erst durch die Link-Fields-Festlegung werden erst die erforderlichen Recordsets der Detailtabelle selektiert. Wenn die DB beispielsweise 10000 Rechnungen mit im Schnitt ca. 10 Positionen je Rechnung enthält, würde das ja bedeuten, dass zunächst im Unterform für Rechnungspositionen 100000 Datensätze geladen werden (sofern nicht mit "Max Datensätze" beschränkt)

Habe das Problem aber insofern umgangen, als ich mit einen COntroller progr. habe, der je Unterform weiss, welches SELECT Statement zu laden ist. Die Zuweisung der Datenherkunft erfolgt dann erst als Schritt 6.

1 Me!UFo-Element.SourceObject = "NächstesUFo"
2 Me!UFo-Element.LinkChildFields = NULL
3 Me!UFo-Element.LinkMasterFields = NULL
4 Me!UFo-Element.LinkChildFields = "FeldimUFo"
5 Me!UFo-Element.LinkMasterFields = "FeldimHauptFormular"
6a Me!UFo-Element.Form.UniqueTable = MeinUniqueTable
6b Me!UFo-Element.Form.ResyncCommand = MeinResyncCommand
6c Me!UFo-Element.Form.RecordSource = MeinRecordSource

Über MeinTabControl.Pages(mbytTabIndex).Controls kann man die Unterforms je Registerseite ermitteln...

bg
Walter