collapse

* Benutzer Info

 
 
Willkommen Gast. Bitte einloggen oder registrieren. Haben Sie Ihre Aktivierungs E-Mail übersehen?

* Wer ist Online

  • Punkt Gäste: 54
  • Punkt Versteckte: 1
  • Punkt Mitglieder: 1

Es sind keine Mitglieder online.

* Forenstatistik

  • stats Mitglieder insgesamt: 13804
  • stats Beiträge insgesamt: 63539
  • stats Themen insgesamt: 8609
  • stats Kategorien insgesamt: 5
  • stats Boards insgesamt: 16
  • stats Am meisten online: 415

Autor Thema: Ereignis beim Laden funktioniert nicht immer ........  (Gelesen 581 mal)

Offline derilzemer

  • Access-Meister
  • ***
  • Beiträge: 544
    • Quartettportal
Ereignis beim Laden funktioniert nicht immer ........
« am: Oktober 08, 2017, 13:45:45 »
Hallo,
ich habe ein Bild-Unterformular, welches mir beim laden immer eine bestimmte ID (bestimmte Bildtyp) anzeigen soll, da in diesem Bild-Ufo viele Arten Bilder geladen/hinterlegt werden können. Mit im Spiel sind die Tabellen tblBilderZuSpiel und tblBildmotive. Dem Ufo ist als Ereignis beim laden folgender Code hinterlegt.
Private Sub Form_Load()
    Me.RecordSelectors = False
    Me.Recordset.FindFirst "[BildmotivID_F] =1 or [BildmotivID_F] =5"
End Sub
ID 1 = Deckblatt (DB) und ID 5 = Schachtel-DB.
Grundsätzlich funktioniert das auch, bis auf ein paar rühmliche Ausnahmen, was ich jetzt nicht wirklich nachvollziehen kann, warum das so ist. Die Ausnahme ist immer dann der Fall, wenn ich ID8 = Box/Schachtel auswähle. Wenn man dann einen Solchen Datensatz aufruft, dann zeigt er grundsätzlich genau das Bild (ID8) an, obwohl ID1 oder ID5 zur Auswahl steht (bild1--> Ausnahme und bild2 -->Normalfall) :(. Es bleibt noch zu sagen, dass auf der Auswahlliste ein select gebunden ist, der das Bildmotiv sortiert. Dies dürfte doch aber das ganze nicht beeinflussen, oder?
SELECT tblBilderZuSpiel.BildmotivID_F, tblBildmotive.Bildmotiv
FROM tblBildmotive INNER JOIN tblBilderZuSpiel ON tblBildmotive.BildMotivID = tblBilderZuSpiel.BildmotivID_F
WHERE (((tblBilderZuSpiel.SpielID_F)=[Formulare]![frmErfassung]![txtSpielID])) OR (((tblBilderZuSpiel.BildmotivID_F)=1))
ORDER BY tblBildmotive.Bildmotiv;
Deswegen würde ich mich über eure Ideen bzw. Hilfe freuen, damit ich das abstellen kann und das Ereignis immer funktioniert.
Ich bin aktuell nicht so angebunden was Internet angeht wie ich das gerne hätte aber auch okay ist. Ich bin in Reha wegen Rücken, da sollte I-Net 2. rangig sein. Deswegen kann ich auch nicht immer sofort antworten wie gewohnt. Eure Hilfe wäre dennoch gewünscht.

Gruß Andreas
Grüße und Dank im voraus
Andreas
 

Offline derilzemer

  • Access-Meister
  • ***
  • Beiträge: 544
    • Quartettportal
Re: Ereignis beim Laden funktioniert nicht immer ........
« Antwort #1 am: November 11, 2017, 17:08:43 »
Hallo,
hat niemand eine Idee, worin das Problem liegen könnte?
mfG
Andreas
Grüße und Dank im voraus
Andreas
 

Offline Frithjiof

  • Newbie
  • Beiträge: 41
Re: Ereignis beim Laden funktioniert nicht immer ........
« Antwort #2 am: November 13, 2017, 12:39:32 »
Ich verstehe das Problem nicht.
Deine Form_Load Prozedure macht im meinen Augen keinen Sinn.

Frithjof
 

Offline derilzemer

  • Access-Meister
  • ***
  • Beiträge: 544
    • Quartettportal
Re: Ereignis beim Laden funktioniert nicht immer ........
« Antwort #3 am: November 13, 2017, 14:53:41 »
Hi
Ich verstehe das Problem nicht.
Deine Form_Load Prozedure macht im meinen Augen keinen Sinn.
Private Sub Form_Load()
    Me.RecordSelectors = False
    Me.Recordset.FindFirst "[BildmotivID_F] =1 or [BildmotivID_F] =5"
End Sub
Wie soll man es dann lösen, damit er beim Laden des UFO ID 1 oder 5 anzeigt? Was ist daran "unsinnig"? Es stimmt zwar, daß ich bei nur wenigen Datensätzen das Problem habe, dass er NICHT ID 1 oder 5 lädt, aber was wäre dann der richtige Ansatz?

Gruß Andreas
Grüße und Dank im voraus
Andreas
 

Offline Lachtaube

  • Access-Meister
  • ***
  • Beiträge: 854
Re: Ereignis beim Laden funktioniert nicht immer ........
« Antwort #4 am: November 13, 2017, 15:40:47 »
Fernanalysen der Daten sind wohl nicht möglich. Ob FindFirst erfolgreich war, lässt sich mit der Methode NoMatch des Recordsets herausfinden. Diese gibt dann False bei Erfolg und True bei Misserfolg zurück.

PS: ... und die Navigationsleiste kannst Du doch im Entwurfsmodus abstellen.
Grüße von der (⌒▽⌒)
 

Offline Frithjiof

  • Newbie
  • Beiträge: 41
Re: Ereignis beim Laden funktioniert nicht immer ........
« Antwort #5 am: November 13, 2017, 15:54:18 »
Genau, Findfirst ist eine Methode die einen Recordset durchsucht, aber nicht einschränkt(filtert).
für Deine Absicht, wenn ich Dich richtig verstehe müsstes sowas helfen:

Me.filter="[BildmotivID_F] =1 or [BildmotivID_F] =5"
Me.FilterOn =true

Folgendes solte es auch tun:
Me.RowSource= "Select  xxx.[BildmotivID_F],  [xxx].[zzz] from xxx where xxx.[BildmotivID_F] =1 or xxx.[BildmotivID_F] =5;"
 
Folgende Mitglieder bedankten sich: derilzemer

Offline derilzemer

  • Access-Meister
  • ***
  • Beiträge: 544
    • Quartettportal
Re: Ereignis beim Laden funktioniert nicht immer ........
« Antwort #6 am: November 13, 2017, 16:26:26 »
Hi,
Genau, Findfirst ist eine Methode die einen Recordset durchsucht, aber nicht einschränkt(filtert).
für Deine Absicht, wenn ich Dich richtig verstehe müsstes sowas helfen:
Me.filter="[BildmotivID_F] =1 or [BildmotivID_F] =5"
Me.FilterOn =true
Okay, damit setzt er jetzt definitiv 1 oder 5, das wäre ja okay. Aber dann kann ich mir aber auch KEIN anderes Bild mehr aus der Liste anschauen. Ich kann es zwar anwählen, aber er bleibt hart auf ID 1 oder 5, eben wegen dem Filter denke ich mal, oder?

Gruß Andreas


Grüße und Dank im voraus
Andreas
 

Offline derilzemer

  • Access-Meister
  • ***
  • Beiträge: 544
    • Quartettportal
Re: Ereignis beim Laden funktioniert nicht immer ........
« Antwort #7 am: November 13, 2017, 16:31:28 »
Hi,
Fernanalysen der Daten sind wohl nicht möglich. Ob FindFirst erfolgreich war, lässt sich mit der Methode NoMatch des Recordsets herausfinden. Diese gibt dann False bei Erfolg und True bei Misserfolg zurück.
Die Codeänderung von Frithjiof hilft bedingt weiter, beseitigt die Auffälligkeit, aber schafft ein anderes Problem, nämlich dass ich nicht mehr in den Bildern hin und her switchen kann wenn nötig.
Zitat
PS: ... und die Navigationsleiste kannst Du doch im Entwurfsmodus abstellen.
Wollte ich eine Navigationsleiste abstellen, oder meinst du die Liste Links zum auswählen? Die will ich natürlich nicht abstellen. Ich will ja nur, dass wenn man in einen Datensatz springt, generell das Deckblatt des Spieles angezeigt wird. Es muss aber weiterhin die Möglichkeit bestehen, dass ich aus der Liste mir auch noch ein anderes Bild auswählen und anschauen kann.

Gruß Andreas
Grüße und Dank im voraus
Andreas
 

Offline Beaker s.a.

  • Access Guru
  • ****
  • Beiträge: 1600
Re: Ereignis beim Laden funktioniert nicht immer ........
« Antwort #8 am: November 13, 2017, 17:14:27 »
Hallo Andreas,
Zitat
dass er NICHT ID 1 oder 5 lädt
Dann würde ich vermuten, dass es diese bei dem gewählten Spiel nicht gibt.
Prüfe also, wie angeregt,
Me.Recordset.FindFirst "[BildmotivID_F] =1 or [BildmotivID_F] =5"
If Me.Recordset.NoMatch Then ...
gruss ekkehard
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.
 

Offline Frithjiof

  • Newbie
  • Beiträge: 41
Re: Ereignis beim Laden funktioniert nicht immer ........
« Antwort #9 am: November 14, 2017, 01:49:14 »
Die Codeänderung von Frithjiof hilft bedingt weiter, beseitigt die Auffälligkeit, aber schafft ein anderes Problem, nämlich dass ich nicht mehr in den Bildern hin und her switchen kann wenn nötig.

Um hin und her zu switchen muss der Filter angepasst werden.

Me.filter="[BildmotivID_F] =" & XXX
Me.FilterOn =true


Die (m.E. bessere) Variante, die ich in der Regel bevorzuge ist die Aktualisierung des Sql-Statements:
Me.RowSource= "Select  xxx.[BildmotivID_F],  [xxx].[zzz] from xxx where xxx.[BildmotivID_F] =" & neue_ID & ";"
Frithjof
 

Offline derilzemer

  • Access-Meister
  • ***
  • Beiträge: 544
    • Quartettportal
Re: Ereignis beim Laden funktioniert nicht immer ........
« Antwort #10 am: November 14, 2017, 21:18:04 »
Hi Ekkehard,
Zitat
dass er NICHT ID 1 oder 5 lädt
Dann würde ich vermuten, dass es diese bei dem gewählten Spiel nicht gibt.
Ist definitiv da, ist auch richtig benamst etc. und wie man im Bild im Einstiegsthread sieht ist Schachtel-DB (ID 5) ja hinzugefügt.

Gruß Andreas
Grüße und Dank im voraus
Andreas
 

Offline derilzemer

  • Access-Meister
  • ***
  • Beiträge: 544
    • Quartettportal
Re: Ereignis beim Laden funktioniert nicht immer ........
« Antwort #11 am: November 14, 2017, 21:38:04 »
Hi Frithjiof,
Um hin und her zu switchen muss der Filter angepasst werden.
Me.filter="[BildmotivID_F] =" & XXX
Me.FilterOn =true
Dir habe ich es ja noch nicht gesagt, aber VBA und SQL technisch bin ich ziemlich mau bestückt, aber das ist dir sicherlich schon aufgefallen :(. Bedeutet das, dass ich hier feste ID's im Filter dazu schreiben müsste?
Zitat
Die (m.E. bessere) Variante, die ich in der Regel bevorzuge ist die Aktualisierung des Sql-Statements:
Me.RowSource= "Select  xxx.[BildmotivID_F],  [xxx].[zzz] from xxx where xxx.[BildmotivID_F] =" & neue_ID & ";"
Du würdest das im VBA präferieren gegenüber der Filtervariante, welche du mir vorgeschlagen hattest.
Me.RowSource= "Select  tbl.BilderZuSpiel[BildmotivID_F] from tblBilderZuSpiel where tbl.BilderZuSpiel.[BildmotivID_F] =" & neue_ID & ";"Hier verstehe ich im letzten Teil nicht (=" & neue_ID & ";"), wie er 1 und 5 primär setzt und wie man dennoch switchen kann :(. Sorry

Gruß Andreas
Grüße und Dank im voraus
Andreas
 

Offline Frithjiof

  • Newbie
  • Beiträge: 41
Re: Ereignis beim Laden funktioniert nicht immer ........
« Antwort #12 am: November 15, 2017, 11:18:49 »
Hallo Andreas.
Vorweg, ich habe mich nochmal mit dem, mir auf dem ersten Blick suspekt erscheinenden, Befehl

Me.Recordset.FindFirst "[BildmotivID_F] =1 or [BildmotivID_F] =5"
beschäftigt.

Prinzipiell sollte er funktionieren allerdings schreibt Microsoft hier dass die Methode auf Formularebene nicht funktioniert.

Richtig müsst es so lauten
Me.Recordsetclone.FindFirst "[BildmotivID_F] =1 or [BildmotivID_F] =5"
Me.Bookmark = Me.RecordsetClone.Bookmark

Ist es unsicher, ob  [BildmotivID_F] =1 oder [BildmotivID_F] =5 überhaupt im Recordset enthalten sind, solltest Du, wie bereits von Lachtaube und Ekkehard angeregt mit "NoMatch" erstmal prüfen.

Me.Recordsetclone.FindFirst "[BildmotivID_F] =1 or [BildmotivID_F] =5"
If Me.Recordsetclone.NoMatch Then
       msgbox "Was mach ich jetzt?"
else
      Me.Bookmark = Me.RecordsetClone.Bookmark
endif

Me.RowSource= "Select  tbl.BilderZuSpiel[BildmotivID_F] from tblBilderZuSpiel where tbl.BilderZuSpiel.[BildmotivID_F] =" & neue_ID & ";"Hier verstehe ich im letzten Teil nicht (=" & neue_ID & ";"), wie er 1 und 5 primär setzt und wie man dennoch switchen kann :(. Sorry

<Me.RecordSource> kann während der Laufzeit geändert werden.
(sorry, nicht Me.RowSource >> so heisst das nur in Kombinations- und Listenfeldern.)

Egal welche Methode (Filter, Bookmark, SQL) Du zum „switchen“ wählst, irgendwoher muss ja eine <neue_ID> kommen.
In Deinem Formular klickt der Benutzer auf einen Eintrag in der Liste <Bildmotiv> und dann wird das Bild angezeigt. Die „neue_ID“ wäre vermutlich  (kommt auf die Rowsource des Listenfeldes an) der aktuelle Wert aus der Liste <Bildmotiv>.

Sub Bildmotiv_AfterUpdate() ' oder beim Klicken oder ...
if nz(me.bildmotiv,0)>0 then
Me.RecordSource= "Select  tbl.BilderZuSpiel[BildmotivID_F] from tblBilderZuSpiel where tbl.BilderZuSpiel.[BildmotivID_F] =" & me.bildmotiv & ";"
else
'irgendwas oder nichts tun
endif
end sub

oder

Sub Bildmotiv_AfterUpdate() ' oder beim Klicken oder ...
if nz(me.bildmotiv,0)>0 then
Me.Recordsetclone.FindFirst "[BildmotivID_F] =" & me.bildmotiv
Me.Bookmark = Me.RecordsetClone.Bookmark
endif
end sub


Frithjof
 
Folgende Mitglieder bedankten sich: derilzemer

Offline derilzemer

  • Access-Meister
  • ***
  • Beiträge: 544
    • Quartettportal
Re: Ereignis beim Laden funktioniert nicht immer ........
« Antwort #13 am: November 15, 2017, 19:37:24 »
Hi Frithjiof,
Danke wegen der Recherche. Also ich habe mal folgendes gemacht.
Private Sub Form_Load()
   Me.RecordsetClone.FindFirst "[BildmotivID_F] =1 or [BildmotivID_F] =5"
        If Me.RecordsetClone.NoMatch Then
            MsgBox "Was mach ich jetzt?"
        Else
    Me.Bookmark = Me.RecordsetClone.Bookmark
        End If
End Sub
Mit dieser Einstellung ändert sich erst mal nichts. In meinem Beispieldatensatz wählt er weiterhin die falsche ID (Box/Schachtel) und nicht Schachtel-DB. Er meckert aber auch nicht, dass es die 5 nicht gibt. Die NoMatch Prüfung schlägt auch nicht an, ergo ist die ID da. Ich habe dann nochmal deinen 1. Vorschlag genommen mit dem Filter, das ging dann am Beispieldatensatz aber ich kann dann eben nicht switchen, auch wenn ich das AfterUpdate Ereignis integriere, was du mir zum Schluss gezeigt hast.
Private Sub Bildmotiv_AfterUpdate() ' oder beim Klicken oder ...
    If Nz(Me.BildmotivID_F, 0) > 0 Then
        Me.RecordsetClone.FindFirst "[BildmotivID_F] =" & Me.BildmotivID_F
        Me.Bookmark = Me.RecordsetClone.Bookmark
    End If

'    Me.lstBmWahl.Requery
'    Me.Recalc
End Sub

Dass es mit dem Filter zum Teil geht zeigt ja nur, dass die Sourcen bzw. die ID's da sind.

Egal welche Methode (Filter, Bookmark, SQL) Du zum „switchen“ wählst, irgendwoher muss ja eine <neue_ID> kommen.
In Deinem Formular klickt der Benutzer auf einen Eintrag in der Liste <Bildmotiv> und dann wird das Bild angezeigt. Die „neue_ID“ wäre vermutlich  (kommt auf die Rowsource des Listenfeldes an) der aktuelle Wert aus der Liste <Bildmotiv>.

Dem Listenfeld liegt diese Abfrage zugrunde:
SELECT tblBilderZuSpiel.BildmotivID_F, tblBildmotive.Bildmotiv
FROM tblBildmotive INNER JOIN tblBilderZuSpiel ON tblBildmotive.BildMotivID = tblBilderZuSpiel.BildmotivID_F
WHERE (((tblBilderZuSpiel.SpielID_F)=[Formulare]![frmErfassung]![txtSpielID]))
ORDER BY tblBildmotive.Bildmotiv;

Sub Bildmotiv_AfterUpdate() ' oder beim Klicken oder ...
if nz(me.bildmotiv,0)>0 then
Me.Recordsetclone.FindFirst "[BildmotivID_F] =" & me.bildmotiv
Me.Bookmark = Me.RecordsetClone.Bookmark
endif
end sub


Den habe ich zwar wie gesagt integriert, aber es geht eben nicht. Ich bekomme auch keinen Fehler als Meldung :(. Ich bin mal wieder ratlos und denke, dass ich mal wieder irgendwo Mist baue :(. Aber dann meine ich sollte ich doch eine Fehlermeldung bekommen, oder? 
Also zusammenfassend habe ich jetzt folgende Konfiguration:

Private Sub Form_Load()
    Me.RecordsetClone.FindFirst "[BildmotivID_F] =1 or [BildmotivID_F] =5"
        If Me.RecordsetClone.NoMatch Then
            MsgBox "Was mach ich jetzt?"
        Else
    Me.Bookmark = Me.RecordsetClone.Bookmark
        End If
End Sub

Private Sub Bildmotiv_AfterUpdate() ' oder beim Klicken oder ...
    If Nz(Me.BildmotivID_F, 0) > 0 Then
        Me.RecordsetClone.FindFirst "[BildmotivID_F] =" & Me.BildmotivID_F
        Me.Bookmark = Me.RecordsetClone.Bookmark
    End If
End Sub

Ich habe im VBA Teil für frmErfassungUfoBilder noch folgenden Passus gefunden und weiss nicht, ob das konträr arbeitet:
Private Sub lstBmWahl_AfterUpdate()
    ' Den mit dem Steuerelement übereinstimmenden Datensatz suchen.
    Dim rs As Object
    Set rs = Me.Recordset.Clone
    rs.FindFirst "[BildmotivID_F] = " & str(Nz(Me![lstBmWahl], 0))
    If Not rs.EOF Then Me.Bookmark = rs.Bookmark
End Sub

Gruß vom leicht verwirrten
Andreas
Grüße und Dank im voraus
Andreas
 

Offline Frithjiof

  • Newbie
  • Beiträge: 41
Re: Ereignis beim Laden funktioniert nicht immer ........
« Antwort #14 am: November 15, 2017, 21:12:28 »
Mit dieser Einstellung ändert sich erst mal nichts. In meinem Beispieldatensatz wählt er weiterhin die falsche ID (Box/Schachtel) und nicht Schachtel-DB. Er meckert aber auch nicht, dass es die 5 nicht gibt.  Die NoMatch Prüfung schlägt auch nicht an, ergo ist die ID da.
Die Bedingung  "[BildmotivID_F] =1 or [BildmotivID_F] =5" lässt 2 Bilder zu. Welches anfangs angezeigt wird hängt ab vom gegenwärtigen Zustand des Recordsets.
Wenn immer Bild  Nr. 5 angezeigt werden soll, dann darf da nur  "[BildmotivID_F] =5 " stehen.

Private Sub Form_Load()
    Me.FilterOn =false  'fals Filter gesetzt sind
    Me.Filter=""     'Filter löschen falls welche gespeichert wurden
        Me.RecordsetClone.FindFirst "[BildmotivID_F] =5"
        If Me.RecordsetClone.NoMatch Then
            MsgBox "Was mach ich jetzt?"
        Else
             Me.Bookmark = Me.RecordsetClone.Bookmark
        End If
End Sub


Deine Bilder-Auswahlliste heißt offensichtlich <lstBmWahl> (nicht wie in meinem Beispiel <Bildmotiv>)
also lautet die Ereignissprozedur:

Private Sub lstBmWahl_AfterUpdate()
         if nz(me.lstBmWahl,0)>0 then
              Me.Recordsetclone.FindFirst "[BildmotivID_F] =" & me.lstBmWahl
              Me.Bookmark = Me.RecordsetClone.Bookmark
         endif
end sub

So müsste es gehn.
 
Folgende Mitglieder bedankten sich: derilzemer