Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

DAO Recordset VBA

Begonnen von Brusellise, April 05, 2017, 09:16:18

⏪ vorheriges - nächstes ⏩

Brusellise

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

Lachtaube

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
Grüße von der (⌒▽⌒)

Brusellise

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

DF6GL

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.



Brusellise

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

MzKlMu

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.
Gruß Klaus

Brusellise

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.

MzKlMu

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.
Gruß Klaus

DF6GL

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.








Brusellise

Ok. Dann habe ich dies auch verstanden. Ich finde jetzt eine Lösung für mich.

Danke für eure tolle Unterstützung.

Brusellise

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.

DF6GL

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.

Brusellise

Schade, danke trotzdem für deine Hilfe.

Beaker s.a.

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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Brusellise

Hi,

kennst du evtl. doch eine Möglichkeit?