Spalten in Abfrage beim Ausführen wählen

Hallo Experten,

ich bin mir nicht sicher, ob ich Access (2003) so richtig anwende, aber für mein Verständnis müßte es so gehen.

Ich habe folgende Tabelle:
ID, Name, Vorname, Straße, …, Betrag2007, Betrag2008, …, Betrag2011

Es ist eine Tabelle unserer Gönner im Verein, wo eingetragen werden soll, wieviel sie jeweils pro Jahre bezahlt haben. Soweit ist alles klar und funktioniert auch.
Jetzt kommte die Auswertung.
Ich möchte eine Liste haben, in der die Beträge der jeweils letzten drei Jahre angezeigt werden. Dabei möchte ich die Abfrage oder den Bericht aber nicht jedesmal ändern, sondern beim Ausführen der Abfrage oder des Berichtes gefragt werden, welches das letzte Jahr sein soll.
Es soll so funktionieren, wie die Parameterabfrage bei einer Abfrage. Dabei wird aber nur über den Inhalte der Spalte sondiert, nicht über den Spaltennamen.
Wenn ich nun das Jahr 2010 eingegeben habe, soll eine Tabelle entstehen mit Name, Adresse, etc. und den Zahlungen von 2008, 2009 und 2010.
Ist soetwas möglich?
Wenn ja, kann es mir jemand erklären? Ich habe aber leider (noch) keine Ahnung von der Programmiererei in Access und Co.

Danke schon jetzt für Euere Hilfe, wenn es nicht gehen sollte, sagt es mir bitte auch, dann brauch ich mir keine weiteren Gedanken zu machen.

Gruß
Hermann

Hallo,

nun, Gedanken solltest Du Dir schon machen, und zwar über den grundlegenden Tabellenaufbau.

So, wie es jetzt ist, wird das auf Dauer nichts werden. Die Aufzählungen der „Jahresbeträge“ in einem Datensatz verstößt gegen die Regeln der Normalisierung, was eben zu Deinen Schwierigkeiten führt.

Weiterhin sollte beachtet werden ,dass reservierte Wörter („Name“), nicht aussagekräftige Namen („ID“) und Sonder-/Leerzeichen in Namen dringend zu vermeiden sind.

Für Dein Vorhaben brauchst Du zwei Tabellen:

tblMitglieder

MGNr (Primärschlüssel, möglichst Zahl,Long ,bzw. Autowert)
Vorname (Text)
Nachname (Text)
Strasse (Text)
PLZ (Text)
Ort (Text)
.
.
.

tblMitgeliederbeitraege

MGBID (PK, Autowert)
MGB_MGNr (Zahl, Long, bzw. entspr. zu MGNr aus tblMitglieder)
MGB_Betrag (Währung)
MGB_Beitragsjahr (Zahl, Long)
MGB_Zahldatum (Datum/Uhrzeit)
.
.

und 1:n - Beziehung zwischen MGB_MGNr und MGNr

Zur Datenpflege wird ein Einzel- (Haupt-) Formular mit Datenherkunft zu tblMitglieder benutzt, das ein UFO-Steuerelement besitzt, das wiederum ein Endlosform mit Datenherkunft zu tblMitgliederBeitraege enthält, bzw. anzeigt.

Die Eigenschaften „Verknüpfen von /nach“ des UFO-St.-El. werden auf die entspr. Schlüsselfelder (Beziehungsfelder) eingestellt.

Damit kannst Du alle Daten eingeben/pflegen und ausdrucken, ohne jedes Jahr die Tabelle(n) und die Formulare oder den (einzigen) Bericht zu ändern.

Viele Grüße vom Bodensee
Franz, DF6GL

Hallo Hermann,
Franz hat es da ziemlich exakt getroffen.
Die Tabellenstruktur ist einfach aufzugliedern, sonst wird es nichts.
Das Problem ist, dass man über die normalen Abfrageentwürfe (also das SQL) die Felder nicht per Index ansprechen kann. Also mann kann nicht sagen Feld(1), Feld(2), … der Tabelle ausgeben.
Ginge das im SQL-Statement, dann wäre natürlich eine Lösung einfach, weil Du dann einfach im Abfrageentwurf einen Parameter angibst, der wird einmalig abgefragt und dann brauchst Du nur noch über eine Form von Vergleich an das richtige Feld heranzugehen.

Aber, das geht so über die normale Obefläche nicht.

Das wäre nur möglich, wenn Du die gesamte Abfrage auf Visual-Basic umstellst und quasi das SQL-Statement über Berechnungslogiken ermittelst und den Text per VB-Funktionen zusammenbaust und dann abschickst und das Ergebnis dann wieder ausgibst.
Damit dabei aber keine Fehler entstehen, müssten noch weitere Eingabeprüfungen folgen, die sicherstellen, dass das Jahr korrekt eingegeben wurde und im zulässigen Zeitraum der jeweiligen Tabellen-Feldnamen liegt. D.h., die Funktion müsste zunächst die Tabellenstruktur auslesen, ermitteln, was das jüngste und das älteste Jahr ist und alle Werte die größer sind als das jüngste Jahr - 3 abweisen als zu hohen Wert usw. Sonst würde nämlich später nach einem Feld in der Struktur gesucht, dass es nicht gibt.

Du siehst, dass es beliebig kompliziert wird.
Mit der vorgeschlagenen Umstellung der Tabellenstruktur auf 2 Tabellen, quasi mit Stammdaten und einer mit Bewegungsdaten, würde alles mit recht einfachen Abfragen funktionieren und ohne Programmierung.

Du erfasst einen Eingabeparameter (z.B.SUCHJAHR) in der Abfrage und wertest nur den Vergleichswert gegen das Rechnungsdatum des Mitglieds aus:

YEAR(RECHNUNGSDATUM) between SUCHJAHR and SUCHJAHR+2

Damit würden alle drei Jahre aufaddiert oder angezeigt. Voraussetzung ist eine 4stellige Eingabe des SUCHJAHR-Parameters.

Das ist deutlich einfacher, als eine VB-Programmierung, nur um die Tabellenstruktur zu erhalten.

Gruß
Ulrich

Danke für Euere Antworten,

es ist so, wie ich schon befürchtet habe, entweder neue Tabelle(n) oder programmieren.

Die Sache mit der einen Tabelle hat sich ergeben, da ich sie in einer Excel-Liste von meinem Vorgänger bekommen habe und ich dachte, es wäre übersichtlicher, alles in eine Tabelle zu stecken. So habe ich in einer Tabelle für jede Person eine Zeile.

Aber es stimmt, eine Tabelle ist blöd, ich muß ja spätestens im nächsten Jahr die Tabelle ändern, wenn die Beträge für 2012 kommen.

Also werde ich mich mal an die zweite Tabelle machen.

Das mit dem VB habe ich noch nicht raus, kommt also nicht in Frage.

Danke trotzdem, vielleicht melde ich mich nochmal.

Gruß
Hermann