Hallo ich brauche eure Hilfe
Ich habe in einem Formular mehrer Kombifelder, die Werte für ein Kombifeld beziehe ich aus einer anderen Tabelle, wobei ich den Primärschlüssel abspeichere, aber im Formular ein anderes Feld anzeige. So wie die Verknüpfung eingestellt ist, ist es zwingend, dass ein Wert aus dem Kombifeld ausgewählt wird. Wir dies nicht gemacht kommt folgende Fehlermeldung:
Das Microsoft Office Access-Datenbankmodul kann in der Tabelle T_Konto keinen Datensatz mit passenden Schlüsselfelder Art_Konto finden.
Ich habe diese Meldung noch abgefangen, in dem ich vor jeder Navigation, z.B neuer Datensatzt, Beenden, Vorhergehender Datensatz eine Ueberprüfung auf diese Felder mache und eine entsprechende MsgBox Meldung mache.
Mein Problem ist nun, wenn ich nun anfange einen neuen Datensatz zu eröffnen und dabei merke, dass ich in einen Fehler gemacht habe und in löschen will, muss ich nun zuerst alle Kombifelder ausfüllen, bis ich in löschen kann. Wie kann ich dies umgehen?
Der Scirpt für das Löschen sieht wie folgt aus:
Private Sub batLief_Loesch_Click()
'Datensatz löschen, löst Lösch-Routine in Modul Navigation aus
On Error GoTo Err_batLief_Loesch_Click
Dim Text As String
Text = "Wollen Sie den Lieferant wirklich löschen?"
Call Navigation.Loeschen(Text)
Forms!F_Lief!Lief_ID.SetFocus
Exit_batLief_Loesch_Click:
Exit Sub
Err_batLief_Loesch_Click:
MsgBox Err.Description
Resume Exit_batLief_Loesch_Click
End Sub
Public Sub Loeschen(Text)
'Loeschen von Datensätzen
Dim Meldung As String
Meldung = MsgBox(Text, vbYesNo + vbQuestion)
If Meldung = vbNo Then
Exit Sub
Else
DoCmd.SetWarnings False
DoCmd.RunCommand acCmdDeleteRecord
End If
End Sub
Vielen Dank für eure Hilfe
Daniel
Hallo,
wenn
"neuen Datensatz zu eröffnen und dabei merke, dass ich in einen Fehler gemacht habe und in löschen will, "
der Fall ist, ist der neue DS noch nicht gespeichert und es genügt, ein oder mehrere Male die Taste Esc-Taste zu drücken , bzw. im Code einige "Me.Undo"- Zeilen einzubauen.
Ein Speichern des DS ohne ausgefülltes Kombifeld sollte durch Überprüfung im Form_Beforeupdate-Ereignis verhindert werden.
Hallo Franz
Beim genauen meines Access-Projektes habe ich nun verschiedenes festgestellt, dass noch nicht optimal funktioniert.
Ich habe in meinem Artikelstamm ein verschiedene Kombifelder (Kontostamm, Lieferanten und Klassierung), wenn ich nun eine Klassierung lösche, so wird der Artikel im Formular nicht mehr angezeigt, ist jedoch in der Artikeltabelle vorhanden. Ich habe mir nun überlegt, dass ich in in den Tabellen (Konto, Lieferant, Klassierung) eine Statusfeld aktiv / inaktiv mache. Weiter möchte ich vor dem Löschen eines Datensatzes in den Tabellen (Konto...) eine Ueberprüfung mache, ob diese in einem Artikel verwendet wird. Doch wie gehe ich dies genau an? Ich habe mir überlegt, ein Ja/Nein Feld in den Tabellen (Konto...) zu machen und über den Artikelstamm eine Anfügeabfrage auszuführen, die in der Tabelle (Konto...) das Ja/Nein Feld auf Ja setzt. So kann ich beim Löschvorgang eine Ueberprüfung auf dieses Ja/Nein Feld machen. Das ganze hat aber einen Haken, das ganze wird nicht zurückgesetzt, wenn das Konto nicht mehr verwendet wird. Ich denke es muss für dieses Problem eine andere Lösung geben.
Weitere Frage: Zur Zeit werden meine Daten, die ich erfasse direkt in die Tabelle geschrieben. Ich möchte nun jedoch im Artikelstamm einen Speicherbottom erstellen. Die Daten werden erst in die Tabelle geschrieben, wenn ich diesen Bottom betätigt habe. Wenn ich eine Aktion, wie den Datensatzt wechseln oder das Formular schliessen vor dem Speichern mache, soll eine Meldung kommen, ob ich den aktuellen Datensatz speichern will oder nicht. Wie mache ich das.
Vielen Dank
Daniel
Hallo,
in der Tat, das Löschen von Stammdaten ist in aller Regel von Übel... Lass also diese Löscherei ganz bleiben. Wenn Du ref. Integrität bei den Tabellenbeziehungen (richtig) einstellst, unterbindet Access das Löschen von Stammdaten, wenn diese in anderen Tabellen benutzt sind.
"wenn das Konto nicht mehr verwendet wird. " Es wird solange verwendet, wie ein Artikel zu diesem Konto zugeordnet ist (falls das so beziehungsmäßig der Fall ist)
"Ich denke es muss für dieses Problem eine andere Lösung geben." --> Löschen bleiben lassen oder akzeptieren, dass auch der entspr. Artikel gelöscht wird (werden muß).
Weitere Frage:
Ich nehme an, du benutzt grundsätzlich(!) ein Formular für die Datenerfassung.
Dabei ist ein "Speicher"button überflüssig, die Daten werden beim Datensatzwechsel oder beim Schliessen des (gebundenen) Forms immer gespeichert (falls kein erkennbarer Fehler auftritt).
Man sollte sich daran gewöhnen, dass das so ist. Um Fehlerkonstellationen durch Fehleingaben/falsche Daten zu erkennen, kann man da Form-Ereignis "Vor Aktualisierung" benutzen, um Plausibilitätsprüfungen durchzuführen und evtl. das Speichern zu unterbinden (Cancel=true ). Dort kann auch die (im Lauf der Zeit nervende) MsgBox aufgerufen werden:
Sub Form_BeforeUpdate(Cancel as Integer)
If Msgbox ("Soll gespeichert werden?", vbQuestion+vbYesNo) = vbNo then Cancel =true
End Sub
Wenn Du konzeptionell unbedingt einen "Speicher"-Button brauchst, dann rate ich zur Verwendung eines ungebundenen Formulars, bei dem Du dann selber für alle Datenspeicherungen in die entspr. Tabelle sorgen musst
Hallo Franz
Ich überprüfe nun die Felder mit dem Ereignis bevor aktualisieren. Ich arbeite nun überall mit aktivi / inaktiv. Wenn ich z.B. im Artikestamm auf einem Artikel etwas ändere und dieser besitzt nun einen inaktiven Liefeant kommt eine Meldung. Auch habe ich über Auswertung die Möglichkeit zu schauen, welcher Artikel ist an diesem Lieferant angehängt und ich kann diese Artikel ändern.
Ich habe mit diesem Fall wieder einiges lernen können vielen dank.
Gruss Daniel