ich bin gerade dabei eine Anwendung umzusetzen die hauptsächlich aus 2
Registern besteht.
Register A hat 7 Reiter mit jeweils einem Ufo hinter dem je ein
anderes Formular mit eigener Datensatzherkunft in Endlosansicht
steckt.
Register B hat insgesamt 15 Reiter, die in Abhängigkeit der Auswahl in
Register A Sichtbar oder Unsichtbar werden.
Teilweise überschneiden sich die angzeigten Reiter von Register B.
Soll heißen, Reiter 1 von Register B kann angezeigt werden wenn Reiter
1 von Register A gewählt ist, aber auch wenn z.B. Reiter 3, 4 und 5
gewählt ist.
In jedem Reiter des Registers B steck wieder ein eigenständiges
Unterformular in Endlosformansicht.
Die angezeigten Datensätze der UFo´s in Register B stehen aber immer
in Abhängigkeit der gewählten Datensätze der UFo´s in Register A.
In jedem UFo stecken auch noch ein paar Funktionen wie farbiger
Zeilenwechsel, Sortier und Filterfunktionen und die Überprüfung von
Pflichfeldern etc.
Nun bin ich mittlerweile mit der Programmierung der sämtlicher UFo´s
aus Register A fertig und beim 2. UFo deren Daten in abhängigkeit von
den UFos aus Register A angezeigt werden und fange an, an
verschiedenen Stellen Abstürze von Access zu erleben. z.B. wenn ich
einen Registerwechsel per Button ausführe. Dann stürzt die DB
beispielsweise ab wenn das Current Ereignis eines UFos 2 mal
hintereinander durchlaufen wird. Aber auch anderen eigentlich
problemlosen Stellen.
Da ich sämtlich /Decompile, etc. Maßnahmen schon durch habe, wende ich
mich verzweifelt an die Newsgroup.
Bevor ich jetzt detailiert auf das Datenmodell eingehe, liegt mir die
Frage näher:
Hat jemand Erfahrung mit der Verwendung vieler gleichzeitiger UFo´s?
Geht das überhaupt? Ich hab mir schon die Finger wund gegoogelt aber
keine brauchbaren Infos gefunden und bin mir aber fast sicher das
meine Probleme daher rühren. Vielleicht sind es zu viele
Datenbankzugriffe gleichzeitig wegen der vielen UFo´s? Aber bei 255
dürfte ich noch nicht angekommen sein...
Evtl. gibt es ja auch ein paar Tricks oder Dinge die man bei einem
Vorhaben mit vielen UFo´s beachten sollte?
Über ein paar Anregungen würde ich mich sehr freuen.
Viele Grüße,
Martin
Es geht schon, ist aber nicht empfehlenswert, einfach weil man mit
einem solchen Anwendungsdesign sehr viele Objekte und Daten lädt.
Zudem klingt deine Beschreibung, als hättest du auch noch viel
Programmierung in dieser Bündelung von Formularen.
Das arbeitet alles gegen die Stabilität der Anwendung.
Was du deshalb und schon aus Performancegründen zumindest
vom Prinzip her machen solltest, ist, nur die UFos zu laden, die im
Moment wirklich nötig sind (bzw. waren), weil der Anwender sie sieht.
Das kannst du steuern, indem du die Eigenschaft "Herkunftsobjekt"
der UFo-Steuerelemente ab Seite 2 leer lässt und erst beim
Wechseln zur jeweiligen Registerseite das SourceObject des
UFos zuweist (s. a. www.donkarl.com?FAQ4.17). Also ca.
Select Case Me!RegisterA
Case 1
If Me!UFoAufSeite2.SourceObject = "" Then _
Me!UFoAufSeite2.SourceObject = "DasHerkunftsformular2"
Case 2
If Me!UFoAufSeite3.SourceObject = "" Then _
Me!UFoAufSeite3.SourceObject = "DasHerkunftsformular3"
usw.
End Select
--
Servus
Karl
****************
http://www.donkarl.com Access-FAQ
http://www.donkarl.com/?aek 13. Access-Entwickler-Konferenz
Nürnberg: 25./26.9. + 2./3.10.2010, Hannover: 16./17.10.2010
vielen Dank für Deine Antwort zu so später Stunde.
On 17 Aug., 23:18, "Karl Donaubauer" <NoS...@donkarl.com> wrote:
> Was du deshalb und schon aus Performancegründen zumindest
> vom Prinzip her machen solltest, ist, nur die UFos zu laden, die im
> Moment wirklich nötig sind (bzw. waren), weil der Anwender sie sieht.
Ja, das habe ich gerade ausprobiert. Grundsätzlich wird das wirklich
sinnvoller sein. Störend ist nur die Ladezeit beim Reiterwechsel. Und
natürlich geht eine vorherige Datensatzauswahl verloren wenn ich die ID
´s nicht zwischenspeicher.
Unterm Strich aber wohl das kleinere Übel. Vielleicht mache ich es
sogar mit nur 2 UFo´s und transparentem Register.
Allerdings habe ich trotzdem noch Abstürze die ich mir nicht erklären
kann.
Ich denke ich werde als nächstes mal eine neue Datenbank erstellen und
mir die Nacht damit vertreiben. Schlafen is eh nur was für Warmduscher
xD
LG
Martin
Ich habe ein ungebundes HFO mit 2 Registern und 2 UFO´s ohne
SourceObject und Verknüpfung.
Beim ersten Öffnen und bei jedem Reiterwechsel auf dem Register (wie
oben beschrieben) wird ein Formular mit dem UFO geladen.
Das Current Ereignis des Formulares befüllt ein ungebundenes Textfeld
im HFO.
Das 2. UFO wird je nach Reiterwechsel im 2. Register mit einem
SourceObject per VBA belegt und erhält einen Eintrag im LinkChildField
und im LinkMasterField.
In dem 2. UFO wird immer ein Formular mit angezeigt das einen
"Spezialknopf" trägt. Bei betätigen dieses Buttons wird ein Code
ausgeführt der sich die aktuelle ID merk, den Reiter des 1. Registers
wechselt (wobei dann auch das SourceObject geändert wird vom 1. UFO),
den entsprechenden DS anhand der gemerkten ID sucht und anschließend
das SourceObject des 2. UFO´s samt LinkChildField und LinkMasterField
ändert. Und hier krachts immer.
Lösungsversuche:
Gehe ich den Code mit F8 im Haltemodus durch funktioniert allerdings
alles wunderbar.
Testweise habe ich mal Access 2000 probiert -> selbes Problem
Access 2007 -> Funktioniert einwandfrei !!
Das habe ich auch schon gemacht:
http://www.eggheadcafe.com/forumarchives/Accessforms/Aug2005/post23734138.asp
(Textfeld mit gleichen Namen wie ID über die verknüpft wird)
/Decompile, Compact, Repair, Importieren, händisches kopieren etc.
Zwar ist es ein kleiner Trost das es in A2007 funtz, aber da ich die
Anwendung für Access 2003 benötige leider keien Lösung für mich.
Jemand ne Idee?
Danke und Gruß,
Martin
Deine Beschreibung der Abläufe ist nicht ganz einfach zu verstehen.
Poste mal den Code hinter deinem "Spezialknopf" oder zumindest
die 100 Zeilen rund um die Absturzstelle.
On 18 Aug., 08:54, "Karl Donaubauer" <NoS...@donkarl.com> wrote:
> Deine Beschreibung der Abläufe ist nicht ganz einfach zu verstehen.
> Poste mal den Code hinter deinem "Spezialknopf" oder zumindest
> die 100 Zeilen rund um die Absturzstelle.
Ja, das war woll einfach schon zu spät. Ich versuche das ganze mal mit
etwas Code zu veranschaulichen:
UFO 1 über Register 1, in dem ein Formular angezeigt wird und beim
Anzeigen den Wert eines ungebundenen Textfeldes ändert.
Das UFO 2 über Register 2 ist mit diesem Textfeld verknüpft und
schränkt somit die angezeigten Datensätze bei Zeilenwechsel in UFO 1
ein.
In diesem UFO 2 befindet sich ein Button im Detailbereich
(Endlosformular), der Code hinter dem Button sieht so aus:
Private Sub btItemOpen_Click()
Dim lngGebaeudeID
lngGebaeudeID = Me!txtGebaeudeID
Forms!F_Startup!Reg1Gebaeude.SetFocus ' Hier wird das Change
Ereignis des Registers ausgelöst, s. Code etwas weiter unten
Forms!F_Startup!UFO1.SetFocus
Forms!F_Startup!UFO1.Form.RecordsetClone.FindFirst "GebaeudeID = "
& lngGebaeudeID
Forms!F_Startup!UFO1.Form.Bookmark = Forms!F_Startup!
UFO1.Form.RecordsetClone.Bookmark
Forms!F_Startup!UFO1.Form!txtGebaeudeBezeichnung.SetFocus
End Sub
Code OnChange Register 1:
Private Sub Reg1_Change()
bolLoad = true 'Variable die im Deklarationsbereich des Formulars
angelegt wurde und verhindern soll das beim ausblenden der Reiter das
Change Ereignis des 2. Registers behandelt wird
' Alle Reiter des 2. Registers ausblenden
Me.Reg2.Pages("Reg2Standorte").Visible = False
Me.Reg2.Pages("Reg2Gebaeude").Visible = False
Me.Reg2.Pages("Reg2Kontakte").Visible = False
' etc., es sind insgesamt 14 Register die dann nach Bedarf
eingeblendet werden
' UFo des 1. Registers leeren
Me!UFO1.SourceObject = ""
Select Case Me!Reg1.Value
Case 0
' Register für Firmenansicht einblenden
Me.Reg2.Pages("RegUfoStandorte").Visible = True
Me.Reg2.Pages("RegUfoGebaeude").Visible = True
Me.Reg2.Pages("RegUfoKontakte").Visible = True
' etc.
' UFo mit Daten füllen
Me!UFO1.SourceObject = "F_FirmenEndlos"
If Me!Reg2.Value <> 0 Then
Me.Reg2.Pages("RegUfoStandorte").SetFocus
' Fokus setzen
Me!UFO1.SetFocus
Me!UFO1.Form.sel2.SetFocus
Case 1
' Register für Standortansicht einblenden
Me.Reg2.Pages("RegUfoGebaeude").Visible = True
Me.Reg2.Pages("RegUfoDetailsStandorte").Visible = True
Me.Reg2.Pages("RegUfoNotizen").Visible = True
' etc.
' UFo´s mit Daten füllen
Me!UFO1.SourceObject = "F_StandorteEndlos"
If Me!Reg2.Value <> 1 Then
Me.Reg2.Pages("RegUfoGebaeude").SetFocus
' Fokus setzen
Me!UFO1.SetFocus
Me!UFO2.Form.sel2.SetFocus
Case 2 '
Case 3 ' etc., insgesamt 7 Reiter
End Select
bolLoad = false
Call RegUfo_Change ' Das Change Ereignis des 2 Registers muss
ausgelöst werden um die Verknüpfung von UFO2 korrekt zu setzen
End Sub
Code des Change Ereignis von Register 2:
Private Subn Reg2_Change()
If bolLoad = False then
' UFo des Unterregisters leeren
Me!UFO2.SourceObject = ""
Select Case Me!Reg1.Value
Case 0
Me!UFO2.SourceObject = "F_StandorteUfo"
Me!UFO2.LinkChildFields = "FirmID"
Me!UFO2.LinkMasterFields = "txtFirmID"
Case 1
Me!UFO2.SourceObject = "F_GebaeudeUfo"
' Verknüpfung festlegen
If Me!Reg1.Value = 0 Then
Me!UFO2.LinkChildFields = "FirmID"
Me!UFO2.LinkMasterFields = "txtFirmID"
ElseIf Me!Reg1.Value = 1 Then
Me!UFO2.LinkChildFields = "StandortID"
Me!UFO2.LinkMasterFields = "txtStandortID"
End If
Case 2
Case 3
Case 4 ' etc
End Select
End If
End Sub
Wären des ausführens werden natürlich noch die Open und Current
Ereignisse der zu ladenden Forms gefeuert, da ich aber dort zum Test
auch mal alles auskommentiert hatte, habe ich diese jetzt nicht
gepostet.
Mir sind beim schlafen und frühstücken und denken noch ein paar Ideen
gekommen:
- Nur ein ungebundenes Textfeld (statt eins je Reiter im 1. Register)
in das alle ID´s beim Anzeigen-Ereignis geschrieben werden, je nachdem
welches Formular gerade aktiv ist
- Verknüpfung nicht über LinkFields sonder die Datensatzherkunft im
Formular (Unterformular 2)
- Insgesamt ca. 20 einzelne UFo´s, eins je Reiter in Register 2, die
schon beim Öffnen des HFO mit Formularen geladen sind. Lediglich das
SourceObject von UFO1 wird zur Laufzeit geändert
Ich werde das in der Zwischenzeit mal ausprobieren, vielleicht hilfts
ja.
Viele Grüße,
Martin
Antworten ist nicht mehr nötig, ich habs gelöst.
Der Versuch mit der Zuweisung der Datensatzherkunft hat wunderbar
funktioniert.
Wenn ich da früher drauf gekommen wäre hätte ich mir vieeeeel Zeit
gespart.
Oh well....
Danke nochmal Karl für Deinen Beistand.
Liebe Grüße,
Martin