Juli 14, 2020, 02:36:48

Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!


Suche Button und Serienbrief über Access öffnen / ablegen

Begonnen von Muhkuh86, April 07, 2010, 08:33:43

⏪ vorheriges - nächstes ⏩

Muhkuh86

Hallo,


ich bin gerade dabei mir eine kleine Datenbank für eine Bibliothek (Schulprojekt) anzulegen und habe noch zwei Fragen zur Durchführung.

Mein bisheriger Stand ist, dass ich 4 Tabellen (TAusleihen, TKunden, TBuecher und TBNummer), 1 Abfrage (ASerienbrief), 6 Formulare (FAusleihe, FKunden, FBuecher, UFName, UFTitel und FStartmenue) und 1 Bericht (BAusleihen) habe.

Die DB ist wie folgt aufgebaut:

Beziehungen:

TKunden steht 1:n mit Tausleihen
Tausleihen steht 1:1 mit TBuecher.

Nun zu meinen Fragen.

1. Mein Startformular, welches als GUI dient,soll u.A. zwei Buttons haben, welche es mir ermöglichen, direkt und ohne die jeweilen Formulare zu öffnen, Kunden oder Buecher zu suchen. Wie realisiere ich das am besten? Ich weiss nicht, wie ich die Verknüpfung zur Suche erstellen kann. Oder geht das über einen komplett anderen weg?

2. Ich möchte einen Bericht automatisch an Kunden verschicken, die Bücher länger als einen Monat ausgeliehen haben, dass Sie es zurückbringen sollen. Dazu habe ich einen Serienbrief in Word erstellt. Wo und wie kann ich diesen am besten in die DB integrieren? Wie mache ich das, dass er mir sagt, dass Kunde X bereits seit einem Monat das Buch y ausgeliehen hat? Ich habe da keinerlei Ansatz, wo und wie ich das einbaue. Der Brief soll dann übrigens nicht via Mail verschickt werden (gibt dafür eh keine Einträge in den Tabellen), sondern automatisch mit dem betreffenden Datensatz der 30 Tage überfällig ist, als Doc in einem bestimmten Ordner abgespeichert werden, damit man ihn direkt ausdrucken kann.


Vielleicht kann mir da ja irgendjemand Lösungshinweise oder Hilfe geben :)

Liebe Grüße
Nora

database

April 07, 2010, 09:44:42 #1 Letzte Bearbeitung: April 07, 2010, 09:47:28 von database
Hallo Nora,

ZitatTausleihen steht 1:1 mit TBuecher


kann nicht stimmen, da ein Buch mehrmals ausgeliehen werden kann. somit sollte die Beziehung  1-Bücher  n-Ausleihen lauten!

zu 1  jedes Formular zählt zum GUI :)
        Ja ist lösbar - du brauchst eine Möglichkeit die entsprechenden Suchkriterien gegen die Datenbank zu schicken und ein Teil, das dir das Ergebnis darstellt.
        Vernüpfung zur 'Suche' ... 'Suche' ist kein Datenbankobjekt sondern ein Vorgang. In deinem Fall KANN das per VBA ausprogrammiert werden.

zu 2  Serienbriefe beruhen auf einer Tabelle oder Abfrage, die entweder in Word selbst oder aus einem Word-kompatiblen Programm (Datenbank) stammen.
        In deinem Fall würde ich empfehlen per Abfrage eine Tabelle mit den Serienbriefdaten zu befüllen, den Serienbrief in Word positionierst du dann auf diese Datenquelle.
        Wenn du mit VBA nich so auf Freundschaft bist - den Serienbrief von Word aus öffnen.
        Ein anderer Weg wäre der, dass du einen Bericht erstellst, der dem Serienbrief gleicht und diesen dann Datensatzweise als PDF in einn Verzeichnis druckst (exportierst).
        Das dort erzeugte PDF-Dokument kannst du dann nach belieben Drucken um es traditionell per Post zu versenden oder bei Bedarf per Mail als Anhang versenden.

ZitatWie mache ich das, dass er mir sagt, dass Kunde X bereits seit einem Monat das Buch y ausgeliehen hat

In dem du das Ausleihdatum mit dem aktuellen Tagesdatum vergleichst (per Abfrage)

HTH

Peter

Muhkuh86

Hallo,

erstmal danke für die rasche Antwort.

Leider kann ich damit nicht allzuviel anfangen ;D

Also erstmal ist noch zu sagen, dass jedes Buch nur einmal verliehen werden kann, wenn es weg ist, kann es in der Zeit nicht nochmal verliehen werden (1:1), davon ausgehend, dass jeder Schlüssel eindeutig zu einem Buch zugewiesen ist, und nicht nur einem Titel (wovon es logischerweise mehrere Bücher gibt).

Kann man das mit der Suche auch ohne VBA lösen? Ich wollte das über einen Suche-Button im Startmenü lösen, wo ich bei der Erstellung mit dem Assistenten angebe: Formular öffnen (z.B. FKunden) und dann "Das Formular öffnen und bestimmte Daten suchen un anzeigen". Dort kommt dann aber leider eine Fehlermeldung, dass die Formulare erst verknüpft werden müssen, bzw. ein verknüpftes Feld vorhanden sein muss. Wie verknüpfe ich das denn? Dachte das Formular bezieht seine Daten direkt aus der Tabelle...


Den Serienbrief habe ich schon erstellt und er bezieht auch seine Daten (Anrede, Name, Anschrift etc.) direkt aus den Tabellen (TKunden und TBuecher). Nur leider weiss ich nun nicht, wie ich den Brief via Access abspeichere, bzw. prüfe, dass diese besagten 30 Tage rum sind und ich dafür eine Meldung o.ä. erhalte.

Mit VBA bin ich eher auf Kriegsfuss. Abfragen gehen noch, nur wiess ich auch nicht wie ich das damit realisieren kann :(

Habt ihr vielleicht noch Tipps für mich?

database

Hallo,

Zitatdass jedes Buch nur einmal verliehen werden kann, wenn es weg ist, kann es in der Zeit nicht nochmal verliehen werden (1:1)

Da hast du natürlich recht. 8)
Nur ersuche ich zu beachten, dass ein Verleihvorgang so ziemlich nichts mit Datenbanktechnik zu tun hat. Lies dazu bitte AUCH hier nach...
http://www.dbwiki.de/wiki.php?title=Access_Anf%E4nger:_Grundlagen_des_Datenbank-Designs

ZitatKann man das mit der Suche auch ohne VBA lösen

Ja, kann man auch - die Fehlermeldung entsteht dadurch dass Access zum Zeitpunk zu dem du das Formular öffnen willst nicht 'weiss' welchen Datensatz du sehen willst.
ZitatDachte das Formular bezieht seine Daten direkt aus der Tabelle

...wenn du das so definiert hast - JA. Um einen bestimmten Datensatz anzeigen zu können - bzw. beim Öffnen des Formulars ein bestimmter Datensatz angezeigt werden soll, muss Access bekanntgegeben werden, welcher dieses sein soll.
Ich gehe davon aus, dass du mit Access 2007 arbeitest - wegen der Fehlermeldung, die dann erzeugt wird, wenn man per Assistenten eine Schaltfläche zum Öffnen eines Fomulars anlegen will.
Makros sind nicht so flexibel wie VBA - daher will in diesem Fall Access ein Feld auf dem Formular 'sehen' um sich von dort die Infos zu holen um welchen Datensatz es sich handelt.

Legst du den Button ohne Assistenten an, hast du die Möglichkeit anschließend ins Ereignis 'Beim Klicken' z.B. folgenden Code zu schreiben:
DoCmd.OpenForm "tbl_Kunde", , , "Name='" & InputBox("Name") & "'"
Damit wird das Formular geöffnet und jener Datensaatz angezeigt, der im Feld 'Name' den Namen stehen hat, den du in die Inputbox eingegeben hast.

ZitatDen Serienbrief habe ich schon erstellt ...

Dazu bitte den Hinweis beachten, die Daten in eine extra Tabelle zu legen oder eine entsprechende Abfrage zu erstellen.
In dem Zusammenhang weise ich dich nochmals eingehend darauf hin, dass die 1:1 Beziehung nicht stimmt! Glaube mir, ich weiß schon wovon ich rede ;D
Etwa so bekommst du die Dauerausleiher ... :)
SELECT * FROM Tabelle WHERE  Date()-[Ausleihdatum] > 30

Mit VBA bist du eher auf Kriegsfuß OK, dann öffne den Serienbrief von Word aus und verwende 'SpeichernUnter ... PDF / XPS' oder du installierst dir einen Free PDF Converter (google) und Druckst dann über den Installierten PDF-'Drucker' in ein Verzeichnis.

Muhkuh86

Hallo database,

nochmals danke für deine ausführliche Hilfe.

Also unser Lehrer ist ja quasi der Projektleiter und hat uns diese Beziehungen auferlegt.

So ist der Aufbau:

[TKunden] 1----n [TAusleihen] 1-------1[TBuecher]


Den Code DoCmd habe ich ausprobiert, da kommt die Meldung, dass Access das Makro DoCmd nicht finden kann (ich habe Access 2003).
Also ich habe im FStartmenü einen Button ohne Assistenten erstellt und bei Ereignis "Beim Klicken" den Code angepasst und eingetragen.
Klappt aber nicht :(

Wir sollen basierend auf dem Formular FKunden eine Suche starten. Kann ich da einstellen, dass er mehr sucht als nur den Namen wie in dem Code? Ich müsste sicher ein extra Suchformular erstellen mit Abfragen etc...nur da hört es dann wieder bei mir auf und er meinte ja "basierend auf FKunden" (also ohne extra Formular).

Kann man nicht irgendwie die Suche von Access dafür verwenden? Ich meine die Suche, die ich auch direkt in dem Formular FKunden per Button benutzen kann (Datensatznavigation --> Datensatz suchen).

Entschuldige bitte die unbeholfenen Fragen, aber ich habe davon wirklich nicht allzuviel Ahnung.


Das mit dem Serienbrief hab ich auch nicht verstanden. Wo trage ich dieses SELECT * FROM ein?


Viele Grüße



DF6GL

Hallo,

auch ich muß sagen, dass eine 1:1-Beziehung  Unsinn ist.

Frage mal den Lehrer, ob:

1) Du evtl. was falsch verstanden hast
2) er einen falschen ( vielleicht besser: unpassenden ;-) )Gedankengang entwickelt hat
3) er sich bewußt ist, was er mit einer 1:1-Beziehung anstellen wird (so es eine ist)

4)
Für diese Ausleihgeschichte brauchst Du im Grunde nur 3 TAbellen:

TKunden  (alle Kunden der Bücherei)

TBücher (alle registrierten Büpcher der Bücherei)

TAusleihen (nur Primärschlüsselfeld (Autowert), KUndennummer, Buchnummer,Vorgangsdatum, Vorgangsart)



Beziehungen:

TKunden  1:n   TAusleihen  n:1  TBücher


Für jede Tabelle erstellst du ein Formular ( für Tausleihen ein Endlosform, darin zur Auswahl eines Kunden ein Kombifeld für Kundennummer)

Im Formular "frmBücher" kommt ein UFO, das das Form "frmAusleihen" anzeigt und über das Ausleih_ID-Feld verknüpft ist.


Das ist alles. Mit Hilfe des Forms "frmBücher" kannst Du eine Ausleihe eines Büches dann bearbeiten, ob Ausleihvorgang oder Rückgabe gerade erledigt werden soll.

(Die Ausleihvorgänge können auch über das Endlosform "frmAusleihen" direkt erfasst werden, wenn ein zusätzliches Kombi für die Auswahl eines Buche (Buch_ID) vorgesehen wird.

Das kannst Du aber selber mal probieren.

Bestimmte Einschränkungen bei der Auswahl eines Buches (z. B. nur die Bücher anzeigen, die akt. nicht verliehen sind) erfolgt über geeignet erstellet Abfragen für das Kombi.   Diese zeitliche Einschränkung (Kriteriumsangabe) ist etwas schwieriger zu erstellen, weil Datumsbereiche abgefragt werden müssen und die bestimmte Formatierungen des Datums erfordern.





Mi

Muhkuh86

Hallo DF6GL (hat der Name was zu bedeuten? :D),

also unser Lehrer hat uns eine umfassende Projektaufgabe gegeben, in der handfest steht, dass es eine 1:1 Beziehung sein muss (auch Access gibt mir das vor, wenn ich die jeweiligen Primärschlüssel aus TBuecher und Tausleihen verknüpfe), aber da können wir uns ewig "streiten", ich würde es so machen wie ihr sagt, dürfen wir aber nicht.


Zitat von: DF6GL am April 07, 2010, 13:12:10
Im Formular "frmBücher" kommt ein UFO, das das Form "frmAusleihen" anzeigt und über das Ausleih_ID-Feld verknüpft ist.


Das darf ich auch nicht machen. Die einzigen UF habe ich bei dem Fausleihen, wo die jeweiligen Kundennamen und Buchtitel zudem jeweiligen Schlüssel angezeigt wird, wenn ich ihn eintippe.


DF6GL

Hallo,



in der Tat, er hat was zu bedeuten  ;)    --> das ist mein Amateurfunk-Rufzeichen



Ok mit der 1:1-Beziehung, wenn es denn so sein muß (was ich nach wie vor bezweife, dass das auch so gemeint ist) )

"die jeweiligen Primärschlüssel aus TBuecher und Tausleihen verknüpfe"   ist falsch! Natürlich gibt Access es Dir dann vor, wenn Du es so machst, aber das heißt noch lange nciht, dass es auch sinnhaftig richtig ist.

"dürfen wir aber nicht."  ok, dann eben nicht.  Aber die Konsequenz ist eine nicht funktionierende Db..

Du kannst ja mal, sobald die "Lösung" bekannt ist, diese hier posten  ;)

Muhkuh86

Werd ich machen, wenn ich alternative Lösungen bekomme. Wir müssen das dann abgeben und kriegen (wohl nur) eine Note, mal schauen.

Jetzt muss ich erstmal noch gucken wie ich die Sachen da umsetze.

Danke euch.

LG

database

Hallo Nora,

Zitataber da können wir uns ewig "streiten"

Ich glaube ich gehe da mit DF6GL konform, wenn ich betone, dass hier nicht um Streit geht sondern darum, das du Verständnis bekommst für die Vorgänge in und um eine Datenbank.
Ich glaube eher, dass die Vorgabe lautet in der Tabelle Ausleihen einen Primärschlüssel zu führen - das ist OK, dann sollte es noch ein Feld geben, das vielleicht BuchID_FK heißt und ein Zahlenfeld vom Typ Long Integer ist.
Wenn du dieses dann mit dem Primärschlüssel der Tabelle Bücher verbindest - dann hasst du es richtig gemacht. (Ergibt dann die 1:n)
Tabellen hinzuzaubern und irgendwas zu verbinden von dem man der Meinung ist dass es so sein SOLL ist ein bisschen dünn und führt meist direkt ins Datenchaos!
Sollte diese Vorgabe tatsächlich in der Form von einem Lehrer kommen bin ich der Meinung, dass es besser ist wenn dieser eure Arbeiten nicht beurteilt  :-\ OK - dieses Urteil steht mir nicht zu ... aber dennoch.

DoCmd  ... das ist unter Acc2003 keine Besonderheit! Da hast du dich sicher verschrieben - kontrolliere noch mal bitte  DoCmd geht sicher!

Grüße

Peter


Muhkuh86

Guten Morgen,

also wir sollten einen Primärschlüssen bei den Kunden und bei den Büchern anlegen und diese als Fremdschlüssel bei Tausleihen zusammenführen. So ist es auch in der Aufgabenstellung gefordert.

Das DoCmd geht jetzt, glaube da war ein Leerzeichen davor :)

Geht das auch irgendwie in Verbindung mit mit Like "*", also dass man Mei eingibt und alle Meiers bekommt? :)

Ich glaube ich werde das über ein Suchformular mit Listenfeld lösen, sieht besser aus und zeigt ja dann nicht nur einen Treffer an. Oder was meint ihr?


Auf einen neuen langen Tag mit Access :)

LG

DF6GL

Hallo,

also doch 1:n ....     ;D  

DoCmd.OpenForm "tbl_Kunde", , , "[Name] like '" & InputBox("Name") & "*'"

Auf Name "Name" DRINGEND verzichten!! Mindestens Eckklammern benutzen!

Statt der Inputbox könnte (besser) auch ein normales ungebundenes Textfeld herhalten.

Wie und was Du zum Suchen nimmst, ist allerdings Geschmacksache...


Ich für meinen Teil benutze standardmäßig ein ungebundenes Kombi (im Formkopf oder -fuß) oder auch ein Listenfeld, evtl. zur besseren Einschränkung abhängige Kombi-/Listenfelder und filtere danach das Formular, bzw. weise dem eine neue Abfrage mit passender Kriteriumsangabe zu.


Muhkuh86

Huhu,

naja nein, 1:1 weil er es so sagt ^.^ /) ...



Danke für den Code. Ich habe jetzt mein Suchformular fertig und es funktioniert auch alels wunderbar :)

Nur eine "Kleinigkeit" hätte ich noch gern, falls das einfach möglich ist. Ich möchte auf einem Eintrag in der Liste klicken und dann diesen Datensatz in dem Formular FKunden direkt anzeigen lassen.

Wie mache ich das am besten?


Viele Grüße

database

Hallo,

Zitatnaja nein, 1:1 weil er es so sagt
*AAAAArrrgggghhhhhhh*   ;D ;D


ZitatAuf Name "Name" DRINGEND verzichten!! Mindestens Eckklammern benutzen

Hatte übersehen darauf hinzuweisen, dass die Bezeichnungen nur sinngemäß zu verstehen sind - Reservierte Bezeichner sind natürlich so wie Sonderzeichen ... tunlichst zu vermeiden.

Zur Gestaltung gibt es wie DF6GL bemerkt hat natürlich verschiedene Möglichkeiten, die Inputbox auch hier bitte als eine dieser Möglichkeiten zu sehen - sie bietet halt zum Ausprobieren den kürzesten Anlaufweg.

ZitatIch möchte auf einem Eintrag in der Liste klicken

Welche Liste meinst du damit - ein Listenfeld (Steuerelement) oder eine Kombibox (Kombinationsfeld)?

Wenn du das Listenfeld ansprichst, welches du für dein Suchformaular ins Auge gefasst hast...

Jedes Listenfeld sollte zumindest 2 Felder (Spalten) haben wobei die erste (nicht sichtbare) Spalte den Primärschlüssel der Herkunftstabelle / Abfrage / Werteliste darstellt.
Klickst du nun auf das Listenfeld um einen Datensatz zu markieren, kannst du über das Ereignis 'Beim Klicken' beispielsweise den Wert des Listenfeldes abfragen.
Das Listenfeld hat beim Klicken immer den Wert, der in der GEBUNDENEN SPALTE steht. Im beschriebenem Szenario also den Primäschlüssel des ausgewählten Datensatzes.
Natürlich kann man auch den Wert einer anderen Spalte auslesen - so zum Beispiel den der Namensspalte, wenn diese im Listenfeld angeezeigt wird oder Mitglied der RowSource ist.

Zugriff auf den Wert der gebundenen Spalte wenn das Listenfeld z.B. 'lstNamensliste' heißt:
Dim lngID as Long
lngID = Me!lstNamensliste


Zugriff auf eine weitere Spalte im Listenfeld
Dim strName as String
strName = Me!lstNamensliste.Column(n)


Wobei n für die Position der  Spalte im Listenfeld steht 0 = die gebundene Spalte, 1 = die erste sichtbare, 2 = die 2. sichtbare ....
Somit erhältstt du die Werte, die du dann als Filterkritereien beim Öffnen des Formulars angeben kannst.

HTH

Peter


Muhkuh86

Huhu,

muss ich dafür extra ein neues Formular erstellen oder kann ich das vorhandene FKunden dafür benutzen?

Und wie wende ich die Filterkriterien dann an?


Wenn dann würde ich das über die gebundene Spalte machen, ich weiss aber nicht wie ich das Filterkriterium einbinde.