{"id":55000723,"date":"2026-08-01T00:00:00","date_gmt":"2026-08-01T00:00:00","guid":{"rendered":"http:\/\/access-basics.de\/723"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Rechnungsverwaltung_Rechnungen_eines_Kunden","status":"publish","type":"post","link":"https:\/\/access-basics.de\/index.php\/Rechnungsverwaltung_Rechnungen_eines_Kunden.html","title":{"rendered":"Rechnungsverwaltung: Rechnungen eines Kunden"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg04.met.vgwort.de\/na\/894e8aec323245aea8e4a39f87a7e85f\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p class='introduction'>Das Kundendetailformular zeigt bisher nur die Stammdaten eines Kunden &#8211; Name, Anschrift, Kontaktdaten. Was fehlt, ist der Blick auf das Gesch&auml;ft: Welche Rechnungen hat dieser Kunde eigentlich erhalten? Diese Frage beantworten wir, indem wir dem Formular ein Unterformular hinzuf&uuml;gen, das genau die Rechnungen des gerade angezeigten Kunden auflistet. Das Prinzip dahinter kennen wir bereits aus dem Rechnungsformular &#8211; Verkn&uuml;pfen von und Verkn&uuml;pfen nach -, nur wenden wir es diesmal auf eine andere Beziehung an. Und ganz nebenbei wird dabei sichtbar, wozu die historisierten Felder aus dem Datenmodell gut sind. Au&szlig;erdem legen wir von hier aus neue Rechnungen an und &ouml;ffnen vorhandene zum Bearbeiten. Wie das gelingt, liest Du in diesem Artikel.<\/p>\n<h2>Beispieldatenbank<\/h2>\n<p>Die Beispiele dieses Artikels findest Du in der Datenbank Rechnungsverwaltung_RechnungenEinesKundenAnzeigen.accdb<\/b>. Sie setzt die Reihe fort und enth&auml;lt die Formulare der vorherigen Artikel bereits.<\/p>\n<h2>Warum die Rechnungen ins Kundenformular geh&ouml;ren<\/h2>\n<p>Wer mit einem Kunden telefoniert, will h&auml;ufig zweierlei gleichzeitig sehen: seine Stammdaten und das, was zwischen ihm und uns bisher gelaufen ist. Bisher liegen diese beiden Dinge in getrennten Formularen. Die Anschrift steht in frmKundendetail<\/b>, die Rechnungen erreicht man nur &uuml;ber <b>frmRechnung<\/b> &#8211; und dort muss man sie erst suchen.<\/p>\n<p>Bequemer ist es, die Rechnungen dorthin zu holen, wo der Kunde ohnehin schon auf dem Bildschirm steht. Genau daf&uuml;r sind Unterformulare da: Sie zeigen zu einem Datensatz des Hauptformulars die zugeh&ouml;rigen Datens&auml;tze der n-Seite. Beim Rechnungsformular waren das die Positionen zu einer Rechnung, hier sind es die Rechnungen zu einem Kunden. Die Beziehung ist eine andere, das Verfahren ist dasselbe.<\/p>\n<h2>Das Unterformular anlegen<\/h2>\n<p>Wir erstellen &uuml;ber Erstellen|Formulare|Formularentwurf<\/b> ein neues Formular und binden es &uuml;ber die Eigenschaft <b>Datensatzquelle<\/b> an die Tabelle <b>tblRechnungen<\/b>. Gespeichert wird es unter dem Namen <b>sfmKundeRechnungen<\/b>.<\/p>\n<p>Weil es sp&auml;ter als Liste innerhalb eines anderen Formulars erscheinen soll, stellen wir seine Standardansicht<\/b> auf <b>Datenblatt<\/b>. Damit zeigt es seine Datens&auml;tze zeilenweise untereinander, so wie wir es schon von den &Uuml;bersichtsformularen der Artikel und Kunden kennen (siehe Bild 1).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_723_001.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_723_001.png\" alt=\"Der Entwurf von sfmKundeRechnungen mit der Standardansicht Datenblatt\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 1: Der Entwurf von sfmKundeRechnungen mit der Standardansicht Datenblatt<\/p>\n<h2>Welche Felder geh&ouml;ren hinein?<\/h2>\n<p>Nun ziehen wir die Felder aus der Feldliste in den Detailbereich. F&uuml;r eine Rechnungs&uuml;bersicht sind das die Angaben, an denen man eine Rechnung wiedererkennt: die Rechnungsnummer<\/b>, das <b>Rechnungsdatum<\/b>, das <b>Faelligkeitsdatum<\/b> und das Nachschlagefeld <b>RechnungsstatusID<\/b>, das den Status im Klartext anzeigt.<\/p>\n<p>Zwei weitere Felder nehmen wir hinzu, und die verdienen eine Erkl&auml;rung: Kundennummer<\/b> und <b>KundeFirma<\/b>. Auf den ersten Blick sind sie &uuml;berfl&uuml;ssig &#8211; wir wissen doch, welchen Kunden wir gerade ansehen, schlie&szlig;lich steht er dar&uuml;ber im Hauptformular. Warum also die Angaben wiederholen?<\/p>\n<p>Der Grund liegt im Datenmodell. Diese beiden Felder geh&ouml;ren zu den historisierten Feldern in <b>tblRechnungen<\/b>. Sie stammen nicht aus <b>tblKunden<\/b>, sondern sind Kopien, die beim Anlegen der Rechnung dort hineingeschrieben wurden. Sie zeigen also nicht, wie der Kunde heute hei&szlig;t, sondern wie er hie&szlig;, als die Rechnung angelegt wurde.<\/p>\n<p>Damit wird die Historisierung zum ersten Mal sichtbar. Benennt sich ein Kunde um &#8211; aus einer Einzelfirma wird eine GmbH -, dann &auml;ndern wir seinen Stammdatensatz, und das Hauptformular zeigt sofort den neuen Namen. Die alten Rechnungen im Unterformular tragen aber weiterhin den alten. Genau so soll es sein: Eine gestellte Rechnung ist ein Dokument, das sich nicht r&uuml;ckwirkend &auml;ndert. Wer diese Spalten nicht braucht, kann sie nat&uuml;rlich weglassen &#8211; als Anschauungsobjekt f&uuml;r das Prinzip sind sie aber lehrreich.<\/p>\n<h2>Das Unterformular einbauen<\/h2>\n<p>Jetzt &ouml;ffnen wir frmKundendetail<\/b> in der Entwurfsansicht. Wir bauen zun&auml;chst den oberen Teil ein wenig um &#8211; die bisher in einer Spalte angezeigten Felder der Tabelle <b>tblKunden<\/b> verschieben wir nun so, dass diese teilweise nebeneinander erscheinen. Unter den Stammdatenfeldern entsteht so mehr Platz &#8211; dorthin ziehen wir das Formular <b>sfmKundeRechnungen<\/b> aus dem Navigationsbereich. Access legt daraufhin ein Unterformular-Steuerelement an, das denselben Namen tr&auml;gt wie das Formular, und stellt seine Eigenschaft <b>Herkunftsobjekt<\/b> auf <b>Form.sfmKundeRechnungen<\/b> ein.<\/p>\n<p>Das mitgelieferte Bezeichnungsfeld beschriften wir mit Rechnungen:<\/b>, damit klar ist, was die Liste zeigt. Und weil das Unterformular beim Vergr&ouml;&szlig;ern des Formulars mitwachsen soll, setzen wir seinen <b>Horizontalen Anker<\/b> und seinen <b>Vertikalen Anker<\/b> auf <b>Beide<\/b>. Die Schaltfl&auml;chen <b>cmdOK<\/b> und <b>cmdAbbrechen<\/b> darunter bekommen wie gewohnt den <b>Vertikalen Anker<\/b> <b>Unten<\/b>, damit sie nicht unter dem wachsenden Unterformular verschwinden.<\/p>\n<h2>Verkn&uuml;pfen von und Verkn&uuml;pfen nach<\/h2>\n<p>Nun der entscheidende Punkt: Woher wei&szlig; das Unterformular, welche Rechnungen es zeigen soll? Es ist an <b>tblRechnungen<\/b> gebunden und k&ouml;nnte zun&auml;chst einmal alle Rechnungen der Datenbank anzeigen. Dass es sich auf die des angezeigten Kunden beschr&auml;nkt, regeln zwei Eigenschaften des Unterformular-Steuerelements.<\/p>\n<p><b>Verkn&uuml;pfen von<\/b> benennt das Feld im Hauptformular, <b>Verkn&uuml;pfen nach<\/b> das Feld im Unterformular. Beide tragen hier den Wert <b>KundeID<\/b> &#8211; im Hauptformular ist das der Prim&auml;rschl&uuml;ssel des Kunden, im Unterformular der Fremdschl&uuml;ssel der Rechnung. Access filtert daraufhin die Datens&auml;tze des Unterformulars so, dass nur die &uuml;brig bleiben, deren <b>KundeID<\/b> mit der des angezeigten Kunden &uuml;bereinstimmt (siehe Bild 2).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_723_002.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_723_002.png\" alt=\"Die Eigenschaften Verkn&uuml;pfen von und Verkn&uuml;pfen nach des Unterformular-Steuerelements\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 2: Die Eigenschaften Verkn&uuml;pfen von und Verkn&uuml;pfen nach des Unterformular-Steuerelements<\/p>\n<p>In den meisten F&auml;llen tr&auml;gt Access diese beiden Eigenschaften selbst&auml;ndig ein, sobald man das Unterformular hineinzieht &#8211; es erkennt die Beziehung zwischen tblKunden<\/b> und <b>tblRechnungen<\/b> aus dem Datenmodell. Bleiben die Felder leer oder steht etwas Unerwartetes darin, tr&auml;gt man sie von Hand nach. Ein Blick lohnt sich in jedem Fall, denn ein fehlender Eintrag f&auml;llt sofort auf: Das Unterformular zeigt dann bei jedem Kunden dieselbe, viel zu lange Liste.<\/p>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Access &#091;basics&#093;<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/282\/access-basics?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 400 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/access-basics.de\/data\/wp\/v2\/posts\/55000723\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/index.php\/data\/wp\/v2\/posts\/55000723?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/access-basics.de\/data\/wp\/v2\/posts\/55000723\/\"\/>\n\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"e450f295ee\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Das Kundendetailformular zeigt bisher nur die Stammdaten eines Kunden &#8211; Name, Anschrift, Kontaktdaten. Was fehlt, ist der Blick auf das Gesch&auml;ft: Welche Rechnungen hat dieser Kunde eigentlich erhalten? Diese Frage beantworten wir, indem wir dem Formular ein Unterformular hinzuf&uuml;gen, das genau die Rechnungen des gerade angezeigten Kunden auflistet. Das Prinzip dahinter kennen wir bereits aus dem Rechnungsformular &#8211; Verkn&uuml;pfen von und Verkn&uuml;pfen nach -, nur wenden wir es diesmal auf eine andere Beziehung an. Und ganz nebenbei wird dabei sichtbar, wozu die historisierten Felder aus dem Datenmodell gut sind. Au&szlig;erdem legen wir von hier aus neue Rechnungen an und &ouml;ffnen vorhandene zum Bearbeiten. Wie das gelingt, liest Du in diesem Artikel.<\/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,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662026,66042026,44000014],"tags":[],"class_list":["post-55000723","post","type-post","status-publish","format-standard","hentry","category-662026","category-66042026","category-Loesungen"],"aioseo_notices":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v15.9.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Rechnungsverwaltung: Rechnungen eines Kunden - Access [basics]<\/title>\n<link rel=\"canonical\" href=\"https:\/\/access-basics.de\/index.php\/Rechnungsverwaltung_Rechnungen_eines_Kunden.html\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Rechnungsverwaltung: Rechnungen eines Kunden - Access [basics]\" \/>\n<meta property=\"og:description\" content=\"Das Kundendetailformular zeigt bisher nur die Stammdaten eines Kunden - Name, Anschrift, Kontaktdaten. Was fehlt, ist der Blick auf das Gesch&auml;ft: Welche Rechnungen hat dieser Kunde eigentlich erhalten? Diese Frage beantworten wir, indem wir dem Formular ein Unterformular hinzuf&uuml;gen, das genau die Rechnungen des gerade angezeigten Kunden auflistet. Das Prinzip dahinter kennen wir bereits aus dem Rechnungsformular - Verkn&uuml;pfen von und Verkn&uuml;pfen nach -, nur wenden wir es diesmal auf eine andere Beziehung an. Und ganz nebenbei wird dabei sichtbar, wozu die historisierten Felder aus dem Datenmodell gut sind. Au&szlig;erdem legen wir von hier aus neue Rechnungen an und &ouml;ffnen vorhandene zum Bearbeiten. Wie das gelingt, liest Du in diesem Artikel.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-basics.de\/index.php\/Rechnungsverwaltung_Rechnungen_eines_Kunden.html\" \/>\n<meta property=\"og:site_name\" content=\"Access [basics]\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-01T00:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"-0001-11-30T00:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg04.met.vgwort.de\/na\/894e8aec323245aea8e4a39f87a7e85f\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Gesch\u00e4tzte Lesezeit\">\n\t<meta name=\"twitter:data1\" content=\"12\u00a0Minuten\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/access-basics.de\/#website\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Access [basics]\",\"description\":\"DAS ACCESS-MAGAZIN F\\u00dcR ALLE, DIE VON 0 AUF 100 WOLLEN\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/access-basics.de\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Rechnungsverwaltung_Rechnungen_eines_Kunden.html#primaryimage\",\"inLanguage\":\"de\",\"url\":\"http:\/\/vg04.met.vgwort.de\/na\/894e8aec323245aea8e4a39f87a7e85f\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Rechnungsverwaltung_Rechnungen_eines_Kunden.html#webpage\",\"url\":\"https:\/\/access-basics.de\/index.php\/Rechnungsverwaltung_Rechnungen_eines_Kunden.html\",\"name\":\"Rechnungsverwaltung: Rechnungen eines Kunden - Access [basics]\",\"isPartOf\":{\"@id\":\"https:\/\/access-basics.de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Rechnungsverwaltung_Rechnungen_eines_Kunden.html#primaryimage\"},\"datePublished\":\"2026-08-01T00:00:00+00:00\",\"dateModified\":\"-0001-11-30T00:00:00+00:00\",\"author\":{\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\"},\"breadcrumb\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Rechnungsverwaltung_Rechnungen_eines_Kunden.html#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/access-basics.de\/index.php\/Rechnungsverwaltung_Rechnungen_eines_Kunden.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Rechnungsverwaltung_Rechnungen_eines_Kunden.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Rechnungsverwaltung_Rechnungen_eines_Kunden.html\",\"url\":\"https:\/\/access-basics.de\/index.php\/Rechnungsverwaltung_Rechnungen_eines_Kunden.html\",\"name\":\"Rechnungsverwaltung: Rechnungen eines Kunden\"}}]},{\"@type\":\"Person\",\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/#personlogo\",\"inLanguage\":\"de\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","_links":{"self":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000723","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/comments?post=55000723"}],"version-history":[{"count":0,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000723\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/media?parent=55000723"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/categories?post=55000723"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/tags?post=55000723"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}