Registersteuerelement Seiten leeren

Moderator: ModerationP

Registersteuerelement Seiten leeren

Beitragvon Gast » 19. Okt 2021, 19:05

Hallo,
in einem ungebundenen Formular gibt es eine Combo cboLaender, in dem ein Land ausgewählt werden kann.
Eine Liste lstStaedte zeigt die Städte des gewählten Landes an. Wird auf eine Stadt geklickt, werden Informationen auf verschiedenen Seiten eines Registersteuerelements gezeigt. Das funktioniert auch.
Jetzt gibt es aber das Problem, dass für einige Länder noch keine Städte eingetragen sind. Daher bleibt die Liste lstStaedte leer, was logisch ist.
Unklar ist, wie man alle Seiten des Registersteuerelements leer bekommt. Es bleiben nämlich die Daten der Stadt bestehen, die man zuvor gewählt hat.
„Aktualisieren“ hilft da nicht. Ist das nur mit VBA zu lösen?
Danke für Tipps.
VG Petra
Gast
 

Re: Registersteuerelement Seiten leeren

Beitragvon knobbi38 » 19. Okt 2021, 22:34

Hallo Petra,

wo kommen den die Städtedaten in den Registerkarten her und wie werden sie angezeigt? Genauso müßten diese dann auch wieder gelöscht werden.

Ulrich
Zuletzt geändert von knobbi38 am 19. Okt 2021, 23:33, insgesamt 1-mal geändert.
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 3603
Registriert: 02. Jul 2015, 14:23

Re: Registersteuerelement Seiten leeren

Beitragvon benny66 » 19. Okt 2021, 23:04

gelöscht
benny66
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 946
Registriert: 22. Nov 2015, 21:56

Re: Registersteuerelement Seiten leeren

Beitragvon Gast » 20. Okt 2021, 08:30

Hallo Ulrich,
wo kommen den die Städtedaten in den Registerkarten her und wie werden sie angezeigt?

Jedes Register hat ein Ufo.
Bei den LinkMasterFields des Ufo-Controls ist jeweils die Liste angegeben. Sie enthält in der geb. Spalte den PK,
bei den LinkChildFields ist der FK zum obigen PK angegeben.
Wenn die Liste leer wird, fehlt doch der PK und damit kann doch keine Beziehung aufgebaut werden. Die Felder des Ufos müssten dann doch leer werden. Sie sind es, wenn das Formular geöffnet wird und noch nichts in der Combo bzw. Liste gewählt wurde.
VG Petra
Gast
 

Re: Registersteuerelement Seiten leeren

Beitragvon knobbi38 » 20. Okt 2021, 11:26

Hallo Petra,

ich habe jetzt keine Lusten, dein Szenario nachzustellen. Kannst du eine kleine DemoDB hochladen?

Gruß Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 3603
Registriert: 02. Jul 2015, 14:23

Re: Registersteuerelement Seiten leeren

Beitragvon petko » 20. Okt 2021, 15:06

Hallo Ulrich,
ich habe das jetzt einmal in einer Demo nachgestellt.
Wenn man Australia, dann Graz wählt, werden im Registersteuerelement die Datensätze gezeigt.
Das Phänomen stellt sich ein, wenn man jetzt irgendein anderes Land wählt.
Die Liste wird aktualisiert; sie wird geleert. Aber im Registersteuerelement sind die vorherigen Datensätze noch zu sehen, obwohl LinkMasterFields des Ufo-Controls auf die jetzt leere Liste referenziert ist.
Müsste es dann nicht das Ergebnis sein, dass keine Datensätze im Element gezeigt werden?
VG Petra
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
petko
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 17
Registriert: 20. Okt 2021, 15:02

Re: Registersteuerelement Seiten leeren

Beitragvon Bitsqueezer » 21. Okt 2021, 09:25

Hallo Petra,

Problem ist, daß nach dem Wechsel kein Eintrag in der Listbox selektiert ist, entsprechend kann das UFO auch nichts filtern.

Besser ist, die Listbox zu entfernen und ein UFO zu verwenden. Da man nicht "über zwei Ecken" zwei UFOs verbinden kann, braucht es dann eine Textbox im HFO, die sich die ID holt, so daß man diese verlinken kann.

Test v2.zip


Auf diese Weise geht es komplett ohne Code - und nebenbei kannst Du die Städteliste dann auch ansprechend formatieren.
Auch die Abfragen benötigen so keine Referenz auf ein Control eines Formulares, was man besser immer vermeidet.

Kleiner Wermutstropfen: Das Zwischenfeld verwendet eine Formel mit "=". Diese werden grundsätzlich erst als letztes berechnet mit etwas Verzögerung. Entsprechend hat man immer eine kleine Verzögerung beim Datensatzwechsel, das ist mit dieser Lösung nicht vermeidbar.

Es ist daher empfehlenswert, vom Städte-UFO aus per Code die Datensatzquelle der anderen UFOs zu verändern, das geht immer sofort und ist performant. Ich verwende dazu gerne einen selbstgebauten Event, den man in die anderen UFOs per dort platzierter Eventprozeduren verarbeiten kann.

Beispiel siehe meine Downloadseite unter "CCFormSync". Das Beispiel zeigt zwar die Synchronisation des Datensatzzeigers, kann aber auf die gleiche Weise verwendet werden, um die ausgewählte ID des Städte-UFOs per Event-Parameter an die anderen UFOs weiterzureichen, die sich einfach nur auf den gleichen Event "aufschalten" müssen. So sind die Formulare komplett voneinander entkoppelt und benötigen keinen Direktzugriff auf irgendein anderes Formular.

Gruß

Christian
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Bitsqueezer
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 8497
Registriert: 21. Jun 2007, 12:17

Re: Registersteuerelement Seiten leeren

Beitragvon petko » 21. Okt 2021, 10:18

Hallo Christian,
vielen Dank für die Erklärung und das Beispiel.
Ich werde versuchen, deine Angaben umzusetzen und erst dann deine DB konsultieren. Mal schauen, wie weit ich komme. Hoffentlich gelingt es mir völlig ohne.
Auch die Abfragen benötigen so keine Referenz auf ein Control eines Formulares, was man besser immer vermeidet.

Wie ist besser zu verstehen? Performance oder unsicher? An sich ist es doch eine Parameterabfrage, nur halt mit einem Control.

Noch etwas anderes:
Mit folgendem werden alle Tabellen meiner DB, die die WHERE-Klausel erfüllen, gezeigt
Code: Alles auswählen
SELECT Name FROM MsysObjects
WHERE Left$([Name],1)<>"~"
AND Left$([Name],4) <> "MSys"
AND Left$([Name],4) <> "USys"
AND Type=1;

Es taucht auch diese auf
f_4AD23AE0BCF54E9E9F3C1A98DC030B7C_Data

Im Beziehungsfenster und im Navigationsbereich kann sie nicht sichtbar gemacht werden und durch Reparieren verschwindet sie nicht.
Es kommt diese Meldung beim Versuch, sie zu öffnen:
Laufzeitfehler '7874': Microsoft Access kann das Objekt 'f_4AD23AE0BCF54E9E9F3C1A98DC030B7C_Data' nicht finden.

An sich ja ein Widerspruch zum Abfrageergebnis.
Ich denke, sie ist ein Rudiment, das durch Reparieren nicht wegzukriegen ist. Ich habe jetzt noch nicht versucht, sie zu löschen.
Wie geht das gefahrlos und tauchen solche Tabellen öfter auf evtl durch einen Absturz?
VG Petra
petko
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 17
Registriert: 20. Okt 2021, 15:02

Re: Registersteuerelement Seiten leeren

Beitragvon Bitsqueezer » 21. Okt 2021, 12:35

Hallo Petra,

Wie ist besser zu verstehen? Performance oder unsicher? An sich ist es doch eine Parameterabfrage, nur halt mit einem Control.


Weder noch..:)

Du erstellst damit eine Abfrage, die auf ein nicht zur Abfrage gehörendes Objekt verweist und damit darauf angewiesen ist, daß dieses Objekt existiert und zugreifbar ist.
Beim Umbenennen des Controls fällt das nicht auf, aber vermutlich spätestens zur Laufzeit. Auch der Compiler hilft hier nicht. Somit ist das eine potentielle Fehlerquelle, die u.U. erst nach Auslieferung auffällt, wenn man nicht gut getestet hat.
Es erschwert einem als Entwickler auch, herauszufinden, wo ein Objekt überall gebraucht wird (empfehlenswertes Addon: V-Tools mit "Total Deep Search"-Tool).

Zum einen sollte man alle Abfragen immer als gespeicherte Abfragen verwenden, alleine schon wegen eines geringfügigen Performancevorteils und besserer Lesbarkeit/zentraler Verwaltbarkeit und kein SELECT direkt in einer Row-/ControlSource.

Zum anderen kann man eine Abfrage mit einem Parameter versehen ("PARAMETERS"-Klausel) und die Abfrage per Code mit dem Wert versorgen. Das ist umständlicher, keine Frage, aber man hat alles da, wo es hingehört, nämlich im Formularcode, wo es gebraucht wird.

Dann auch immer im Hinterkopf behalten, daß man eine Datenbank ggf. mal auf einen DB-Server hochskalieren will. Solche Abfragen lassen sich dann nicht exportieren, da sie eine lokale Access-Ressource verwenden, die auf dem Server nicht bekannt ist und daher dort nicht funktioniert.

In meinem letzten Projekt habe ich z.B. alternativ eine Funktion erstellt, die als Parameter den Parameternamen verwendet (z.B. "ID_Stadt"). Die Funktion in einem Standardmodul wird dann von ALLEN parametrisierten Abfragen verwendet und entscheidet per Select Case, von wo der Parameter kommen soll. Das hat den Vorteil, daß die Funktion immer verwendet werden kann, da ein Standardmodul immer automatisch instantiiert ist (also nicht erst ein Formular geladen sein muß). Die Funktion kann dann alle notwendigen Tests machen, z.B., ob das gesuchte Formular (oder was auch immer) zur Verfügung steht und von da der gewünschte Parameterwert bezogen werden kann. Die Funktion kann dann auch einen entsprechenden Default-Wert zurückgeben, z.B. 0, wenn das Formular nicht geladen ist.

Ist das Formular nicht geladen, kann die Abfrage daher trotzdem ausgeführt werden, auch wenn sie dann nichts anzeigt (oder eben alles, abhängig davon, wie man das macht).

Mit folgendem werden alle Tabellen meiner DB, die die WHERE-Klausel erfüllen, gezeigt
[...]Im Beziehungsfenster und im Navigationsbereich kann sie nicht sichtbar gemacht werden und durch Reparieren verschwindet sie nicht.
Es kommt diese Meldung beim Versuch, sie zu öffnen:


Nein, Du zeigst damit keine Tabellen an, sondern den Inhalt der Tabelle "MsysObjects", mehr nicht. Was da drinsteht, ist von Access verwaltet und sagt nichts darüber aus, ob die Tabelle existiert.
Vermutlich war es eine Temp-Tabelle oder eine Lookup-Tabelle, die nicht mehr existiert. Aber das kann Dir nur MS sagen.

Wenn Du eine Liste aller Tabellen haben möchtest, ist die einzig zuverlässige Methode, die TableDefs-Auflistung durchzugehen und von dort die Namen zu holen.

Die Tabelle MSysObjects sollte man, wie alle Systemtabellen, besser in Ruhe lassen, weswegen sie ja auch ausgeblendet sind, damit man nicht daran rumfummelt. Es gibt nur wenige Ausnahmen, etwa die MSysResources oder die USys-Tabellen.

Gruß

Christian
Bitsqueezer
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 8497
Registriert: 21. Jun 2007, 12:17

Re: Registersteuerelement Seiten leeren

Beitragvon knobbi38 » 21. Okt 2021, 14:48

Hallo Petra,

die Tabelle wird automatisch von Access bei einer neuen .accdb mit den Flags = -2146828288 angelegt und hat einen eindeutigen Namen. Ergänze deine Where-Bedingung und filtere diese Tabelle über die Flags aus.

Gruß Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 3603
Registriert: 02. Jul 2015, 14:23

Re: Registersteuerelement Seiten leeren

Beitragvon Jogeli » 21. Okt 2021, 15:40

Hallo Petra
Kleine Anmerkung. Der englische Name für Österreich ist nicht Australia, sondern Austria. :D
Gruss
Köbi
Jogeli
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 57
Registriert: 20. Feb 2016, 14:07

Re: Registersteuerelement Seiten leeren

Beitragvon knobbi38 » 21. Okt 2021, 21:38

@Christian:
Problem ist, daß nach dem Wechsel kein Eintrag in der Listbox selektiert ist, entsprechend kann das UFO auch nichts filtern.
Das hat nichts mit der Selektion zu tun, sondern die Value Eigenschaft hat nach dem Wechsel immer noch den gleichen Wert! Da sich der Inhalt vom MasterLinkField nicht geändert hat, ändert sich für das UFO erstmal auch nichts. Erst mit einer erneuten Selektion würde die Value-Eigenschaft mit einem neuen Wert überschrieben.


Hallo Petra,

das Problem mit der Listbox ist, daß die Value-Eigenschaft bei einem Requery nicht automatisch zurückgesetzt wird und den letzten Wert behält, also u.U. auch ungültig oder sogar falsch werden kann.
Deshalb im Zweifelsfall immer die Value Eigenschaft vorher auf NULL setzen!

Falls gewünscht, könnte man dann auch gleich neu selektieren:
Code: Alles auswählen
Private Sub cboLaender_AfterUpdate()
  ' Clear selection and requery
  lstStaedte.Value = Null
  lstStaedte.Requery
 
  ' Autoselect first item if any
  If lstStaedte.ListCount > 0 Then
    lstStaedte.Value = lstStaedte.ItemData(0)
  End If
End Sub


Gruß Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 3603
Registriert: 02. Jul 2015, 14:23

Re: Registersteuerelement Seiten leeren

Beitragvon petko » 23. Okt 2021, 10:56

Hallo,
danke euch für die Hinweise und fürs Mitlesen (Austria :wink:).
@Christian
ich bin froh, dass ich auf der Grundlage deiner Beschreibung die Liste durch ein Ufo ersetzen konnte. Ich habe jetzt meine DB mit deiner verglichen und stellte dies fest:
a) Ich benannte das Linkfeld txtStadtID, bei dir ctl_StadtID. Ctl statt txt als Präfix – hat das einen tieferen Sinn?

b) Das Linkfeld mit Wenn(IsError(… abzusichern, hatte ich gar nicht bedacht. Ich hatte nur =[sfmStaedte].[Formular].[StadtID], was auch geht, aber wohl nicht so gut ist. Gefühlsmäßig denke ich, dass Access zu einem Umweg gezwungen wird, wenn man das Control angibt statt den Feldnamen direkt.
Man könnte ja auch durch VBA das Linkfeld bestücken.
Ist es generell besser, möglichst alles ohne VBA hinzubekommen wie hier?
Ich kann mir jetzt auch nicht vorstellen, was da zu einem Fehler führen könnte, der Wenn(IsError(… nötig macht.

c) du belässt den Datensatzmarkierer (DSM) im Ufo; ich ließ ihn weg, um mehr das Aussehen einer Liste zu haben. Dann schlug ich mich damit herum, das gewählte Feld markiert zu bekommen, damit es auch zu sehen ist, wenn man in das 2. Ufo wechselt. Nicht geschafft. Ich versuchte die bedingte Formatierung. Ist eine Markierung des gewählten Datensatzes ohne Zuhilfenahme des DSM überhaupt hinzubekommen?

@Ulrich
die Value Eigenschaft hat nach dem Wechsel immer noch den gleichen Wert

Ich habe versucht, bei einem Stopp im Direktbereich das mit dem MasterLinkField zu beweisen. Kein Erfolg, geht das überhaupt?
Das Code-Beispiel werde ich noch mal einbauen. Sind interessante Aspekte auch mit obigem.
Gruß Petra
Zuletzt geändert von petko am 23. Okt 2021, 11:47, insgesamt 1-mal geändert.
petko
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 17
Registriert: 20. Okt 2021, 15:02

Re: Registersteuerelement Seiten leeren

Beitragvon knobbi38 » 23. Okt 2021, 11:21

Petko hat geschrieben:Ich habe versucht, bei einem Stopp im Direktbereich das mit dem MasterLinkField zu beweisen. Kein Erfolg, geht das überhaupt?

Nein, denn im MasterLinkField steht ja nur der Bezeichner. Du mußt schon diesen Bezeichner evaluieren und dann auf das Steuerelement zugreifen.

Gruß Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 3603
Registriert: 02. Jul 2015, 14:23

Re: Registersteuerelement Seiten leeren

Beitragvon petko » 23. Okt 2021, 11:52

Hallo Ulrich,
danke
Du mußt schon diesen Bezeichner evaluieren und dann auf das Steuerelement zugreifen.

Liest sich so, als wenn es ginge.
Wie macht man das?
Gruß Petra
petko
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 17
Registriert: 20. Okt 2021, 15:02

Nächste

Zurück zu Access Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 17 Gäste