Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: crystal am Mai 15, 2020, 19:37:53

Titel: Seltsame Tabellen-Verknüpfung
Beitrag von: crystal am Mai 15, 2020, 19:37:53
Hallo!
Ich habe ein seltsames Verhalten in Access (MS 365) festgestellt.
Zur Situation:
Ich habe eine Tabelle, zu der ich weitere Daten via Verknüpfungs-Tabelle zuordne. Funktioniert prima.

Jetzt möchte ich weitere Daten mit einer neuen Verknüpfungs-Tabelle hinzufügen. Diese habe ich wie vor manuell angelegt und ins Datenmodell identisch integriert.

Sobald ich nun die neue Verknüpfungs-Tabelle zu einer Abfrage hinzufüge, sind die Daten der Abfrage (Felder der Haupttabelle) in der Datenblatt-Ansicht nicht mehr änderbar. Nehme ich die neue Tabelle heraus, kann ich die Daten wieder ändern.

Ich habe alle Verknüpfungen überprüft und kann keinen Unterschied feststellen.

Einziger Unterschied ist vielleicht, dass in der neuen Verknüpfungs-Tabelle und der nachgeordneten Tabelle noch keine Daten vorhanden sind.

Wer kann mir helfen?

Edit: ich füge die geleerte Datenbank hinzu. Darin sind fast alle Daten und VBA-Codes gelöscht.
Starten der Abfrage GetAllMovies führt zu dem Ergebnis, dass man keine Daten ändern kann.
Löscht man im Entwurf die Tabellen MovieActors und Actors, kann man die Daten ändern. Wieso???
Titel: Re: Seltsame Tabellen-Verknüpfung
Beitrag von: PhilS am Mai 16, 2020, 11:01:53
Ich vermute, in deiner neuen Tabelle fehlt der Primärschlüssel und/oder bei der Beziehung zwischen den Tabellen keinen eindeutigen Zusammenhang (X:Y) feststellen.
Titel: Re: Seltsame Tabellen-Verknüpfung
Beitrag von: crystal am Mai 16, 2020, 16:34:04
@PhilS: Nein, der Primärschlüssel fehlt nirgends und die Zusammenhänge sind eindeutig.

Neue Erkenntnisse:
1. Umbenennen der Tabellen/Felder bringt nichts.
2. Testweise habe ich die Verknüpfung von MovieId zu MovieActorsMovieRef gelöscht und statt MovieId irgendein anderes passendes Feld benutzt - schon klappt es. Mach ich es dann rückgängig, klappt es nicht mehr.

Wer weiß weiter?
Titel: Re: Seltsame Tabellen-Verknüpfung
Beitrag von: DF6GL am Mai 16, 2020, 16:42:56
Hallo,


unter anderem Microsoft...:

ZitatProblembehandlung bei Informationen zu Problemen, die beim Aktualisieren von Daten in einer Abfrage auftreten können

•Wenn die Abfrage auf drei oder mehr Tabellen basiert und eine viele-zu-eins-zu-viele-Beziehung besteht, können Sie die Daten nicht direkt in der Abfrage aktualisieren.

aus https://docs.microsoft.com/de-de/office/troubleshoot/access/errors-updating-query-form-data
Titel: Re: Seltsame Tabellen-Verknüpfung
Beitrag von: Beaker s.a. am Mai 16, 2020, 18:23:28
Hallo,
Habe es mir mal angesehen.
1. Nachschlage Felder in "tblMovies",  >:( solltest du schon gelernt haben
2. die Beziehungen gehören für mich alle zum Typ 1
wenn man andere braucht setzt man die in Abfragen. Und in deiner
"GetAllMovies" braucht es auch keine anderen Typen.
gruss ekkehard
Titel: Re: Seltsame Tabellen-Verknüpfung
Beitrag von: Beaker s.a. am Mai 16, 2020, 18:44:18
Und überhaupt macht deine Abfrage keinen grossen Sinn, wer will sich
zwei Dutzend Felder denn in der normalen Tabellenansicht anschauen?
Und zum Editieren ist die Abfrage schon gar nicht zu gebrauchen, auch
nicht als DS-Herkunft für ein Formular. Das gehört m.E. so aufgebaut; -
- HFo auf Basis der Tabelle "Movies" und keine andere
- die FK-Felder und die zugehörigen Klartexte werden dort in Kombis
angezeigt. Die kann man auch so breit ziehen, dass mehrere Spalten
sichtbar sind.
Die Zwischentabellen "MovieActors" und "MovieTags" werden in UFo
angezeigt. Darein gehören dann jeweils ein Kombi zu Actors bzw. Tags.
Und schon siehst du zu jedem Movie alle Eigenschaften auf einen Blick,
und kannst auch editieren. Für alle anderen 1-Tabellen brauchst du eh
eigene HFo.
gruss ekkehard
Titel: Re: Seltsame Tabellen-Verknüpfung
Beitrag von: crystal am Mai 16, 2020, 20:07:50
@Beaker s.a.
Vielen Dank für deine Kritik.
Die Abfrage macht so zum Editieren natürlich keinen Sinn.
Sie ist gedacht gewesen, um in einem Such-Formular z.B. auch Actor-Namen etc. auswählen zu können. Da in der Verknüpfungstabelle nur die Referenzen abgelegt werden, wird die Suche z.B. nach Name(n) etwas schwierig.
Meine Idee war, in dieser Abfrage alle relevanten Felder anzuzeigen, um einfach danach suchen zu können, z.B. "select irgendwas from GetAllMovies where actorname = "Hugo" and tagname = "blau"", aber dann im Formular auch Änderungen machen zu können.

Es ist richtig, dass konzeptionell einige Tabellen als 1:1-Beziehungen gedacht sind. 1 Movie= 1 Genre etc.
Da könnte ich im Such-Formular natürlich auch über eine Kombobox auswählen und nach der entsprechenden Id suchen. Also könnte ich diese Tabellen aus GetAlMovies rausnehmen. Am Ende hätte ich dann nur noch Movies, MovieActors und MovieTags in der Abfrage, das sollte ja dann vielleicht klappen.

Die Tags und Actors sind tatsächlich als SubForms angelegt.

Die Nachschlage-Felder sind nur zum Testen gedacht, damit ich Beispieldaten direkt in die Tabelle eingeben kann. Natürlich fliegen die wieder raus.
Titel: Re: Seltsame Tabellen-Verknüpfung
Beitrag von: crystal am Mai 16, 2020, 21:38:39
Das Problem bleibt - oder doch nicht.
Also:
Ich habe eine Tabelle Movies.
Zu jedem Movie gehören verschiedene Tags (ein Movie kann mehrere Tags enthalten).
Zu jedem Movie gehören verschiedene Actors (ein Movie kann mehrere Actors haben).
Zunächst einmal trivial.
Es könnten auch noch weitere Daten zu einem Movie zugefügt werden, z.B. Locations, Verweise auf Bilder usw. (alles 1:n-Beziehungen)
Alles kein Problem, da man ja entsprechende UFos in das Movie-Formular einfügen und somit die Daten einfach eingeben kann. Eine Abfrage solch mehrfach verknüpfter Tabellen ist allerdings nicht editierbar, wie wir nun gelernt haben.

Jetzt möchte ich aber z.B. nach Movies suchen, in denen ein bestimmter Actor und/oder ein bestimmtes Tag (usw.) vorkommt, um dann die Movie-Daten bearbeiten zu können.

Wie kann ich das anstellen?

Ich glaube, die Lösung jetzt gefunden zu haben:  :) :) :)

Ich könnte z.B. alle meine Verknüpfungen in eine Abfrage einbauen und ein dreigeteiltes Formular anlegen: oben gebe ich meine Suchkriterien an, links werden dann zur Vorauswahl eine wenige Daten aus den selektierten Movies angezeigt (Endlos-Formular, nicht editierbar) und wenn ich dort auf ein Movie klicke, werden rechts die Moviedaten zum editieren angeboten mit allen nachgeorneten Daten in UFos.

Ich habe wohl zu einfach gedacht: alles selektieren, um es editieren zu können. Aber mit dieser Idee (links Daten aus der - nicht editierbaren - Selektion anzeigen) und rechts dann die Daten GENAU des Datensatzes editieren, der links ausgewählt wurde). So könnte es klappen.
Es könnte dann allerdings sein, das EIN Movie links mehrfach angezeigt wird. Aber damit könnte man leben. Oder vielleicht mit ORDER BY und SELECT DISTINCT unterdrücken???

Was meint ihr dazu?

Titel: Re: Seltsame Tabellen-Verknüpfung
Beitrag von: PhilS am Mai 17, 2020, 10:51:05
Zitat von: crystal am Mai 16, 2020, 16:34:04
@PhilS: Nein, der Primärschlüssel fehlt nirgends und die Zusammenhänge sind eindeutig.
Das kann ich nach einem kurzen Blick auf deine Beispiel-DB bestätigen.
Irgendetwas an dem Aufbau der Abfrage mit den M:N-Beziehungen scheint Access zu verwirren. Eine Erklärung habe ich dafür nicht.

Wenn du eindeutige Datensätze ausgeben lässt (DISTINCTROW), dann wird die Abfrage übrigens aktualisierbar, obwohl das nach meiner Einschätzung nichts am Ergebnis ändern sollte.



Titel: Re: Seltsame Tabellen-Verknüpfung
Beitrag von: crystal am Mai 17, 2020, 16:57:20
@PhilS
Vielen Dank dafür, dass du dir die Mühe gemacht hast, meine "abgespeckte" DB anzuschauen.

Der DISTINCTROW-Tipp ist sehr interessant, aber ich denke, ich komme mit meinem zuvor dargestellten Konzept weiter.
Auch wenn die Abfrage Datensätze mehrfach zurückgibt, ist das mit meinem Konzept des dreigeteilten Formulars wohl zu handhaben. Bin noch am probieren...

Übrigens: DISTINCT hatte ich schon probiert, DISTINCTROW allerdings nicht. Es ist eben schwierig, in ACCESS SQL-Direktiven einzugeben und im "Entwurfsmodus" angezeigt zu bekommen. Die kaskadierten JOINs im SQL-Text meiner Abfrage sind syntaktisch auch eher schwer zu verstehen. Leider werden strukturierte SQL-Direktiven, die im Klartext eingegeben wurden, von ACCESS immer wieder verhunzt, wenn man sie speichert und wieder anschaut...
Titel: Re: Seltsame Tabellen-Verknüpfung
Beitrag von: Beaker s.a. am Mai 17, 2020, 19:15:05
@crystal
Anbei habe ich dir mal ein Minimalstbeispiel gebastelt.
Da das auch für ähnliche Modelle, 1 x N und 2 x M brauchbar ist, sind
die Benennungen entsprechend allgemein. Die müsstest du natürlich
anpassen, - wobei hier N = Movies, M1 = Actors und M2 = Tags ist.
Die beiden Kombis im HFo N filtern jeweils nach nach M1 oder M2.
So wie es jetzt ist allerdings unabhängig voneinander. Will sagen es
werden nicht beide Werte gleichzeitig ausgewertet für den Filter. Dazu
könntest du einen Button integrieren, der die beiden Filter (siehe
AfterUpdate-Events) zusammen führt.
Um die Übersicht noch zu verbessern könnte ich mir links von den beiden
UFo ein Listenfeld vorstellen, in dem zunächst alle Movies angezeigt
werden (Auswahl per Klick) und das über die die Kombis gefiltert wird.
Dann siehst du auf einen Blick (ohne im Form zu blättern) was der Filter
ausspuckt, und du hast eine gefilterte Auswahl zum schnellen Navigieren
zu einem Movie.
Die Kombis in den UFo bekommen ein NotInList-Event spendiert (im
Beispiel nicht enthalten), das dann das entsprechende HFo (im Beispiel
nur M1 angelegt) aufruft, um neue Actors bzw. Tags zu erfassen.
Wie du siehst kannst du alles (mehr oder weniger) über ein einziges
Formular erfassen/editieren ohne eine Monsterabfrage mit der man
nicht wirklich was anfangen kann.
Was im Beispiel nicht berücksichtigt ist sind deine Tabellen auf der linken
Seite (Genre u.s.w.). Die müssen dazu und die FK in Tabelle N eingefügt
werden. Auf dem HFo Movies erscheinen die dann als Kombifelder
(gebunden). Um danach zu filtern legst du wiederum ein Kombi (dieses
ungebunden wie die anderen) im Formularkopf an, DS-Herkunft
"Genres". Der Filter lautet damit dann so
sFilter = "GenreID_F = " & Me.cboGenres
Die Tabelle TagTypes gehört als Kombi ins HFo Tags.

gruss ekkehard
Titel: Re: Seltsame Tabellen-Verknüpfung
Beitrag von: crystal am Mai 18, 2020, 00:26:53
@Beaker s.a.
Wow, sehr schönes Beispiel.
Interessant auch die UNION-Selects in den Komboboxen des HFo, um "Alle" unterzubringen. Ich hätte "Alle" wohl einfach als Datensätze angelegt.

Dein Beispiel kommt schon sehr nahe an das heran, was ich mir an der Oberfläche als Funktionalität vorgestellt habe. Statt es links durch ein Listenfeld zu erweitern, möchte ich ein weiteres UFo anlegen, in dem z.B. je ein Bild (Thumbnail) und andere kurze Informationen der Movies angezeigt werden. Das geht natürlich nicht mit einem Listenfeld.  Die Auswahl könnte dann über ein Klick im Detailbereich erfolgen.

Schließlich möchte ich dann die Eingaben im HF-Kopf ("Suchmuster") als Template ablegen, um einfach auf frühere Suchen zugreifen zu können. In der Template-Tabelle möchte ich dann die SQL-Direktiven zusammenbasteln (inkl. AND, OR, AND NOT, =, <>, LIKE, ORDER BY etc.). In meinem ungebundenem HF würde ich dann nur noch "Suchmuster" per Kombobox auswählen und dann per VBA die zusammengebastelten SQL-Direktiven laden und zur Laufzeit im HF bzw. dem "linken UFo" zuordnen. Somit könnte ich häufig wiederkehrende Suchmuster ablegen und brauche sie nicht immer wieder neu eingeben. Statt sich mit SQL-Statements herumzuschlagen, könnte der Anwender dann einfach ein Template anhand eines sprechenden Namens auswählen, z.B. "Alle Movies mit Farbe blau oder Actor Hugo", "Alle Movies, die noch nicht bearbeitet wurden", "Movies mit TagType Farben". Außerdem könnte der Formularkopf dadurch sehr schlank werden, was wichtig ist, da ich viel Platz zur Anzeige von Movie-Infos und -Bildern brauche. Ich bin da noch am Experimentieren und überlege, wie ich Parameter auch noch abfragen kann...

Übrigens (1): meine Tags sind hierarchisch gedacht, z.B. TagType Farben und Tags blau, rot, grün usw. Leider kann man in einem Endlos-UFo keine entsprechenden VBA-Berechnungen machen (abhängige Komboboxen), weshalb ich mich dann entschlossen habe, TagType und Tag in der Tabelle Tag zu einem Klartextfeld zusammenzusetzen, z.B. "Farbe  blau" und im HF mit einer nicht-proportionalen Schriftart anzuzeigen, damit die TagTypes gleichmäßig abgetrennt erscheinen. Besser wäre es natürlich, zunächst TagType "Farbe" zu selektieren und dann das passende Tag. Das aber klappt mit abhängigen Komboboxen im (Endlos-)UFo nicht.

Übrigens (2): wenn ich in einem UFo einen DS lösche, erfolgt immer eine Warnung durch Access. Kann man das irgendwie unterdrücken?

Nochmals DANKE für das sehr lehrreiche Beispiel und deinen Senf!
Titel: Re: Seltsame Tabellen-Verknüpfung
Beitrag von: Beaker s.a. am Mai 18, 2020, 18:06:15
@crystal
ZitatInteressant auch die UNION-Selects in den Komboboxen des HFo, um "Alle" unterzubringen
Sowas lernt man durch vieles Lesen. Dazu gleich mal noch eine Codeverbesserung
(Verkürzung) weil noch mal nachgelesen
Private Sub cboFilterM1_AfterUpdate()
    Dim sFilter As String
    With Me
        sFilter = _
              "Entitaet_NID IN(SELECT Eintitaet_NID_F FROM tblNzuM1 WHERE Entitaet_M1ID_F = " & .cboFilterM1 & ")" _
            & " OR " & .cboFilterM1 & " = 0"
        .Filter = sFilter
        .FilterOn = True
    End With
End Sub


Wie du dein spezielles Form jetzt gestaltest bleibt natürlich dir überlassen.
Ich wollte dir nur ein paar einfache Vorgehensweisen und Grundlagen zeigen
(pro Form nur eine Tabelle, Verknüpfung von HFo/UFo usw.). Denn bei Access
musst du von der Excel-Denkweise "alles auf einem Sheet" wegkommen.
Dein Datenmodell ist ja korrekt, soweit ich das ohne weiteres Hintergrundwissen
beurteilen kann.
Das mit den gespeicherten Filtern ist nicht schlecht, habe ich auch schon mal in
meiner Anfangszeit gemacht, finde ich nur leider nicht mehr. Das Prinzip ist aber
recht simple. Eine Tabelle mit ID, Kurzbezeichnung (für's Kombi) und einem
Textfeld zur Aufnahme des generierten Filter-Strings. Die Breite von 255 Zeichen
sollte dafür reichen. Diese wird dann DS-Herkunft des Kombis. AfterUpdate
desselben holst du dann den Filter direkt aus der 3. Spalte (Nr. ist 2), oder per
DLookup mit der ID aus der Tabelle und weist ihn dem Form.Filter zu.
Für das Zusammenstellen der Filter(Strings) würde ich ein eigenes Formular
erstellen, da hast du keine Platzprobleme auch nicht mit den weiteren Tabellen
(z.B. SF und Hugo). Mit einem Listfeld könntest du prüfen ob der Filter das
erwartete Ergebnis liefert, und das HFo "Movies "nebst Kombi "Filters" damit
füttern. Und, wenn neu, die Tabelle.

Zu "Übrigens (1)" gibt es sicher eine Lösung, fällt mir im Moment nur leider nicht ein  >:( 

Zu "Übrigens (2)":
Private Sub Form_BeforeDelConfirm(Cancel As Integer, _
        Response As Integer)
    ' Access-Meldung unterdrücken
    Response = acDataErrContinue
    ' nur wenn du möchtest
    If MsgBox("Löschen?", vbOKCancel) = vbCancel Then
        Cancel = True
    End If
End Sub


gruss ekkehard
Titel: Re: Seltsame Tabellen-Verknüpfung
Beitrag von: crystal am Mai 19, 2020, 10:30:59
@Beaker s.a.
Lieber Ekkehard,
ich bin wirklich begeistert von deinen ausführlichen und sehr lehrreichen Antworten!
Respekt für deine Mühe, so intensiv und sorgfältig auf Fragen einzugehen.

Bravo und ein dickes Lob für so viel Engagement!!!
Titel: Re: Seltsame Tabellen-Verknüpfung
Beitrag von: Beaker s.a. am Mai 19, 2020, 18:54:05
@crystal
Danke für dein Lob, - ich bemühe mich.
Mir ist dazu auch gerade noch eingefallen, das es da ein sehr nützliches
AddIn gibt, das ich mal zusammen mit Josef Pötzl entwickelt habe. Damit
ist es sehr viel einfacher zusammengesetzte SQL- & Filterstrings zu prüfen
als mit Debug.Print und dem ganzen C&P Hin und Her.
Entpacke das Archiv in ein beliebiges Verzeichnis und lies die ReadMe.
Die Funktionsweise ist auf dem Startformular des AddIns erklärt.
gruss ekkehard