Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Ereignis beim Laden funktioniert nicht immer ........

Begonnen von derilzemer, Oktober 08, 2017, 13:45:45

⏪ vorheriges - nächstes ⏩

derilzemer

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

derilzemer

Hallo,
hat niemand eine Idee, worin das Problem liegen könnte?
mfG
Andreas
Grüße und Dank im voraus
Andreas

Frithjiof

Ich verstehe das Problem nicht.
Deine Form_Load Prozedure macht im meinen Augen keinen Sinn.

Frithjof

derilzemer

Hi
Zitat von: Frithjiof am November 13, 2017, 12:39:32
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

Lachtaube

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 (⌒▽⌒)

Frithjiof

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;"

derilzemer

Hi,
Zitat von: Frithjiof 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

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

derilzemer

Hi,
Zitat von: Lachtaube 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.
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.
ZitatPS: ... 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

Beaker s.a.

Hallo Andreas,
Zitatdass 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
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)

Frithjiof

Zitat von: derilzemer am November 13, 2017, 16:31:28
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

derilzemer

Hi Ekkehard,
Zitat von: Beaker s.a. am November 13, 2017, 17:14:27
Zitatdass 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

derilzemer

Hi Frithjiof,
Zitat von: Frithjiof am November 14, 2017, 01:49:14
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

Frithjiof

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


Zitat von: derilzemer am November 14, 2017, 21:38:04
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

derilzemer

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.

Zitat von: derilzemer am November 14, 2017, 21:38:04
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;


Zitat von: Frithjiof am November 15, 2017, 11:18:49

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

Frithjiof

Zitat von: derilzemer am November 15, 2017, 19:37:24
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.