{"id":55000866,"date":"2012-12-01T00:00:00","date_gmt":"2020-05-22T21:49:59","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=866"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Abonnements_verwalten_Teil_1","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Abonnements_verwalten_Teil_1\/","title":{"rendered":"Abonnements verwalten, Teil 1"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg05.met.vgwort.de\/na\/535b26fbafc4467b9cfbafe5be316ded\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Wenn man an Abonnements denkt, fallen einem zun&auml;chst Zeitungen oder Magazine ein. Es gibt aber nat&uuml;rlich auch Abonnements f&uuml;r alle anderen Bereiche des Lebens &#8211; vom Sockenabo, das einem regelm&auml;&szlig;ig neue Socken garantiert, bis hin zum Abonnement &uuml;ber die regelm&auml;&szlig;ige Lieferung von Adressetiketten. Allen Abonnements ist gemeinsam, dass diese verwaltet werden m&uuml;ssen, damit jeder Kunde das richtige Produkt zum passenden Zeitpunkt erh&auml;lt. Dieser Beitrag zeigt M&ouml;glichkeiten zum Verwalten von Abonnements auf.<\/b><\/p>\n<p>Wenn Sie sich ein einfaches Zeitschriften-Abonnement vorstellen, bei dem der Leser monatlich eine Ausgabe der Zeitschrift erh&auml;lt, gibt es grunds&auml;tzlich mindestens zwei M&ouml;glichkeiten, um dies abzuhandeln:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Sie legen den Zeitraum fest, innerhalb dessen der Kunde das Produkt erh&auml;lt &#8211; beispielsweise vom 1.1.2012 bis zum 31.12.2012. Befindet sich der Lieferzeitpunkt der aktuellen Ausgabe innerhalb dieses Zeitraumes, erh&auml;lt der Kunde ein Exemplar, sonst nicht.<\/li>\n<li class=\"aufz-hlung\">Sie verwalten die einzelnen Ausgaben in einer Tabelle und weisen dem Abonnement die entsprechenden Datens&auml;tze dieser Tabelle zu, also beispielsweise 1\/2012 bis 12\/2012.<\/li>\n<\/ul>\n<p>Die Variante mit dem Zeitraum hat einen Nachteil: Es kann ja einmal vorkommen, dass die erste Ausgabe des Jahres schon im Vormonat erscheint, also beispielsweise am 31.12.2011, oder dass die letzte Ausgabe des Zeitraums etwas sp&auml;ter ver&ouml;ffentlicht wird &#8211; etwa am 2.1.2013. In diesem Fall m&uuml;ssen Sie zu jeder Ausgabe noch weitere Angaben festlegen, zum Beispiel einen generischen Erscheinungstermin wie etwa immer den ersten Tag des Monats.<\/p>\n<p>Bei dieser vom Datenmodell her einfacheren L&ouml;sung m&uuml;ssten Sie aber dennoch eine M&ouml;glichkeit schaffen, die pro Kunde versendeten Ausgaben zu speichern &#8211; und dann k&ouml;nnen Sie auch gleich zu der Variante mit der Verwaltung der einzelnen Ausgaben &uuml;bergehen.<\/p>\n<p><b>Produkt oder Abonnement<\/b><\/p>\n<p>Ein interessantes Thema ist die Vermengung von Begriffen wie Abonnement, Bestellung, Produkt et cetera. Wenn ein Kunde ein Abonnement bestellt, wie wird dies dann in der Datenbankanwendung behandelt Eines steht fest: Der Kunde wird als Datensatz in einer Kundentabelle gespeichert (egal, ob dieser bereits vorhanden ist oder neu angelegt werden muss). Eine Bestellung hat mit dem Abonnement eigentlich nicht viel gemein, denn eine Bestellung entspricht ja der Zuordnung eines Produktes zu einem Kunden (mit entsprechendem Zeitpunkt, Konditionen et cetera). Das Abonnement l&auml;sst sich eher mit einem einzelnen Produkt gleichsetzen beziehungsweise mit einer Bestellposition. Dabei unterschlagen wir zun&auml;chst, dass ein Abonnement ja aus mehreren Lieferungen besteht. W&auml;hrend das Abonnement beziehungsweise das Produkt als Bestellposition Teil einer kompletten Bestellung sein kann, soll es doch w&auml;hrend der Verwaltung des Abonnements als dem jeweiligen Kunden zugeordnetes Element und somit losgel&ouml;st von der Bestellung oder einer Bestellposition betrachtet werden.<\/p>\n<p>Also enth&auml;lt das Abonnement zumindest ein Fremdschl&uuml;sselfeld zum Herstellen einer Beziehung zum betroffenen Kunden.<\/p>\n<p>Der Einfachheit halber lassen wir aus dieser Anwendung die Bestellungen komplett aus und schauen nur auf die reine Abonnementverwaltung.<\/p>\n<p><b>Datenmodell<\/b><\/p>\n<p>Ohne Kunden gibt es kein Abonnement, deshalb beginnen wir hier mit der Tabelle <b>tblKunden<\/b>. Diese sieht im Entwurf wie in Bild 1 aus. Zu dieser Tabelle geh&ouml;rt noch eine Lookup-Tabelle, welche die Anreden beisteuert. Die Tabelle hei&szlig;t <b>tblAnreden<\/b>, enth&auml;lt die Felder <b>AnredeID <\/b>und <b>Anrede <\/b>und wird &uuml;ber das Fremdschl&uuml;sselfeld <b>AnredeID <\/b>der Tabelle <b>tblKunden <\/b>referenziert. Dieses Fremdschl&uuml;sselfeld wurde als Nachschlagefeld ausgelegt.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/AbonnementsVerwalten-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Die Tabelle tblKunden in der Entwurfsansicht<\/span><\/b><\/p>\n<p>Die Produkte, also beispielsweise <b>Access im Unternehmen<\/b>, <b>Access [basics] <\/b>oder <b>Access-Newsletter <\/b>speichern wir in einer Tabelle namens <b>tblProdukte<\/b>. Diese Tabelle enth&auml;lt neben dem Prim&auml;rschl&uuml;sselfeld <b>ProduktID <\/b>noch ein Feld mit der Produktbezeichnung sowie ein Feld namens <b>AnzahlAusgaben<\/b>, das die Anzahl der Ausgaben pro Jahr kennzeichnet (s. Bild 2). Au&szlig;erdem finden Sie im Datenmodell dieser Tabelle noch ein Feld namens <b>Laufzeit<\/b>, das die Laufzeit eines Abonnements zu diesem Produkt in Monaten aufnimmt.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/AbonnementsVerwalten-web-images\/pic003.png\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Die Tabelle tblProdukte mit einigen Daten<\/span><\/b><\/p>\n<p>Jedes Abonnement wird selbstverst&auml;ndlich genau einem Kunden zugewiesen. Deshalb steht schon fest: Die Tabelle <b>tblAbonnements <\/b>muss neben dem Prim&auml;rschl&uuml;sselfeld <b>AbonnementID <\/b>noch ein Fremdschl&uuml;sselfeld zur Tabelle <b>tblKunden <\/b>enthalten (s. Bild 3). Welche Informationen sollen noch zu einem Abonnement gespeichert werden Ein Abonnement f&uuml;hrt auf jeden Fall einen Kunden und ein Produkt zusammen. Daher erh&auml;lt die Tabelle zwei Fremdschl&uuml;sselfelder namens <b>ProduktID <\/b>und <b>KundeID<\/b>, die beide als Nachschlagefeld ausgef&uuml;hrt werden. Das Nachschlagefeld <b>ProduktID <\/b>soll dabei das Feld <b>Produkt <\/b>der Tabelle <b>tblProdukte <\/b>zur Auswahl anbieten, das Nachschlagefeld <b>KundeID <\/b>das Feld <b>Kundenbezeichnung <\/b>der Tabelle <b>tblKunden <\/b>&#8211; beides in alphabetischer Reihenfolge. Dies erreichen Sie am schnellsten durch den Einsatz des Nachschlage-Assistenten.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/AbonnementsVerwalten-web-images\/pic004.png\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Entwurfsansicht der Tabelle tblAbonnements<\/span><\/b><\/p>\n<p>Normalerweise sollte man annehmen, dass Sie hier einen zusammengesetzten, eindeutigen Index &uuml;ber die beiden Felder <b>ProduktID <\/b>und <b>KundeID <\/b>anlegen sollten. Allerdings kann es ja vorkommen, dass ein Kunde ein Abonnement zum gleichen Produkt verl&auml;ngert oder dieses sp&auml;ter nochmals ordert &#8211; Eindeutigkeit bez&uuml;glich der Kombination aus Produkten und Kunden ist also nicht gefragt. <\/p>\n<p>Welche Informationen soll das Abonnement noch enthalten Interessant ist sicher das Startdatum, das wir im gleichnamigen Feld mit dem Datentyp <b>Datum\/Uhrzeit <\/b>speichern. Au&szlig;erdem soll noch vermerkt werden, ob ein Abonnement gek&uuml;ndigt oder storniert wurde. Eine K&uuml;ndigung f&uuml;hrt dazu, dass das Abonnement &#8211; so dies vorgesehen ist &#8211; nicht automatisch verl&auml;ngert wird.<\/p>\n<p>Eine Stornierung kann beispielsweise innerhalb eines festgelegten Zeitraums (der R&uuml;cktrittsfrist) erfolgen und f&uuml;hrt dazu, dass das Abonnement nicht weiter ausgef&uuml;hrt wird. Die Felder <b>GekuendigtAm <\/b>und <b>StorniertAm <\/b>nehmen die entsprechenden Datumsangaben auf.<\/p>\n<p>Und da wir bereits die Verl&auml;ngerung eines Abonnements angesprochen haben: Die geschieht in der Regel, wenn der Abonnent das Abonnement nicht bis zu einem bestimmten Termin k&uuml;ndigt. Es gibt sicher auch Abonnements, die automatisch auslaufen, g&auml;ngig ist aber das Modell der automatischen Verl&auml;ngerung. Was geschieht bei einer Verl&auml;ngerung eines Abonnements<\/p>\n<p>Es gibt grunds&auml;tzlich zwei M&ouml;glichkeiten:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Sie &auml;ndern die Daten des zu verl&auml;ngernden Abonnements so, dass der Kunde weiterhin die gewohnten Lieferungen erh&auml;lt.<\/li>\n<li class=\"aufz-hlung\">Sie legen ein neues Abonnement an, dass sich auf den gleichen Kunden und das gleiche Produkt bezieht. Au&szlig;erdem sollte hier festgehalten werden, welches Abonnement hier verl&auml;ngert wurde.<\/li>\n<\/ul>\n<p>Wir w&auml;hlen die zweite Variante, da sie besser nachvollziehbar scheint. Damit Sie erkennen k&ouml;nnen, ob es sich bei dem Abonnement um ein Folge-Abonnement handelt, legen wir in der Tabelle <b>tblAbonnements <\/b>auch noch ein Feld namens <b>FolgeaboVon <\/b>an. Dieses wird, wie in Bild 4 zu erkennen, mit dem Prim&auml;rschl&uuml;sselfeld der Tabelle selbst verkn&uuml;pft. Dies erreichen Sie, indem Sie die Tabelle zwei Mal in das Beziehungsfenster ziehen und dann das Feld <b>FolgeaboVon <\/b>einer der beiden Repr&auml;sentationen der Tabelle auf das Feld <b>AbonnementID <\/b>der anderen ziehen. Legen Sie f&uuml;r diese Beziehung referentielle Integrit&auml;t fest.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/AbonnementsVerwalten-web-images\/pic005.png\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Zuordnung von Folge-Abonnements<\/span><\/b><\/p>\n<p><b>Ausgaben und Versendungen<\/b><\/p>\n<p>Es fehlen noch die Ausgaben, die mit jedem Abonnement an die Kunden versendet werden sollen. Das ist komplizierter, als es zun&auml;chst den Anschein hat. Immerhin gibt es ja f&uuml;r jedes Produkt verschiedene Ausgaben: F&uuml;r <b>Access im Unternehmen <\/b>die Ausgaben 1 bis 6 f&uuml;r jedes Jahr, f&uuml;r <b>Access [basics] <\/b>etwa 1 bis 12. Diese sollen nun je nach Startzeitpunkt einem Abonnements zugeordnet werden. Wenn der Kunde beispielsweise am 1.7. eines Jahres einsteigt, soll er bei einem Magazin mit zw&ouml;lf Ausgaben mit der Ausgabe <b>7 <\/b>beginnen. Das spezielle Abonnement des Kunden soll also etwa die Ausgaben 7\/2012 bis 6\/2013 enthalten. Ein anderer Kunde steigt vielleicht einen Monat sp&auml;ter ein, sein Abonnement sieht also bez&uuml;glich der Versendungen gleich ganz anders aus. Um diese Ausgaben zum jeweiligen Abonnement zuweisen zu k&ouml;nnen, wollen wir zun&auml;chst einmal die Ausgaben je Abonnement definieren. Dies erledigen wir in einer Tabelle namens <b>tblAusgaben<\/b>, welche die vier Felder <b>AusgabeID<\/b>, <b>AusgabeBezeichnung<\/b>, <b>AusgabeNummer <\/b>und <b>AusgabeJahr <\/b>enth&auml;lt. Diese Tabelle k&ouml;nnte beispielsweise Daten wie in Bild 5 enthalten. Wo aber befindet sich hier der Verweis auf das Produkt &#8211; und zwar in Form eines Fremdschl&uuml;sselfeldes namens <b>ProduktID <\/b>mit einer Referenz auf das Prim&auml;rschl&uuml;sselfeld der Tabelle <b>tblProdukte<\/b> Dieses geh&ouml;rt eigentlich in diese Tabelle. Wir m&ouml;chten aber noch einen Spezialfall abfangen, der durch verschiedene Abonnement-Formen mit den gleichen Ausgaben resultiert: Es ist ja m&ouml;glich, dass Sie zus&auml;tzlich zu einem zw&ouml;lfmonatigen Abonnement noch ein dreimonatiges Testabo anbieten. Der Kunde mit dem Testabo soll aber etwa die gleiche Ausgabe 5\/2012 erhalten wie der Kunde mit dem regul&auml;ren Abonnement. Deshalb kann ein Eintrag der Tabelle <b>tblAusgaben <\/b>mehreren Datens&auml;tzen der Tabelle <b>tblProdukte <\/b>zugeteilt werden.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/AbonnementsVerwalten-web-images\/pic002.png\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6: Das komplette Datenmodell der Beispieldatenbank<\/span><\/b><\/p>\n<p>Damit h&auml;tten wir festgelegt, welche Ausgaben es zu einem Produkt gibt. Nun m&uuml;ssen wir nur noch die im Rahmen eines Abonnements zu verschickenden Ausgaben festlegen. Dies wiederum geschieht in der Tabelle <b>tblVersendungen<\/b>. Diese verkn&uuml;pft die Tabelle <b>tblAbonnements <\/b>mit der Tabelle <b>tblAusgaben<\/b>. Das Feld <b>VersendungID <\/b>dient als Prim&auml;rschl&uuml;sselfeld, das Feld <b>AusgabeID <\/b>ist ein Fremdschl&uuml;sselfeld zum Herstellen der Beziehung zur Tabelle <b>tblAusgaben <\/b>und das Feld <b>AbonnementID <\/b>weist die Ausgabe schlie&szlig;lich einem der Datens&auml;tze der Tabelle <b>tblAbonnements <\/b>zu. Schlie&szlig;lich m&uuml;ssen wir noch irgendwo vermerken, wann die Ausgabe an den &uuml;ber die Tabelle <b>tblAbonnements <\/b>referenzierten Kunden verschickt wurde. Dies erledigen wir mit einem Datumsfeld namens <b>Versanddatum<\/b>.<\/p>\n<p>Bild 6 zeigt die Zusammenh&auml;nge zwischen den einzelnen Tabellen im &Uuml;berblick. Auch der noch zu programmierende Ablauf beim Anlegen eines Abonnements l&auml;sst sich hier ablesen: Wenn ein neuer Datensatz zur Tabelle <b>tblAbonnements<\/b> hinzugef&uuml;gt wird, legt man dort auch das Produkt fest, auf dem das Abonnement basiert. Im n&auml;chsten Schritt pr&uuml;ft man, welche Ausgaben angelegt werden sollen. Dazu wird im Feld <b>AktuelleAusgabeID<\/b> der Tabelle <b>tblProdukte<\/b>, das ebenfalls mit der Tabelle <b>tblAusgaben <\/b>verkn&uuml;pft ist, die aktuelle Ausgabe referenziert. Im Folgenden sollen in der Tabelle <b>tblVersendungen <\/b>die entsprechenden Eintr&auml;ge vorgenommen werden: Wenn das Feld <b>AnzahlAusgaben <\/b>der Tabelle <b>tblProdukte <\/b>also etwa den Wert <b>12 <\/b>enth&auml;lt, sollen in der Tabelle <b>tblVersendungen <\/b>zw&ouml;lf Datens&auml;tze erstellt werden. Diese enthalten jeweils einen Verweis auf den neu angelegten Datensatz der Tabelle <b>tblAbonnements <\/b>und auf die zw&ouml;lf Eintr&auml;ge der Tabelle <b>tblAusgaben<\/b>, die zur aktuellen Ausgabe und zum gew&auml;hlten Produkt passen. Wie dies technisch abl&auml;uft, schauen wir uns weiter unten an.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/AbonnementsVerwalten-web-images\/pic006.png\" alt=\"pic006.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Tabelle der Ausgaben<\/span><\/b><\/p>\n<p>Damit die Tabelle <b>tblVersendungen <\/b>jede Ausgabe nur einmal je Abonnement aufnimmt, legen wir einen zusammengesetzten eindeutigen Schl&uuml;ssel f&uuml;r die beiden Felder <b>AbonnementID <\/b>und <b>AusgabeID<\/b> fest.<\/p>\n<p><b>Formulare zur Datenverwaltung<\/b><\/p>\n<p>Nachdem die Tabellenstruktur steht, ben&ouml;tigen wir eine Reihe Formulare zum Verwalten der Abonnements und der dazu ben&ouml;tigten Daten.<\/p>\n<p>Die Kunden sollen in einem Formular <b>frmKunden <\/b>verwaltet werden. &Uuml;ber dieses Formular werden schlie&szlig;lich auch die Abonnements eines jeden Kunden angezeigt und die zu versendenden Ausgaben. Das Formular <b>frmKunden<\/b> verwendet die Tabelle <b>tblKunden <\/b>als Datenherkunft und zeigt die Details zu einem Kunden in der Formularansicht an. An dieser Stelle gibt es noch keine Besonderheiten &#8211; ziehen Sie einfach alle ben&ouml;tigten Felder aus der Datenherkunft in den Detailbereich der Entwurfsansicht und ordnen Sie diese etwa wie in Bild 7 an.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/AbonnementsVerwalten-web-images\/pic007.png\" alt=\"pic007.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 7: Das Formular zur Verwaltung der Kunden in der Entwurfsansicht<\/span><\/b><\/p>\n<p><b>Produkte verwalten<\/b><\/p>\n<p>Bevor wir die Unterformulare zur Darstellung der Abonnements eines Kunden sowie der Versendungen zu dem jeweils aktivierten Abonnement einf&uuml;gen, sollen zun&auml;chst die M&ouml;glichkeiten der dazu ben&ouml;tigten Daten geschaffen werden.<\/p>\n<p>Da w&auml;ren zun&auml;chst die Produkte, ohne die nichts geht: Sie k&ouml;nnen kein Abonnement anlegen ohne ein Produkt und auch keine Ausgaben.<\/p>\n<p>Das Formular <b>frmProdukte <\/b>verwendet die Tabelle <b>tblProdukte <\/b>als Datenherkunft und zeigt auch alle Felder dieser Tabelle an (s. Bild 8). Sie k&ouml;nnen damit zwar nun Daten f&uuml;r die Felder <b>Produkt <\/b>und <b>AnzahlAusgaben <\/b>hinzuf&uuml;gen, aber noch nicht f&uuml;r das Fremdschl&uuml;sselfeld <b>AktuelleAusgabeID <\/b>&#8211; daf&uuml;r liegen ebenfalls noch keine Daten vor.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/AbonnementsVerwalten-web-images\/pic008.png\" alt=\"pic008.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 8: Das Formular zum Anlegen der Produkte<\/span><\/b><\/p>\n<p>Um eine oder mehrere Ausgaben anzulegen, f&uuml;gen Sie dem Formular gleich neben dem Feld <b>AnzahlAusgaben <\/b>eine Schaltfl&auml;che namens <b>cmdNeueAusgaben <\/b>hinzu. Dieses ruft ein Formular auf, mit dem Sie neue Ausgaben zum aktuellen Produkt hinzuf&uuml;gen k&ouml;nnen &#8211; dazu sp&auml;ter mehr.<\/p>\n<p>Das Unterformular <b>sfmAusgaben <\/b>soll alle Ausgaben zum aktuell im Hauptformular <b>frmProdukte <\/b>angezeigten Produkt anzeigen. Dazu verwendet das Formular eine Abfrage<b> <\/b>als Datenherkunft, die auf den beiden Tabellen <b>tblProdukteAusgaben<\/b> und <b>tblAusgaben <\/b>basiert und die unter dem Namen <b>qryFrmProdukteSfmAusgaben<\/b> gespeichert wird (s. Bild 10).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/AbonnementsVerwalten-web-images\/pic010.png\" alt=\"pic010.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 9: Datenherkunft des Unterformulars sfmAusgaben<\/span><\/b><\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/AbonnementsVerwalten-web-images\/pic011.png\" alt=\"pic011.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 10: Produkte und Ausgaben im Entwurf<\/span><\/b><\/p>\n<p><!--30percent--><\/p>\n<p>Das Unterformular zeigt somit automatisch nur noch Ausgaben an, die zum aktuellen Produkt im Hauptformular geh&ouml;ren.<\/p>\n<p>Eine Besonderheit ergibt sich noch bez&uuml;glich des Kombinationsfeldes zur Auswahl der aktuellen Ausgabe, das wir in <b>cboAktuelleAusgabeID <\/b>umbenennen. Es soll genau wie das Unterformular <b>sfmAusgaben<\/b> nur die zum aktuellen Produkt geh&ouml;renden Ausgaben zur Auswahl anbieten.Dazu weisen Sie diesem Kombinationsfeld als Datensatzherkunft eine Abfrage zu, die genauso aussieht wie die Datenherkunft des Unterformulars <b>sfmAusgaben<\/b>, aber unter dem Namen <b>qryFrmProdukteCboAktuelleAusgabeID <\/b>als eigene Abfrage gespeichert wird. Man wei&szlig; nie, ob nicht eine der Abfragen einmal angepasst werden muss, daher werden diese gleich als eigene Objekte gespeichert.<\/p>\n<p>Wenn nun bereits einige Datens&auml;tze in den Tabellen <b>tblAusgaben <\/b>und <b>tblProdukteAusgaben<\/b> vorhanden w&auml;ren, w&uuml;rde das Formular <b>frmProdukte <\/b>diese wie in Bild 11 anzeigen.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/AbonnementsVerwalten-web-images\/pic012.png\" alt=\"pic012.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 11: Formularansicht der Produkte und Ausgaben<\/span><\/b><\/p>\n<p>Also k&uuml;mmern wir uns doch darum, dass einige Ausgaben angelegt werden. Dies erledigen Sie, in dem Sie die weiter oben angelegte Schaltfl&auml;che <b>cmdNeueAusgaben <\/b>mit Leben f&uuml;llen.<\/p>\n<p>Legen Sie dazu die folgende Ereignisprozedur an, die durch das Ereignis <b>Beim Klicken <\/b>der Schaltfl&auml;che ausgel&ouml;st wird:<\/p>\n<pre>Private Sub cmdNeueAusgaben_Click()\r\n    DoCmd.OpenForm &quot;frmNeueAusgaben&quot;, WindowMode:=acDialog, OpenArgs:=Me!ProduktID\r\n    Me!cboAktuelleAusgabeID.Requery\r\n    Me!sfmAusgaben.Form.Requery\r\nEnd Sub<\/pre>\n<p>Die Prozedur &ouml;ffnet ein weiteres Formular namens <b>frmNeueAusgaben <\/b>und &uuml;bergibt den Wert des Feldes <b>ProduktID <\/b>des aktuellen Datensatzes per &Ouml;ffnungsargument an das Formular.<\/p>\n<p>Dieses wird au&szlig;erdem als modaler Dialog ge&ouml;ffnet und sieht wie in Bild 12 aus. Das Formular zeigt alle kommenden und noch nicht erfassten Ausgaben in einem Listenfeld an.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/AbonnementsVerwalten-web-images\/pic013.png\" alt=\"pic013.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 13: frmNeueAusgaben in der Entwurfsansicht<\/span><\/b><\/p>\n<p>Der Benutzer kann die gew&uuml;nschten Eintr&auml;ge unter Verwendung der <b>Strg<\/b>&#8211; und der <b>Umschalt<\/b>-Taste markieren und die Ausgaben mit der Schaltfl&auml;che <b>OK <\/b>hinzuf&uuml;gen oder das Formular ohne &Atilde;&#8220;nderung der Ausgaben mit der Schaltfl&auml;che <b>Abbrechen <\/b>schlie&szlig;en. Die Prozedur <b>cmdNeueAusgaben_Click <\/b>aktualisiert jeweils mit der <b>Requery<\/b>-Methode noch die Datenherkunft des Unterformulars <b>sfmAusgaben <\/b>sowie die Datensatzherkunft des Kombinationsfeldes <b>cboAktuelleAusgabe<\/b>.<\/p>\n<p><b>Erstellen des Formulars frmNeueAusgaben<\/b><\/p>\n<p>Unabh&auml;ngig von Abonnements, also der Zuordnung von zu versendenden Ausgaben zu einem Kunden, m&uuml;ssen die Ausgaben f&uuml;r das betroffene Produkt zun&auml;chst einmal angelegt werden.<\/p>\n<p>Bei <b>Access im Unternehmen <\/b>hei&szlig;en solche Ausgaben <b>1\/2012<\/b>, <b>2\/2012 <\/b>und so weiter. Die k&ouml;nnen Sie entweder von Hand anlegen oder Sie ziehen ein Formular hinzu, das Ihnen diese Arbeit abnimmt.<\/p>\n<p>Dieses sieht im Entwurf wie in Bild 13 aus und enth&auml;lt ein Listenfeld namens <b>lstAusgaben<\/b>, das erst beim &Ouml;ffnen des Formulars mit Daten gef&uuml;llt wird. Da die Daten als Zeichenkette &uuml;bergeben werden, stellen Sie die Eigenschaft <b>Herkunftsart <\/b>auf <b>Wertliste <\/b>ein. Damit der Benutzer wie im Windows Explorer mehrere Eintr&auml;ge mit der <b>Strg<\/b>&#8211; und der <b>Umschalt<\/b>-Fl&auml;che ausw&auml;hlen kann, stellen Sie die Eigenschaft <b>Mehrfachauswahl <\/b>auf <b>Erweitert <\/b>ein.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/AbonnementsVerwalten-web-images\/pic014.png\" alt=\"pic014.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 12: Formular zum Anlegen neuer Ausgaben<\/span><\/b><\/p>\n<p>Damit die noch nicht angelegten Ausgaben im Listenfeld <b>lstAusgaben <\/b>angezeigt werden, legen Sie die Ereignisprozedur aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-58-anchor\">Listing 1<\/a><\/span> an, die durch das Ereignis <b>Beim &Ouml;ffnen <\/b>des Formulars <b>frmNeueAusgaben <\/b>ausgel&ouml;st wird.<\/p>\n<p class=\"listingueberschrift\">Listing 1: Neu hinzuzuf&uuml;gende Ausgaben in einer Liste anzeigen<\/p>\n<pre>Private Sub Form_Open(Cancel As Integer)\r\n    Dim i As Integer\r\n    Dim strAusgaben As String\r\n    Dim intAnzahlAusgaben As Integer\r\n    Dim intJahrAusgabe As Integer\r\n    Dim intNummerAusgabe As Integer\r\n    lngProduktID = Nz(Me.OpenArgs)\r\n    If lngProduktID = 0 Then\r\n        Cancel = True\r\n    Else\r\n        intAnzahlAusgaben = DLookup(&quot;AnzahlAusgaben&quot;, &quot;tblProdukte&quot;, &quot;ProduktID = &quot; &amp; lngProduktID)\r\n        intJahrAusgabe = Nz(DMax(&quot;AusgabeJahr&quot;, &quot;qryProdukteAusgaben&quot;, _\r\n            &quot;ProduktID = &quot; &amp; lngProduktID), Year(Date))\r\n        intNummerAusgabe = Nz(DMax(&quot;AusgabeNummer&quot;, &quot;qryProdukteAusgaben&quot;, _\r\n            &quot;ProduktID = &quot; &amp; lngProduktID &amp; &quot; AND AusgabeJahr = &quot; &amp; intJahrAusgabe), 1)\r\n        For i = 1 To 100\r\n            If Not intNummerAusgabe = intAnzahlAusgaben Then\r\n                intNummerAusgabe = intNummerAusgabe + 1\r\n            Else\r\n                intNummerAusgabe = 1\r\n                intJahrAusgabe = intJahrAusgabe + 1\r\n            End If\r\n            strAusgaben = strAusgaben &amp; intNummerAusgabe &amp; &quot;;&quot; &amp; intJahrAusgabe &amp; &quot;;&quot; _\r\n                &amp; intNummerAusgabe &amp; &quot;\/&quot; &amp; intJahrAusgabe &amp; &quot;;&quot;\r\n        Next i\r\n        Me!lstAusgaben.RowSource = strAusgaben\r\n        Me!lstAusgaben = Me!lstAusgaben.ItemData(0)\r\n    End If\r\nEnd Sub<\/pre>\n<p>Diese Prozedur f&uuml;llt und verwendet eine Variable namens <b>lngProduktID<\/b>, deren Wert auch noch in einer weiteren Prozedur verwendet werden soll. Daher deklarieren Sie die entsprechende Variable wie folgt im Kopf des Klassenmoduls <b>Form_frmNeueAusgaben<\/b>:<\/p>\n<pre>Dim lngProduktID As Long<\/pre>\n<p>Die Prozedur <b>Form_Open <\/b>pr&uuml;ft zun&auml;chst, ob die Eigenschaft <b>OpenArgs <\/b>des Formulars einen Wert enth&auml;lt. Dieser wird beim Aufruf vom Formular <b>frmProdukte <\/b>aus als Wert des Feldes <b>ProduktID <\/b>des aktuellen Datensatzes &uuml;bergeben.<\/p>\n<p>Hat diese den Wert <b>NULL<\/b>, wird <b>lngProduktID <\/b>durch die Funktion <b>Nz <\/b>mit dem Wert <b>0 <\/b>gef&uuml;llt. In diesem Fall wird das &Ouml;ffnen des Formulars durch Einstellen des R&uuml;ckgabeparameters <b>Cancel <\/b>auf den Wert <b>False <\/b>abgebrochen.<\/p>\n<p>Anderenfalls ermittelt die Prozedur zun&auml;chst die Anzahl der Ausgaben pro Kalenderjahr f&uuml;r dieses Produkt. Dies erledigt ein entsprechender Aufruf der <b>DLookup<\/b>-Funktion, das Ergebnis landet in der Variablen <b>intAnzahlAusgaben<\/b>. Warum ben&ouml;tigen wir diesen Wert Weil wir damit festlegen, welche Ausgaben &uuml;berhaupt zur Liste der Ausgaben hinzugef&uuml;gt werden. Wenn ein Magazin nur sechs Ausgaben pro Jahr liefert, sollen dementsprechend nur die Nummern <b>1\/2012 <\/b>bis <b>6\/2012 <\/b>erscheinen und nicht etwa die <b>7\/2012<\/b>.<\/p>\n<p>Die folgende Anweisung ermittelt den gr&ouml;&szlig;ten Wert im Feld <b>AusgabeJahr <\/b>f&uuml;r dieses Produkt. Ist noch keine Ausgabe vorhanden, wird das aktuelle Jahr verwendet. Das Ergebnis landet in der Variablen <b>intJahrAusgabe<\/b>. &Atilde;&#8220;hnliches geschieht in der n&auml;chsten Zeile. Dort wird der gr&ouml;&szlig;te Wert des Feldes <b>AusgabeNummer <\/b>f&uuml;r das entsprechende Produkt und das zuvor ermittelte Jahr ausgelesen und in <b>intNummerAusgabe <\/b>gespeichert.<\/p>\n<p>Auf diese Weise wei&szlig; die Prozedur, bis zu welcher Ausgabe Datens&auml;tze in der Tabelle <b>tblAusgaben<\/b> vorliegen. Beide <b>DMax<\/b>-Anweisungen verwenden &uuml;brigens die Abfrage <b>qryProdukteAusgaben <\/b>als Datenherkunft, welche die Tabellen <b>tblProdukteAusgaben <\/b>und <b>tblAusgaben <\/b>zusammenf&uuml;hrt.<\/p>\n<p>Danach werden Eintr&auml;ge f&uuml;r die 100 folgenden Ausgaben angelegt. Innerhalb der dazu angelegten <b>For&#8230;Next<\/b>-Schleife pr&uuml;ft die Prozedur zun&auml;chst, ob die Nummer der in <b>intNummerAusgabe <\/b>gespeicherten Ausgabe bereits der maximalen Anzahl <b>Ausgaben <\/b>f&uuml;r das Jahr entspricht. Falls nicht, wird <b>intNummerAusgabe<\/b> um eins erh&ouml;ht, um die n&auml;chste Ausgabe anzulegen. Wenn der Wert in <b>intNummerAusgabe <\/b>bereits der maximalen Anzahl Ausgaben entspricht, wird <b>intNummerAusgabe <\/b>auf <b>1 <\/b>zur&uuml;ckgesetzt und die in <b>intJahrAusgabe <\/b>gespeicherte Zahl um eins erh&ouml;ht.<\/p>\n<p>Danach wird ein neuer Eintrag zur Variablen <b>strAusgaben <\/b>hinzugef&uuml;gt, der etwa wie folgt aufgebaut ist:<\/p>\n<pre>1;2012;1\/2012<\/pre>\n<p>Das erste Element ist die Nummer der Ausgabe, das zweite das Jahr und das dritte die Bezeichnung der Ausgabe. Schlie&szlig;lich wird der in <b>strAusgaben <\/b>gespeicherte Ausdruck der Eigenschaft <b>RowSource <\/b>des Listenfeldes <b>lstAusgaben <\/b>zugewiesen. Au&szlig;erdem wird der erste Eintrag des Listenfeldes markiert.<\/p>\n<p>Damit nur die Bezeichnung der Ausgabe angezeigt wird, stellen Sie die Eigenschaften <b>Spaltenanzahl <\/b>und <b>Spaltenbreiten <\/b>auf die Werte <b>3 <\/b>und <b>0;0 <\/b>ein.<\/p>\n<p><b>Neue Ausgaben speichern<\/b><\/p>\n<p>Der Benutzer kann nun eine oder mehrere neue Ausgaben ausw&auml;hlen. Nach dem Bet&auml;tigen der <b>OK<\/b>-Taste sollen diese Ausgaben in die Tabellen <b>tblAusgaben <\/b>eingetragen werden. Au&szlig;erdem soll die Zuordnung zum gew&auml;hlten Produkt &uuml;ber die Tabelle <b>tblProdukteAusgaben <\/b>hergestellt werden.<\/p>\n<p>Die durch den Mausklick auf die Schaltfl&auml;che <b>cmdOK <\/b>ausgel&ouml;ste Prozedur <b>cmdOK_Click<\/b> sieht wie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-69-anchor\">Listing 2<\/a><\/span> aus. Sie enth&auml;lt im Wesentlichen eine <b>For Each<\/b>-Schleife, die alle markierten Eintr&auml;ge des Listenfeldes <b>lstAusgaben <\/b>durchl&auml;uft.<\/p>\n<p class=\"listingueberschrift\">Listing 2: Neue Ausgaben zur Tabelle tblAusgaben hinzuf&uuml;gen<\/p>\n<pre>Private Sub cmdOK_Click()\r\n    Dim var As Variant\r\n    Dim db As DAO.Database\r\n    Dim strBezeichnung As String\r\n    Dim intNummer As String\r\n    Dim intJahr As String\r\n    Dim lngAusgabeID As Long\r\n    Set db = CurrentDb\r\n    For Each var In Me!lstAusgaben.ItemsSelected\r\n        intNummer = Me!lstAusgaben.Column(0, var)\r\n        intJahr = Me!lstAusgaben.Column(1, var)\r\n        strBezeichnung = Me!lstAusgaben.Column(2, var)\r\n        db.Execute &quot;INSERT INTO tblAusgaben(AusgabeBezeichnung, AusgabeNummer, AusgabeJahr) &quot; _\r\n            &amp; &quot;VALUES(''&quot; &amp; strBezeichnung &amp; &quot;'', &quot; &amp; intNummer &amp; &quot;, &quot; &amp; intJahr &amp; &quot;)&quot;, dbFailOnError\r\n        lngAusgabeID = db.OpenRecordset(&quot;SELECT @@IDENTITY&quot;).Fields(0)\r\n        db.Execute &quot;INSERT INTO tblProdukteAusgaben(ProduktID, AusgabeID) VALUES(&quot; &amp; lngProduktID _\r\n            &amp; &quot;, &quot; &amp; lngAusgabeID &amp; &quot;)&quot;, dbFailOnError\r\n    Next var\r\n    Set db = Nothing\r\n    DoCmd.Close acForm, Me.Name\r\nEnd Sub<\/pre>\n<p>Diese Eintr&auml;ge liefert die Auflistung <b>ItemsSelected<\/b>. Der Wert eines jeden Eintrags dieser Auflistung entspricht dem Index des Eintrags und wird in der Variablen <b>var <\/b>gespeichert.<\/p>\n<p>Die ersten drei Anweisungen innerhalb der Schleife lesen den Wert der ersten, zweiten und dritten Spalte der Zeile mit dem angegebenen Index aus und speichern die Werte in den Variablen <b>intNummer<\/b>, <b>intJahr <\/b>und <b>strBezeichnung<\/b>.<\/p>\n<p>Diese Werte speichert die folgende <b>Execute<\/b>-Methode mit einer <b>INSERT INTO<\/b>-Anweisung in der Tabelle <b>tblAusgaben<\/b>. Die folgende Abfrage <b>SELECT @@IDENTITY <\/b>liest den Prim&auml;rschl&uuml;sselwert des so erzeugten Datensatzes aus, also den Wert des Feldes <b>lngAusgabeID <\/b>des neuen Eintrags.<\/p>\n<p>Dieser Wert ist n&ouml;tig, um den Datensatz der Tabelle <b>tblAusgaben <\/b>mit dem in der Tabelle <b>tblProdukte <\/b>gespeicherten Produkt in Beziehung zu setzen.<\/p>\n<p>Dies geschieht durch das Anlegen eines neuen Datensatzes in der Tabelle <b>tblProdukteAusgaben<\/b>, der f&uuml;r das Feld <b>ProduktID <\/b>den Wert aus <b>lngProduktID <\/b>und f&uuml;r das Feld <b>AusgabeID <\/b>den soeben ermittelten Wert aus <b>lngAusgabeID <\/b>zugewiesen bekommt. Diese Schritte werden f&uuml;r alle markierten Ausgaben ausgef&uuml;hrt.<\/p>\n<p>Nach dem Schlie&szlig;en des Formulars <b>frmNeueAusgaben <\/b>wird die Prozedur <b>cmdNeueAusgaben <\/b>des Formulars <b>frmProdukte <\/b>fortgesetzt, was zur Aktualisierung des Unterformulars mit den Ausgaben dieses Produkts und des Kombinationsfeldes zur Auswahl der aktuellen Ausgabe f&uuml;hrt.<\/p>\n<p><b>Abonnements anlegen<\/b><\/p>\n<p>Nachdem Sie mit den beiden Formularen <b>frmProdukte <\/b>und <b>frmNeueAusgaben <\/b>einige Produkte und Ausgaben angelegt haben, k&uuml;mmern wir uns um das Anlegen von Abonnements und Versendungen. Dies geschieht wieder im Formular <b>frmKunden<\/b>. Dort f&uuml;gen Sie nun zwei Unterformulare hinzu &#8211; eines zum Eintragen der Abonnements eines Kunden und eines f&uuml;r die Ausgaben zum aktuell ausgew&auml;hlten Abonnement.<\/p>\n<p>Das Unterformular zur Anzeige der Abonnements hei&szlig;t <b>sfmAbonnements <\/b>und verwendet die Tabelle <b>tblAbonnements <\/b>als Datenherkunft. Sie soll alle Felder dieser Tabelle au&szlig;er <b>KundeID <\/b>anzeigen (s. Bild 14), und zwar in der Datenblattansicht.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/AbonnementsVerwalten-web-images\/pic015.png\" alt=\"pic015.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 14: Entwurf des Unterformulars sfmAbonnements<\/span><\/b><\/p>\n<p>F&uuml;gen Sie das Unterformular einfach per Drag and Drop aus dem Datenbankfenster beziehungsweise dem Navigationsbereich in das Formular <b>frmKunden<\/b>.<\/p>\n<p>Access erkennt standardm&auml;&szlig;ig automatisch, dass es zwischen den als Datenherkunft verwendeten Tabellen <b>tblKunden <\/b>und <b>tblAbonnements <\/b>von Haupt- und Unterformular eine Beziehung gibt, und tr&auml;gt das Feld <b>KundeID <\/b>f&uuml;r die beiden Eigenschaften <b>Verkn&uuml;pfen von <\/b>und <b>Verkn&uuml;pfen nach <\/b>des Unterformular-Steuerelements ein.<\/p>\n<p>Anschlie&szlig;end legen Sie das Unterformular zur Anzeige der Ausgaben des aktuell im Unterformular <b>sfmAbonnements <\/b>markierten Abonnements an. Es verwendet die Tabelle <b>tblVersendungen <\/b>als Datenherkunft und zeigt die Felder <b>AusgabeID <\/b>und <b>Versanddatum <\/b>an (s. Bild 15).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/AbonnementsVerwalten-web-images\/pic016.png\" alt=\"pic016.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 15: Entwurf des Unterformulars sfmVersendungen<\/span><\/b><\/p>\n<p>Wenn Sie das Unterformular <b>sfmVersendungen<\/b> wie gewohnt zum Hauptformular hinzuf&uuml;gen, wird jedoch keine Beziehung zwischen einem der Felder des Unterformulars und dem Hauptformular hergestellt. Das ist auch gar nicht m&ouml;glich, denn das Unterformular <b>sfmVersendungen <\/b>soll ja die zum aktuellen Datensatz des Unterformulars <b>sfmAbonnements <\/b>vorhandenen Datens&auml;tze anzeigen.<\/p>\n<p>Wie also synchronisieren wir die beiden Unterformulare Dazu legen Sie zun&auml;chst ein Textfeld im Hauptformular an. Dieses hei&szlig;t <b>txtAktuellesAbonnementID <\/b>und soll jeweils den Wert des Feldes <b>AbonnementID <\/b>des im Unterformular markierten Datensatzes anzeigen. Dazu tragen Sie f&uuml;r die Eigenschaft <b>Steuerelementinhalt <\/b>den folgenden Ausdruck ein (s. Bild 16):<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/AbonnementsVerwalten-web-images\/pic017.png\" alt=\"pic017.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 16: Abbilden der im Unterformular ausgew&auml;hlten AbonnementID im Hauptformular<\/span><\/b><\/p>\n<pre>=[sfmAbonnements]![AbonnementID]<\/pre>\n<p>Wenn Sie nun einen Datensatz im Unterformular <b>sfmAbonnements <\/b>f&uuml;r einen Kunden anlegen, zeigt das Textfeld <b>txtAktuellesAbonnement <\/b>den Wert des Feldes <b>AbonnementID <\/b>dieses Datensatzes an. Nun m&uuml;ssen Sie noch das Unterformular <b>sfmVersendungen <\/b>so einstellen, dass es nur die zu diesem Abonnement passenden Datens&auml;tze anzeigt. Dies erledigen Sie wiederum &uuml;ber die beiden Eigenschaften <b>Verkn&uuml;pfen von <\/b>und <b>Verkn&uuml;pfen nach <\/b>des Unterformular-Steuerelements auf die Werte <b>AbonnementID <\/b>und <b>txtAktuellesAbonnementID<\/b> (s. Bild 17).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/AbonnementsVerwalten-web-images\/pic018.png\" alt=\"pic018.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 17: Synchronisieren der Unterformulare<\/span><\/b><\/p>\n<p><b>Abonnement und Versendungen eintragen<\/b><\/p>\n<p>Nun liegen aber noch keine Abonnements und Versendungen vor, mit denen Sie die Synchronisierung der Unterformulare ausprobieren k&ouml;nnten. Also k&uuml;mmern wir uns nun um das Anlegen von Abonnements samt Versendungen. Dies setzt das Vorhandensein eines Kundendatensatzes im Hauptformular voraus, denn sonst kann das Abonnement nicht zugeordnet werden.<\/p>\n<p>Ist ein Kunde vorhanden, soll das Ausw&auml;hlen eines Produktes mit dem in <b>cboProduktID <\/b>umbenannten Kombinationsfeld mit dem Steuerelementinhalt <b>ProduktID <\/b>im Unterformular <b>sfmAbonnements <\/b>alles Weitere ansto&szlig;en.<\/p>\n<p>Wir verwenden die durch das Ereignis <b>Vor Aktualisierung <\/b>ausgel&ouml;ste Ereignisprozedur, die Sie wie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-73-anchor\">Listing 3<\/a><\/span> im Klassenmodul <b>Form_sfmAbonnements <\/b>anlegen. Die Prozedur speichert zun&auml;chst die <b>ProduktID <\/b>in der Variablen <b>lngProduktID<\/b>. Das Feld <b>Startdatum <\/b>wird mit der Funktion <b>Now <\/b>auf das aktuelle Datum und die entsprechende Uhrzeit eingestellt &#8211; gegebenenfalls k&ouml;nnen Sie hier die Uhrzeit weglassen und mit der Funktion <b>Date <\/b>nur das Datum eintragen.<\/p>\n<p class=\"listingueberschrift\">Listing 3: Anlegen eines Abonnements und der Versendungen<\/p>\n<pre>Private Sub cboProduktID_AfterUpdate()\r\n    Dim lngProduktID As Long\r\n    Dim db As DAO.Database\r\n    lngProduktID = Me!cboProduktID\r\n    Me!Startdatum = Now\r\n    Set db = CurrentDb\r\n    If Not Me!cboProduktID.OldValue = lngProduktID Then\r\n        db.Execute &quot;DELETE FROM tblVersendungen WHERE AbonnementID = &quot; _\r\n            &amp; Me!AbonnementID, dbFailOnError\r\n    End If\r\n    Call VersendungenAnlegen(lngProduktID, Me!AbonnementID)\r\n    RunCommand acCmdSaveRecord\r\n    Me.Parent!sfmVersendungen.Form.Requery\r\n    Set db = Nothing\r\nEnd Sub<br\/>\r\nPublic Sub VersendungenAnlegen(lngProduktID As Long, lngAbonnementID As Long)\r\n    Dim intAnzahlAusgaben As Integer, lngAktuelleAusgabeID As Long\r\n    Dim intAktuelleAusgabeNummer As Integer, intAktuelleAusgabeJahr As Integer\r\n    Dim i As Integer\r\n    Dim db As DAO.Database\r\n    Dim strSQL As String\r\n    Dim rstAusgaben As DAO.Recordset\r\n    Dim strVorhanden As String\r\n    intAnzahlAusgaben = DLookup(&quot;AnzahlAusgaben&quot;, &quot;tblProdukte&quot;, &quot;ProduktID = &quot; &amp; lngProduktID)\r\n    lngAktuelleAusgabeID = Nz(DLookup(&quot;AktuelleAusgabeID&quot;, &quot;tblProdukte&quot;, &quot;ProduktID = &quot; _\r\n        &amp; lngProduktID), 0)\r\n    intAktuelleAusgabeNummer = Nz(DLookup(&quot;AusgabeNummer&quot;, &quot;tblAusgaben&quot;, &quot;AusgabeID = &quot; _\r\n        &amp; lngAktuelleAusgabeID), 0)\r\n    intAktuelleAusgabeJahr = Nz(DLookup(&quot;AusgabeJahr&quot;, &quot;tblAusgaben&quot;, &quot;AusgabeID = &quot; _\r\n        &amp; lngAktuelleAusgabeID), 0)\r\n    Set db = CurrentDb\r\n    Set rstAusgaben = db.OpenRecordset(&quot;SELECT * FROM qryProdukteAusgaben WHERE ProduktID = &quot; _\r\n        &amp; lngProduktID &amp; &quot; ORDER BY AusgabeJahr, AusgabeNummer&quot;, dbOpenDynaset)\r\n    rstAusgaben.FindFirst &quot;AusgabeID = &quot; &amp; lngAktuelleAusgabeID\r\n    Do While Not rstAusgaben.EOF And i &lt; intAnzahlAusgaben\r\n         strSQL = &quot;INSERT INTO tblVersendungen(AbonnementID, AusgabeID) VALUES(&quot; &amp; lngAbonnementID _\r\n            &amp; &quot;, &quot; &amp; rstAusgaben!AusgabeID &amp; &quot;)&quot;\r\n        On Error Resume Next\r\n        db.Execute strSQL, dbFailOnError\r\n        If Err.Number = 3022 Then\r\n            strVorhanden = strVorhanden &amp; vbCrLf &amp; rstAusgaben!AusgabeBezeichnung\r\n        End If\r\n        On Error GoTo 0\r\n        i = i + 1\r\n        rstAusgaben.MoveNext\r\n    Loop\r\n    If Len(strVorhanden) &gt; 0 Then\r\n         MsgBox &quot;Folgende Ausgaben sind bereits vorhanden:&quot; &amp; strVorhanden, vbOKOnly\r\n    End If\r\n    If i &lt; intAnzahlAusgaben Then\r\n         MsgBox &quot;Es wurden nur &quot; &amp; i &amp; &quot; Ausgaben f&uuml;r die Versendungen angelegt.&quot;\r\n    End If\r\n    Set db = Nothing\r\nEnd Sub<\/pre>\n<p>Dann pr&uuml;ft die Routine, ob f&uuml;r dieses Abonnement gegebenenfalls nur ein neues Produkt ausgew&auml;hlt wurde &#8211; beispielsweise nach einer Fehleingabe. Wird ein komplett neues Produkt ausgew&auml;hlt, l&ouml;scht die Prozedur alle vorhandenen Versendungen zu diesem Abonnement. Dann ruft die Prozedur die Routine <b>VersendungenAnlegen<\/b> mit der <b>ProduktID <\/b>und der <b>AbonnementID <\/b>auf (s. Modul <b>mdlAbonnements<\/b>). Diese ermittelt zun&auml;chst einige Werte:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Die Anzahl der Ausgaben f&uuml;r das gew&auml;hlte Produkt landet in der Variablen <b>intAnzahlAusgaben<\/b>.<\/li>\n<li class=\"aufz-hlung\">Die ID der f&uuml;r dieses Projekt festgelegten aktuellen Ausgabe wird in der Variablen <b>lngAktuelleAusgabeID <\/b>gespeichert.<\/li>\n<li class=\"aufz-hlung\">Die Nummer und das Jahr dieser Ausgabe werden in die Variablen <b>intAktuelleAusgabeNummer <\/b>und <b>intAktuelleAusgabeJahr <\/b>eingetragen.<\/li>\n<\/ul>\n<p>Danach &ouml;ffnet die Prozedur eine Datensatzgruppe auf Basis der Abfrage <b>qryProdukteAusgaben<\/b>, welche die Tabellen <b>tblProdukteAusgaben <\/b>und <b>tblAusgaben <\/b>zusammenf&uuml;hrt. Diese werden nach den Feldern <b>AusgabeJahr <\/b>und <b>AusgabeNummer <\/b>sortiert und nach der in <b>lngProduktID <\/b>gespeicherten <b>ProduktID <\/b>gefiltert.<\/p>\n<p>Diese Abfrage enth&auml;lt alle Ausgaben f&uuml;r dieses Produkt. Da wir uns lediglich f&uuml;r eine bestimmte Anzahl Ausgaben ab der aktuellen Ausgabe interessieren, springen wir mit der <b>FindFirst<\/b>-Methode zun&auml;chst zur aktuellen Ausgabe.<\/p>\n<p>Danach durchl&auml;uft eine <b>Do While<\/b>-Schleife alle Ausgaben ab der aktuellen Ausgabe. Die Abbruchbedingung tritt ein, wenn das Ende der Datensatzgruppe erreicht wurde oder wenn die gew&uuml;nschte Anzahl Versendungen angelegt wurde. Innerhalb dieser Schleife wird zun&auml;chst eine SQL-Anweisung zusammengestellt, welche einen neuen Datensatz zur Tabelle <b>tblVersendungen <\/b>hinzuf&uuml;gen soll. Dabei wird das Feld <b>AbonnementID <\/b>mit dem automatisch zum gleichnamigen Feld des Unterformulars <b>sfmAbonnements <\/b>hinzugef&uuml;gten Wert gef&uuml;ttert und das Feld <b>AusgabeID <\/b>mit dem entsprechenden Wert der Datensatzgruppe <b>rstAusgaben<\/b>.<\/p>\n<p>Bevor diese SQL-Abfrage tats&auml;chlich ausgef&uuml;hrt wird, deaktiviert die Prozedur die Fehlerbehandlung. Sollte das Abonnement n&auml;mlich bereits zuvor einmal angelegt worden sein, sind eventuell bereits Datens&auml;tze vorhanden. Wird eine Kombination aus Ausgabe und Abonnement zwei Mal angelegt, l&ouml;st dies den Fehler <b>3022 <\/b>aus, der hier entsprechend behandelt wird &#8211; und zwar, indem der Zeichenkette <b>strVorhanden <\/b>die Bezeichnung der Ausgabe angeh&auml;ngt wird. Schlie&szlig;lich wird <b>i<\/b> um eins erh&ouml;ht.<\/p>\n<p>Nach dem Durchlaufen der Schleife pr&uuml;ft die Prozedur noch, ob Versendungen bereits vorhanden waren, und gibt eine entsprechende Meldung aus; dies geschieht auch, wenn weniger Versendungen als erwartet angelegt wurden. Dies kann etwa dann geschehen, wenn nicht mehr gen&uuml;gend Ausgaben in der Tabelle <b>tblAusgaben <\/b>gefunden wurden.<\/p>\n<p>Zu guter Letzt speichert wiederum die aufrufende Prozedur <b>cboProduktID_AfterUpdate <\/b>den Datensatz und aktualisiert das Unterformular <b>sfmVersendungen<\/b> des &uuml;bergeordneten Formulars, damit die angelegten Versendungen direkt angezeigt werden.<\/p>\n<p><b>Versendungen manuell anlegen<\/b><\/p>\n<p>Das Formular soll es auch erlauben, manuell Verwendungen anzulegen. Dies kann etwa der Fall sein, wenn Sie einem Kunden eine oder mehrere Ausgaben im Rahmen einer Bonusaktion oder dergleichen spendieren m&ouml;chten.<\/p>\n<p>Das Kombinationsfeld <b>cboAusgabeID<\/b> sollte dann nat&uuml;rlich nur solche Werte enthalten, die auch in dem im Abonnement angegebenen Produkt enthalten sind.<\/p>\n<p>Au&szlig;erdem soll verhindert werden, dass der Benutzer eine Ausgabe zu einem Abonnement hinzuf&uuml;gt, das bereits f&uuml;r eine Versendung vorgesehen ist. Im Datenmodell ist dies bereits durch einen eindeutigen Index &uuml;ber die Felder <b>AbonnementID <\/b>und <b>AusgabeID <\/b>in der Tabelle <b>tblVersendungen <\/b>abgesichert, aber der Benutzer soll nat&uuml;rlich nicht mit der beim Verletzen von derartigen Restriktionen &uuml;blichen Fehlermeldung konfrontiert werden.<\/p>\n<p>Dummerweise ist es nicht m&ouml;glich, nur die noch nicht verwendeten Datens&auml;tze der zugrunde liegenden Tabelle <b>tblVersendungen <\/b>anzuzeigen &#8211; wenn Sie die Datensatzherkunft um solche Ausgaben-Datens&auml;tze beschneiden, die in bereits zugeordneten Versendungen vorkommen, werden diese in den bereits vorhandenen Eintr&auml;gen nicht mehr angezeigt.<\/p>\n<p>Allerdings k&ouml;nnen wir die Daten wenigstens so sortieren, dass die noch nicht verwendeten Eintr&auml;ge zuerst angezeigt werden. Dazu legen Sie zun&auml;chst eine Basisabfrage an, die wie in Bild 18 die Tabellen <b>tblAusgaben<\/b>, <b>tblProdukteAusgaben<\/b>, <b>tblProdukte <\/b>und <b>tblAbonnements <\/b>zusammenf&uuml;hrt.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/AbonnementsVerwalten-web-images\/pic020.png\" alt=\"pic020.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 18: Basisabfrage zum Sortieren der Ausgaben zur Auswahl f&uuml;r die Versendung<\/span><\/b><\/p>\n<p>Die Abfrage soll die Felder <b>AusgabeID<\/b>, <b>AusgabeBezeichnung<\/b>, <b>AbonnementID<\/b>, <b>AusgabeJahr<\/b>, und <b>AusgabeNummer<\/b> enthalten. Speichern Sie diese Abfrage unter dem Namen <b>qryAusgabenNachAbonnements<\/b>. Legen Sie dann eine neue Abfrage an, welche die zuvor angelegte Abfrage <b>qryAusgabenNachAbonnements <\/b>sowie die Tabelle <b>tblVersendungen <\/b>als Datenherkunft enth&auml;lt.<\/p>\n<p>F&uuml;gen Sie alle Felder der Abfrage <b>qryAusgabenNachAbonnements <\/b>zum Entwurfsraster hinzu und zus&auml;tzlich das Feld <b>VersendungID <\/b>der Tabelle <b>tblVersendungen<\/b>.<\/p>\n<p>Zu diesem Zeitpunkt liegen noch keine Beziehungen zwischen der Abfrage <b>qryAusgabenNachAbonnements <\/b>und <b>tblVersendungen <\/b>im Abfrageentwurf vor. Diese f&uuml;gen Sie nun hinzu: Die Abfrage soll nur diejenigen Datens&auml;tze aus <b>qryAusgabenNachAbonnements <\/b>liefern, die &uuml;ber die Felder <b>AusgabeID <\/b>und <b>AbonnementID <\/b>mit der Tabelle <b>tblVersendungen <\/b>verkn&uuml;pft sind. Dazu setzen Sie die entsprechenden Beziehungspfeile. Aber wollten wir denn nicht gerade die &uuml;brigen Datens&auml;tze anzeigen &#8211; also diejenigen, die noch nicht in der Tabelle <b>tblVersendungen <\/b>erfasst sind Doch: Also &auml;ndern Sie die Beziehungstypen der beiden Beziehungen wie in Bild 19 ab &#8211; also auf die Weise, dass die Abfrage alle Datens&auml;tze der Abfrage <b>qryAusgabenNachAbonnements<\/b> anzeigt, unabh&auml;ngig davon, ob es verkn&uuml;pfte Datens&auml;tze in der Tabelle <b>tblVersendungen <\/b>gibt.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/AbonnementsVerwalten-web-images\/pic021.png\" alt=\"pic021.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 20: Abfrage zum Sortieren nach zu versendenden Ausgaben<\/span><\/b><\/p>\n<p>Speichern Sie die Abfrage unter dem Namen <b>qryAusgabenNachAbonnementsMitVersendung<\/b>.<\/p>\n<p>Die Abfrage sieht danach wie in Bild 20 aus. Hier f&uuml;gen Sie noch Sortierungen nach den Feldern <b>VersendungID<\/b>, <b>AusgabeJahr <\/b>und <b>AusgabeNummer <\/b>ein. Dadurch, dass zuerst nach den Versendungen sortiert wird, erscheinen die Datens&auml;tze mit einem Nullwert f&uuml;r dieses Feld ganz oben.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/AbonnementsVerwalten-web-images\/pic023.png\" alt=\"pic023.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 21: Nach zu versendenden und nicht zu versendenden Ausgaben sortierte Datens&auml;tze<\/span><\/b><\/p>\n<p>Das Ergebnis sieht dann etwa wie in Bild 21 aus. Die Eintr&auml;ge, deren Feld <b>VersendungID <\/b>den Wert <b>Null <\/b>hat, werden ganz oben angezeigt und nach Jahr und Nummer der Ausgabe sortiert. F&uuml;r das Kombinationsfeld m&uuml;ssen wir den Inhalt nat&uuml;rlich noch nach dem Abonnement filtern, denn es sollen ja nur die f&uuml;r das aktuell im Unterformular <b>sfmAbonnements <\/b>markierte Abonnement angelegten Ausgaben angezeigt werden. <\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/AbonnementsVerwalten-web-images\/pic022.png\" alt=\"pic022.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 19: Einstellung der Verkn&uuml;pfungseigenschaften<\/span><\/b><\/p>\n<p>Dazu legen Sie f&uuml;r das Ereignis <b>Beim Laden <\/b>des Unterformulars eine Ereignisprozedur an, die wie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-78-anchor\">Listing 4<\/a><\/span> aussieht.<\/p>\n<p class=\"listingueberschrift\">Listing 4: F&uuml;llen des Kombinationsfeldes zur Auswahl von Ausgaben zur Versendung<\/p>\n<pre>Private Sub Form_Load()\r\n    Dim lngAbonnementID As Long\r\n    lngAbonnementID = Nz(Forms!frmKunden!txtAktuellesAbonnementID)\r\n    Forms!frmKunden!sfmVersendungen.Form!cboAusgabeID.RowSource = _\r\n        &quot;SELECT * FROM qryAusgabenNachAbonnementMitVersendung WHERE AbonnementID = &quot; &amp; lngAbonnementID\r\n    Me!cboAusgabeID.Requery\r\nEnd Sub<\/pre>\n<p>Die Prozedur liest die Nummer des aktuellen Abonnements aus und f&uuml;llt das Kombinationsfeld <b>cboAusgabeID <\/b>mit der entsprechenden Datensatzherkunft aus Basis der Abfrage <b>qryAusgabenNachAbonnementsMitVersendung<\/b>. Schlie&szlig;lich ben&ouml;tigen Sie noch eine kleine Ereignisprozedur, die das Kombinationsfeld nach dem Ausw&auml;hlen einer der geplanten Versendungen aktualisiert. Dazu reicht der einfache Aufruf der <b>Requery<\/b>-Methode nach dem Anzeigen eines neuen Datensatzes. Die entsprechende Ereignisprozedur <b>Form_Current <\/b>im Unterformular <b>sfmVersendungen <\/b>sieht wie folgt aus:<\/p>\n<pre>Private Sub Form_Current()\r\n    Me!cboAusgabeID.Requery\r\nEnd Sub<\/pre>\n<p>Wenn Sie nun das Kombinationsfeld <b>cboAusgabeID <\/b>aufklappen, erscheinen die noch als Versendung markierten Ausgaben oben in der Liste, die bereits verwendeten folgen direkt dahinter (s. Bild 22). Der Benutzer kann so zwar immer noch doppelte Eintr&auml;ge vornehmen, aber die entsprechenden Ausgaben werden immerhin weiter hinten angezeigt.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/AbonnementsVerwalten-web-images\/pic024.png\" alt=\"pic024.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 22: Die noch nicht zu versendenden Ausgaben werden in der Auswahlliste ganz oben dargestellt.<\/span><\/b><\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Im ersten Teil dieser Beitragsreihe haben Sie das Datenmodell der Abonnementverwaltung kennengelernt und einige Formulare zur Eingabe von Kunden, Produkten und Abonnements erstellt. Es fehlt jedoch noch eine ganze Reihe Funktionen. Abonnements sollen verl&auml;ngert werden k&ouml;nnen, und au&szlig;erdem m&uuml;ssen die Ausgaben &#8211; welcher Art auch immer &#8211; verschickt werden. Dazu muss man zu gegebenen Zeitpunkten ermitteln k&ouml;nnen, welcher Benutzer welche Ausgabe erhalten beziehungsweise zugesendet bekommen soll.<\/p>\n<p>Um diese Funktion k&uuml;mmern wir uns im zweiten Teil dieser Beitragsreihe, der in der folgenden Ausgabe von <b>Access im Unternehmen <\/b>erscheint.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Abonnementverwaltung.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{2BA7CBBD-BC01-4A97-96CC-EDEE246D0F98}\/aiu_866.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn man an Abonnements denkt, fallen einem zun&auml;chst Zeitungen oder Magazine ein. Es gibt aber nat&uuml;rlich auch Abonnements f&uuml;r alle anderen Bereiche des Lebens &#8211; vom Sockenabo, das einem regelm&auml;&szlig;ig neue Socken garantiert, bis hin zum Abonnement &uuml;ber die regelm&auml;&szlig;ige Lieferung von Adressetiketten. Allen Abonnements ist gemeinsam, dass diese verwaltet werden m&uuml;ssen, damit jeder Kunde das richtige Produkt zum passenden Zeitpunkt erh&auml;lt. Dieser Beitrag zeigt M&ouml;glichkeiten zum Verwalten von Abonnements auf.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662012,66062012,44000027],"tags":[],"class_list":["post-55000866","post","type-post","status-publish","format-standard","hentry","category-662012","category-66062012","category-Loesungen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Abonnements verwalten, Teil 1 - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Abonnements_verwalten_Teil_1\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Abonnements verwalten, Teil 1\" \/>\n<meta property=\"og:description\" content=\"Wenn man an Abonnements denkt, fallen einem zun&auml;chst Zeitungen oder Magazine ein. Es gibt aber nat&uuml;rlich auch Abonnements f&uuml;r alle anderen Bereiche des Lebens - vom Sockenabo, das einem regelm&auml;&szlig;ig neue Socken garantiert, bis hin zum Abonnement &uuml;ber die regelm&auml;&szlig;ige Lieferung von Adressetiketten. Allen Abonnements ist gemeinsam, dass diese verwaltet werden m&uuml;ssen, damit jeder Kunde das richtige Produkt zum passenden Zeitpunkt erh&auml;lt. Dieser Beitrag zeigt M&ouml;glichkeiten zum Verwalten von Abonnements auf.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Abonnements_verwalten_Teil_1\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:49:59+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg05.met.vgwort.de\/na\/535b26fbafc4467b9cfbafe5be316ded\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"30\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Abonnements_verwalten_Teil_1\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Abonnements_verwalten_Teil_1\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Abonnements verwalten, Teil 1\",\"datePublished\":\"2020-05-22T21:49:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Abonnements_verwalten_Teil_1\\\/\"},\"wordCount\":5331,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Abonnements_verwalten_Teil_1\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/535b26fbafc4467b9cfbafe5be316ded\",\"articleSection\":[\"2012\",\"6\\\/2012\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Abonnements_verwalten_Teil_1\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Abonnements_verwalten_Teil_1\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Abonnements_verwalten_Teil_1\\\/\",\"name\":\"Abonnements verwalten, Teil 1 - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Abonnements_verwalten_Teil_1\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Abonnements_verwalten_Teil_1\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/535b26fbafc4467b9cfbafe5be316ded\",\"datePublished\":\"2020-05-22T21:49:59+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Abonnements_verwalten_Teil_1\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Abonnements_verwalten_Teil_1\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Abonnements_verwalten_Teil_1\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/535b26fbafc4467b9cfbafe5be316ded\",\"contentUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/535b26fbafc4467b9cfbafe5be316ded\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Abonnements_verwalten_Teil_1\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Abonnements verwalten, Teil 1\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Abonnements verwalten, Teil 1 - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Abonnements_verwalten_Teil_1\/","og_locale":"de_DE","og_type":"article","og_title":"Abonnements verwalten, Teil 1","og_description":"Wenn man an Abonnements denkt, fallen einem zun&auml;chst Zeitungen oder Magazine ein. Es gibt aber nat&uuml;rlich auch Abonnements f&uuml;r alle anderen Bereiche des Lebens - vom Sockenabo, das einem regelm&auml;&szlig;ig neue Socken garantiert, bis hin zum Abonnement &uuml;ber die regelm&auml;&szlig;ige Lieferung von Adressetiketten. Allen Abonnements ist gemeinsam, dass diese verwaltet werden m&uuml;ssen, damit jeder Kunde das richtige Produkt zum passenden Zeitpunkt erh&auml;lt. Dieser Beitrag zeigt M&ouml;glichkeiten zum Verwalten von Abonnements auf.","og_url":"https:\/\/access-im-unternehmen.de\/Abonnements_verwalten_Teil_1\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:49:59+00:00","og_image":[{"url":"http:\/\/vg05.met.vgwort.de\/na\/535b26fbafc4467b9cfbafe5be316ded","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"30\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Abonnements_verwalten_Teil_1\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Abonnements_verwalten_Teil_1\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Abonnements verwalten, Teil 1","datePublished":"2020-05-22T21:49:59+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Abonnements_verwalten_Teil_1\/"},"wordCount":5331,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Abonnements_verwalten_Teil_1\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/535b26fbafc4467b9cfbafe5be316ded","articleSection":["2012","6\/2012","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Abonnements_verwalten_Teil_1\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Abonnements_verwalten_Teil_1\/","url":"https:\/\/access-im-unternehmen.de\/Abonnements_verwalten_Teil_1\/","name":"Abonnements verwalten, Teil 1 - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Abonnements_verwalten_Teil_1\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Abonnements_verwalten_Teil_1\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/535b26fbafc4467b9cfbafe5be316ded","datePublished":"2020-05-22T21:49:59+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Abonnements_verwalten_Teil_1\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Abonnements_verwalten_Teil_1\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Abonnements_verwalten_Teil_1\/#primaryimage","url":"http:\/\/vg05.met.vgwort.de\/na\/535b26fbafc4467b9cfbafe5be316ded","contentUrl":"http:\/\/vg05.met.vgwort.de\/na\/535b26fbafc4467b9cfbafe5be316ded"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Abonnements_verwalten_Teil_1\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Abonnements verwalten, Teil 1"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000866","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000866"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000866\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000866"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000866"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000866"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}