Access

Liebe/-r Experte/-in,
habe da ein Problem mit Beziehungen in meiner Datenbank.
Also, ich habe Ein Formular „Rechnungskopf_F“ welches auf einer Tabelle basiert. Das Formular enthält das Feld „RechNr“ welche ich über ein Modul generieren lasse.
In diesem Formular gibt es das Unterformular „Rechnung_F“ welches auf einer Abfrage basiert. Dieses Formular beinhaltet sie einzelnen Rechnungsposten.Um die Posten der richtigen Rechnung zuzuordnen, enthält das Formular ein Feld „ReNr“, also die gleiche wie im Kopf. Wenn ich jetzt eine Rechnung löschen möchte, sollen die Posten zu dieser Rechnungsnummer auch gelöscht werden. Das bekomme ich einfach nicht hin. Entweder gibt es Probleme wenn ich die Löschweitergabe in den Beziehungen aktiviere und es lässt sich kein Datensatz hinzufügen, oder die Rechnungsposten werden nicht gelöscht. Hoffe es kann mir einer hier helfen.
Vielen Dank, Markus

Hallo Markus,
ich bin zur Zeit in Reha und kann dir, da ich nur ein ‚Not-Notebook‘ dabei habe keine Screenshots schicken.
Mein Tip:
Schau dir die Beziehungen der Tabelle an und stelle auf ‚Referentielle Integrität‘. So waren die Begriffe bei Access 2000 und Access XP. Du musst nach sinngemäßen begriffen suchen. Möglicherwiese heißt der Menüpunkt auch Datendiagramm oder so ähnlich.
Wie gesagt, ich hab keine Möglichkeit dir anders zu helfen, hab hier nur Office 2007 (Excel, Word).
Ich hoffe du kannst mit meiner Antwort etwas anfangen.
LG
Manfred

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Markus,
Du hast also eine Tabelle für Rechnungen und eine für Rechnungspositionen – das ist gut! Die Verknüpfung führst Du offensichtlich über die eigens generierte „ReNr“ durch – das empfehle ich schon lange nicht mehr, obwohl es im Prinzip nicht falsch ist!
Mein Vorschlag: Richte in Deiner Rechnungstabelle einen Primärschlüssel mit einem zusätzlichen „AutoWert“ ein (das sollte man seit Speicherplatz nichts mehr kostet grundsätzlich tun!!)
Dein Formular richtest Du dann OHNE Unterformular (basierend auf nur EINER Abfrage) unter Aufteilung auf Formularkopf usw. ein. Du wirst sehen: Alle Deine Probleme lösen sich wie von selbst auf!
Viel Erfolg
xratlos

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

danke für die Hilfe. Dabei habe ich nur ein Problem.
Ich hatte diese Variante schon probiert, aber dann tritt folgendes Problem auf.Also, alle Felder kommen aus einer Tabelle. Das Formular beruht auf einer Abfrage. Im Formularkopf gibt es folgende Felder:KdNr,ReNr,RechDatum, und ID(AutoWert).
Wenn ich jetzt die Rechnungspositionen eingebe, wird mir bei Eingabe einer weiteren Position die KdNr auf „0“ gesetzt. Das habe ich umgangen mit einer „AfterUpdate“ Anweisung im ersten Feld der Positionen. Hier wird also die KdNr neu eingetragen.
Jetzt habe ich aber das Problem, dass jede Position auch eine neue Rechnungsnummer erhält. Würde mich freuen, wenn du mir da noch einmal helfen könntest.
Viele Grüße, Markus

Hallo Manfred,

danke für deine Antwort.Referentielle Integrität habe ich schon versucht, aber wird irgendwie nicht zugelassen und wenn, dann gibt es Probleme wenn ich die einzelnen Rechnungsposten eingebe.
Werde das aber bestimmt noch hinbekommen, das übt schlieslich auch :smile:
Dir wünsche ich noch viel Erholung
Markus

Hallo Markus,
tut mir leid, bei meiner ersten Antwort habe ich ein wenig zu schnell aus der Hüfte geschossen: Deine Version Ober-Unterformular war schon richtig! Aber: Du brauchst zwei Tabellen – eine für die Rechnung (KdNr, ReNr usw.) und eine für ALLE Rechnungspositionen verknüpft über die ID (mit referentieller Integrität). Wenn Du jetzt eine neue Rechnung anlegst, musst Du im Formular für die Generierung der ReNr sorgen (z.B. mit BeforeUpdate) oder so wie Du es schon probiert hast. Achte aber darauf, dass eine ggf. schon vorhandene ReNr nicht überschrieben werden kann!!
Das Unterformular bezieht sich dann auf eine eigene Abfrage (oder direkt auf die Tabelle). Da die Verknüpfung zwischen Ober- und Unterformular auch dort (im Formular) festgelegt ist, kannst Du beliebig viele Positionen als eigene DS eintragen. Den richtigen Sekundärschlüssel fügt Access automatisch ein.
Deine Beobachtung, dass die KdNr = 0 wird entsteht sonst dadurch, dass ein neuer Rechnungs-DS angelegt wird, aber das willst Du ja gar nicht.
Ich hoffe, ich habe Dein Problem jetzt richtig erkannt. Sonst melde Dich ruhig wieder. Viel Spaß
xratlos

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Au weia, vielleicht sollte ich mir den Namem „Ratlos“ zulegen.
Irgendwie funktioniert es nicht. Habe einmal 2 Screenshots gemacht, vielleicht kannst du daraus etwas erkennen, was ich falsch mache. Habe die Bilder mal hier hochgeladen: http://www.wesele.de/access/
Danke noch einmal für die Hilfe.
Markus

Hallo Markus,
der Name „Ratlos“ ist schon längst vergeben – sonst hätte ich ihn!!
Ein Tipp vorweg: Ich versuche in einer DB immer Feldnamen nur einmalig zu vergeben. Das ist zwar nicht vorgeschrieben, erspart aber trotzdem viel Kummer (z.B. ID ID)!!
In der Rechnung_T darf ID kein Autowert sein!! Das ist ein Sekundärschlüssel! Also nur eine Zahl (LongInteger)! Beim Umwandeln musst Du aber jetzt alles von Hand erstmal richtig machen!! Ich gehe mal davon aus, dass ID mit ID verknüpft sind.
Wenn Du das geschafft hast musst Du die gleiche Prozedur auch für Patientendatei_T Rechnungskopf_T machen (ich kann nicht erkennen ob das schon so ist!).
In der Rechnung_T ist das Feld AdressenlistenN und die entsprechende Verknüpfung überflüssig! Du solltest beides tunlichst entfernen!
In Dein Formular habe ich reingeschaut – dafür kenne ich Deine Bedarfe aber zu wenig. Fehler habe ich auf Anhieb nicht gefunden.
Und jetzt nicht verzagen…
xratlos

Hi Markus

Du musst
a) die referentielle Integrität aktivieren sowie
b) die Aenderungs- und Löschweitergabe

dann sollte es hinhauen. Ein Problem sollte dabei nicht auftauchen, es sein denn, du hast nicht denselben Datentyp.

LG, Henri.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

wollte mich nur bedanken. Jetzt habe ich es hinbekommen.
Unter anderem lag mein Problem auch daran, dass der Rechnungskopf beim Öffnen schon mit Daten gefüllt ist, nämlich AdressenlistenNr,RechNr, Datum und auch die ID.
Habe also sofort Daten in den Posten eingegeben. Dadurch bekam ich immer die Fehlermeldung. Habe es so gelöst, dass der Cursor auf RechNr beim öffnen steht und nach TAB in die Positonen springt. Jetzt lässt sich der DS auch hinzufügen.
Geht bestimmt noch einfacher, aber so funktioniert es und ich kann weiter basteln. Also, Danke für die Unterstützung.
Markus

Hallo Markus,
…gern geschehen:smile:
2. geht sicher eleganter EIN Beispiel: lasse das Formular beim Öffnen immer auf einen neuen DS springen. Wenn Du keinen neuen DS eingeben willst suchst Du danach halt den passenden, schon vorhandenen DS aus.
Geht irgendwie so: „docmd.gotonewrecord“ (Syntax musst halt mal schaun)
Viel Spaß und Erfolg
xratlos