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
Hallo Wolfgang,
Vermutlich nur eine falsche Referenzierung des UFo; - schaust du hier (https://www.donkarl.com?FAQ4.2).
gruss ekkehard
Hallo,
was ist hierunter zu verstehen:
Zitat...between #01/01/{0}# and #12/31/{0}#", "{0}", strJahr)...
??
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
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
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.
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
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
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
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.
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
Lade die DB (repariert/komprimiert/gezippt) hier hoch.
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
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 Ifeinfach
Me.lblEndlos.Visible = (txtLaufzeit = #12/31/2099#)
Me.txtLaufzeit.Visible = Not (txtLaufzeit = #12/31/2099#)und
Me.lblZinstermine.Visible = True
Me.txtZinstermin.Visible = TrueWenn 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 1Wieso ist ein Termin ein String und nicht Date?
Und wenn schon String müssten die Cases so abgefragt werden
Case "1"gruss ekkehard
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
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 1Wieso 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
Zitatda Anzahl der Zinstermine
Und warum heisst das Feld dann nicht so?
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