Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: Ratoncito am März 14, 2022, 13:47:18

Titel: Fehler bei Anzeige im Formular
Beitrag von: Ratoncito am März 14, 2022, 13:47:18
Hallo,

auf einem Formular möchte ich Zinszahlungen anzeigen. Bei einem Wertpapier funktioniert das nicht. Im Anhang ist jeweils ein Screenshoot vom Formular, der dazugehörigen Abfrage, dem VBA-Code mit überwachten Ausdrücken und den Herkunftstabellen.

Den Code der Prozedur habe ich ebenfalls beigefügt.
Option Compare Database
Option Explicit
Private Sub cboIsin_AfterUpdate()
    Dim strTermin As Byte
    Dim strJahr As String
    Dim strLaufzeit As String
    Dim bytIdf As Byte
           
    Me.Requery

   
    Me.txtID.Visible = True                 'ID WePa anzeigen
       
   
    Me.lblWaehrung.Visible = True           'Bezeichnung Währung anzeigen
   

   
       
    If txtZinstermin > 0 Then               '= Anleihe
        strLaufzeit = txtLaufzeit           'Datum bei unbefristetem WePa verdecken
        If txtLaufzeit = #12/31/2099# Then
            Me.lblEndlos.Visible = True
            Me.txtLaufzeit.Visible = False
            Else
            Me.lblEndlos.Visible = False
            Me.txtLaufzeit.Visible = True
        End If
        Me.lblZinstermine.Visible = True
        Me.txtZinstermin.Visible = True
        Me.sfmZins.Visible = True
        Me.lblZins.Visible = True
        Me.lblJahr.Visible = True
        Me.txtJahr.Visible = True
        Me.lblLaufzeit.Visible = True
        Me.lblKind.Visible = True
        Me.chkKind.Visible = True
                       
                             
        strTermin = txtZinstermin
        Select Case strTermin           'benötigte Felder für Zinstermine Ein- oder Ausblenden
        Case 1
        Me.txtTermin1.Visible = True
        Me.txtTermin2.Visible = False
        Me.txtTermin3.Visible = False
        Me.txtTermin4.Visible = False
        Me.txtTermin5.Visible = False
        Me.txtTermin6.Visible = False
   
        Case 2
        Me.txtTermin1.Visible = True
        Me.txtTermin2.Visible = True
        Me.txtTermin3.Visible = False
        Me.txtTermin4.Visible = False
        Me.txtTermin5.Visible = False
        Me.txtTermin6.Visible = False
       
        Case 3
        Me.txtTermin1.Visible = True
        Me.txtTermin2.Visible = True
        Me.txtTermin3.Visible = True
        Me.txtTermin4.Visible = False
        Me.txtTermin5.Visible = False
        Me.txtTermin6.Visible = False
   
        Case 4
        Me.txtTermin1.Visible = True
        Me.txtTermin2.Visible = True
        Me.txtTermin3.Visible = True
        Me.txtTermin4.Visible = True
        Me.txtTermin5.Visible = False
        Me.txtTermin6.Visible = False
       
        Case 5
        Me.txtTermin1.Visible = True
        Me.txtTermin2.Visible = True
        Me.txtTermin3.Visible = True
        Me.txtTermin4.Visible = True
        Me.txtTermin5.Visible = True
        Me.txtTermin6.Visible = False
   
        Case 6
        Me.txtTermin1.Visible = True
        Me.txtTermin2.Visible = True
        Me.txtTermin3.Visible = True
        Me.txtTermin4.Visible = True
        Me.txtTermin5.Visible = True
        Me.txtTermin6.Visible = True
       
        End Select
       
    Else                                    '= keine Anleihe
        Me.lblZinstermine.Visible = False
        Me.txtZinstermin.Visible = False
        Me.sfmZins.Visible = False
        Me.lblZins.Visible = False
        Me.lblJahr.Visible = False
        Me.txtJahr.Visible = False
        Me.lblLaufzeit.Visible = False
        Me.lblKind.Visible = False
        Me.chkKind.Visible = False
        Me.lblEndlos.Visible = False
    End If
   
   
        Select Case txtWaehrung
    Case 1
    Me.lblEUR.Visible = True
    Me.lblUSD.Visible = False
    Me.lblCHF.Visible = False
   
    Case 2
    Me.lblEUR.Visible = False
    Me.lblUSD.Visible = True
    Me.lblCHF.Visible = False
   
    Case 3
    Me.lblEUR.Visible = False
    Me.lblUSD.Visible = False
    Me.lblCHF.Visible = True
    End Select
   
                                            'Filter aktivieren
    strJahr = txtJahr.Value
    Me.sfmZins.Form.Filter = Replace("[DatumKonto] between #01/01/{0}# and #12/31/{0}#", "{0}", strJahr)
    Me.sfmZins.Form.FilterOn = True
   
                                            'Filter für sfmTausch
    bytIdf = Me.txtIdfWePa
    Me.sfmTausch.Form.Filter = "[IdfWePa] Like '" & bytIdf & "'"
    Me.sfmTausch.Form.FilterOn = True
                                            'nur Sichtbar wenn Daten
    Me!sfmTausch.Visible = Me!sfmTausch.Form.Recordset.RecordCount > 0

End Sub
Private Sub cboIsin_KeyDown(KeyCode As Integer, Shift As Integer)

    Me.cboIsin.Dropdown
   
End Sub
Private Sub cboWePa_AfterUpdate()

    Me.cboIsin = Me.cboWePa
       
    cboIsin_AfterUpdate
   
End Sub

Private Sub cmdClose_Click()

    DoCmd.Close
   
End Sub
Private Sub cmdNeu_Click()

    DoCmd.Close
    DoCmd.OpenForm "frmInfoEintragen"
       
End Sub

Private Sub optIsin_Click()

    Me.optIsin = 1
    Me.optWePa = 0
    Me.cboIsin.Visible = True
    Me.cboIsin.SetFocus
    Me.cboIsin.Dropdown
    Me.cboWePa.Visible = False
   
End Sub

Private Sub optWePa_Click()

    Me.optWePa = 1
    Me.optIsin = 0
    Me.cboWePa.Visible = True
    Me.cboWePa.SetFocus
    Me.cboWePa.Dropdown
    Me.cboIsin.Visible = False
   
End Sub

Private Sub txtJahr_AfterUpdate()

    cboIsin_AfterUpdate

End Sub

Im Fehlerfall stimmen die Ausdrücke nicht. Leider kann ich nicht erkennen, wo die falschen Werte herkommen.

Ich würde mich freuen, wenn jemand eine Lösung für mein Problem hat.

Vielen Dank und liebe Grüße - Wolfgang

00 Fehler.png
00 Okay.png
00 Tabelle.png

Titel: Re: Fehler bei Anzeige im Formular
Beitrag von: Beaker s.a. am März 14, 2022, 14:53:14
Hallo Wolfgang,
Vermutlich nur eine falsche Referenzierung des UFo; - schaust du hier (https://www.donkarl.com?FAQ4.2).

gruss ekkehard
Titel: Re: Fehler bei Anzeige im Formular
Beitrag von: DF6GL am März 14, 2022, 16:05:23
Hallo,


was ist hierunter zu verstehen:

Zitat...between #01/01/{0}# and #12/31/{0}#", "{0}", strJahr)...

??
Titel: Re: Fehler bei Anzeige im Formular
Beitrag von: Ratoncito am März 14, 2022, 17:03:11
Hallo,

vielen Dank für die Antworten.

Ich möchte noch hinzufügen, dass es rund 100 unterschiedliche Wertpapiere gibt, nur bei einem werden die Zinsen nicht angezeigt.
In den abgefragten Tabellen finde ich keinen Wert, der einen Fehler verursachen könnte.
Nirgendwo finde ich das Datum 12.07.1905, dass in txtLaufzeit angezeigt wird.
In der dazugehörenden Abfrage steht der richtige Wert 22.03.2019
 

Zur Frage nach der Codezeile
Auf dem Formular kann man auswählen für welches Jahr die Zinsen angezeigt werden sollen.

    Me.sfmZins.Form.Filter = Replace("[DatumKonto] between #01/01/{0}# and #12/31/{0}#", "{0}", strJahr)

{0} ist ein Platzhalter dem am Ende der Zeile der entsprechende Wert zugewiesen wird.


Liebe Grüße - Wolfgang
Titel: Re: Fehler bei Anzeige im Formular
Beitrag von: Beaker s.a. am März 14, 2022, 17:20:44
Hallo Wolfgang,
Ich weiss zwar nicht was das Feld "Termin1" in "tblWePa" bedeutet, aber da
steht in beiden sichtbaren DS ein Datum aus dem Jahre 1900.
Ist das korrekt?

gruss ekkehard
Titel: Re: Fehler bei Anzeige im Formular
Beitrag von: MzKlMu am März 14, 2022, 18:07:44
Hallo,
das Jahr ist eine Zahl und sollte auch als Zahl (int) verwendet werden.
Das Replace ist auch überflüssig ebenso das strJahr.
Auch
Me.sfmZins.Form.Filter = "[DatumKonto] between Dateserial(txtJahr,1,1) and Dateserial(txtJahr,12,31)"
Wenn man sich so den Code ansieht, scheint auch das Datenmoddell eher suboptimal zu sein.
Z.B. die Aufzählungsfelder für die Zinstermine.
Auch Like in Verbindung mit einer ID (IdfWePa) macht keinen Sinn. Du filterst doch nicht auf einen Teil einer ID. Außerdem macht Like nur in Verbindung mit dem Joker (*) Sinn.
Titel: Re: Fehler bei Anzeige im Formular
Beitrag von: Ratoncito am März 15, 2022, 08:15:18
Hallo,

vielen Dank für Eure Antworten.

Zitat von: Beaker s.a. am März 14, 2022, 17:20:44Ich weiss zwar nicht was das Feld "Termin1" in "tblWePa" bedeutet, aber da
steht in beiden sichtbaren DS ein Datum aus dem Jahre 1900.
Ist das korrekt?
Ja, das ist korrekt. "Termin1" ist der erste der Zinstermine. Es wird nur der Tag und Monat benötigt, die folgenden Zinstermine werden berechnet (bei 4 Zinsterminen z.Bsp. alle 3 Monate).
In einem Bericht zur Auflistung der Zinstermine machte mir das Jahr Probleme, daher habe ich für den ersten Zinstermin grundsätzlich das Jahr 1900 verwendet. Da das Jahr auf keinem Formular auftaucht ist es nicht störend.
Lässt sich sicherlich eleganter lösen, aber...

@MzKlMu
Den angesprochenen Code habe ich geändert. Danke für den Hinweis.

Wenn es weitere Punkte zur Verbesserung gibt, bin ich gerne bereit, diese umzusetzen.
Allerdings wäre ich dringend an einer Lösung meines Problems interessiert.

Liebe Grüße - Wolfgang
Titel: Re: Fehler bei Anzeige im Formular
Beitrag von: Beaker s.a. am März 15, 2022, 11:02:02
Hallo Wolfgang,
Verstehe ich zwar nicht, - wie kann der 1. Termin in der Vergangenheit liegen?
Warum wird der nicht gleich beim Kauf oder wann auch immer der bestimmt wird
berechnet. Vor allem wie sollen den die nächsten Termin korrekt berechnet werden
mit der Basis?
Ich vermute fast, dass damit auch dein Problem zusammen hängt. Vielleicht kannst
du eine DB hochladen, in der man das nachvollziehen kann.
Was mir gerade noch aufgefallen ist
If txtZinstermin > 0 Then               '= AnleiheDu hast doch offensichtlich eine Typentabelle (man sieht ein Feld namens "Art").
Warum verwendest du die hier nicht?


gruss ekkehard
Titel: Re: Fehler bei Anzeige im Formular
Beitrag von: Ratoncito am März 15, 2022, 11:55:57
Hallo Ekkehard,

für den ersten Zinstermin wird nur der Tag und der Monat benötigt und ist in allen Jahren gleich. Benötigt wird er in einem Bericht, den ich jedes Jahr für die Kontrolle der Zahlungen ausdrucke. Und darin wird nur Tag und Monat angezeigt.

Die Anzahl der Zinstermine wird zum Ein- und Ausblenden der Termine und der Kontrolle der erfolgten Zahlungen benötigt. Das ist so okay und gewollt. Zur Verwendung von "Art" hätte ich dies in der Abfrage berücksichtigen müssen, und die Anzahl der Zinstermine wird eh benötigt. Daher habe ich diesen Weg gewählt. Es gibt mehrere Wertpapiere mit nur 1 Zinstermin, da funktioniert es.

Außer bei diesem Wertpapier funktioniert das bei allen anderen. Und in der dazugehörigen Abfrage sind die korrekten Werte ja vorhanden, werden aber nicht angezeigt. Ich verstehe nicht, wo die falschen Werte herkommen.

Liebe Grüße - Wolfgang
Titel: Re: Fehler bei Anzeige im Formular
Beitrag von: Beaker s.a. am März 15, 2022, 14:18:46
ZitatAußer bei diesem Wertpapier funktioniert das bei allen anderen.
Dann kann es eigentlich nur an den Daten dieses Satzes liegen.
Überprüfe die mal direkt in der Tabelle, - korrekte FK, korrekte Termine.
Ich kenne sowas, da übersieht man mit seiner Betriebsblindheit gerne mal
so Kleinigkeiten, die einem dann um die Ohren fliegen.
Titel: Re: Fehler bei Anzeige im Formular
Beitrag von: Ratoncito am März 16, 2022, 07:50:48
Hallo,

Zitat von: Beaker s.a. am März 15, 2022, 14:18:46Dann kann es eigentlich nur an den Daten dieses Satzes liegen.
Überprüfe die mal direkt in der Tabelle, - korrekte FK, korrekte Termine.

Was sind FK?

Die Datensätze und Tabellen sind im ersten Beitrag als Anhang.
Obwohl ich die Daten schon mehr als einmal kontrolliert habe, bin ich gestern nochmals jedes Feld jedes einzelnen Eintrags durchgegangen.
Zum Probieren habe ich Datum und Anzahl der Zinstermine verändert - alles ohne Erfolg.

In der dazugehörigen Abfrage werden mir die Daten korrekt angezeigt, im Überwachungsfenster von VBA tauchen diese falschen Werte auf.
Ich habe keine Idee, wo diese Werte herkommen.
Was kann ich noch machen?

Liebe Grüße - Wolfgang
Titel: Re: Fehler bei Anzeige im Formular
Beitrag von: Beaker s.a. am März 16, 2022, 12:06:08
Lade die DB (repariert/komprimiert/gezippt) hier hoch.
Titel: Re: Fehler bei Anzeige im Formular
Beitrag von: Ratoncito am März 17, 2022, 12:00:28
Hallo,

vielen Dank für das Angebot.

Die DB enthält private Daten, die ich nicht komplett öffentlich machen möchte.

Im ersten Beitrag hatte ich schon 2 Beispiele beigefügt. Nun wollte ich in der DB alle anderen Daten löschen um sie hier hochzuladen. Dabei ist mir aufgefallen, dass schon das Löschen einiger Daten die gleichen Probleme bei weiteren unbeteiligten Wertpapieren verursacht. Einen Zusammenhang kann ich auch nach längerer Suche nicht erkennen.

Daher vermute ich sehr stark, dass es Fehler bei der Programmierung rund um das Formular "frmInfoAnzeigen" gibt.
Den ganzen Teil habe ich erst später zu der DB zugefügt und die Daten eingetragen. Dabei ist allerdings nie dieses Problem aufgetreten.

Macht es Sinn, wenn ich alle Daten, außer der in den Beispielen eh schon öffentlichen, lösche und die DB anschließend hier hochlade? Das Problem ist dann so nicht direkt reproduzierbar.

Gibt es Tools zum Überprüfen einer DB auf Fehler?

Liebe Grüße - Wolfgang
Titel: Re: Fehler bei Anzeige im Formular
Beitrag von: Beaker s.a. am März 17, 2022, 14:31:51
Hallo Wolfgang,
Zitatdass schon das Löschen einiger Daten die gleichen Probleme bei weiteren unbeteiligten Wertpapieren verursacht.
Du beschreibst das Problem zwar nicht, aber für mich deutet das schon wieder
auf inkonsistente Daten hin.
ZitatDas Problem ist dann so nicht direkt reproduzierbar.
Warum nicht, wenn du den Problem-DS und alle, die damit zusammenhängen drin
lässt?
Lass es uns versuchen.

Nachdem ich mir deinen Code gerade noch einmal angeschaut habe, vermute ich
i.Ü. einen Designfehler beim Datenmodell, ausgelöst durch dies
        strTermin = txtZinstermin
        Select Case strTermin           'benötigte Felder für Zinstermine Ein- oder Ausblenden
        Case 1
        Me.txtTermin1.Visible = True
        Me.txtTermin2.Visible = False
        Me.txtTermin3.Visible = False
        Me.txtTermin4.Visible = False
        Me.txtTermin5.Visible = False
        Me.txtTermin6.Visible = False
Sind das an eine Tabelle gebundene Felder, und sind die da auch nummeriert?
Kann man im Bild nicht sehen. Dann musst du das Datenmodell überarbeiten; -
die Termine gehören in eine eigene Tabelle mit Fremdschlüssel (FK) zum WP.

Auch wenn's für's Problem wahrscheinlich nicht relevant, ein paar Anmerkungen
zu deinem Code, wenn er dann überhaupt gebraucht wird, lässt der sich aber auch
noch vereinfachen, - z.B. wird aus
If txtLaufzeit = #12/31/2099# Then
            Me.lblEndlos.Visible = True
            Me.txtLaufzeit.Visible = False
            Else
            Me.lblEndlos.Visible = False
            Me.txtLaufzeit.Visible = True
        End If
einfach
Me.lblEndlos.Visible = (txtLaufzeit = #12/31/2099#)
Me.txtLaufzeit.Visible = Not (txtLaufzeit = #12/31/2099#)
und
Me.lblZinstermine.Visible = True
Me.txtZinstermin.Visible = True
Wenn Label und Feld mit einander verbunden sind, reicht es das Feld unsichtbar
zu stellen. Das Label übernimmt die Einstellung.
Was dann noch verwirrt, ist dies
strTermin = txtZinstermin
        Select Case strTermin
        Case 1
Wieso ist ein Termin ein String und nicht Date?
Und wenn schon String müssten die Cases so abgefragt werden
Case "1"
gruss ekkehard
Titel: Re: Fehler bei Anzeige im Formular
Beitrag von: Ratoncito am März 18, 2022, 08:16:23
Hallo Ekkehard,

vielen Dank für Deine sehr ausführliche Antwort.
Deine Anmerkungen und Korrekturen zum Code schaue ich mir in Ruhe an und werde die Verbesserungen umsetzen.

Ich habe mich gestern lange mit der Suche nach dem Fehler beschäftigt, leider ohne etwas zu finden. Da offensichtlich ein Fehler im Formular "frmInfoAnzeigen" vorlag, habe ich dieses neu gemacht. Den Code in VBA habe ich behalten und die benötigten Elemente eingefügt.

Nachdem alle Steuerelemente und Unterformulare angeordnet waren funktioniert es ohne Probleme. Leider habe ich die Ursache, warum die Abfrage bei 1 Wertpapier offensichtlich ins Leere lief, nicht gefunden. Im Moment scheint es zu funktionieren und ich hoffe, dass es so bleibt.

Mit Deinen Anmerkungen zum Code werde ich mich am Wochenende beschäftigen.

Nochmals vielen Dank für Deine Mühe und investierte Zeit.

Liebe Grüße und ein schönes Wochenende - Wolfgang
Titel: Re: Fehler bei Anzeige im Formular
Beitrag von: Ratoncito am März 18, 2022, 10:18:38
Hallo,

Zitat von: Beaker s.a. am März 17, 2022, 14:31:51Was dann noch verwirrt, ist dies
Code [Auswählen] Erweitern
strTermin = txtZinstermin
        Select Case strTermin
        Case 1
Wieso ist ein Termin ein String und nicht Date?

Sorry, ist falsch benannt. Ist Byte, da Anzahl der Zinstermine. Habe ich in bytTermin umbenannt.

Liebe Grüße - Wolfgang
Titel: Re: Fehler bei Anzeige im Formular
Beitrag von: Beaker s.a. am März 18, 2022, 14:24:34
Zitatda Anzahl der Zinstermine
Und warum heisst das Feld dann nicht so?
Titel: Re: Fehler bei Anzeige im Formular
Beitrag von: Ratoncito am März 29, 2022, 19:13:49
Hallo,

ich möchte kurz ein Update geben. Ich habe nochmals intensiv nach der Ursache gesucht, ohne fündig zu werden.

Dabei kamen mir immer mehr neue Ideen, die ich direkt umgesetzt habe. Das Formular ist nun komplett anders aufgebaut.

@Beaker s.a.
Ganz besonders möchte ich mich nochmals bei Dir bedanken. Einige der Anmerkungen zum Code habe ich bei dem neuen Formular umgesetzt.

Liebe Grüße - Wolfgang