Supportnet Computer
Planet of Tech

Supportnet / Forum / Datenbanken

Autowert bei Abbruch





Frage

Guten Tag liebe Access Profis, Darstellung: Formular "Rechnung eingeben" Bei Aufruf wird leeres Formular gezeigt Die Rechnungsnummer = Autowert,Primärschlüssel Erstes Datenfeld = Kombinationsfeld zur Adresseneingaben Zweites Feld = Tagesdatum wird autom. beim Hineingen erzeugt. (Makro) Drittes Feld = Konditionen (Kombifeld) Viertes Feld = Unterformular Problem: Öffnet der Anwender diese Formular, gibt einen Teil Daten ein und Entscheidet sich dann, das Formular zu verlassen ist dies leider möglich. Access Fehlermeldung: Sie können den Datensatz im Moment nicht speichern...... Möchten Sie das Datenbankobjet trotzdem schließen? Bestätige ich jetzt mit Ja, wird kein DS gespeichter, aber die Rechnungsnummer ist vergeben. Das heißt: wird eine neue Rechnung erstellt fehlt eine Rechnungsnummer. Ziel: Ich möchte alle benötigten Felder auf Eingabepflicht setzen. Grund: Das Formular kann erst gespeichert werden, wenn alle notwendigen Felder ausgefüllt sind. Frage: Die Einstllung in den Tabelleneigenschaften ist mir bekannt. Was aber mache ich mit den Kombinationsfeldern, die in der Tabelle nicht auftauchen? Oder kennen Sie eine andere Möglichkeit zu verhindern, dass beim Abbruch automatisch Rech.Nr. erzeugt werden. Für die Hilfe herzlichen Dank im Voraus Ingo Neuhaus

Antwort 1 von RalfH

Hallo,
Eine Plausibilitätsprüfung würde da schon helfen, das ganze in eine Abbruch- und/oder OK Button untergebracht.
Gruß Ralf

Antwort 2 von Marie

Versuchs mal so:

Private Sub Form_BeforeUpdate(Cancel As Integer)
Select Case MsgBox("Daten speichern?", vbYesNoCancel)
Case vbYes
'nichts tun heisst es wird gespeichert
Case vbNo
'Änderungen werden verworfen
Me.Undo
Cancel = True
Case vbCancel
'es wird nicht gespeichert, Daten bleiben aber erhalten
Cancel = True
End Select
End Sub

Antwort 3 von Ingo.

Hallo liebe Marie,

herzlichen Dank für Deinen Vorschlag.

Leider kenne ich mich mit der Programmiersprache sehr wenig aus. Habe bisher mit Makro und Ereignisprozeduren gearbeitet.

Es wäre sehr nett, wenn Du mir etwas genauer erklären könntest wie ich deinen Vorschlag anwenden soll.

Gern auch per Email.

  • *Threadedit* 17:25:07
    Admininfo: siehe FAQ 5.


    Gruß

    Ingo

  • Antwort 4 von Marie

    Hallo Ingo,

    ich beantworte keine Fragen per E-Mail, ich bitte um Verständnis.

    Eine Private Sub ist eine Ereignisprozedur und Form_BeforeUpdate heisst, dass sie ausgeführt wird vor Aktualisierung des Formulars. Also mach Dein Formular auf im Entwurfsmodus, lass Dir mit Ansicht Eigenschaften das Eigenschaftsfenster anzeigen und klicke auf Ereignis vor Aktualisierung und füge da den Code ein, Achtung erste und letzte Zeile sind dann doppelt, bitte herauslöschen.

    Gruß Marie

    Antwort 5 von Ingo.

    Hallo Marie,

    wie ich bemerkt habe scheint der Email- Kontakt hier nicht erwünscht. Ist kein Problem, es klappt ja auch so hervorragend.

    Herzlichen Dank für Deine letzte Info. Ich habe Deine Anweisungen befolgt und der Datensatz wir jetzt erst nach Abfrage gespeichert.

    Das eigentliche Problem besteht aber weiterhin.
    Wird eine Rechnung teilweise geschrieben, dann aber nicht gespeichert, ist der Autowert "Rech-Nr." vergeben.
    Bei der nächsten Rechnung wird damm eine "Rech-Nr." übersprungen.

    Wie kann ich verhindern, dass der Autowert gesetzt wird, wenn ich die Rechnung abbreche?

    Ich hoffe, Du hast eine Idee!

    Gruß
    Ingo

    Antwort 6 von RalfH

    Tach
    Sub Form_BeforeUpdate (cancel as integer)
    cancel = true 'Datensaetze nie speichern
    End Sub

    Gruß Ralf

    Antwort 7 von Ingo.

    Hallo Ralf,

    herzlichen Dank für Deine Idee !
    Leider wird auch mit dieser Prozedur der Autowert gespeichert.

    Gruß

    Ingo

    Antwort 8 von RalfH

    Hallo,
    Dann hilft das gute alte VBA.

    Den Autowert kann man anstatt automatisch auch über eine VBA Routine vergeben, wobei der Wert bei einem neuen Datensatz immer einen Aufgezählt wird.

    Das ganze tritt man los, bei Klick auf dem Speichern Button den man erstellt, hat, oder eben halt nicht wenn man auf den Abbruch Button geht.
    Gruß Ralf

    Antwort 9 von Marie

    Also wenn trotz
    Zitat:
    Me.Undo
    Cancel = True

    gespeichert wird, dann erstellst und soeicherst Du die Autonummer schon vorher, dann shau doch bitte mal nach wo du den Datensatz anlegst.

    Zitat:
    Zweites Feld = Tagesdatum wird autom. beim Hineingen erzeugt. (Makro)


    Ich vermute mal hier liegt der Hase im Pfeffer. Wirf mal das Makro raus und probiers nochmal.

    Gruß Marie

    Antwort 10 von RalfH

    @ Marie BINGO !
    Gruß Ralf

    Antwort 11 von Marie

    Nun setz das Tagesdatum wenn der Datensatz gespeichert wird.

    Gruß Marie

    Antwort 12 von erik

    Hallo alle zusammen,

    ich bin nicht sicher, ob die angesprochenen Lösungen schon reichen. Wenn in ein beliebiges gebundenes Feld irgendeine Eingabe gemacht wird, dann wird sofort ein Primärschlüssel vergeben, was sich nicht so ohne Weiteres rückgängig machen lässt. Dabei spielt es dann auch keine Rolle mehr, ob der Datensatz letztendlich gespeichert wird oder nicht.

    In diesem Fall muss man sich vom Autowert abkoppeln und stattdessen selbständig die nächste Rechnungsnummer ermitteln. Dazu reicht prinzipiell schon eine DMax()-Funktion aus, die die letzte Nummer ermittelt und um 1 erhöht:

    NächsteNummer = Nz(DMax("Feld","Tabelle"), 0) +1


    Hier besteht zwar die sehr geringe Wahrscheinlichkeit, dass zwei Personen gleichzeitig dieselbe Rechnungsnummer ermitteln, aber das dürfte sich im Rahmen tiefster Promillewerte halten.

    Das ist übrigens einer der Gründe, warum ich niemals einen Autowert in die Daten hineinfließen lasse, sondern ausschließlich für die Eindeutigkeit eines Datensatzes und Beziehungen zwischen den Tabellen benutze.

    Gruß
    erik

    Antwort 13 von Ingo.

    Hallo Marie, Erik und Ralf,

    ich habe alle vorgeschlagenen Möglichkeiten probiert. Der Vorschlag von Marie und Ralf hat mir leider nicht weitergeholfen.
    Erik hat den Sachverhalt richtig erkannt. Danke!!

    Bevor ich die Nachrit von Erik gelesen habe, bin ich auch auf eine Lösung gekommen.

    Ich habe alle Felder auf ungebunden gesetzt. Dann habe ich mit dem Makro "SetztenWert" den Inhalt der ungebundenen Felder in den DS übertragen.

    Vorteil:
    der Autowert wird erst beim aktivieren den Makros erstellt.
    Frage nach der Eingabe speichern
    Ja = Makro Wert eingeben und speichern. (Autowert wird gesetzt)
    Nein= Beenden ohne speichern (Autowert wird nicht gesetzt und Datei wird geschlossen)

    Nachteil:
    Drückt der Anwender versehentlich das Button speichern, obwohl der DS noch leer ist wird nach Fehlermeldung wieder ein Autowert vergeben.

    Frage:
    Gibt es eine Möglichkeit, mein Macro so zu gestalten, das nur gespeichert wird, wenn mindesten zwei oder drei Felder eingegeben wurden??

    Vielleicht weiss jemand Rat.

    Für Eure Bemühungen herzlichen DANK!!

    Gruß
    Ingo

    Antwort 14 von Ingo.

    Hallo Erik,

    jetzt habe ich doch etwas falsch gemacht.
    Wo bitte soll ich

    NächsteNummer = Nz(DMax("Rech-Nr","Rechnung ändern"), 0) +1

    bitte eintragen, damit es funktioniert??

    Antwort 15 von erik

    Hallo Ingo,

    ich würde hier das NachEingabe-Ereignis des Formulars verwenden. Das wird ausgeführt, nachdem der Datensatz erzeugt wurde, und zwar nur dann. Nur hier ist es sinnvoll, eine Rechnungsnummer einmalig zu generieren.

    Gruß
    erik

    Antwort 16 von Ingo.

    Hallo Erik

    Klappt leider nicht

    Ich habe folgende Parameter eingegeben:

    Formular NachEingabe Ereigniss
    Private Sub Form_AfterInsert()
    NächsteNummer = Nz(DMax("Rech-Nr", "Rechnungen"), 0) + 1
    End Sub

    Feld = Rech-Nr.
    Tabelle = Rechnungen
    Formular= Rechnung eingeben.

    Bekomme Fehlermeldung
    Laufzeitfehler 2001
    Sie haben die vorherige Operation abgebrochen

    Befor ich das Ereignis eingegeben habe, wurden alle Datensätze aus Rechnungen gelöscht und ein neuer DS mit der Rech-Nr. 1 erzeugt.

    Ich hoffe, Du weisst Rat!

    Antwort 17 von erik

    Hallo,

    und warum wurden alle Datensätze gelöscht? Du musst noch irgendwo etwas ausführen lassen, denn weder NachEingabe-Ereignis noch die DMax()-Funktion löschen vorhandene Datensätze. :-)

    Kommentiere versuchsweise alle anderen Ereignisse usw. aus, für die Speicherung der Rechnungsnummer wird nichts anderes benötigt.

    Antwort 18 von Ingo.

    Hallo Erik,

    Mißverständnis!!!

    Ich habe die DS gelöscht und einen neuen DS mit der Rech-Nr. 1 erzeugt.
    Dann habe ich das Ereignist eingegeben.

    Tabelle Rechnung enthält einen DS mit der Rech-Nr. 1
    Formular ist ein Eingabeformular also leer.
    Wenn ich in das leere Formular (Rechnung eingeben) nun einen DS eingebe erhalte ich die beschriebene Fehlermeldung.

    Gruß
    Ingo

    Antwort 19 von erik

    Hi,

    gibt es noch andere Ereignisse, die laufen? Mit dem NachEingabe-Ereignis allein funktioniert das garantiert, also schließe ich daraus, dass du noch irgendwas anderes laufen lässt oder eingestellt hast, von dem ich nicht weiß, dass es so ist. Ich könnte mir zumindest vorstellen, dass hier Cancels oder Undos unterwegs sind, die hier immerhin im Diskussionsfaden besprochen wurden.

    Antwort 20 von RalfH

    Guten Morgen,

    Zitat:
    Formular "Rechnung eingeben"
    Bei Aufruf wird leeres Formular gezeigt
    Die Rechnungsnummer = Autowert,Primärschlüssel
    Erstes Datenfeld = Kombinationsfeld zur Adresseneingaben
    Zweites Feld = Tagesdatum wird autom. beim Hineingen erzeugt. (Makro)
    Drittes Feld = Konditionen (Kombifeld)
    Viertes Feld = Unterformular


    Hast Du das Makro beim zweiten Feld beseitigt? Ansonsten wird ja ein Datensatz angelegt.

    Viertes Feld, wozu ist das da ?

    Gruß Ralf

    Antwort 21 von Ingo.

    Hallo und Guten Morgen meine netten Helfer!

    Hallo Erik,
    zum Testen Deiner Ereignisprozedur habe ich eine neue Tabelle/Formular angelegt.

    Formularname = Formular1
    Feldname = Fortlaufende Nr.
    Ausführort Formular1 NachEreignis

    Hier eine Kopie der Ereignisprozedur
    Zitat:
    Option Compare Database

    Private Sub Form_AfterInsert()
    NächsteNummer = Nz(DMax("Fortlaufende Nr", "Tabelle1"), 0) + 1
    End Sub


    Ich erhalte folgende Fehlermeldung

    Zitat:
    Laufzeitfehler '3075':
    Syntaxfehler (fehlender Operator) in Abfrageausdruck 'Max(Fortlaufende Nr)'


    Leider komme ich hier nicht mehr weiter.
    Vielleicht fällt Dir noch etwas ein. Wenn diese Variante funktionieren würde wäre das echt super!
    Gruß
    Ingo

    Antwort 22 von Ingo.

    Hallo Ralf,

    gern nehme ich Stellung zu Deiner Frage:

    Der Sachverhalt, den Du nachfragst, ist nicht mehr aktuell. Ich habe das Formular wie in meiner Antwort 13 beschrieben verändert.

    Das viert Feld ist kein Feld sondern mein Unterformular. (habe mich da leider falsch ausgedrückt)

    Das Makro ist aktiv, es spricht aber ein ungebundenes Feld an und erzeugt so keinen Autowert. Der Autowert wird erst erzeugt, wenn ich das Makro 'SetzenWert' aktiviere. Damit wird dann der Datensatz erzeugt.

    Ich hoffe zur Klärung beigetragen zu haben.

    Gruß
    Ingo

    Antwort 23 von Ingo.

    Hallo liebe Helfer,

    es gib da noch ein Problem, wo Ihr vielleicht helfen könnt.

    Zustand:
    Formular Rechnung mit Unterformular Rech- Positionen

    Der Formulardatensatz enthält Rech Nr, Rech Datum, Knd Nr, Knd Adresse und Summe(Rechenfeld aus dem Unterformular).

    Das Unterformular enthält Anzahl, Artikelbezeichnung, Einzelpreis, Rechenfeld Gesamtsumme. Weiterhin wird die Knd. Nr und die Rech. Nr. vom Rechnungsformular übernommen.

    Mein Problem:
    Das Formular läuft ohne Fehler, wenn die Reihenfolge eingehalten wird. Kommt aber ein Anwender auf die Idee, zuerst das Unterformular zu nutzten, wird das Macro ausgeführt, welches die Rechnungsnummer und die Kundennummer übernimmt. Da diese im Rechnungsformular aber noch nicht eingetragen sind erhalte ich eine Fehlermeldung und das Makro wird angehalten.

    Frage:
    Wie kann ich verhindern, dass das Unterformular benutzt wird, wenn noch kein DS im Hauptformular eingegeben wurde?

    Für eine gute Idee Danke ich im Voraus!

    Gruß
    Ingo

    Antwort 24 von Marie

    das Unterformular ausblenden (visible = false) bis

    gruß marie

    Antwort 25 von Ingo.

    Guten Morgen Marie,

    Danke für den Antwort.

    Leider habe ich nicht verstanden, wie ich diesen Befehl anwenden soll. Bin doch ein Access Anfänger!!

    Kann ich mit diesem Befehl das Unterformular ausblenden, bis z.B. die drei Notwendigen Felder ausgefüllt sind?
    Wenn ja wo muss ich den Befehl eingeben?

    Gruß Ingo

    Antwort 26 von erik

    Hallo Ingo,

    in deiner DMax()-Funktion verwendest du einen Feldnamen, der ein Leerzeichen enthält. Du solltest wissen, dass man solche Leerzeichen möglichst vermeiden sollte, denn so bist du gezwungen, bei der Verwendung dieses Namens eckige Klammern zu verwenden.

    Nz(DMax("[Fortlaufende Nr]", "Tabelle1"), 0) + 1


    Gruß
    erik

    Antwort 27 von Marie

    Private Sub Form_Open(Cancel As Integer)

    Me![DeinUFO].Visible = False

    End Sub


    schreibst Du in Dein Hauptformularals Code, dann wird das UFO ausgeblendet.

    Nun musst Du aber selbst eintscheiden wann Du es wieder einblenden willst und dort dann reinschreiben
    Me![DeinUFO].Visible = True

    Gruß Marie

    Antwort 28 von Ingo.

    Hallo Marie,

    herzlichen D A N K für Deinen tollen Vorschlag!

    Du hast mir wieder einmal toll geholfen

    Gruß
    Ingo

    Antwort 29 von Ingo.

    Hallo Erik,

    habe eine neue Tabelle und ein neues Formular erstellt, um Deine Ereignisprozedur zu testen.

    Leider noch immer ohne Erfolg.

    Tabelle = Test
    Felder ID, RechNr, Adresse

    Folgendes habe ich im Formular Test eingegeben.

    Zitat:
    Private Sub Form_AfterInsert()
    NächsteNummer = Nz(DMax("[RechNr]", "Test"), 0) + 1
    End Sub


    Nun bekomme ich keine Fehlermeldung, aber der Wert im Feld RechNr (Zahl) ändert sich nichts.

    Ich weiß wirklich nicht, was ich da falsch gemacht habe.
    Bitte versuche es noch einmal zu erklären.

    Danke

    Gruß
    Ingo

    Antwort 30 von erik

    Hallo Ingo,

    das Eintippen einer Ereignisprozedur reicht manchmal nicht, denn es muss auch noch mit dem Formular verknüpft sein. Öffne das Eigenschaftsfenster des Formulars und suche dort unter den Ereignissen den Eintrag "Nach Eingabe". Steht dahinter als Wert "[Ereignisprozedur]" drin? Wenn nicht, dann aus der Liste auswählen.

    Gruß
    erik

    Ich möchte kostenlos eine Frage an die Mitglieder stellen:


    Ähnliche Themen:


    Suche in allen vorhandenen Beiträgen: