September 29, 2022, 03:40:53

Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!


docmd.openform mit acformadd und undo

Begonnen von Walterio, Juni 01, 2022, 11:52:20

⏪ vorheriges - nächstes ⏩

Walterio

Hallo
Beim öffnen eines UF um einen neuen Satz in eine Tabelle zu erzeugen, wird im Load-Modul vom UF das Identifikations-Feld der Tabelle generiert:
me.ChemID = "CH-" & format(right(dmax("ChemID", "ChemTab"), 4) + 1, "0000")
Das UF öffnet sich und die neu generierte ID wird angezeigt.

Und nun bricht der User die Übung mit der Befehlstaste [Abbruch] ab:
Private Sub cmdAbbruch_Click()
   me.undo
   DoCmd.Close acForm, Me.Name, acSaveNo
End Sub

Jedoch in der Tabelle ist bereits ein Satz mit der neuen ID erstellt worden!

Kann es daran liegen, dass im Formular ein Textfeld und in der Tabelle ein Feld, beide mit dem Namen ""ChemID" existieren?
Oder muss ich "manuell" den Neuen Satz löschen? Z.B. mit DoCmd.runSQL?

Danke für jeden Hinweis
Walter

MzKlMu

Hallo,
wo befindet sich der Button "Abbruch" im Hafo oder im Ufo ?

PS:
Was willst Du mit dem acSaveNo ?
Mit Datenspeicherung hat das nichts zu tun.
Un da Du Dich auf das aktuelle Formular beziehst, reicht DoCmd.CloseEs empfiehlt sich auch Code zu kopieren und nicht abzuschreiben.
Gruß
Klaus

Walterio

Der Button "Abbruch" ist im UFo.

Danke für den "Entschlackungs"-Hinweis (docmd.close). Nehme es mir zu Herzen.

P.S.
Musste abschreiben, da ich auf den "falschen" Rechner bin...

MzKlMu

Hallo,
dann müsste der Abbruch button funktionieren.
Gruß
Klaus

Beaker s.a.

Hallo,
@klaus
Nein, m.E. aus den folgenden Gründen nicht

@Walter
Das liegt an der Reihenfolge der ablaufenden Ereignisse. Ein UFo
wird immer vor dem HFo geladen. D.h. bei dir, das nach dem Erstellen
eines neuen DS im UFo (das geschieht durch die Zuweisung der ID)
zum HFo gewechselt wird wodurch der DS im UFo autom. gespeichert
wird. Da ist dann nix mehr mit Undo. Close.Form müsste i.Ü. auch
zu einem LZ-Fehler führen (hab ich jetzt aber nicht probiert).
Ich finde dieses Vorgehen auch nicht sinnig. Durch die o.a. Tatsache
fehlt dir in deinem neuen DS ja auch die ID (der FK) aus dem HFO.
Normal wählt man doch zuerst im HFo einen DS aus um zu diesem den/die
DS im UFo anzulegen. So macht es ja nur Sinn, wenn das HFo schon mit
nur einem DS im RS geöffnet wird. Aber auch da würde ich das Erstellen
des DS im UFo erst beim Laden des HFo anstossen. Dann landest du im
UFo und Undo funzt auch.

gruss ekkehard
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

Walterio

Danke für deine Antwort, ekkehard,

Jetzt sehe ich, dass ich bei meiner Problem-Beschreibung einen Denkfehler machte: es ist nicht ein UFo sondern ein anderes Formular das geöffnet wird. Es geht also um 2 Formulare, das erste "ChemListe" und das zweite "ChemDetails" - für mich gefühlsmässig Haupt- und Unterformular, was aber total falsch ist...

Im Formular "ChemListe" (der eine Auflistung der Sätze aus der Tabelle "ChemTab" ist) hat es ein Button [neue Chemikalie] mit dem Click-Ereignis:
Private Sub cmdneueChemikalie_Click()
    DoCmd.OpenForm "ChemDetails", , , , acFormAdd, , "neu"
End Sub
Es wird also das Formular "ChemDetails" aufgerufen, wo ein DS mit allen seinen Attributen erfasst/bearbeitet werden kann.

Das es sich um einen neuen DS handelt, wird mit dem OpenArg  "neu"   signalisiert, und damit erfolgt die Generierung vom ID-Feld im Load-Ereignis:
Private Sub Form_Load()
...   
' neuer Datensatz mit neuer Chemikalien-ID
    If InStr(1, Nz(Me.OpenArgs, ""), "neu") = 1 Then
        Me.ChemID = "CH" & Format(Right(DMax("ChemID", "ChemTab"), 4) + 1, "0000")
        Exit Sub
    End If
.....
End Sub

Und damit enthält das Textfeld ChemID im geöffneten Formular "ChemDetails" den neuen Wert, etwa CH-0123.

Wenn nun die [Abbruch]-Taste in diesem Formular gedrückt wird, erfolgt:
Private Sub cmdAbbruch_Click()
   me.undo
   DoCmd.Close acForm, Me.Name, acSaveNo
End Sub
Aber der Undo kommt irgendwie zu spät: Der neue DS mit der ID CH-0123 ist bereits in der Tabelle...
Der Ansatz, ein weiteres Feld in der Tabelle als zwingend zu definieren führt einfach zu LZ-Fehler.

Hoffe niemand zu stark verärgert zu haben mit meiner falschen Problem-Darstellung.

Walter

DF6GL

Hallo,

nutze die Eigenschaft "DefaultValue" des Steuerelementes. Dann wird ein neuer DS erst dann generiert, wenn ein Wert in ein anderes Feld eingegeben wird.

        Me!ChemID.DefaultValue = "CH" & Format(Right(DMax("ChemID", "ChemTab"), 4) + 1, "0000")

Walterio

Das Formular-Textfeld zeigt mit .DefaultValue nun "#Name?". Das ist es also nicht.

Und es soll ja so sein: unabhängig davon ob oder welche Felder im Formular schon eingetragen wurden, wenn der User auf [Abbruch] drückt, sollte kein neuer Satz in der Tabelle entstehen. Du schreibst ja
Zitat von: undefined... wird ein neuer DS erst dann generiert, wenn ein Wert in ein anderes Feld eingegeben wird.
Es soll aber kein neuer DS generiert werden. Bzw. der neue DS mit dem Undo wieder verschwinden.

Walterio

Ich hab es gefunden! Beim Activate-Modul war ein völlig überflüssiges "Requery".
Jetzt funktionierts es wie gewünscht (ohne DefaultValue).

Danke für dein Mitdenken und deine Geduld.

Die Moral von der Geschichte: Achtung mit Requerys!

DF6GL

Hallo,

das ist es schon.... Wie kommst Du darauf, dass es das nicht ist?


Es sind zwei Vorgänge:

1) Vorgeben eines Standardwertes für ein Feld  (ohne Erzeugen eines neuen realen DS)

2) Unterbinden der Speicherung des neuen DS in die Tabelle


Es fehlen noch Gänsefüße (bei Text(feldern)  ):

        Me!ChemID.DefaultValue = Chr$(34) & "CH" & Format(Right(DMax("ChemID", "ChemTab"), 4) + 1, "0000") & Chr$(34)


ZitatWenn der User auf [Abbruch] drückt, sollte kein neuer Satz in der Tabelle entstehen.


Wenn neue Werte eingegeben wurden, wurde ein neuer DS im Formular generiert, aber noch nicht in die Tabelle gespeichert. Drücke zu diesem Zeitpunkt <Esc> (Undo), und der neue DS wird zurückgenommen und anschließend (nach dem Verlassen des Forms) nicht in die Tabelle gespeichert.


Schreibe also das "Drücken" der Taste <Esc> in die Klick-Ereignisprozedur des Buttons:


Sub btnAbbrechen_Click()

  Me.Undo
' und evtl.
'Docmd.Close acForm, Me.Name, wenn das Form gleich geschlossen werden soll

End Sub

Walterio