Liebe Access-Profis,
ich habe in meiner Buchverwaltung eine Eingabemaske zur Erfassung von neuen Buchtiteln (frm_BuchEingabe). Dieser Maske habe ich ein Kombinationsfeld (Liste104) als Suchfeld vorangestellt, so dass bereits eingegebene Titel ggf. verändert werden können. Nach Eingabe des Suchtitels wird der Datensatz angezeigt; dieses geschieht mittels eines eingebetteten Makros >> ="[BUC_PS] = " & Str(Nz([Screen].[ActiveControl];0)) <<. Wenn ich dann aber in dieser Maske zum nächsten Datensatz gehe bzw. zurück zu einem anderen Datensatz wechsle, bleibt der vormalige Eintrag im Listenfeld stehen. Das irritiert den Anwender doch sehr.
Wie kann ich denn den Suchtext aus dem Kombinationsfeld wieder löschen; wenn dieses mit einem Folgemakro geschehen kann, wäre das prima, weil das Wechseln der Datensätze ebenfalls mit eingegetteten Makros vollzogen wird.
Vorab meinen Dank für Tipps und Hilfestellungen
gromax
Hallo gromax,
füge dem eingebetteten Makro die Aktion "SetzenWert" (--> alle Aktionen anzeigen!) hinzu und setze den Wert des aktiven Steuerelements (=Kombifeld) auf NULL.
PS:
Besser wäre natürlich der Verzicht auf Makros, insbesondere auf eingebettete, und die Umstellung auf VBA-Code, weil dieser einfacher transparenter und besser kommunizierbar ist.
Ich würde an Deiner Stelle auch dem Rat von MaggieMay folgen und die Makros lassen. Ich habe auch so angefangen und dann nach und nach alles auf VBA umgestellt. Das ist viel flexibler und man kann sich auch recht schnell einarbeiten, zudem bekommt man hier auch super Hilfestellung dazu.
Hallo MeggieMay, hallo detekk,
danke für die Unterstützung; ich habe eueren Rat befolgt und folgende Prozeduren für die Navigationsschaltflächen hinterlegt:
Private Sub cmd_ErsterDS_Click()
DoCmd.GoToRecord , , acFirst
Me.Liste104 = ""
End Sub
Private Sub cmd_LetzterDS_Click()
DoCmd.GoToRecord , , acLast
Me.Liste104 = ""
End Sub
Private Sub cmd_VorherigerDS_Click()
DoCmd.GoToRecord , , acPrevious
Me.Liste104 = ""
End Sub
Private Sub cmd_NaechsterDS_Click()
DoCmd.GoToRecord , , acNext
Me.Liste104 = ""
End Sub
Private Sub cmd_NeuerDS_Click()
DoCmd.GoToRecord , , acNewRec
Me.Liste104 = ""
End Sub
Mit dem Eintrag Me.Liste104 = "" leere ich das Listenfeld, sobald ein neuer DS aufgerufen wird.
Gibt es dazu noch ein professionelleren Rat eurerseits? Wenn ja, immer gerne!
Mit freundlichem Gruß
gromax
Hi,
ich würde das Löschen von Formular-Steuerelementen mit der Zuweisung von NULL bevorzugen, weil dies auch dem Initialwert bei leeren Feldern entspricht.
Des weiteren fehlt die Fehlerbehandlung in den Fällen wo man sich bereits auf dem ersten/letzten Datensatz befindet und weiterhin rückwärts/vorwärts zu blättern versucht.
Hallo gromax,
Das brauchst du nur einmal im Ereignis "Beim Anzeigen" zu behandeln:
Private Sub Form_Current()
Me!Liste104 = NULL
End Sub
Drei Zeilen Code gespart ;)
gruss ekkehard
Hallo MaggieMay, hallo Ekkehard,
beide Hinweise sind umgesetzt; alles funktioniert wie gewünscht!! Klasse!
Vielen Dank
gromax
Hallo MaggieMay, hallo Ekkehard, liebe Access-Profis,
nun wollte ich den Rat bzgl. der Fehler-Lösung mit einer EOF-Prozedur lösen; es klappt nicht und ich habe sämtliche Alternativen (DAO, FindNext, rst.moveNext und dies alles in verschiedenen Zeilen) ausprobiert!
Einer Navigationsschaltfläche in meinem Formular habe ich folgenden Code beigegeben:
Private Sub cmd_NaechsterDS_Click()
Dim db As Database
Dim rst As Recordset
Set db = Application.CurrentDb
Set rst = db.OpenRecordset("qry_BuecherSortiert", dbOpenDynaset)
DoCmd.GoToRecord , , acNext
If rst.EOF Then
If MsgBox("Möchten Sie einen neuen Titel eingeben?", vbQuestion + vbYesNo, "Letzter Titel") = vbYes Then
DoCmd.GoToRecord , , acNewRec
Else
rst.MoveLast
End If
End If
Set rst = Nothing
Set db = Nothing
End Sub
Wo liegt denn hier der Fehler?
Vielen Dank und viele Grüße
gromax
Hi,
definiere: "es klappt nicht"
Was passiert? Error?
Harald
Hallo,
kannst Du bitte mal beschreiben, was der Code tun soll ?
Wenn man in einem gebundenen Formular vorwärts blättert, landet man ja automatisch bei einem neuen Datensatz, es sei denn, Anfügen ist gesperrt.
Das Recordset Gedöns ist bei einem gebundenen Formular auch überflüssig. Ebenso kann EOF so nicht verwendet werden (wird auch nicht benötigt).
Und statt das Kombi zu leeren (beim Blättern) würde ich das Kombi auf den angezeigten Datensatz setzen.
Bitte beschreibe mal genau den gedachten Ablauf.
Hallo Harald, hallo Klaus,
in meiner DB habe ich eine Eingabemaske, mittels derer die Bücher eingegeben werden. In dieser Maske sind Navigationsschaltflächen eingepflegt, die zwischen den Datensätzen hin- und herschalten. Wenn ich nun beim letzten Datensatz ankomme und eben weiterschalte, zeigt sich die Maske zur Eingabe eines neuen Datensatzes komplett leer. An eben dieser Stelle möchte ich, dass der Anwender abgefragt wird, ob er ein neues Buch eingeben möchte - wenn nicht, dann soll der Datensatzzeiger beim letzten Buchtitel verharren.
Wenn dieses funktioniert, dann würde ich analog eine Prozedur einstellen, die bei der BOF-Position sich mit einem entsprechenden Dialog zeigt und beim ersten Datensatz stehen bleibt.
Viele Grüße
gromax
Hallo,
vergiss BOF und EOF das ist hier fehl am Platz, Du hast ja ein gebundenes Formular.
Für den 1. Teil Deiner Beschreibung würde der Code so aussehen:
Private Sub cmd_NaechsterDS_Click()
DoCmd.GoToRecord , , acNext
If Me.NewRecord = True Then
If MsgBox("Möchten Sie einen neuen Titel eingeben?", vbQuestion + vbYesNo, "Letzter Titel") = vbYes Then
' nichts weiter zu tun
Else
DoCmd.GoToRecord , , acLast 'wieder zum letzten DS
End If
End If
End Sub
Und für Zurückblättern sieht der Code dann so aus:
Private Sub cmd_VorherigerDS_Click()
If Me.CurrentRecord = 1 Then
MsgBox "Dies ist der 1.Datensatz"
Else
DoCmd.GoToRecord , , acPrevious
End If
End Sub
Übrigens, ich würde das Kombi zum Suchen nicht leeren, sondern auf den angezeigten Datensatz setzen. Das stimmt dann automatisch überein.
Private Sub Form_Current() 'Formularereignis "Beim Anzeigen"
Me.Liste104 = Me.BUC_PS
End Sub
Hallo Klaus,
super! Genau so!
Vielen Dank
gromax