Guten Abend, bin Neuling bei Access da ich normalerweise EXCEL benutze. Will jetzt einen Programm für einen Zeltlager erstellen (habe bis Mai Zeit ;)) und ich bin schon am Anfang gescheitert...
Ich habe drei Typen von Personen (TblPersonen) - Trainer, Kinder und Aufsichtsperson und jeder bezahlt einen anderen Beitrag. Mein Ziel - Ich möchte in der TblTeilnehmer im Feld "Persontyp" einen "T" eingeben und dann soll automatisch im Feld "Kosten" 85€ eingetragen werden. Die Kosten sollen aus der Tabelle TblPerson ermittelt werden falls die Kosten sich ändern muss ich sie nur einmal ändern.
Ich arbeite seit 4 Tage dran. Wenn ich wusste wie sowas heißt könnte ich selber mal nachsehen. Muss ich einen Makro erstellen? Mit Excel benötigte ich so ca. 20 Sekunden...
Es genügt vollkommen in einer Tabelle der Personentypen den Teilnahme-Beitrag einmalig anzugeben. In der Teilnehmertabelle wird dann ein Fremdschlüssel von dieser Tabelle entsprechend des Typs verwendet und Abfragen haben Zugriff auf den Betrag und können damit rechnen.
Du solltest prüfen, ob die Datenbank auch für andere Zeltlager (oder Veranstaltungen) genutzt werden soll - dann wird das Tabellengefügfe etwas umfangreicher, weil bei jeder Veranstaltung andere Beträge anfallen können - das Prinzip bleibt aber das gleiche.
Ich habe alles aufgebaut wie Sie es mir beschrieben haben. Mein Datenbank soll so bearbeitet werden, dass meine Nachfolgen sie benützen können. Sie sollen dann auch die TblPerson erweitern dürfen. Sonst lohnt sich die Arbeit nicht. :D.
Mit einem "Auswahlfenster" kann der Benutzter ein von den drei Personen anklicken. Ich möchte aber dann, das sofort die dazugehörige Betrag bei den Feld "Kosten" eingefügt wird. Ich habe versucht eine Abfrage aufzubauen, komme aber nicht weiter.
Das ist meine Frage, wie muss ich die Abfrage aufbauen? Ich arbeite mit Access 2016.
Hallo,
ZitatSie sollen dann auch die TblPerson erweitern dürfen.
Was verstehst Du hier unter erweitern, neue Daten oder neue Felder ?
Der Benutzer dürfte die Datensätze der vorhandenen Felder in TblPerson ändern oder ergänzen. Sonst nichts...
Hallo,
ZitatIch möchte in der TblTeilnehmer im Feld "Persontyp" einen "T" eingeben und dann soll automatisch im Feld "Kosten" 85€ eingetragen werden.
Das ist schon mal der falsche Weg. Der Typ einer Person wird (bzw. muss) in der Personentabelle gespeichert werden. Also liegt bereits mit der Auswahl der Person automatisch auch der Typ fest.
Was machst Du eigentlich, wenn aus einer Aufsichtsperson ein Trainer wird ?
Oder umgekehrt. Auch aus Kindern könnten Trainer werden.
Wie willst Du das bei den gegenwärtigen Tabellen abbilden ?
Und vor allen Dingen, wenn das rein über ein Feld in der Personentabelle geregelt wird, stimmen ja bei Änderungen des Personentyps die alten Datensätze nicht mehr.
Sinngemäß gilt das auch für die Kosten, mit dem Vorschlag von Lachtaube das über die Beziehungen zu regeln, geht nicht, da dann auch die alten Datensätze mit den neuen Kosten verbunden würden.
Es ist daher die Kosten redundant zu speichern oder eine Liste zu führen mit Gültigkeitsdatum und Feldern für PTyp und Kosten.
Letzteres ist komplizierter als die redundante Speicherung.
Hier gibt es noch viel Spielraum für notwendige Veränderungen.
Vor allen Dingen im Hinblick auf diesen Satz:
ZitatMein Datenbank soll so bearbeitet werden, dass meine Nachfolgen sie benützen können.
@Klaus,
zu dem Zeitpunkt, als ich meine Antwort gab, war die Nutzung der Datenbank nicht geklärt.
@Venta3
Alle Tabellen enthalten jeweils einen Autowert als Primärschlüsselfeld (hier nicht weiter aufgeführt), Fremdschüssel werden im Folgenden FS genannt und haben eine Beziehung zum Primärschlüssel der vorangestellten Tabelle.
Hier ein mögliches Grundgerüst.
- Veranstaltung - Titel, Ort, Zeitpunkte von - bis, etc.
- Personentyp - Bezeichnung, ggf. Abkürzung
- VeranstaltungBetrag - Veranstaltung FS + Personentyp FS + Betrag
- Person - Personendaten (Nachname, Vorname, etc.)
- Anmeldung - VeranstungBetrag FS + Person FS + ggf. Zahldatum u.ä.
Hallo,
@Lachtaube,
ich wollte es nur gesagt haben. ;D
Ist ja auch kein Problem Klaus. :)
Hallo Klaus,
danke für ihren Input jedoch...
TblPerson => [ID]; [Beschreibung]; [Kosten]
TblTeilnehmer => [Name]... [Person]....[Kosten für Teilnehmer]
Die Teilnehmer können ihr "Person" während der Zeit nicht ändern. Nächstes Jahr werden die Datensätze der TblTeilnehmer gelöscht, die TblPerson angepasst, und dann geht der Spaß wieder von Vorne los. Ich dachte mir so etwas würde vielleicht funktionieren, weiß jedoch nicht wo ich sie einsetzen soll. Leider bekomme ich nur "Syntaxfehler".
Kosten für Teilnehmer: Where [Person]=[TblPerson]![ID]; [TblPerson]![Kosten]; 0
Englisch ist meiner Muttersprache - ich weiß nicht welche Befehl ich auch Deutsch für "Where" benötige...
Es gibt genügend Tabellen wo ich ein Wert eingebe und eine zweite wird automatisch eingetragen. Wie entsteht die Verbindung??
Hallo Venta3,
wie Klaus in seiner Antwort #5 bereits geschrieben hat, ist eine redundante Speicherung des Betrags nötig, d. h. der Betrag, der bei jedem Teilnehmer-Typ hinterlegt ist, wird in die Teilnehmer-Tabelle kopiert.
Ein einfacher Weg hierfür ist ein mehrspaltiges Kombifeld.
1. Erstelle eine Abfrage, die Personen-Id, -Name, -Typ und Betrag darstellt.
2. Diese Abfrage ist Datenquelle eines Kombifelds.
3. Die erste Spalte (Personen-Id) kannst du unsichtbar machen, indem du Spaltenbreite 0 dafür definierst, also "0; 3cm; 1cm; 2cm" im Feld Spaltenbreite eingibst und Anzahl Spalten auf 4 setzt.
4. Gebundene Spalte bleibt 1.
5. Mit VBA kannst du auf die Werte der Spalten zugreifen, z.B.
txtBetrag.value=cboPerson.Column(3)
(beachte: Zählung beginnt bei 0)
(im Event cboPerson_AfterUpdate).
6. Dein Feld txtBetrag ist an ein entspr. Feld in der Tabelle gebunden.
Eine andere und bessere Variante ist es, den Betrag in die Datensatz-Quelle des Formulars aufzunehmen.
Natürlich ändern die Teilnehmer ihre Person nicht; gemeint ist hier, das Id, Name etc. aus der Personen-Tabelle geholt werden.
Zu kompliziert? Wenn du willst, baue ich ein kleines Beispiel. Lade dazu deine DB hier hoch (komprimiert und gezippt).
Noch zu deiner letzten Antwort: Der SQL-Standard benutzt für Bestandteile der Sprache ausschließlich Englisch. "Where" z.B. wird deshalb nicht übersetzt.
lg
crystal
Inzwischen ist mir klar wo mein Fehler liegt...
Ich gebe die Teilnehmer Info über einen Formular ein. Wenn ich dann sage er ist "T" für "Trainer" (pulldown Fenster) soll dann dann in das Feld "Kosten" dann Betrag X erscheinen...
Feld [PersonID]
Ereignis - AfterUpdate -
DomWert("[Kosten]";"TblPersonenkreis";"[PersonID]=" &"[PersonID]")
Wenn ich den Syntax richtig verstehe soll in das Feld [Kosten] den Betrag aus der Tabelle [TblPersonenkreis]! genommen werden, wo die PersonID von beiden identisch sind, richtig?
Access mag meinen Syntax nicht. :'(
Leider kommt immer einen Fehler ==> " = wird erwartet"????
Hi, probiere es mal so
DomWert("[Kosten]";"TblPersonenkreis";"[PersonID]=" & [PersonID])
Könnte sein, dass Du noch den Formularbezug dazu schreiben musst indem das Steuerelement PersonID ist.
DomWert("[Kosten]";"TblPersonenkreis";"[PersonID]=" & [FormularName].[PersonID])
Grüße
Hier ein einfaches Beispiel mit dem vorher von mir erwähntem Datenmodell, was man bei Gefallen erweitern kann.
Hallo,
ich denke, das "=" fehlt schlicht vor dem Ausdruck.
=DomWert("[Kosten]";"TblPersonenkreis";"[PersonID]=" &"[PersonID]")
und müsste im Feld "Kosten" als Standardwert stehen, also nicht im AfterUpdate von "Person", dort allenfalls als
me.Kosten = DomWert("[Kosten]";"TblPersonenkreis";"[PersonID]=" &"[PersonID]")
lg
crastal
Ich bin so am Verzweifeln! ABER endlich habe ich keinen Syntaxfehler... Wieso auch immer...
Jetzt habe ich nur das Problem, dass nur die Kosten für den Trainer angenommen werden. Ich kann die Zahl beliebig ändern, wird immer nur vom Trainer genommen. Habe jetzt ein paar JPGs beigefügt...
Versuche es im Nach Aktualisierung Ereignis von PersonID mit Me.Kosten = DLookup("Kosten", "tblPersonenkreis", BuildCriteria("PersonID", dbText, Me.PersonID))