Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: Brusellise am April 05, 2017, 09:16:18

Titel: DAO Recordset VBA
Beitrag von: Brusellise am April 05, 2017, 09:16:18
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
Titel: Re: DAO Recordset VBA
Beitrag von: Lachtaube am April 05, 2017, 09:37:48
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
Titel: Re: DAO Recordset VBA
Beitrag von: Brusellise am April 05, 2017, 10:00:33
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
Titel: Re: DAO Recordset VBA
Beitrag von: DF6GL am April 05, 2017, 10:12:50
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.


Titel: Re: DAO Recordset VBA
Beitrag von: Brusellise am April 10, 2017, 09:29:11
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
Titel: Re: DAO Recordset VBA
Beitrag von: MzKlMu am April 10, 2017, 09:44:58
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.
Titel: Re: DAO Recordset VBA
Beitrag von: Brusellise am April 10, 2017, 10:12:05
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.
Titel: Re: DAO Recordset VBA
Beitrag von: MzKlMu am April 10, 2017, 10:24:10
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.
Titel: Re: DAO Recordset VBA
Beitrag von: DF6GL am April 10, 2017, 10:53:48
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.







Titel: Re: DAO Recordset VBA
Beitrag von: Brusellise am April 10, 2017, 10:57:20
Ok. Dann habe ich dies auch verstanden. Ich finde jetzt eine Lösung für mich.

Danke für eure tolle Unterstützung.
Titel: Re: DAO Recordset VBA
Beitrag von: Brusellise am April 10, 2017, 12:00:30
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.
Titel: Re: DAO Recordset VBA
Beitrag von: DF6GL am April 10, 2017, 12:50:48
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.
Titel: Re: DAO Recordset VBA
Beitrag von: Brusellise am April 10, 2017, 13:28:20
Schade, danke trotzdem für deine Hilfe.
Titel: Re: DAO Recordset VBA
Beitrag von: Beaker s.a. am April 10, 2017, 14:29:36
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
Titel: Re: DAO Recordset VBA
Beitrag von: Brusellise am April 10, 2017, 16:52:56
Hi,

kennst du evtl. doch eine Möglichkeit?
Titel: Re: DAO Recordset VBA
Beitrag von: DF6GL am April 10, 2017, 19:06:28
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.
Titel: Re: DAO Recordset VBA
Beitrag von: Beaker s.a. am April 10, 2017, 23:43:14
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