Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: gromax am Juli 03, 2016, 18:35:34

Titel: Kombinationsfeld leeren
Beitrag von: gromax am Juli 03, 2016, 18:35:34
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
Titel: Re: Kombinationsfeld leeren
Beitrag von: MaggieMay am Juli 03, 2016, 23:24:43
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.
Titel: Re: Kombinationsfeld leeren
Beitrag von: datekk am Juli 04, 2016, 17:29:59
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.
Titel: Re: Kombinationsfeld leeren
Beitrag von: gromax am Juli 05, 2016, 20:55:07
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
Titel: Re: Kombinationsfeld leeren
Beitrag von: MaggieMay am Juli 05, 2016, 22:32:45
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.
Titel: Re: Kombinationsfeld leeren
Beitrag von: Beaker s.a. am Juli 06, 2016, 16:03:27
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
Titel: Re: Kombinationsfeld leeren
Beitrag von: gromax am Juli 08, 2016, 20:38:28
Hallo MaggieMay, hallo Ekkehard,

beide Hinweise sind umgesetzt; alles funktioniert wie gewünscht!! Klasse!

Vielen Dank
gromax
Titel: Re: Kombinationsfeld leeren
Beitrag von: gromax am Juli 08, 2016, 22:37:40
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
Titel: Re: Kombinationsfeld leeren
Beitrag von: bahasu am Juli 09, 2016, 07:46:11
Hi,

definiere: "es klappt nicht"
Was passiert? Error?

Harald
Titel: Re: Kombinationsfeld leeren
Beitrag von: MzKlMu am Juli 09, 2016, 08:46:40
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.
Titel: Re: Kombinationsfeld leeren
Beitrag von: gromax am Juli 09, 2016, 19:43:27
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
Titel: Re: Kombinationsfeld leeren
Beitrag von: MzKlMu am Juli 09, 2016, 19:47:40
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


Titel: Re: Kombinationsfeld leeren
Beitrag von: gromax am Juli 09, 2016, 20:57:42
Hallo Klaus,

super! Genau so!

Vielen Dank
gromax