Ich benutze in einem Formular ungebundene Textfelder. Nach Eingabe der jeweiligen Felder wird via Button ein neuer Datensatz erstellt.
Den VBA Code dafür habe ich aus diesem Forum erhalten (siehe unten). Nun meine Frage. Wie kann man einen bereits erstellten Datensatz mit einen Button ändern / aktualisieren, wenn ein ungebundenes Feld nach Eingabe geändert wird. Geht das? Danke für eure Hilfe.
Private Sub Entladung1()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim lngID As Long
Set db = CurrentDb()
Set rs = db.OpenRecordset("tblBue_Be_Entladeschein", DB_OPEN_DYNASET)
rs.AddNew
rs!Datum = Me!Datum
rs!Erfasser = Me!Erfasser
rs!Status = Me!Status
rs!Buchungsart = Me!Buchungsart
rs!Kunde = Me!cboKunde
rs!Spediteur = Me!Spediteur
rs!LKWKennzeichen = Me!Kennzeichen
rs!Tor = Me!Tor
rs!Zollpapiere = Me!Zollpapiere
rs!EingangEuroFP = Me!EUROFP
rs!EingangEuroGP = Me!EUROGP
lngID = rs!Entladescheinnummer
rs.Update
rs.Close: Set rs = Nothing
Set db = Nothing
Response = acDataErrAdded
Den Datensatz müsste man zuvor suchen, finden und danach editieren. Als Suchkriterium sollte das Primärschlüsselfeld oder ein Pflichtfeld mit eindeutigem Index oder eine PflichtfFelderkombination mit eindeutigem Mehrfachindex herangezogen werden. (Luftcode)
Private Sub EditKnopf()
With CurrentDb.OpenRecordset("TabName_bzw_AbfrageName_bzw_AbfrageText, dbOpenDynaset)
.FindFirst "SchluesselfeldName = 4711"
If Not .NoMatch
.Edit
!Status = "geplant"
.Update
End If
.Close
End With
End Sub
Hi,
danke, habe ich grob verstanden.
Wie sieht der Code aus, wenn ich beispielsweise ein Kombinationsfeld als Filter für die Datensatzsuche benutzen möchte.
Das Kombinationsfeld lautet "Filter"?
Bitte um deine Hilfe. Bin ein VBA Anfänger.
Danke
Hallo Brusellise,
wurde schon mehrmals gefragt:
Welchen Grund gibt es, hier ungebundene Formulare zu benutzen und damit Access-Funktionen nochmal neu zu erfinden?
Zudem: Grundsätzlich auf Leer- und Sonderzeichen sowie auf reservierte Wörter (--> "Filter") bei der Namensgebung DRINGEND verzichten...
...
With CurrentDb.OpenRecordset("tblBue_Be_Entladeschein", dbOpenDynaset)
.FindFirst "Entladescheinnummer = " & Me!cmbFilter
.
.
falls sich der PK-Wert in der ersten Spalte des Kombi-Listenfeldes befindet.
Ansonsten:
...= " & Me!cmbFilter.Column(2)
wenn sich der Wert in der 3. (!) Spalte befindet.
Hallo DF6GL,
danke für deine Hilfe. Werde dies gleich versuchen umzusetzen.
Zu deiner Frage:
Es gibt eigentlich keinen speziellen Grund. Meine Kollegen finden es nur Userfreundlicher mit einen Speicher Button zu arbeiten. Deshalb versuche ich mir euch eine Lösung zu finden. Das alte Problem hatte ich ja schon mit deiner Hilfe gelöst. Jetzt habe ich noch dieses Problem und ich denke mit eurer Hilfe wird dies auch gelöst werden.
Ich sage danke, danke, danke.
Gruß
Brusellise
Hallo,
ZitatMeine Kollegen finden es nur Userfreundlicher mit einen Speicher Button zu arbeiten.
das geht auch mit gebundenen Formularen, völlig problemlos und einfacher und zuverlässiger außerdem.
Und Pflichtfelderprüfung bzw. Plausibilitätsprüfung kann man da auch noch unterbringen.
Hallo Klaus,
kläre mich bitte auf, wie dies funktioniert. Diese Funktion kenne ich ehrlich gesagt sind. Aber ich bin ja noch lernfähig. Nach meinen Kenntnisstand, werden gebundene Felder immer direkt gespeichert nach dem Eintrag.
Bitte um Info, damit ich weiter lernen kann ;)
Danke.
Hallo,
Zitatwerden gebundene Felder immer direkt gespeichert nach dem Eintrag.
nein, das ist so unzutreffend. Und einzelne Felder werden zunächst gar nicht gespeichert, sondern nur der komplette Datensatz wenn man den Datensatz wechselt, oder das Formular schließt. Und dieses Speichern kann man verhindern und auch die Einträge wieder rückgängig machen.
Im Anhang ein Beispiel mit einem gebunden Formular das auch Pflichtfelder prüft.
In dem Beispiel kann man ohne gezieltes Speichern oder Verwerfen noch nicht mal die DB verlassen.
Hallo,
kurze (grobe) Erläuterung zum "Speichern" in einem Formular:
Es gibt mehrere "Level" der "Speicherung" bei der manuellen Eingabe von Werten in ein gebundenes Formular.
Beim Eingeben gelangen die Zeichen zunächst in die Eigenschaft "TEXT" des Steuerelementes und können da, solange sich der Cursor im Feld befindet, auch "editiert" werden.
Verlässt der Cursor das Steuerelement, treten mehrere Ereignisse auf ,z. B. BeforeUpdate. In diesem ist dann eine Plausiprüfung möglich (sinnvoll) und im Fall einer Falscheingabe kann das Ereignis abgebrochen (Cancel=True) und evtl. die Eingabe zurückgenommen (Me.Undo) werden.
Wird das Ereignis nicht abgebrochen, werden die Daten in die Eigenschaft "Value" des Controls übernommen ("gespeichert") und das Form-Recordset dadurch aktualisiert.
Wird der Form-Datensatz jetzt verlassen (durch Schließen des Forms, durch Wechsel des Datensatzes, durch Requery oder sonstiger "Bewegung" der Datensätze, durch explizites Speichern (Runcommand accmdSaveRecord , auch Me.Dirty=False)) , erfolgt erst jetzt die Speicherung (bzw. Aktualisierung) des Form-Recordsets (d. h. der betroffenen Form-Datensätze) in die (der) dahinterliegende(n) Tabelle.
Bei all diesen Vorgängen treten (mehr oder weniger bekannte) Ereignisse auf, bei den mittels deren Ereignisprozeduren auf den Ablauf Einfluss (z. B. Abbruch mit Cancel=true, sofern vorhanden) genommen werden kann.
Ok. Dann habe ich dies auch verstanden. Ich finde jetzt eine Lösung für mich.
Danke für eure tolle Unterstützung.
Hi,
leider muss ich doch nochmal nachfragen.
Ich möchte nun die Funktion aus dem Beispiel von "MzKlMu" nutzen.
Soweit funktioniert auch alles.
Leider benutze ich ein Naviformular. Der User kann derzeit noch das Formular schliessen, sobald er einen Link vom NAVIFormual benutzt.
Wie kann ich das verhindert? Jemand eine Idee. Der Rest funktioniert jetzt so gewünscht.
Danke für euren tollen Support.
Hallo,
ein Navi-Formular kann zwangsläufig nur immer ein Formular aktiv darstellen. D.h. den Vorgang "Formular schließen" kannst Du nicht unterbinden, wenn zu einem anderen Form navigiert wird.
Statt dem Navi-Form könntest Du ein Register-Steuerelement einsetzen.
Schade, danke trotzdem für deine Hilfe.
Hallo Franz,
ZitatD.h. den Vorgang "Formular schließen" kannst Du nicht unterbinden, wenn zu einem anderen Form navigiert wird.
Heisst das, dass das Ereignis "Form_Close" hier nicht ausgelöst wird?
gruss ekkehard
Hi,
kennst du evtl. doch eine Möglichkeit?
Hallo,
@Brusellise: Möglichkeit wofür?
@Beaker s.a.: Vermutlich wird Form_Close ausgelöst (hab es nicht getestet), aber dort besteht eh keine Eingriffsmöglichkeit.
Hallo Franz,
Klar, hast du natürlich recht; - habe ich mal wieder verwechselt :-(
Aber Form_Unload hat einen Cancel-Parameter, und müsste ja auch
gefeuert werden, - oder?
Schau ich mir morgen mal an.
gruss ekkehard