1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

Frage zu: Access Unterformulare mit Listenfeld steuern

Discussion in 'Office-Programme' started by sassi83, Apr 8, 2009.

Thread Status:
Not open for further replies.
  1. sassi83

    sassi83 ROM

    Hallo Zusammen,

    erstmal einen Gruß an alle, bin seit heute neu hier.
    Ich hoffe Ihr könnt mir zu einer Frage helfen. Ich habe schon in vielen Beiträgen gesucht aber leider noch keine Lösung gefunden. Ich bin eher ein Access-Anfänger und habe von VBA keine Ahnung, hoffe dass mein Problem auch ohne VBA zu lösen ist.

    Folgendes: Ich habe ein Formular in Access erstellt, das Reklamationen zu bestimmten Artikelnummern anzeigen soll. Es gibt ein Textfeld in der die Artikelnummer angezeigt wird. Damit verknüpft sind zwei Unterformulare, in dem einen werden die Reklamationen zu der Artikelnummer angezeigt, in dem anderen Unterformular die getroffenen Maßnahmen. Soweit so gut, das funktioniert auch.

    Nun hätte ich gerne einen "Statusmonitor" der ebenfalls in diesem Formular anzeigt, welche Artikelnummern in diesem Monat auffallen, also die oft reklamiert werden. Ich habe ein drittes Unterformular gebastelt, dass dies anzeigt. Ich würde nun gerne mit einem Listenfeld, dass die jeweiligen Monate (aus einer Tabelle) enthält, das Unterformular steuern, dass man also z.B. April 09 auswählen kann und das Unterformular die Daten von April anzeigt. Ich kriege das aber nicht hin, dass das klappt.
    Ist es überhaupt möglich, so ein Listenfeld mit Monaten einzufügen, wenn das Formular eigentlich durch die Artikelnummer gesteuert wird? Oder muss das dann irgendwie miteinander verknüpft werden?

    Ich hoffe, ich hab verständlich ausgedrückt, was mein Problem ist, wäre sehr nett wenn Ihr mir helfen könntet! Danke!
     
  2. Hascheff

    Hascheff Moderator

    Hallo sassi,
    für einen Anfänger hast du schon ganz gut geschafft.

    Bevor ich zu deinem Problem komme, noch ein anderer Rat:
    Dein Formular ist, so wie du es beschrieben hast, eigentlich ausgelastet, wenn nicht, lass die Reserve für spätere Aufgaben.
    Um die Überlastung zu vermeiden, fallen mir jetzt drei Wege ein:
    - Mit Hilfe von Buttons lassen sich nicht benötigte Elemente unsichtbar schalten. (VBA oder Makro erforderlich, gut geeignet für erste Schritte)
    Besser:
    Verwende das Tool "Registersteuerelement" im Formular.
    Am Besten:
    Benutze einen Button im Formular, um ein anderes Formular zu öffnen. Lege zuerst das zweite Formular an und benutze dann den Steuerelement-Assistenten, um den Button anzulegen.
    Diese Methode hat außerdem den Vorteil, dass du damit auch Berichte anzeigen lassen kannst.

    Nun zum Problem. Eigentlich willst du doch einen Bericht sehen. Ein Unterformular/-bericht ist nicht nötig.
    Du hast ja eine Tabelle (TReklamationen), die neben der Artikelnummer (ANr) das Reklamationsdatum (RekDatum) enthält. (in Klammern die im folgenden benutzten Bezeichner) Benutzt du diese Datumsangaben, werden im folgend beschriebenen Verfahren die Monate mit null Reklamationen nicht angezeigt. Ich gehe mal davon aus, dass das kein Problem ist. (Wenn ja, es ist lösbar.)

    Zunächst erstellst du eine Abfrage (AReklamationen) auf der Basis dieser Tabelle. Neben den benötigten Feldern der Tabelle enthält sie die Funktion "Monat". Im einfachsten Fall ist das
    Monat: Monat(RekDatum)
    Vor dem Doppelpunkt steht der Alias. Geht die Tabelle über mehrere Jahre, genügt das nicht.

    Dann musst du mit der Funktion
    Monat: DatSeriell(Jahr([TReklamationen]![RekDatum]);Monat([TReklamationen]![RekDatum]);1)
    zu jedem Datum das Datum des zugehörigen Monatsersten berechnen. Durch Formatierung kannst du erreichen, dass die 1 nicht angezeigt wird, z.B. "MMMM JJ".

    :sorry:, ich muss erst mal unterbrechen. Spätestens morgen melde ich mich noch mal.
     
  3. sassi83

    sassi83 ROM

    Hallo Hascheff,
    vielen Dank schonmal soweit. Dann wäre es wohl wirklich besser, per Knopfdruck einen Bericht zu öffnen.
    Den Bericht habe ich schonmal erstellt, es zeigt nun für jeden Monat die Anzahl der Reklamationen einer Artikelnummer an. In der Basistabelle (die alle Reklamationen seit 2006 enthält) sind eh nur Artikelnummern enthalten, für die es Reklamationen gab, deswegen muss man nicht erst die rausfiltern, die nicht reklamiert wurden.
    In der Tabelle sind bereits die Monate im Format YYYYMM hinterlegt, das muss man auch nicht erst umwandeln (spuckt unser Firmensystem direkt so aus).
    Meine Frage wäre nun, wie man den Bericht so filtern kann, dass nur die Daten eines ausgewählten Monats angezeigt werden?
    Danke und Gruß, Sassi :)
     
  4. Hascheff

    Hascheff Moderator

    Hallo sassi,
    ich will einen zweiten Weg mindestens skizzieren. Beide Wege haben nämlich ihre Vorteile.
    Man kann auch ein Formular anlegen und in den Formularkopf ein Listenfeld stellen, mit dessen Hilfe man die im Formular angezeigten Datensätze filtert. Mit Hilfe des Steuerelement-Assistenten ist das kein Problem.

    Nun zum Bericht. Du musst den Bericht wie schon erwähnt mit einem Button öffnen. Gut, das wäre dann VBA-Code hinter dem Button, aber das macht ja der Assistent. Leider ohne Filter, aber man lernt auf die Art den Access-VBA-Code kennen.Es gibt aber noch einen besseren Weg, den VBA-Code kennenzulernen. Man stellt hinter den Button ein Makro. Im Gegensatz zu Word und Excel hat das Access-Makro äußerlich nichts mit VBA zu tun.

    Am besten ist es, das Makro vor dem Button zu erstellen. Zuerst musst du jedoch im Formular ein Element anlegen, in dem du den auszuwählenden Monat eingibst. Das kann ein Textfeld, aber auch ein Listenfeld sein. Platziere das Element neben den späteren Ort des Buttons. Ob in Kopf, Details oder Fuß ist gleich. Beim Textfeld musst du allerdings auf das Datumsformat achten.
    Dann also "Makro - Neu". Fortgeschrittene wählen jetzt "Ansicht - Makronamen", so lassen sich alle Makros eines Zusammenhangs in einem Fenster erstellen.
    Du brauchst nur einen Befehl: ÖffnenBericht. Unten bei den Argumenten wählst du den Namen des Berichts, entscheidest Vorschau oder Ausdruck, lässt Filter frei und wählst darunter eine Bedingung. Das Fenster "Ausdrucks-Generator" für das Erstellen der Bedingung kennst du schon von Abfragen. Die Bedingung entspricht dem, was im SQL-Text einer Abfrage hinter WHERE kommt. Der Assistent schreibt allerdings zu viel. Statt etwa "[Berichte]![BReklamationen]![Monat]" schreibst du einfach nur "[Monat]". Vor langer Zeit habe ich in der Hilfe mal gelesen, dass es wichtig ist, den Namen eines Berichtselements und nicht eines Feldes der zugrundeliegenden Abfrage zu wählen ... oder umgekehrt. Lass einfach beide Namen gleich.
    Dann kommt in der Bedingung ein = und dann der Name des Auswahlfeldes. Insgesamt sieht die Bedingung dann etwa so aus:
    Monat = [Formulare]![FReklamationen]![Auswahl]

    Nun kannst du den Button erstellen. Das geht auch ohne Assistent, wichtig ist nur, dass das Makro dem Ereignis "Beim Klicken" zugeordnet wird. Dann kannst du testen.

    Wenn es funktioniert, kommt noch ein letzter Schritt. Öffne das Formular im Entwurfsmodus. Geh dann auf "Extras - Makro - Makros des Formulars zu Visual Basic konvertieren". Du kannst dann nachschauen, wie Bedingungen in VBA behandelt werden. Außerdem kannst du "[Formulare]![FReklamationen]" durch "Me" ersetzen. Der Code funktioniert dann auch, wenn er von anderen Formularen aufgerufen wird, sofern die ein Feld "Auswahl" besitzen.

    Mir fällt gerade ein, es gibt noch einen dritten Weg: Abfrage mit Parameter. Aber das hat eigentlich keinen Vorteil.
     
  5. sassi83

    sassi83 ROM

    Hallo Hascheff,
    vielen Dank, Du hast mir sehr geholfen! Habe ein Makro erstellt und dann die Bedingung gesetzt - schon klappts :-)
    Danke für Deinen Rat,
    Sassi
     
  6. Hascheff

    Hascheff Moderator

    Hallo sassi,
    freut mich. Vergiss nicht den letzten Schritt. Es muss ja nicht gleich sein, aber du lernst auf die Art am einfachsten VBA kennen und irgendwann brauchst du es.
    Gruß
    Hascheff
     
Thread Status:
Not open for further replies.

Share This Page