Referenz eines Ufos zeigen

Moderator: ModerationP

Referenz eines Ufos zeigen

Beitragvon Gast » 19. Sep 2021, 10:25

Hallo,
die n-Seite einer Beziehung wird in einem Unterformular gezeigt. In der Datensatzquelle des Ufos gibt es ein Referenzfeld auf eine andere Tabelle. Wie könnte diese gezeigt werden? Das müsste ja wiederum ein Ufo sein oder nimmt man für alles ein Registersteuerelement?
Gruß
Carla
Gast
 

Re: Referenz eines Ufos zeigen

Beitragvon KlausMz » 19. Sep 2021, 10:30

Hallo,
wenn das ein Referenzfeld ist, braucht es kein Ufo. Nimm die Tabelle des Referenzfeldes mit in die Abfrage für das Ufo dazu (mit der Verknüpfung/Beziehung), dann kannst Du auch die Felder der Referenztabelle im Ufo anzeigen.
Gruß
Klaus . . . . . Feedback wäre wünschenswert.
Ich möchte bitte keine unaufgeforderten PN. Fragen bitte im Forum.
Benutzeravatar
KlausMz
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 40251
Registriert: 06. Okt 2003, 15:09
Wohnort: Irgendwo in der Pfalz

Re: Referenz eines Ufos zeigen

Beitragvon Bitsqueezer » 19. Sep 2021, 14:51

Hallo,

der übliche Wert wäre i.d.R. eine Kombobox, die ja bekanntermaßen eine eigene Abfrage verwendet.
Eine Abfrage im UFO über mehr als eine Tabelle muß man entsprechend planen, damit a) eine bearbeitbare Abfrage bleibt und b) nicht ungewollt Stammdaten verändert werden.

Gruß

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

Re: Referenz eines Ufos zeigen

Beitragvon Gast » 21. Sep 2021, 09:49

Hallo,
vielen Dank für eure Hinweise :D
@Ulrich
dann kannst Du auch die Felder der Referenztabelle im Ufo anzeigen

Ich habe das ausprobiert. Zu meiner Verwunderung können die Felder nicht nur angezeigt werden, sondern auch editiert werden. Ich ging ich auch davon aus, dass die Betonung bei dir auf "Anzeigen" liegt. Ich meine mich zu erinnern, dass ein Editieren nicht möglich ist, wenn zwei Tabellen oder mehr in der DSQ eines Formulars sind. Hier geht es aber. Wann trifft es denn zu, dass bei mehreren Tabellen ein Editieren unmöglich ist?
@Christian
Auch die Combo habe ich mal eingebaut. Das funktioni auch.
Eine Abfrage im UFO über mehr als eine Tabelle muß man entsprechend planen, damit a) eine bearbeitbare Abfrage bleibt

Das deutete ich vor der Umsetzung so, dass wohl ein Editieren evtl. nicht möglich sei. Aber es geht zu miner Überraschung s.o. ohne große Planung. Was wäre denn zu bedenken, denn ich gehe davon aus, dass es bei mir nur klappte, weil besondere Bedingungen günstig vorliegen?
Gruß Carla
Gast
 

Re: Referenz eines Ufos zeigen

Beitragvon Bitsqueezer » 21. Sep 2021, 10:09

Hallo Carla,

dir Krux bei Access ist, das es viel zu viel erlaubt, daher eher wahrscheinlich ist, daß ein Editieren möglich ist als umgekehrt. Daher funktioniert bei Dir auch das Editieren einer Abfrage über mehrere Tabellen.
Aber genau deswegen muß es geplant werden. Wenn Du z.B. eine Lookup-Tabelle für Einheiten (etwa Gewichte) hast, diese verknüpfst und die Felder dafür zur Bearbeitung offenläßt, dann steht da etwa, daß der User 1kg Nägel bestellen will. Der denkt sich, nee, ich will nur 100 Gramm, ändert dann "kg" in "g" und ändert in Wirklichkeit die Lookup-Tabelle, so daß jetzt in ALLEN Bestellungen statt "kg" nun "g" steht...

Generelle Faustregel: EIN Formular darf immer nur EINE Tabelle ändern - daran ist auch Access gebunden, nur daß Access halt Änderungen durchführt, solange die Änderungen nur eine Tabelle gleichzeitig betreffen und ggf. eine PK/FK-ID automatisch erzeugt.

D.h.: Hauptformular ist EIN Formular, z.B. für den Bestellkopf (Adressauswahl etc.). Unterformular ist EIN Formular, für die Eingabe von Bestellpositionen, entsprechend bearbeitet das Hauptformular nur genau die Tabelle "tblBestellungen" und das UFO nur genau die Tabelle "tblBestellpositionen". Und nicht die Tabelle "tblEinheiten". Die wird nur verwendet, denn in der Bestellposition gibt es den FK "ID_Einheit", der auf die Lookup-Tabelle verweist. Entsprechend gibt es eine Kombobox, die alle Einheiten aus der Lookup-Tabelle in einer eigenen Abfrage liefert, der User wählt aus und die ID aus der Lookup-Tabelle wird in die Tabelle "ID_Bestellpositionen" eingefügt. Die Kombobox zeigt dagegen die Einheit als Text an. Entsprechend braucht es in dem UFO keinen JOIN zur Einheitentabelle und damit auch keine Gefahr, Stammdaten zu verändern. Das UFO braucht ausschließlich nur die Tabelle Bestellpositionen, mehr nicht (natürlich als Abfrage formuliert und als solche gespeichert, nicht einfach den Tabellennamen, obwohl möglich. Und für die Abfrage natürlich auch kein "SELECT *".). Entsprechend genauso braucht das HFO nur die Tabelle Bestellungen, mehr nicht.

Gruß

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

Re: Referenz eines Ufos zeigen

Beitragvon KlausMz » 21. Sep 2021, 10:24

Hallo,
wenn ich doch aber im Ufo die Einheiten gar nicht auswählen will, sondern nur anzeigen, was soll ich dann mit einer Kombobox ?
Und wenn man mehr Felder aus der Referenztabelle anzeigen will, ist die Kombobox auch wenig hilfreich.
Um sicherzustellen, dass keine Stammdaten geändert werden, muss man die Felder der Referenztabelle ja nur sperren, was dann für mich auch zu einer Planung gehört.

Ich meine mich zu erinnern, dass ein Editieren nicht möglich ist, wenn zwei Tabellen oder mehr in der DSQ eines Formulars sind.
Das hast Du falsch in Erinnerung.
Wenn man ausschließlich INNER JOIN hat, die Primärschlüssel Autowerte sind, lassen sich auch Abfragen mit mehr als 5 Tabelle bearbeiten. Man muss nur die Reihenfolge der Eingabe beachten, immer von oben nach unten (1:n > 1:n > 1:n usw.) Mit 7 habe ich mal probiert.
Ich habe es nur interessehalber mal probiert, braucht man aber nicht.
Gruß
Klaus . . . . . Feedback wäre wünschenswert.
Ich möchte bitte keine unaufgeforderten PN. Fragen bitte im Forum.
Benutzeravatar
KlausMz
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 40251
Registriert: 06. Okt 2003, 15:09
Wohnort: Irgendwo in der Pfalz

Re: Referenz eines Ufos zeigen

Beitragvon Bitsqueezer » 21. Sep 2021, 10:42

Hallo Klaus,

das ist natürlich richtig, ich hatte jetzt nur von Formularen geschrieben, die zur Eingabe verwendet werden.

In einem reinen Anzeigeformular sieht die Sache natürlich ganz anders aus, da kann man beliebig komplexe Abfragen verwenden, auch solche, die generell nicht editiert werden können wie GROUP-BY- oder Pass-Through-Abfragen.

Hier ist es natürlich auch nicht sinnvoll, eine Kombobox zu verwenden, die hier nur die Performance behindern würde und keinen Mehrwert bietet.

Wenn es wiederum um ein Eingabeformular geht, bei dem man weitere Felder der Referenztabelle verwenden will, kann man statt eines JOINs einfach eine Unterabfrage in der Feldliste verwenden, damit ist dann nur genau dieses Feld automatisch Read-Only (wobei man bei Access meistens ein DLookup statt eines Sub-SELECTs verwenden muß, weil ansonsten die ganze Abfrage nicht mehr editierbar ist, Spezialität von Acces...).

Ebenso kann man natürlich ein "=MeineKombobox.Column(2)" verwenden, was lediglich in der Anzeige etwas hinterherhinkt, daher besser in der Abfrage selbst.

Gruß

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

Re: Referenz eines Ufos zeigen

Beitragvon Gast » 21. Sep 2021, 10:54

Hallo,
statt eines JOINs einfach eine Unterabfrage in der Feldliste verwenden, damit ist dann nur genau dieses Feld automatisch Read-Only

Das würde ich gerne mal machen und kennenlernen. Nur wie muss ich das angehen?
Gruß Carla
Gast
 

Re: Referenz eines Ufos zeigen

Beitragvon Bitsqueezer » 21. Sep 2021, 11:59

Hallo Carla,

das ist kein Hexenwerk, Du schreibst einfach eine Unterabfrage in die Feldliste.

Code: Alles auswählen
SELECT Alle, Deine, Felder, (SELECT Lesefeld FROM AndereTabelle WHERE ...) AS DeinLeseFeld
FROM...

Das WHERE muß so formuliert sein, daß im Ergebnis nur genau EIN Wert von der Unterabfrage zurückgegeben wird. Sichern kann man das mit TOP 1, aber das ist "Schummel"...:)
Das WHERE muß sichern, daß der Wert stimmt. Um beim Beispiel von oben zu bleiben, wäre das "SELECT Einheit FROM tblEinheiten AS E WHERE E.ID_Einheit = X.ID_Einheit", wobei "X" der Alias der Bestellpositionentabelle wäre.

Somit ist gesichert, daß der Text aus "Einheit" als Lesefeld in der Gesamtabfrage erscheint, und es nur genau eine Einheit gibt, bei der die ID aus der Lookup-Tabelle der der ID aus den Bestellpositionen entspricht.

Bis auf die Krux speziell in Access, wo Access aus unverständlichen Gründen bei so einer Unterabfrage gleich die ganze Abfrage auf Read-Only setzt.
Das ist nicht so bei Verwendung von DB-Servern. In Access muß man hier stattdessen DLookup verwenden - das gibt automatisch nur genau einen Wert zurück. Für Access ist das einfach "eine Funktion" und damit bleibt die Abfrage editierbar. Strange, aber das ist Access.

DLookup brauche ich ja wohl nicht zu erläutern, im Notfall hilft die F1-Taste.

Gruß

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

Re: Referenz eines Ufos zeigen

Beitragvon Gast » 23. Sep 2021, 12:02

Hallo,
ich habe es jetzt alles umgesetzt, um es kennenzulernen, auch die Anzeige der Einheit mit DLookup bzw. DomWert.
wo Access aus unverständlichen Gründen bei so einer Unterabfrage gleich die ganze Abfrage auf Read-Only setzt

Das ist wohl auch der Grund, warum man eine Combo mit den Einheiten, die ich noch vom Editierformular im jetztigen Anzeigeformular habe, zwar aufklappen kann, aber keinen anderen Eintrag zuordnen kann. Der Steuerelementinhalt der Combo ist ja der FK, der in der Abfrage steht.
Obwohl der Einbau der Unterabfrage etwas gewöhnungsbedürftig ist, ist der Vorteil, dass die Anzeige der Einheit schneller ist als die mit DLookUp.
die Krux bei Access ist, das es viel zu viel erlaubt, daher eher wahrscheinlich ist, daß ein Editieren möglich ist als umgekehrt

Was ist die Konsequenz? Muss man immer zwei Sorten von Formularen haben? Eins zum Editieren, ein anderes zum Anzeigen. Wäre dafür nicht das einfachste, "Bearbeitungen zulassen" auf NEIN zu setzen?
Gruß Carla
Gast
 

Re: Referenz eines Ufos zeigen

Beitragvon Bitsqueezer » 23. Sep 2021, 13:05

Hallo Carla,

die Konsequenz ist erst mal, die Formular richtig zu planen. Im Allgemeinen genügt es, ein Formular für die Anzeige und für die Bearbeitung verwenden, aber es ist auch immer vom Fall abhängig.

Beim berühmten Standardfall Bestellkopf/-positionen wäre es sinnlos, sowohl HFO wie auch UFO als reines Anzeigeformular zu konzipieren und zusätzlich nochmal als Editierformular. Im Bedarfsfall kann man auch einfach die "Allow..."-Eigenschaften passend setzen, um etwa alles auf Read-Only zu setzen und Löschen/Anfügen zu sperren. Das betrifft allerdings wirklich alles, auch irgendwelche Filterfelder etc.

Das ist wohl auch der Grund, warum man eine Combo mit den Einheiten, die ich noch vom Editierformular im jetztigen Anzeigeformular habe, zwar aufklappen kann, aber keinen anderen Eintrag zuordnen kann. Der Steuerelementinhalt der Combo ist ja der FK, der in der Abfrage steht.


Das hängt jetzt von den Details ab. Wenn Du ein reines Anzeigeformular gebaut hast, würde ich mal erwarten, daß eine Änderung eines Wertes (egal welches Feld) nicht möglich ist. Das fängt schon beim Recordset an, das man zu dem Zweck auf "Snapshot" setzen würde, dann braucht man auch keine "Allow..."-Eigenschaften zu setzen und die Abfrage ist etwas performanter.

In einem Anzeigeformular, wie Klaus ja auch schon sagte, würde man erst gar keine Kombobox einbauen, die dann ja noch eine zusätzliche Abfrage für den Komboboxinhalt ausführen muß, sondern eine bzw. mehrere Textboxen mit den gewünschten Feldern aus der Kombobox. In einem Anzeigeformular braucht man keinen Sub-SELECT/DLookup, da ja nur angezeigt werden soll, kann die Abfrage hier ganz normal die gewünschten Felder per JOIN mit einbauen. Mit Recordset=Snapshot sind ohnehin alle Felder Read-Only.

Was ist die Konsequenz? Muss man immer zwei Sorten von Formularen haben? Eins zum Editieren, ein anderes zum Anzeigen. Wäre dafür nicht das einfachste, "Bearbeitungen zulassen" auf NEIN zu setzen?


Das wäre dann oben schon beantwortet.

Die Konsequenz ist, wenn man ein Formular erstellt, das mal zum Editieren und mal zum Anzeigen verwendet werden soll, die Felder so in die Abfrage einzubauen, daß Felder, die aus der Lookup-Tabelle kommen und in den Bewegungsdaten nicht editiert werden sollen, auf Read-Only zu setzen. Entweder, indem man sie (nur in Access notwendig) per DLookup bzw. Sub-SELECT (in einer Abfrage von SQL Server etwa möglich) einzeln hinzuholt, womit der Rest editierbar bleibt, oder, für den Programmierer natürlich einfacher, indem man die betreffende Textbox sperrt. Das ist aber immer der schlechtere Weg - Lock kann man mal vergessen, ungünstig eingestellte Conditional Formattings können den Lock wieder aufheben und die Abfrage selbst wäre immer noch editierbar. Sicherer ist immer, schon in der Abfrage dafür zu sorgen, daß nur die Felder editierbar sind, die es auch sein sollen. Access kümmert sich dann automatisch im Formular um den Rest, egal, was man da einstellt. Aus einem Read-Only-Feld einer Abfrage kann man nicht per Programmierung/Formulargestaltung ein beschreibbares Feld machen. Und eine direkt geöffnete Abfrage verhindert ebenfalls zuverlässig das Beschreiben des Feldes.

Nachteil von DLookup/Sub-SELECT ist natürlich die schlechtere Performance und aufwendigere Schreibweise, weil man immer nur ein Feld holen kann. Wenn man 10 braucht, braucht es auch 10 DLookups, was eben auch 10 Abfragen im Hintergrund bedeutet. Zum Glück hilft der Optimizer bei einem Sub-SELECT weiter, bei DLookup wohl eher nicht (weil es als Funktionsaufruf gilt und daher ignoriert wird). DLookup (generell Domänenfunktionen) sind in Access SQL allerdings nicht das gleiche wie die gleichnamigen Funktionen in VBA, entsprechend wird der Optimizer hier sicherlich mehr eingreifen können als bei "herkömmlichen" VBA-Funktionen.

Ein reines Anzeigeformular würde man z.B. erstellen, wenn man eine Liste aller Bestellpositionen ausgeben will, die dann u.U. auch den Datensatz des zugehörigen Bestellkopfes redundant mit ausgibt. Hier wäre ein Editieren eher nicht so gut, da man alle Regeln eines Bestellformulares hier erneut programmieren müßte.

Daher: Es gibt keine generelle Regel für "richtig"/"falsch" hier, es hängt immer von den Vorstellungen des Datenbankbesitzers und -designers/-programmierers ab, was man am Ende erreichen will, welche Komfortvorstellungen man hat usw.

Gruß

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

Re: Referenz eines Ufos zeigen

Beitragvon Gast » 24. Sep 2021, 01:06

Hallo Christian,
vielen Dank für deine exquisite Antwort.
Hat Spaß gemacht, sie zu lesen und habe viel gelernt.
VG Carla
Gast
 


Zurück zu Access Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: uwms und 9 Gäste