Neuigkeiten:

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

Mobiles Hauptmenü

Kombinationsfeld leeren

Begonnen von gromax, Juli 03, 2016, 18:35:34

⏪ vorheriges - nächstes ⏩

gromax

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

MaggieMay

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.
Freundliche Grüße
MaggieMay

datekk

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.
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

gromax

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

MaggieMay

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.
Freundliche Grüße
MaggieMay

Beaker s.a.

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
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)

gromax

Hallo MaggieMay, hallo Ekkehard,

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

Vielen Dank
gromax

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

bahasu

Hi,

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

Harald
Servus

MzKlMu

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

gromax

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

MzKlMu

#11
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


Gruß Klaus

gromax

Hallo Klaus,

super! Genau so!

Vielen Dank
gromax