berechnete Spalten können nicht in Systembeziehungen verwendet werden

Mit den beiden Funktionen benötigst Du gar keinen Kalender:

Code:
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


Public Function Saison(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 701 To 1231
               Saison = "Saison" & Str(jjjj) & " /" & Str(jjjj + 1)
          Case 101 To 630
               Saison = "Saison" & Str(jjjj - 1) & " /" & Str(jjjj)
     
          Case Else
             Saison = "Fehler in der Saisonermittling"
   End Select
End Function

Kopiere sie in ein allgemeines Modul (nicht in ein Formular oder Berichtsmodul!).

Der Aufruf erfolgt mit

Code:
Jahreszeit("tt.mm.jjjj")

bzw.

Saison("tt.mm.jjjj")

wobei das Datum mitgegeben wird, für welches die Jahreszeit, bzw. die Saison ermittelt werden soll.
Diese Funktionen kannst Du überall in deinem Projekt direkt nutzen, also auch in Abfragen, Formularen und Berichten.
Ebenso kann Du das Ergebnis in VBA direkt einer Variablen vom Typ String zuordnen:

Code:
suchJahreszeit = Jahreszeit("tt.mm.jjjj")

bzw.

suchSaison = Saison("tt.mm.jjjj")
 
Zuletzt bearbeitet:
Werbung:
Vielen Dank für deine Funktionen. Bin gerade dabei mich betr. VBA einzulesen bzw. einzuhören und werde das dann ausprobieren.

Ich habe aber jetzt noch ein kleines Problem mit meiner Test-Datenbank.
Um das DB-Design noch zu verbessern habe ich noch eine eigene Tabelle T_Rundkurs (ja, nein) erstellt und diese über die IDs (Rundkurs_ID in T_Sportart bzw. ID in T_Rundkurs) mit der Tabelle T-Sportart in Beziehung gesetzt.
Grundsätzlich funktioniert das, zB ersichtlich in der Abfrage q_Ativitäten in der ich alle Tabellen in einen ABfrage packe.

Aber wenn ich das Formular frm_T_Tagebuch aufrufe bekomme ich immer die Meldung "Parameterwert eingeben - T_Sportart.Rundkurs"
Obwohl im Formular folgende Datensatzherkunft hinterlegt ist:
SELECT T_Sportart.ID AS T_Sportart_ID, T_Sportart.KategorieID, T_Sportart.RegionID, T_Sportart.Streckenbezeichnung, T_Sportart.Streckenverlauf, T_Sportart.Höhenmeter, T_Sportart.Höhe, T_Sportart.Entfernung, [T_Sportart].[Rundkurs] AS Ausdr1, T_Tagebuch.ID AS T_Tagebuch_ID, T_Tagebuch.Datum, T_Tagebuch.Zeit, T_Tagebuch.Puls, T_Tagebuch.Belastung, T_Tagebuch.[Zeit Abwärts], T_Tagebuch.[Puls Abwärts], T_Tagebuch.Sportart_ID, T_Tagebuch.Region_ID FROM T_Rundkurs INNER JOIN ((T_Land INNER JOIN T_Region ON T_Land.ID_Land = T_Region.ID_Land) INNER JOIN (T_Kategorie INNER JOIN (T_Sportart INNER JOIN T_Tagebuch ON T_Sportart.[ID] = T_Tagebuch.[Sportart_ID]) ON T_Kategorie.ID_Kategorie = T_Sportart.KategorieID) ON T_Region.ID_Region = T_Sportart.RegionID) ON T_Rundkurs.ID = T_Sportart.RundkursID;

Bevor ich diese Ergänzung vornahm war in der Datensatzherkunft folgendes enthalten:
SELECT [T_Sportart].[ID] AS T_Sportart_ID, [T_Sportart].[KategorieID], [T_Sportart].[RegionID], [T_Sportart].[Streckenbezeichnung], [T_Sportart].[Streckenverlauf], [T_Sportart].[Höhenmeter], [T_Sportart].[Höhe], [T_Sportart].[Entfernung], [T_Sportart].[Rundkurs], [T_Tagebuch].[ID] AS T_Tagebuch_ID, [T_Tagebuch].[Datum], [T_Tagebuch].[Zeit], [T_Tagebuch].[Puls], [T_Tagebuch].[Belastung], [T_Tagebuch].[Zeit Abwärts], [T_Tagebuch].[Puls Abwärts], [T_Tagebuch].[Sportart_ID], [T_Tagebuch].[Region_ID] FROM T_Sportart INNER JOIN T_Tagebuch ON [T_Sportart].[ID] =[T_Tagebuch].[Sportart_ID];

Was könnte da die Ursache sein?

Grüße
Markus
 

Anhänge

Hallo Markus,
Access hat die Angewohnheit generierte Abfragen, z.B., wenn der Formularassistent genutzt wird, als SQL-Statements in die Eigenschaft Datenherkunft des Formulars zu schreiben. Ändert man dann Felder in den Tabellen passt das nicht mehr und man muss das im Formular nachziehen. Das geht, indem man bei der Eigenschaft Datenherkunft, neben der Selectanweisung auf die drei Punkte klickt. Es öffnet sich die Abfrage in der Entwurfsansicht. Dort siehst Du in deriner Version, dass es ein Feld Ausdruck1 gibt, welches irgendwie entstanden ist. Das ist die Ursache. Denn, versteht Access ein Feld in einer Abfrage nicht, nimmt es an, dss es sich um einen einzugebenen Parameter handelt und fragt ihn ab.
Dieses Feld habe ich mit dem richtigen Tabellenfeld ersetzt.
Wichtig: Dann speichert man die Abfrage mit einem eigenen Namen, hier qfrm_T_Tagebuch. UND dann folgt die Frage von Access, ob die Abfrage ins Formular übernommen werden soll. Die muss mit Ja beantwortet werden, dann wird die Selecteintragung mit der aktuellen Abfrage ersetzt.
Dann funktioniert das Formular. Versuche es mal mit deiner Version nachzuvollziehen. Meine hier zum Vergleich.

Noch eine Bitte, setzte bitte in Zukunft jede Art von Code (Selectanweisungen, VBA Code) in Code-Tags. (Oben in der Buttonlieste auf die drei Punkt kilchen und Code wählen). Das erleichtert die Arbeit ungemein.
 

Anhänge

Zuletzt bearbeitet:
Hallo
Ich wollte jetzt meine bestehende Datenbank in die neue Struktur migrieren. Ich habe Folgendes gemacht:
  • Export der von Access nach Excel
  • Bereinigung der Daten (Schreibweisen, leere Felder korrigiert)
  • in Excel zusätzliche Spalten ID_Region, ID_Land, ID-Kategorie, ID_Sportart ergänzt und
  • in Excel zu jeder oben angeführten ID_Region nur eine Region, usw hinterlegt (dasselbe für Land, etc)
  • da der gesamte Import nach Access und Aufteilung mittels Access-Analysetool nicht funktioniert hat, :
  • habe ich eine eigene Excel-AM erstellt für zB Region mit Feldern ID-Region und Region
  • diese Tabelle habe ich in Access importiert als Tabelle Region (als Primärschlüssel habe ich ID_Region gewählt
  • dann eine eigene Excel-AM Sportart erstellt in auch die Felder ID_Region, ID-Kategorie, etc enthalten sind
  • diese AM habe nach Access in einen Tabelle Sportart importiert
  • und dann wollte ich die Tabellen Region und Sportart über die jeweils vorhandene ID-Region in Beziehung setzen, bekomme aber die Fehlermeldung:
"Es wurde kein eindeutiger Index für das in Beziehung stehende Feld der Primärtabelle eingegeben"

Es ist aber definitiv so dass in der Tabelle Region die ID-Region Werte von 1 bis 37 hat und ebenso gibt es in der Tabelle Sportart beim Feld ID-Region ebenfalls nur Werte von 1 bis 37.

Was mache ich falsch ?

Da ich nicht die ganzen Daten (Echtdaten) übermitteln möchte habe ich beiliegend Screenshots gemacht.

Ich hoffe du kannst damit was anfangen

Grüße
Markus
 

Anhänge

Hi
Danke, das habe ich nun korrigiert und funktioniert.

Gibt es mittels Access die Möglichkeit aus einer aus Excel importierten Tabelle die mehrere gleiche Datensätze beinhaltet nur mehr jeweils einmal die gleichartigen Datensatz übrigzulassen?
Konkret: Wenn ich aus meinen bestehenden Datensätze (ca 3800) nur die Felder für die zukünftige Tabelle T_ Sportart übriglasse (also Sport_ID, Strecke, Höhenmeter, etc) habe ich in den 3800 Datensätzen viele Doppeleinträge , da ich ja "nur" ca 700 verschiedene Sportarten habe.
Ich habe das schon in Access mit "Tabelle analysieren" probiert, aber da kann man zwar Tabellen in mehrere Tabellen aufteilen, aber nicht auf die sich nicht mehr unterscheidenden datensätze reduzieren.
Grüße Markus
 
Hallo Markus,
unter dem Reiter "Erstellen", gibt es den Abfrageassistenten. Wenn Du den aufrufst kommt ein Fenster, wo man Duplikatsuche wählen kann. Dann übernimmst Du alle Felder wo Duplikate ausgewertet werden sollen. (ID immer weglassen, die ist ja immer unterschiedlich). Access generiert dann eine Abfrage die alle Sätze anzeigt, die den Duplikatanforderungen entsprechen. Willst Du alle Sätze, die mindestens einaml vorkommen, auch behalten, und nicht nur die Duplikate sehen, dann entferne aus der Abfrage die Kriterien entsprechend (>1).
 
Hallo
Ich habe es jetzt fast geschafft meine alte SportDB auf das neue normalisierte Modell zu migrieren.
Gemacht habe ich das (nach einigen Bereinigungen in den Daten selbst) in dem ich in der alten DB einfach mit einer Abfrage alle relevanten Daten abgefragt habe, die "Ergebnistabelle" dann mit dem Access "Tabelle analysieren" dann in die Tabellen Tagebuch, Sportart, Kategorie, Region aufgeteilt und dann zusätzlich die neue Tabelle Land ergänzt habe.
1:n Beziehungen funktionieren, und auch eine Kontrollabfrage (Kreuztabelle) und Vergleich Ergebnisse alte und neue DB gibt auch richtige Summenergebnisse aus (ZB Sume derZeit in einer Region x im Jahr für Sportart y, richtige Sportart an richtigem Datum)

Die DB-Struktur in "Beziehung" und die dortigen Feldbezeichnungen schauen auch gut aus (siehe Beziehungen.png)

ABER:
Wenn ich aber jetzt in die Tabelle Sportart rein schaue schaut die wie folgt aus (Auszug der Felder, Details siehe Screenshot Sportart.png)
ID_SportartNachschlagen in Region3Nachschlagen in Kategorie3etc
1321
2102

Ursprünglich hatte ich eine Tabelle Kategorie 3, die ich aber umbenannt habe. Und obwohl er in "Beziehungen" als Verknüpfungsfeld ID-Kategorie anzeigt. schaut das in der Tabelle Sportart wie oben aus


Ähnlich sieht es bei der Tabelle Tagebuch (Verknüpfung funktioniert), aber
ID_TAgebuchSportart IDNachschlagen in Sportart3etc
1411395, 10km, 10km
2415399, 10km, 10km
3766712, Ranggerköpfl, Oberperfuß-Rangger

siehe auch Screenshot Tagebuch.png

P.S.: die Sportarten 395, 10km, 10km und 399, 10km, 10km sind unterschiedliche Sportarten da in unterschiedlicher Region

Was ich nicht verstehe warum Access alle Änderungen der Bezeichnungen von Feldern und auch Namen der Tabellen anstandslos übernimmt, aber in der Tabelle dann noch alte Namen aufscheinen und "Nachschlagen in ..."
aufscheint.

Grüße Markus
 

Anhänge

  • Beziehungen.webp
    Beziehungen.webp
    17,4 KB · Aufrufe: 1
  • Sportart.webp
    Sportart.webp
    29,9 KB · Aufrufe: 1
  • Tagebuch.webp
    Tagebuch.webp
    48,4 KB · Aufrufe: 1
Hast Du schon mal geschaut, ob bei den Tabellen "versehentlich" noch Nachschlagefelder eingerichtet sind. Weiterhin entstehen durch die vielen Import- und Umbauaktivitäten oft irgendwelche "Tabellen- und Abfragereste", die nicht sauber aufgeräumt werden. Da hilft Datei/komprimieren und reparieren vielleicht.
 
Hallo

Jetzt habe ich es endlich geschafft die Tabellen T_Region, T_Land, T_Sportart, T_Kategorie und T_Tagebuch in 1:n Beziehungen zu setzen.

Nach Studium diverser Anleitungen und Videos und auch deinen Formularvorschlägen, dachte ich mir es ist ja jetzt einfach ein Formular zu erstellen, um zum Beispiel eine neue Region oder ein neues Land oder beides einzugeben. Einfach Tabelle bzw. Abfrage auswählen und dann Formular erstellen, auf neuen Datensatz gehen und Daten eingeben. Das funktioniert auch bei diversen Vorbildatenbanken.

Bei mir aber nicht !?
Wenn ich das Formular fmt_Land nutze und bei einem Land einen neue Region eingeben will kommt die Fehlermeldung dass " dastensatzquelle ....UfmT_Region ..." nicht vorhanden ist.
Wenn ich beim Formular F_Land_Region (basierend auf der Abfrage A_Land_Region) einen neue Region eingeben will, kommt die Fehlermeldung "Sie müssen einen Wertin das Feld 'T_Land.ID_Land' eingeben" ! Ich wäre davon ausgegangen, dass bei Eingabe einer neuen Region oder Landes automatisch einen neue ID angelegt wird.

Anbei meine Datenbank mit ein paar Testdatensätzen.

Grüße
markus
 

Anhänge

Hallo Markus,
wenn Du natürlich die zugrundeliegenden Abfragen, und Indizes "vernichtest" kann das auch nicht mehr funktionieren. In der letzten DB, die ich hochludt, waren alle Keys, Beziehungen, etc. korrekt. Die Erfassungsformulare funktionierten.
Bei einer "jungfräulichen" Neueingabe der Daten wäre alles ok. Natürlich ist Dein Ansinnen, die Altdaten zu übernehmen, absolut nachzuvollziehen.

Jedoch, bei EDV-Umstellungsprojekten ist die Altdatenübernahme allerdings oft eine eigene Projektphase und wird von eigens geschulten Spezialisten übernommen, die sowohl das Altsysten alsauch das Neusystem im Detail kennen. Meistens sind dann auch eigens geschriebene Umsetzprogramme nötig, weil Daten nicht 1:1 übertragen werden können, was überaschend viel Zeit und Geld kostet. Deshalb kann es auch bei umfangreicheren Datenbeständen sinnvoll(er) sein Altdaten (teilweise) manuell neu zu erfassen. Die Frage ist: Schaffst Du es Dir in angemessener Zeit die Kenntnisse und Erfahrung anzueignen, die für Datenübernahmen nötig sind oder ist es nicht vielleicht einfacher die Daten, nach und nach, neu zu erfassen? Denn der Zeitfaktor scheint ja nicht die große Rolle zu spielen.

Durch Hin- und Herschicken mit "Teilstücken"der DB wird das nicht gelingen, wenn die grundlegenden Dinge wieder von der Kante fallen.
Das ist hier dann nicht die richtige Stelle. Hilfe zur Selbsthilfe und Tipps zu einzelnen Fragestellungen, immer gerne. Access-Grundkurs heißt: lesen, lesen, probieren, lesen......
 
Hallo
Ich habe mich jetzt ziemlich gut eingelesen bzw. eingehört betreffend Formulare. Und habe auch diverse Formulare erfolgreich erstellt.

Um auf deine DB vom 8. März zurückzukommen.: Eines ist mir dort unklar:
Die Tabelle T_Sportart ist über das Feld T.Sportart.ID mit dem Feld T_Tagebuch.Sportart_ID mit der Tabelle T_Tagebuch einer 1:n Beziehung verbunden.

Im Formular frm.EingabeneueAktivität hat das Datenfeld Sportart_ID (=Bezeichnungsfeld 4) als Steuerelementinhalt Sportart_ID und Datensatzherkunft T_Sportart! Aber in der Tabelle T_Sportart gibt es aber gar kein Feld Sportart_ID sondern nur das Feld ID.
Wie kann das funktionieren ?

Grüße Markus
 
Hallo Markus,
da verwechselst Du zwei Dinge. Einmal die Datensatzherkunft des Formulars. Das ist hier die Tabelle T_Tagebuch. Da heißt das Feld Sportart_ID. Es wird also in dem Formularfeld immer der Inhalt des entsprechenden Feldes, nämlich Sportart_ID aus Tabelle T_Tagebuch angezeigt.
Das Kombinationsfeld selbst hat aber eine eigene Datenherkunft, nämlich die Tabelle T_Sportart. Das dient nur dazu die Daten im Kombinationsfeld, die zur Auswahl stehen, beim Klick auf den Pfeil anzuzeigen, bzw. zur Auswahl zu stellen. Die gebundene Spalte des Kombinationsfeldes entscheidet nun welcher tatsächliche Wert bei der Auswahl in das Tabellenfeld von T_Tagebuch geschrieben wird. Das ist hier die Spalte 1 der Tabelle T_Sportart, was wiederum dem Feld "ID" entspricht.
Das ist der Mechanismus hinter Kombinationsfeldern.
Das hat im ersten Moment erstmal nichts mit der Beziehung zwischen den Tabellen zu tun. Jedoch besteht, wie in diesem Fall , eine Beziehung, hier sogar mit referentieller Integrität, prüft Access, ob der ausgewählte Wert "passt". Eine der Kernaufgaben einer Datenbank: Datenintegrität.
 
Hallo Andreas!
Danke, ok das ist verständlich.

Aber ich habe deine Vorlage genau gleich nachgebaut, mit einem kleinen Unterschied:
  • bei mir heissen die Verknüpfungsfelder der Tabellen T_Sportart und T_Tagebuch ID und ID_Sportart
  • bei dir ID und Sportart_ID
Siehe beiliegende Screenshots den Vergleich der Einstellungen bei mir und bei dir

Beim Kombinationsfeld ist
  • bei mir ist daher ID_Sportart als Steuerelementinhalt und T_Sportart als Datensatzherkunft und
  • bei dir Sportart_ID als Steuerelementinhalt und auch T_Sportart als Datensatzherkunft angegeben.
Also nur eine andere Bezeichnung.

Trotzdem zeigt sich bei mir folgendes Bild:
1) es werden im frm_EingabeneueAktivität im Feld "Sportart auswählen" nicht wie bei dir die Felder Streckenverlauf und Streckenbezeichnung sondern die Felder Höhe, Höhenmeter, Entfernung angezeigt
2) wenn ich dann so eine Sportart auswähle bekomme ich die Fehlermeldung "Sie haben einen Wert eingegeben der für dieses Feld nicht gültig ist" und "Sie haben möglicherweise Text in ein numerisches Feld eingegeben.."

Ich habe auch schon das Feld gelöscht und neu hinzugefügt. Aber es ändert sich nichts.

Ich habe es auch versucht mit dem Dialog bei Hinzufügen eines neuen Kombinationsfeldes
  • Das Kombinationsfeld soll die Werte aus einer Tabelle .... .abrufen
  • Auswahl Tabelle T_Sportart
  • Hinzufügen der Felder Streckenbezeichnung. Streckenverlauf, ID
  • Wert Speichern in Feld ID
  • dann das SQL-Statement bei Datensatzherkunft belassen oder auch ersetzt durch T_Sportart
Aber immer das gleiche Problem

Ich habe auch dein Formular in meine Access-Datei kopiert und dann im Formular nur Sportart_ID auf ID_Sportart geändert
Und zuletzt habe ich noch meine Feldbezeichungen komplett identisch mit dir gemacht, dein Formular kopiert, aber auch das bringt diesselbe Fehlermeldung

Kann es sein, dass mein Access ein Problem macht.

Grüße
Markus
 

Anhänge

Werbung:
Hallo Markus,
der Fehler ist ganz klar im ersten Screenshot zu sehen. Das ID-Feld in Tabelle T_Sportart, was ja auch der Primärschlüssel ist, liegt bei dir irgendwo an x-ter Position der Tabelle. Bei mir ist es das erste Feld, oben. Das ist für die Datenquelle des Kombinationsfeldes entscheidend! Denn die "gebundnen Spalte" ist mit 1 angegeben, was bedeutet, dass bei Auswahl einer Zeile im Kombifeld der Wert, der ersten Spalte, nämlich der ID in das Feld in der Tabelle T-Sportart, übertragen und gespeichert wird. Bei dir ist das "Streckebezeichnung", was dann natürlich den Fehler verursacht, dass ein nichtnumerischer Wert in ein numerisches Feld eingegeben werden soll. Das geht nicht.
Deshalb ist es oft auch einfacher zuerst für eine Datenquelle eines Kombifeldes eine eigen kleine Abfrage zu erstellen, die genau nur die Felder und (gefiltert) die Datensätze enthält die man für das Kombifeld benötigt. Z.B. ID und Bezeichnung. (Hatte ich hier drauf verzichtet, sonder direkt die Tabelle genommen)

Du hast also 3 Möglichkeiten:
1. Du änderst die gebundene Spalte auf (hier) 7. (Würde ich aber nicht machen, weil es eben genau zu diesen Unübersichtlichkeiten führt.)
2. Du gehst in die Entwurfsansicht der Tabelle T_Sportarten und verschiebst das ID-Feld nach oben an die erste Position, damit es in der internen Abfrage für das Kombinationsfels zur Spalte 1 wird.
3. Du erstellst für das Kombifeld eine eigene Abfrage. (s.o.)

Genau so kannst Du übrigens auch die weiteren Ausgabespalten für das Kombinationsfeld beeinflussen. Dabei ist aber darauf zu achten, dass die Eigenschaften "Spaltenanzahl" und "Spaltenbreite" nicht mehr auf "Automatisch" gestellt werden, sondern, z.B. 2cm;8cm für ein 2-spaltiges Kombifeld. Willst Du z. B. das 4. Feld der Datenquelle im Kombinationsfeld anzeigen, aber das 1. Feld in dein Tabellenfeld übertragen, bleibt die 1.Spalte die gebunden Spalte, aber in Spaltenbreite stünde dann 0;0;0;5cm.

Spiele mal mit Kombifeldern in einer eigenen kleinen TestDB rum um die Mechanismen zu verstehen.
Wenn das klappt sind dann Listenfelder mit Mehrfachauswahl die nächste Herausforderung. :)
 
Zuletzt bearbeitet:


Schreibe deine Antwort....
Zurück
Oben