berechnete Spalten können nicht in Systembeziehungen verwendet werden

Hi
Danke für die Erklärung. Jetzt habe ich den Fehler gefunden!!!

Die Reihung der Felder in der Tabelle T_Sportart hatte ich in der Datenblattansicht bereits so geändert, dass das Feld ID an erster Stelle war (siehe Screenshot Seite 2)!.
Aber in der Entwurfsansicht der Tabelle war das Feld nach wie vor das Drittletzte und damit auch in der Beziehungsansicht!!

Dass die Umreihung in der Datenblattansicht nicht auch automatisch auch die Reihung in derEntwurfsansicht (und damit die Ansicht in der Beziehungsansicht) ändert, auf das muss am erst kommen !!!

Vielen Dank nochmals
Grüße
Markus
 
Werbung:
Die Datenblattansicht ist eigentlich ein (internes) Formular, also eine Klasse mit eigenen Eigenschaften und Methoden. Eine "Automatik" wäre da kontraproduktiv.

Du kannst das mit einer einfachen Abfrage mal ausprobieren, indem Du in der Entwurfsansicht die Reihenfolge der Felder vergleichst, nachdem Du in der Datenblattansicht die Felder mal hin und hersgeschoben hast. (Zwischendurch mal speichern, dann merkt sich Access die Reihenfolge unabhängig von der Reihenfolge in der Entwurfsansicht der Abfrage.)

Schönes Wochenende.
 
Hallo Andreas!
Die EIngabe neuer Sportarten und Aktivitäten funktioniert soweit.
Wenn ich einen neue Aktivität eingeben. wähle ich aus den Feldern Streckenbezeichnung bzw. Streckenverlauf meine Sportart m Formular aus. Die Felder ID, ID_Kategorie, ID-Region aus der Tabelle T_Sport blende ich aus.

Es ist aber jetzt so, dass ich
  • gleiche Sportarten bzw gleiche Ziele (also identische Streckenbezeichnung bzw .Streckenverlauf) sowohl als Kategorie Rad als auch Berg habe (zB Kemateralm habe ich als Radtour und als Bergtour) und
  • gleiche Sportarten bzw gleiche Ziele (also identische Streckenbezeichnung bzw .Streckenverlauf) sowohl in Region A und Region B habe (zB Klettern in Tirol und im Trentino)
D.h ich sollte bei der Eingabe einer neuen Aktivität nicht nur Streckenbezeichnung bzw .Streckenverlauf einblenden sondern auch Kategorie und Region sehen.
Ich kann jetzt zwar die beiden Felder ID-Kategorie und ID_Region einblenden, in dem ich im Formular die Spaltenbreiten der beiden Felder auf 1cm statt 0cm setzen, sehe aber dann natürlich nur die IDs (der Kategorie bzw. der Region.

Wie schaffe ich es, dass ich die Datenfelder Region (aus Tabelle T_Region) und Kategorie (aus Tabelle T_Kategorie) anzeigen kann?
siehe Formular F_EingabeneueAktivität in beiliegender Datei

Grüße
Markus
 

Anhänge

Hallo Markus,
Du hast als Datenherkunft für das Kombinationsfeld die Tabelle T_Sportart genommen. Bau dir eine Abfrage, in der die Felder aus T_Region und T_Kategorie zusätzlich drin sind, die Du sehen möchtest, wobei die Sportart_ID weiterhin Spalte 1 (gebundene Spalte) ist. Diese Abfrage nimmst Du dann als Datenherkunft für das Kombinationsfeld, natürlich mit den passenden Spaltenbreiten.
 
Hallo

Danke das funktioniert ja fast perfekt.
Bei der Auswahl bekomme ich aber aber die Sportarten mehrmals angezeigt (siehe Screenshot)

Die Abfrage die dem Formular zugrunde liegt sieht so aus:

Code:
SELECT T_Sportart.ID, T_Sportart.Streckenbezeichnung, T_Sportart.Streckenverlauf, T_Region.Region, T_Land.Land, T_Kategorie.Kategorie, T_Tagebuch.Datum, T_Tagebuch.Zeit, T_Tagebuch.Puls, T_Tagebuch.Belastung, T_Tagebuch.[Zeit Abwärts], T_Tagebuch.[Puls Abwärts], T_Tagebuch.Bemerkung
FROM ((T_Land INNER JOIN T_Region ON T_Land.[ID_Land] = T_Region.[ID_Land]) INNER JOIN (T_Kategorie INNER JOIN T_Sportart ON T_Kategorie.[ID_Kategorie] = T_Sportart.[KategorieID]) ON T_Region.[ID_Region] = T_Sportart.[RegionID]) INNER JOIN T_Tagebuch ON T_Sportart.[ID] = T_Tagebuch.[Sportart_ID]
ORDER BY T_Sportart.Streckenbezeichnung;

Grüße
Markus
 

Anhänge

  • Screenshot_Eingabe.webp
    Screenshot_Eingabe.webp
    44,8 KB · Aufrufe: 4
Hallo
Ich habe mich inzwischen in einige VBA-Videos vertieft und wollte jetzt deinen Vorschlagcode vom 5. März betreffend Berechnung der Jahreszeit implementieren.
Ich habe zuerst eine Prozedur geschrieben die das Datumfeld in einen String umwandelt und dann diesen String in alle Datensätze der Abfrage A_Tagebuch_alles in das Bemerkungsfeld in der Form <"Bemerkung neu: " & Datumsstring> schreibt (das Anlegen eines neuen Datenfeldes Jahreszeit mache ich dann später). Das funktioniert soweit.

Wenn ich aber dann deine Function aufrufe, bekomme ich die Fehlermeldung:
Fehler beim Kompilieren: Erwartet: Datenfeld.

Woran könnte das liegen?

Hier der gesamte Code inkl Aufruf deiner Function:

Code:
Option Compare Database
Option Explicit

Sub Jahreszeiten_berechnen()
'Jahreszeiten berechnen und in neues feld schreiben (dzt. in Feld bemerkung)
'Varibalen deklarieren
Dim Datumsstring As String
Dim Suchdat As String
Dim Jahreszeit As String
Dim Ergebnis As String
'Verbindung zur DB
Dim db As Database
Set db = CurrentDb
'Recordset deklarieren
Dim rcsSport As Recordset
'Recordset als Dynaset definieren
Set rcsSport = db.OpenRecordset("A_Tagebuch_alles", dbOpenDynaset)
'finde letzten Datensatz
rcsSport.MoveLast
'Schleife bis zum Ende des Recordset
Do Until rcsSport.BOF
'Kontrolle ob überhaupt etwas gefunden wird
Debug.Print rcsSport.Fields("Id") & " - " & rcsSport.Fields("Datum") & " - " & rcsSport.Fields("Zeit") & " - " & rcsSport.Fields("Bemerkung")
'Übergabe an Variable
Datumsstring = CStr(Day(rcsSport.Fields("Datum"))) + "." + CStr(Month(rcsSport.Fields("Datum"))) + "." + CStr(Year(rcsSport.Fields("Datum")))
'Kontrolle Variable datumsstring
Debug.Print Datumsstring
'Änderungsmodus aktivieren
'Änderung vornehmen
rcsSport.Edit
'schreibt die Variable Datumstring  in das Feld Bemerkung
rcsSport.Fields("Bemerkung") = "Bemerkung neu: " & Datumsstring
'Kontrolle Inhalt Feld Bemerkung
Debug.Print rcsSport.Fields("Bemerkung")
'Aufruf der Function Jahreszeit
Let Suchdat = Datumsstring
Debug.Print "Suchdat: " & Suchdat
'Function aufrufen()
Let Ergebnis = Jahreszeit(Suchdat)
'Datenfelder ergänzen
rcsSport.Fields("Bemerkung") = Ergebnis
'Aktualisierung durchführen
rcsSport.Update
rcsSport.MovePrevious
Loop
rcsSport.Close
End Sub
' Function zur Umwandlung des datums
Public Function Jahreszeit(Suchdat As String) 'Eingabe gültiges Datum als String "tt.mm.jjjj"
 Dim mmtt As Integer
 Dim jjjj As Integer
 
 mmtt = Val(Mid(Suchdat, 4, 2)) * 100 + Val(Mid(Suchdat, 1, 2))
 jjjj = Val(Mid(Suchdat, 7, 4))
 
 Select Case mmtt
        Case 301 To 531
             Jahreszeit = "Frühling" & Str(jjjj)
        Case 601 To 831
             Jahreszeit = "Sommer" & Str(jjjj)
        Case 901 To 1130
             Jahreszeit = "Herbst" & Str(jjjj)
        Case 1201 To 1231
             Jahreszeit = "Winter" & Str(jjjj) & " /" & Str(jjjj + 1)
        Case 101 To 229
             Jahreszeit = "Winter" & Str(jjjj - 1) & " /" & Str(jjjj)
        Case Else
             Jahreszeit = "Fehler in der Jahreszeitermittlung"
 End Select
End Function

Grüße
Markus
 
Wo steht der Cursor, wenn Du nach der Fehlermeldung "Debuggen" drückst?

Noch ein Hinweis: Dein Code ist sehr schlecht lesbar. Arbeite mit Einrückungen und schreibe Kommentare jeweils hinter die betreffende Zeile.
 
Zuletzt bearbeitet:
Hallo!
Nach Erscheinen der Fehlermeldung wird Jahreszeit blau hinterlegt (siehe Fehlermeldung1.png) und nach Drücken ok wird Sub Jahreszeiten_berechnen() gelb hinterlegt (siehe Fehlermeldung2.png)

Ich hqbe den Code jetzt leichter lesbarer gemacht:

Code:
Option Compare Database
Option Explicit

Sub Jahreszeiten_berechnen()
'***** Jahreszeiten berechnen und in neues Feld schreiben (dzt. in Feld Bemerkung)
'***** Variablen deklarieren
    Dim Datumsstring As String
    Dim Suchdat As String
    Dim Jahreszeit As String
    Dim Ergebnis As String
'***** Verbindung zur DB
    Dim db As Database
    Set db = CurrentDb
'***** Recordset deklarieren
    Dim rcsSport As Recordset
'***** Recordset als Dynaset definieren
    Set rcsSport = db.OpenRecordset("A_Tagebuch_alles", dbOpenDynaset)
    rcsSport.MoveLast 'finde letzten Datensatz
'***** Loop
    Do Until rcsSport.BOF 'Schleife bis zum Ende des Recordset
        Debug.Print rcsSport.Fields("Id") & " - " & rcsSport.Fields("Datum") & " - " & rcsSport.Fields("Zeit") & " - " & rcsSport.Fields("Bemerkung") 'Kontrolle ob überhaupt etwas gefunden wird
        Datumsstring = CStr(Day(rcsSport.Fields("Datum"))) + "." + CStr(Month(rcsSport.Fields("Datum"))) + "." + CStr(Year(rcsSport.Fields("Datum"))) 'Übergabe an Variable
        Debug.Print Datumsstring 'Kontrolle Variable Datumsstring
        rcsSport.Edit 'Änderung vornehmen
        rcsSport.Fields("Bemerkung") = "Bemerkung neu: " & Datumsstring 'schreibt die Variable Datumstring  in das Feld Bemerkung
        Debug.Print rcsSport.Fields("Bemerkung") 'Kontrolle Inhalt Feld Bemerkung
        Let Suchdat = Datumsstring
        Debug.Print "Suchdat: " & Suchdat
'***** Function aufrufen
        Let Ergebnis = Jahreszeit(Suchdat)
            rcsSport.Fields("Bemerkung") = Ergebnis 'Datenfelder ergänzen
            rcsSport.Update 'Aktualisierung durchführen
            rcsSport.MovePrevious 'vorheriger Datensatz
    Loop
    rcsSport.Close
End Sub
' Function zur Umwandlung des datums
Public Function Jahreszeit(Suchdat As String) 'Eingabe gültiges Datum als String "tt.mm.jjjj"
 Dim mmtt As Integer
 Dim jjjj As Integer
 
 mmtt = Val(Mid(Suchdat, 4, 2)) * 100 + Val(Mid(Suchdat, 1, 2))
 jjjj = Val(Mid(Suchdat, 7, 4))
 
 Select Case mmtt
        Case 301 To 531
             Jahreszeit = "Frühling" & Str(jjjj)
        Case 601 To 831
             Jahreszeit = "Sommer" & Str(jjjj)
        Case 901 To 1130
             Jahreszeit = "Herbst" & Str(jjjj)
        Case 1201 To 1231
             Jahreszeit = "Winter" & Str(jjjj) & " /" & Str(jjjj + 1)
        Case 101 To 229
             Jahreszeit = "Winter" & Str(jjjj - 1) & " /" & Str(jjjj)
        Case Else
             Jahreszeit = "Fehler in der Jahreszeitermittlung"
 End Select
End Function
 

Anhänge

  • Fehlermeldung2.webp
    Fehlermeldung2.webp
    15,6 KB · Aufrufe: 1
  • Fehlermeldung1.webp
    Fehlermeldung1.webp
    35,4 KB · Aufrufe: 1
Du dimensionierst oben Jahreszeit als String. Nehme den Dim raus, denn Jahreszeit ist eine Funktion, die einen String names Jahreszeit vom Typ Variant (Hier ist es ein String) ausgibt. Es wäre vielleicht deutlicher, wenn ich geschrieben hätte:

Code:
Public Function Jahreszeit(Suchdat As String) As String 'Eingabe gültiges Datum als String "tt.mm.jjjj"
 
Hallo
Ja logisch Variable und Function gleich benennen, bzw Functionnamen deklarieren, das ist natürlich weniger gut

Funktioniert soweit, ich musste noch die Variable Datumsstring mit Format(......, "dd.mm.yyyy") so formatieren, dass die Tage und Monate immer zweistellig sind.

Jetzt habe ich noch folgendes Problem:
Die Ergebnisse der Jahreszeitenberechnung sollen ja in ein eigenes Datenfeld Jahreszeiten hineingeschrieben werden. Dazu habe ich in der Abfrage "A_Tagebuch_alles" eines neues Feld "Jahreszeit" erstellt (in SQL mit "" AS Jahreszeit). Das Feld existiert in der Abfrage.

Allerdings bricht der Code bei der Zeile
rcsSport.Fields("Jahreszeit") = Ergebnis 'Datenfelder ergänzen
mit der Fehlermeldung
"Feld konnte nicht aktualisiert werden"
ab.
Vermutlich hängt das damit zusammen dass in dieses Feld nichts geschrieben werden darf, ich habe aber nichts gefunden wie ich das lösen könnte.

Code:
Option Compare Database
Option Explicit

Sub Jahreszeiten_berechnen()
'***** Jahreszeiten berechnen und in neues feld schreiben (dzt. in Feld bemerkung)
'***** Variablen deklarieren
    Dim Datumsstring As String
    Dim Suchdat As String
    'Dim Jahreszeit As String
    Dim Ergebnis As String
'***** Verbindung zur DB
    Dim db As Database
    Set db = CurrentDb
'***** Recordset deklarieren
    Dim rcsSport As Recordset
'***** Recordset als Dynaset definieren
    Set rcsSport = db.OpenRecordset("A_Tagebuch_alles", dbOpenDynaset)
    rcsSport.MoveLast 'finde letzten Datensatz
'***** Loop
    Do Until rcsSport.BOF 'Schleife bis zum Ende des Recordset
        Debug.Print rcsSport.Fields("Id") _
            & " - " & rcsSport.Fields("Datum") _
            & " - " & rcsSport.Fields("Zeit") _
            & " - " & rcsSport.Fields("Bemerkung") 'Kontrolle ob überhaupt etwas gefunden wird
        Datumsstring = Format(CStr(Day(rcsSport.Fields("Datum"))) _
            + "." + CStr(Month(rcsSport.Fields("Datum"))) _
            + "." + CStr(Year(rcsSport.Fields("Datum"))), "dd.mm.yyyy") 'Übergabe an Variable und Format tt.mm.yyyy
        Debug.Print "Datumsstring: " & Datumsstring  'Kontrolle Variable Datumsstring
        rcsSport.Edit 'Änderung vornehmen
        rcsSport.Fields("Bemerkung") = "Bemerkung neu: " & Datumsstring 'schreibt die Variable Datumstring  in das Feld Bemerkung
        Debug.Print rcsSport.Fields("Bemerkung") 'Kontrolle Inhalt Feld Bemerkung
        Let Suchdat = Datumsstring
        Debug.Print "Suchdat: " & Suchdat
'***** Function aufrufen
        Let Ergebnis = Jahreszeit(Suchdat)
            Debug.Print Ergebnis
            rcsSport.Fields("Jahreszeit") = Ergebnis 'Datenfelder ergänzen
            rcsSport.Update 'Aktualisierung durchführen
            rcsSport.MovePrevious 'vorheriger Datensatz
    Loop
    rcsSport.Close
End Sub
'***** Function zur Umrechnung des Datums in einen Jahreszeit
Public Function Jahreszeit(Suchdat As String) As String 'Eingabe gültiges Datum als String "tt.mm.jjjj"
 Dim mmtt As Integer
 Dim jjjj As Integer
 mmtt = Val(Mid(Suchdat, 4, 2)) * 100 + Val(Mid(Suchdat, 1, 2))
 jjjj = Val(Mid(Suchdat, 7, 4))
 Debug.Print "Monat: " & Val(Mid(Suchdat, 4, 2))
 Debug.Print "Tag: " & Val(Mid(Suchdat, 1, 2))
 Debug.Print "Jahr: " & Val(Mid(Suchdat, 7, 4))
 Debug.Print "mmtt: " & mmtt
 Debug.Print "jjjj: " & jjjj
 
 Select Case mmtt
        Case 301 To 531
             Jahreszeit = "Frühling" & Str(jjjj)
        Case 601 To 831
             Jahreszeit = "Sommer" & Str(jjjj)
        Case 901 To 1130
             Jahreszeit = "Herbst" & Str(jjjj)
        Case 1201 To 1231
             Jahreszeit = "Winter" & Str(jjjj) & " /" & Str(jjjj + 1)
        Case 101 To 229
             Jahreszeit = "Winter" & Str(jjjj - 1) & " /" & Str(jjjj)
        Case Else
             Jahreszeit = "Fehler in der Jahreszeitermittlung"
 End Select
End Function

Grüsse Markus
 
Warum willst Du die Jahreszeit wegschreiben? Das macht keinen Sinn, weil Du sie über die Funktion jederzeit leicht ermitteln kannst. Die Daten sind dann redundant und verstoßen gegen die Normalform.
 
Da hast du natürlich recht.
Bisher habe ich meine Auswertungen immer so gemacht, dass ich in meinen Berichten primär die Diagrammfunktion ("Modernes Diagramm einfügen") genutzt habe und dann Monats- bzw Jahresauswertung (und eben jetzt auch Saisons- und Jahreszeitenauswertung) als x- Achse und die auszuwertenden Daten (Sportart, Zeit, etc.) als y-Achse dargestellt habe.
Die Möglichkeit in Berichten die Ergebnisse tabellarisch darzustellen nutze ich praktisch nie.

Mir ist bewusst dass ich natürlich per VBA auch Diagramme erstellen kann, wie zB hier beschrieben wird:
Working with Chart Object in VBA

Aber das bedeutet, dass ich jedes Diagramm vollkommen in VBA programmieren muss. Liege ich da richtig?

Grüße
Markus
 
Werbung:
Moin Markus,
die Chartfunktionalität in Access hat mich nie begeistert. Deshalb nutze ich dazu Excel, indem ich eine entsprechende Ergebnistabelle erstelle und diese dann in eine passend formatierte Excelmappe exportiere. Es gibt da ja das Workbook-Objekt, was man direkt aus Access heraus ansprechen kann. Ich würde behaupten das ist effektiver und flexibler, als das alte Chart-Objekt.
Das ist im übrigen eine der wenigen Ausnahmen bei denen ich errechnete Werte in eine (Zwischen)tabelle schreibe.
 


Schreibe deine Antwort....
Zurück
Oben