none
Me.Requery zeigt keine Wirkung

    Frage

  • Hallo,

    Me.Requery bringt nicht das erwartete Ergebnis.

    - Access 2003 Windows XP

    - Formular mit Unterformular, welches per Code eingebunden wird

    - Datenherkunft des Hauptformulares Abfrage die Kriterien von einem ungebunden Textfeldes des Hauptormulares bekommt

    Der Anwender kann die angzeigten Daten auf zwei Wege einschränken. Einmal durch die Eingabe eines Kritieriums in das oben genannte ungebundene Textfeld. Nach der Eingabe wird eine Me.Requery ausgeführt. Zusätzlich kann über eine Auswahlfeld Filterungen vorgenommen werden. Die Filterung enthält auch die Möglichkeit alle Datensätze anzuzeigen.

    Die Einschränkung durch das ungebundene Textfeld kann auch auf alle Datensätze eingestellt werden.

    Beschreibung des Fehlers:

    1) Auswahlfeld ist auf ein Kriterium eingestellt.  Über das ungebundene Textfeld mit dem anschließenden Requery ändern sich die angzeigten Datensätze wie gewünscht.

    2) Im Auswahlfeld wechsel ich auf die Einstellung "Alle". Die Datensätze werden entsprechend der letzten Eingabe des ungebundenen Textfeld angzeigt. Darstellung wie gewünscht. Ändere ich nun die Eingabe im ungebundenen Textfeld, ändern sich die Darstellung der Datensätze nicht. Nach dem erneuten öffnen des Formulares wird alles wie gewünscht angezeigt.

     

    Durch das Wechseln der Filtereinstellungen von Kriterium "Einzeln" auf "Alle" (löschen des Filters) scheint die Me.Requery Aktion ausgehebelt zu werden.

    Mit Recalc und Repaint nach dem Requery habe ich experimentiert. SetFocus damit das Hauptformular den Focus hat, habe ich getestet.

     

    Schöne Grüße

    Ulrich

     

     

     

     

     

     

     

    Donnerstag, 28. Oktober 2010 04:59

Antworten

  • Hallo,
     
    ein erster Erfolg hat sich eingestellt.
    Ich habe im "verdächtigen" Code nach dessen Ausführung des Requery, von
    einem anderen Steuerelement aufgerufen,
    nicht mehr funktioniert die Datenquelle des Formulares nochmals zugewiesen.
    Jetzt funktioniert das Ganze wie gewünscht. Vermutlich verliert das Formular
    die Datenquelle.
    Dies wäre noch zu prüfen.
     
     
    Private Sub cboBetriebSuchen_DblClick(Cancel As Integer)
    Me.FilterOn = False
     
    'Neuanbindung der Datequelle.
    'Wird benötigt damit nach dem löschen des Filters die Auswahl der Jahreszahl
    funktioniert.
    'Warum das so sein muss = keine Ahnung
    ==> Me.RecordSource = "MeineAbfrage"
    ....
     
    End Sub
     
     
    Gruß
    Ulrich
     
     
     
    • Als Antwort markiert Ulrich Wrede Freitag, 5. November 2010 14:27
    Freitag, 5. November 2010 11:23

Alle Antworten

  • Ulrich Wrede wrote:

    ...
    2) Im Auswahlfeld wechsel ich auf die Einstellung "Alle". Die
    Datensätze werden entsprechend der letzten Eingabe des
    ungebundenen Textfeld angzeigt. Darstellung wie gewünscht.

    Was heißt das? Wieso "entsprechend der letzten Eingabe",
    wenn du alle sehen willst oder meinst du mit der letzten Eingabe
    "Alle"?

    Ändere ich nun die
    Eingabe im ungebundenen Textfeld, ändern sich die Darstellung der
    Datensätze nicht. Nach dem erneuten öffnen des Formulares wird
    alles wie gewünscht angezeigt.

    Durch das Wechseln der Filtereinstellungen von Kriterium "Einzeln"
    auf "Alle" (löschen des Filters) scheint die Me.Requery Aktion
    ausgehebelt zu werden.
    ...

    Verrate noch, was genau du bei "Alle" oder überhaupt machst,
    um diese Filterungen umzusetzen.
    Welcher Code, SQL-String oder Filtereinstellung im Formular...?


    Servus
    Karl
    *******
    Access-FAQ: http://www.donkarl.com

    Donnerstag, 28. Oktober 2010 07:10
  • Hallo Karl,

    das formale Handling dieses Forums ist mir noch nicht geläufig, deshalb Entschuldigung wenn das mit dem Zitieren nicht so klappt.

     

    1) Kombinationsfeld zum Filtern

    Bei Doppelklick folgender Code (Ausschnitt) alle Datensätze der Abfrage werden angezeigt

    Private Sub cboBetriebSuchen_DblClick(Cancel As Integer)
    Me.FilterOn = False
    ...
    Me!cboSchlag.RowSource = SQLSchlagAlle
    ....
    End Sub

    Alternativ

    Einzelne Datensatz wird angezeigt

    Private Sub cboBetriebSuchen_AfterUpdate()
    ...
    Me!cboSchlag.RowSource = SQLSchlagFilter
    ...
    Me.FilterOn = True
    ...
    End Sub

    2) Abfrage wird von Textfeld beschickt

    9999 bedeutet alle Datensätze anzeigen

    WHERE

    (((Feld1)<=[Formulare]![MeinForm]![Textfeld]) AND ((Feld2)>=[Formulare]![MeinForm]![Textfeld]-1 Or (Feld2) Is Null))

    OR

    ((([Formulare]![MeinForm]![Textfeld])=9999 And ([Formulare]![MeinForm]![Textfeld])=9999))


    ORDER BY Feld3;

     

    Donnerstag, 28. Oktober 2010 07:56
  • Hallo,

    Ulrich Wrede wrote:

    1) Kombinationsfeld zum Filtern

    Bei Doppelklick folgender Code (Ausschnitt) alle Datensätze der
    Abfrage werden angezeigt

    Private Sub cboBetriebSuchen_DblClick(Cancel As Integer)
    Me.FilterOn = False
    ...
    Me!cboSchlag.RowSource = SQLSchlagAlle

    Ist SQLSchlagAlle eine Funktion? Welchen Wert liefert sie?

    .... End Sub

    Alternativ

    Einzelne Datensatz wird angezeigt

    [code]
    Private Sub cboBetriebSuchen_AfterUpdate()
    ...
    Me!cboSchlag.RowSource = SQLSchlagFilter
    ...
    Me.FilterOn = True

    FilterOn bezieht sich auf das Formular, nicht das Kombifeld.
    Allerdings habe ich nirgendwo ein Requery gesehen.

    Gruss - Peter


    Mitglied im http://www.dbdev.org
    FAQ: http://www.donkarl.com

    Donnerstag, 28. Oktober 2010 08:34
    Moderator
  • Hallo Peter,

    >> Ist SQLSchlagAlle eine Funktion? Welchen Wert liefert sie?

    Es ist ein SQL String

    >> Allerdings habe ich nirgendwo ein Requery gesehen.

    Die Datengrundlage der Abfrage bleibt bei der Benutzung des Kombifeldes unberührt. Das Kombinationsfeld dient zum Filtern des Formulares.

    Das erwähnte ungebundene Textfeld des Formulares dient als Kriterium für die Abfrage. Ich denke, erst wenn ich diesen Wert änderen, muss ich anschließend ein Requery ausführen.

    Gruss - Ulrich

     

     

    Donnerstag, 28. Oktober 2010 08:53
  • Hallo,

    Ulrich Wrede wrote:

    Allerdings habe ich nirgendwo ein Requery gesehen.

    Die Datengrundlage der Abfrage bleibt bei der Benutzung des Kombifeldes
    unberührt. Das Kombinationsfeld dient zum Filtern des Formulares.

    Das erwähnte ungebundene Textfeld des Formulares dient als Kriterium für
    die Abfrage. Ich denke, erst wenn ich diesen Wert änderen, muss ich
    anschließend ein Requery ausführen.

    Du schreibst im Betreff, dass Requery keine Wirkung zeigt. Wenn ich dich
    richtig verstehe, hast du es noch garnicht angewendet. Zeig mal den ganzen
    Code aus cboBetriebSuchen_AfterUpdate()

    Gruss - Peter


    Mitglied im http://www.dbdev.org
    FAQ: http://www.donkarl.com

    Donnerstag, 28. Oktober 2010 10:56
    Moderator
  • Hallo

    Me.Filter = "[EU_NR] = '" & Me!cboBetriebSuchen & "'"
    
    proEinstellungenSchreiben "T_TX_Steuerung_1", "BetriebFilterSchlag", Me!cboBetriebSuchen
    
    
    Me!cboSchlag.RowSource = SQLSchlagFilter
    Me!cboSchlag = cboSchlag.ItemData(0)
    Me.FilterOn = True
    BetriebFilterSchlag = Me!cboBetriebSuchen
    
    
    das Requery gibt es hier

    Private Sub txtBezugsjahr_AfterUpdate()
    On Error GoTo Fehler
    
    Me!cboSchlag.Requery
    Me.Requery
    
    Raus:
    Exit Sub
    Fehler:
    MsgBox Err.Description & " " & Err.Number
    
    Resume Raus
    End Sub
    

    Dieses Requery wird nicht ausgeführt, wenn im Kombifeld von einer bestimmten Auswahl auf "alle" gewechselt wird, sprich der Filter ausgeschaltet wird.  Ändere ich dann die Einstellungen im Textfeld txtBezugsjahr gibt keine Änderung der Datensatzzahl.

     

    Gruss - Ulrich

    Donnerstag, 28. Oktober 2010 11:32
  • Hallo,

    Ulrich Wrede wrote:

    Me.Filter = "[EU_NR] = '" & Me!cboBetriebSuchen & "'"
    Ok, wenn dboBetriebSuchen leer ist, wird nach Uebereinstimmung von [EU_NR]='' gefiltert und ich denke, das ist nicht, was du willst, oder? Spendier der Prozedur an dieser Stelle ein If-Statement: [code] If Nz(Me!cboBetriebSuchen, "") = "" Then Me.Filter = "" Else Me.Filter = "[EU_NR] = '" & Me!cboBetriebSuchen & "'" End If

    Desweiteren solltest du die WHERE-Klausel aus deiner Antwort an Karl
    nochmal ueberdenken:

    WHERE
     (Feld1<=[Formulare]![MeinForm]![Textfeld] AND
     (Feld2>=[Formulare]![MeinForm]![Textfeld]-1 Or Feld2 Is Null))
    OR
     ([Formulare]![MeinForm]![Textfeld]=9999 And
      [Formulare]![MeinForm]![Textfeld]=9999)

    Ich vermute, dass du die Statements vor dem Posten verfaelscht hast und die
    echten anders aussehen, desweiteren, dass in den echten Statements der
    Fehler liegt. Z. B. fragst du hier im OR zweimal das gleiche Feld auf 9999
    ab, was ziemlich sinnfrei waere. Deshalb poste mal den echten Code.

    Gruss - Peter


    Mitglied im http://www.dbdev.org
    FAQ: http://www.donkarl.com

    Donnerstag, 28. Oktober 2010 16:28
    Moderator
  • Hallo,

    Ok, wenn dboBetriebSuchen leer ist,

    eigentlich ist das Kombifeld nach einem AfterUpdate-Ereignis nicht leer. Ich habe ja einen Betrieb ausgewählt nach dem gefiltert werden soll.

    Nach einem Doppelklick auf das Kombifeld wird der Filter ausgeschaltet. Ich kann dann alle Datensätze der Abfrage sehen. Diese Abfrage ist nach dem Kriterium txtBezugsjahr des Formulars selektiert

    Ich vermute, dass du die Statements vor dem Posten verfaelscht

    Hier das original im als SQL String für VBA-Code

    SQLSchlagAlle = "SELECT F00_SCHLAG_GRUNDDATEN.SCHLAG_KN, F00_SCHLAG_GRUNDDATEN.SCHLAGNAME, [Nachname] & ' ' & [Vorname] & ', ' & [ORT] & IIf(IsNull([ORTSTEIL]),'',' (' & [ORTSTEIL] & ')') & ' (' & [BETRIEBS_NR] & ')' AS Betrieb, F00_SCHLAG_GRUNDDATEN.EU_NR" _
    & " FROM A00_ADRESSEN RIGHT JOIN (D00_BETRIEB_GRUNDDATEN INNER JOIN F00_SCHLAG_GRUNDDATEN ON D00_BETRIEB_GRUNDDATEN.EU_NR = F00_SCHLAG_GRUNDDATEN.EU_NR) ON A00_ADRESSEN.ID_ADRESS = D00_BETRIEB_GRUNDDATEN.ID_ADRESS" _
    & " WHERE (F00_SCHLAG_GRUNDDATEN.JAHR_ANF <= eval('[Forms]![F_Schlag]![txtBezugsjahr]')" _
    & " AND (F00_SCHLAG_GRUNDDATEN.JAHR_END >= eval('[Forms]![F_Schlag]![txtBezugsjahr]-1')" _
    & " OR ((F00_SCHLAG_GRUNDDATEN.JAHR_END) Is Null))" _
    & " OR eval('[Forms]![F_Schlag]![txtBezugsjahr]=9999'))" _
    & " UNION " _
    & " SELECT F00_SCHLAG_GRUNDDATEN.SCHLAG_KN, F00_SCHLAG_GRUNDDATEN.SCHLAGNAME, 'kein Betriebseintrag' AS Betrieb, 'keine EU-NR' AS EuNR" _
    & " FROM F00_SCHLAG_GRUNDDATEN" _
    & " WHERE" _
    & " (((F00_SCHLAG_GRUNDDATEN.JAHR_ANF)<=eval('[Formulare]![F_Schlag]![txtBezugsjahr]')) AND ((F00_SCHLAG_GRUNDDATEN.JAHR_END)>=eval('[Formulare]![F_Schlag]![txtBezugsjahr]-1')" _
    & " Or (F00_SCHLAG_GRUNDDATEN.JAHR_END) Is Null)" _
    & " AND" _
    & " ((F00_SCHLAG_GRUNDDATEN.EU_NR) Is Null))" _
    & " OR" _
    & " (((F00_SCHLAG_GRUNDDATEN.EU_NR) Is Null)" _
    & " AND ((eval('[Formulare]![F_Schlag]![txtBezugsjahr])=9999')" _
    & " And (eval('[Formulare]![F_Schlag]![txtBezugsjahr])=9999')))" _
    & " ORDER BY F00_SCHLAG_GRUNDDATEN.SCHLAG_KN, Betrieb "

    und hier das QBE-Ergebnis als SQL

    WHERE (((F00_SCHLAG_GRUNDDATEN.JAHR_ANF)<=[Formulare]![F_Schlag]![txtBezugsjahr]) AND ((F00_SCHLAG_GRUNDDATEN.JAHR_END)>=[Formulare]![F_Schlag]![txtBezugsjahr]-1 Or (F00_SCHLAG_GRUNDDATEN.JAHR_END) Is Null)) OR ((([Formulare]![F_Schlag]![txtBezugsjahr])=9999 And ([Formulare]![F_Schlag]![txtBezugsjahr])=9999))
    ORDER BY F00_SCHLAG_GRUNDDATEN.SCHLAG_KN;

     

    Ich habe die QBE-Ergebnis in VBA "angepasst".

    Die Jahreseingrenzung (in der Abfrage) funktioniert immer dann nicht wenn ich vom einzelnen Betrieb (Filter des Formulares, FilterOn = True) auf "alle" wechsel (FilterOn = False). Jetzt zeigt das Requery  hier:

    Private Sub txtBezugsjahr_AfterUpdate()
    On Error GoTo Fehler

    DoCmd.SetWarnings False
    DoCmd.RunSQL "UPDATE T_TX_Steuerung_1 SET JahrBezug =" & CLng(Me!txtBezugsjahr) & " WHERE ID=1"
    DoCmd.SetWarnings True

    Me!cboSchlag.Requery
    Me.Requery

    Raus:
    Exit Sub
    Fehler:
    MsgBox Err.Description & " " & Err.Number

    Resume Raus
    End Sub

    keine Wirkung mehr.

    Gruss- Ulrich


    Freitag, 29. Oktober 2010 04:37
  • Hallo,
     
    ich habe die Sache nochmal  sehr vereinfacht, z. B. ohne Unterformular, nachgebaut. Jetzt funktioniert mein Konstrukt.
    Vielleicht finde ich ja den Fehler der Originalanwendung, wenn ich das Ganze nach und nach aufbaue.
     
    Gru�?
    Ulrich
    Montag, 1. November 2010 17:44
  • Hallo,

    Ulrich Wrede wrote:

    Ich vermute, dass du die Statements vor dem Posten verfaelscht

    Hier das original im als SQL String für VBA-Code
    [...]

    Das wird so wohl nix. Wenn die DB nicht zu gross bzw. vertraulich ist,
    kannst du eine auf das Problem reduzierte DB mit ein paar Erklaerungen
    (Form- u. Controlnamen, Ablauf) irgendwo zum Download bereitstellen? Ich
    wuerde sie mir dann anschauen. Wenn du noch Zugriff auf die alten NGs hast,
    wirst du dort sicher Postings von mir finden und damit auch eine
    funktionierende Email, auf die du sie mir auch mailen kannst.

    Die Antwort gibt's dann wieder hier.

    Gruss - Peter


    Mitglied im http://www.dbdev.org
    FAQ: http://www.donkarl.com

    Donnerstag, 4. November 2010 23:46
    Moderator
  • Hallo,
     
    ein erster Erfolg hat sich eingestellt.
    Ich habe im "verdächtigen" Code nach dessen Ausführung des Requery, von
    einem anderen Steuerelement aufgerufen,
    nicht mehr funktioniert die Datenquelle des Formulares nochmals zugewiesen.
    Jetzt funktioniert das Ganze wie gewünscht. Vermutlich verliert das Formular
    die Datenquelle.
    Dies wäre noch zu prüfen.
     
     
    Private Sub cboBetriebSuchen_DblClick(Cancel As Integer)
    Me.FilterOn = False
     
    'Neuanbindung der Datequelle.
    'Wird benötigt damit nach dem löschen des Filters die Auswahl der Jahreszahl
    funktioniert.
    'Warum das so sein muss = keine Ahnung
    ==> Me.RecordSource = "MeineAbfrage"
    ....
     
    End Sub
     
     
    Gruß
    Ulrich
     
     
     
    • Als Antwort markiert Ulrich Wrede Freitag, 5. November 2010 14:27
    Freitag, 5. November 2010 11:23
  • Hallo Peter,

    danke für Dein Mitdenken und -suchen nach der Ursache meines Access-Problems.

    Durch rumprobieren bin ich zu einer "Lösung" gekommen, vielleicht auch nur ein Würg-Around, mal sehen.

    Sieh mein Posting von vor einer Stunde weiter unten.

     

    Gruss - Ulrich

     

    • Als Antwort markiert Ulrich Wrede Freitag, 5. November 2010 12:59
    • Tag als Antwort aufgehoben Ulrich Wrede Freitag, 5. November 2010 12:59
    Freitag, 5. November 2010 12:58