Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Kreuztabelle Zuordnung

Begonnen von Vertigo, Juli 25, 2019, 14:34:07

⏪ vorheriges - nächstes ⏩

Vertigo

Moin Leute,

Also ich habe ein Endlosformular auf Basis einer Kreuztabelle erstellt. Dort habe ich eine Betriebszuordnung nach der im Formular sortiert werden soll.

TRANSFORM Max(TblMitarbeiter.Fristdatum) AS MaxvonFristdatum
SELECT TblMitarbeiter.PersNr, TblMitarbeiter.Name, TblMitarbeiter.Vorname, TblMitarbeiter.GebDatum, TblOrgEinheitenStruktur.Zuordnung, Min(TblMitarbeiter.Fristdatum) AS MinvonFristdatum1
FROM (TblMitarbeiter INNER JOIN TblAlleMitarbeiter ON TblMitarbeiter.PersNr = TblAlleMitarbeiter.MAPersNr) INNER JOIN TblOrgEinheitenStruktur ON TblAlleMitarbeiter.MABetrieb = TblOrgEinheitenStruktur.[Kürzel Org-Einheit]
WHERE (((TblOrgEinheitenStruktur.Zuordnung)=[Formulare]![FrmFrist]![CboAuswahlBetrieb]) AND ((TblMitarbeiter.Status)<>"Abgeschlossen"))
GROUP BY TblMitarbeiter.PersNr, TblMitarbeiter.Name, TblMitarbeiter.Vorname, TblMitarbeiter.GebDatum, TblOrgEinheitenStruktur.Zuordnung
PIVOT TblMitarbeiter.UProfil;


Hier kommt der Fehlercode:
"Das Microsoft Access- Datenbankmodul erkennt '[Formulare]![FrmFrist]![CboAuswahlBetrieb]' nicht als gültigen Feldnamen oder Ausdruck."


Dabei hillft mir
http://www.donkarl.com/faq/FAQ3Tabfragen.htm#3.18
leider nicht.

Auch die Beiträge hier im Forum haben mir dabei nicht weitergeholfen.

Als Parameter habe ich dann eben '[Formulare]![FrmFrist]![CboAuswahlBetrieb]' oder ohne Klammern eingegeben, auch habe ich's in beiden Versionen auch mit dem englischen Forms versucht.

Nur habe ich keinerlei Erfolg bei der Geschichte.


Wer kann mir da einen entscheidenden Tipp geben?


DF6GL

Hallo,

zum Einen sollte es "Forms!......! statt "Formulare!....!  heißen,
zum Anderen wird IMHO in einem Transform Statement keine Formularreferenz aufgelöst.

Baue also den Transform-String in VBA mit den Werten aus dem Formularfeld zusammen und weise ihn der Datenherkunft des Forms zu:
Zitat
Din strSQL as String

strSQL =  "... WHERE (((TblOrgEinheitenStruktur.Zuordnung)='" & Me!CboAuswahlBetrieb  & "' ) AND ((TblMitarbeiter.Status)<>'Abgeschlossen'))...."

Me.Recordsource = strSQL

Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Vertigo

Ok.
Also ich nehme in der Entwurfsansicht des Formulars die Datensatzquelle demnach raus, da ich diese in VBA angebe, korrekt?

Und um ehrlich zu sein verstehe ich grade nur die Hälfte, müsste der selbe Code wie ich ihn unten postete nicht dann einfach so zu VBA zu übernehmen sein?

Und setzte ich dann den ganzen Code einfach in die Sub Form_Current?

DF6GL

Hallo,

das, was Du unten angegeben hast, ist ein SQL-Statement und kein VBA Code.

Wie der SQL-String zusammengesetzt werden muss, hab ich beispielhaft gezeigt. (Die 3 Pünktchen stehen als Platzhalter für den Rest des SQL-Strings...)

Den Code setzt man sinnvollerweise in das AfterUpdate-Ereignis des Kombifeldes (CboAuswahlBetrieb), sofern dies zutrifft.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Vertigo

Das Kombifeld hat eine eigene Recordsource. Das Formular selbst erhält diese erstellte Recordsource
Demnach einfach
'Forms!Frmfrist.RecourdSource = FristSQL' ?

Beim Ausführen des Codes taucht jedoch ein Syntaxfehler in der 'From-Klausel' auf. Kann jemand sehen wo der liegen könnte?


FristSQL = "SELECT     TblMitarbeiter.PersNr, TblMitarbeiter.Name, TblMitarbeiter.Vorname," _
& "           TblMitarbeiter.GebDatum, TblOrgEinheitenStruktur.Zuordnung, Min(TblMitarbeiter.Fristdatum) AS MinvonFristdatum1 " _
& "FROM        (TblMitarbeiter INNER JOIN TblAlleMitarbeiter ON TblMitarbeiter.PersNr = TblAlleMitarbeiter.MAPersNr) " _
            & "INNER JOIN TblOrgEinheitenStruktur ON TblAlleMitarbeiter.MABetrieb = TblOrgEinheitenStruktur.[Kürzel Org-Einheit] " _
& "WHERE       (((TblOrgEinheitenStruktur.Zuordnung)='" & Me!CboAuswahlBetrieb & "' ) AND (((TblMitarbeiter.Status) <> 'Abgeschlossen'))) " _
& "GROUP       BY TblMitarbeiter.PersNr, TblMitarbeiter.Name, TblMitarbeiter.Vorname, TblMitarbeiter.GebDatum, TblOrgEinheitenStruktur.Zuordnung " _
& "PIVOT       TblMitarbeiter.UProfil"



Danke. Gruß

DF6GL

Hallo,

teste zunächst die ursprüngliche Statement (in der SQL-Ansicht) ohne die Where-Condition mit dem Kombi.

(Vermutlich stimmt die Klammerung nicht)

TRANSFORM Max(TblMitarbeiter.Fristdatum) AS MaxvonFristdatum
SELECT TblMitarbeiter.PersNr, TblMitarbeiter.Name, TblMitarbeiter.Vorname, TblMitarbeiter.GebDatum, TblOrgEinheitenStruktur.Zuordnung, Min(TblMitarbeiter.Fristdatum) AS MinvonFristdatum1
FROM (TblMitarbeiter INNER JOIN TblAlleMitarbeiter ON TblMitarbeiter.PersNr = TblAlleMitarbeiter.MAPersNr) INNER JOIN TblOrgEinheitenStruktur ON TblAlleMitarbeiter.MABetrieb = TblOrgEinheitenStruktur.[Kürzel Org-Einheit]
WHERE (((TblMitarbeiter.Status)<>"Abgeschlossen"))
GROUP BY TblMitarbeiter.PersNr, TblMitarbeiter.Name, TblMitarbeiter.Vorname, TblMitarbeiter.GebDatum, TblOrgEinheitenStruktur.Zuordnung
PIVOT TblMitarbeiter.UProfil;


Falls dann ein Fehler auftaucht, diesen eliminieren und mit einem passenden statischen Wert die KT-Abfrage ausführen:



TRANSFORM Max(TblMitarbeiter.Fristdatum) AS MaxvonFristdatum
SELECT TblMitarbeiter.PersNr, TblMitarbeiter.Name, TblMitarbeiter.Vorname, TblMitarbeiter.GebDatum, TblOrgEinheitenStruktur.Zuordnung, Min(TblMitarbeiter.Fristdatum) AS MinvonFristdatum1
FROM (TblMitarbeiter INNER JOIN TblAlleMitarbeiter ON TblMitarbeiter.PersNr = TblAlleMitarbeiter.MAPersNr) INNER JOIN TblOrgEinheitenStruktur ON TblAlleMitarbeiter.MABetrieb = TblOrgEinheitenStruktur.[Kürzel Org-Einheit]
WHERE (((TblOrgEinheitenStruktur.Zuordnung)= 1 ) AND ((TblMitarbeiter.Status)<>"Abgeschlossen"))
GROUP BY TblMitarbeiter.PersNr, TblMitarbeiter.Name, TblMitarbeiter.Vorname, TblMitarbeiter.GebDatum, TblOrgEinheitenStruktur.Zuordnung
PIVOT TblMitarbeiter.UProfil;

Hier ist "Zuordnung" als vom Datentyp "LONG" angenommen.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Vertigo

#6
Wundervoll. Es funktioniert. Es war wirklich eine Klammer die fehl gesetzt wurde.


Eine Frage besteht noch:
Ich dachte ich müsste jetzt nur 'TblMitarbeiter.PersNr' in den Steuerelementinhalt eines Textfeldes setzen um den entsprechenden Wert zu erhalten, jedoch ist das anscheinend nicht so einfach. Die Anzahl der Datensätze ist korrekt, jedoch nicht die Textfelder.


*Edit:
Habs behoben habe die nur "PersNr" noch stehen und es funktioniert.

DF6GL

Hallo,
führe die KT-Abfrage mal im Abfrageentwurf aus und sieh Dir die ausgegebenen Felder an. Diese sind auch in einem Form an ein Steuerelement (Textfeld)  zu binden.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Vertigo

#8
Moin,

Zitat von: DF6GL am Juli 26, 2019, 16:51:43
Hallo,
führe die KT-Abfrage mal im Abfrageentwurf aus und sieh Dir die ausgegebenen Felder an. Diese sind auch in einem Form an ein Steuerelement (Textfeld)  zu binden.

Eine Frage habe ich dazu noch, wie bekomme ich meine gefilterten Ergebnisse ( [...] WHERE        ((TblOrgEinheitenStruktur.Zuordnung)='" & Me!CboAuswahlBetrieb & "' [...] ) durch das Comboboxfeld jetzt in einen Bericht?

Diese Kreuztabelle macht die ganze Aktion verwirrend.

Setz ich das Statement direkt in die Datensatzquelle, dann folgt: "Die Kreuztabelle einer nicht feststehenden Spalte kann nicht als Unterabfrage verwendet werden"
- Was bedeutet das?

Setz ich das Statement in eine Abfrage und verlinke diese mit dem Bericht, dann übernimmt der nur den Wert aus der Combobox aber keine Datensätze. Der Bericht ist leer.


Wenn ich die Inhalte der grundlegenden Tabellen als Datensatzquelle angebe, dann zeigt er natürlich alle Datensätze an und nicht nur die, die einen Bezug zur Combobox haben.


Ich bin ein wenig überfordert mit der ganzen Kreuztabellen Geschichte. Es hätte ja einfach werden können ;)


Edit: Verlinke ich die Felder des Berichts mit denen des Formulars taucht auch nur ein Datensatz auf.

DF6GL

Hallo,

lad mal die Db hier hoch, komprimiert/repariert, datenreduziert und gezippt.

Beschreibe an Hand der realen Objektnamen und -Felder den Vorgang und das, was Du erwartest.

Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Vertigo

#10
Moin,

- Also im 'FrmFristen' werden die Fristen der Mitarbeiter eines bestimmten Betriebes (Drop-Downfeld 'CBOAufwahlBetrieb') dargestellt. Jetzt würde ich mit diesem Ergebnis einen Bericht erstellen wollen (um dort eine Excel / PDF zu exportieren):


- Und was noch schwierig ist, dass ich einen Filter ('Where-Statement') implementiere, bei welchem ich nur Datensätze angezeigt bekomme mit Datensätzen bis zum Tag in 'TxtFristAuswahl'.
Denn ich weiß nicht genau wie ich das Feld 'MinvonFristdatum' als Feld angeben kann, da es ja keinen Ursprung in einer Tabelle hat sondern durch den Zuordnungs-SQL erstellt wird.


Gruß


P.s.: Wie kann ich hier eigentlich auch Personalangezeigt bekommen, welche nicht in TblGMHFristen aufzufinden sind, jedoch in TblAlleMitarbeiter. Also ich will alle aus TblAlleMitarbeiter angezeigt bekommen, und die sollen dann, falls vorhanden, die Fristen dort stehen haben.
Durch einen einfach 'Right Join' zur TblAlleMitarbeiter klappt es leider nicht.

MzKlMu

Hallo,
warum sind keine Beziehungen angelegt, damit ein Außenstehender die Struktur versteht ?
Eine Datenbank ohne Beziehungen ist keine Datenbank. Das ist das A+O einr DB und ist direkt nach den TAbellen anzulegen.
Ich glaube auch nicht, dass die Struktur stimmt, was sind denn die 6 Felder Org1 - 6 und OrgBasis ?
Die Fristentabelle enthält auch keinen Fremdschlüssel zum Mitarbeiter, die PersNr ist dazu nicht geeignet, Du hast ja eine ID in der Mitarbeitertabelle.

Dringender Rat:
Verzichte auf Sonderzeichen jeder Art in Feldnamen.
Gruß Klaus

Vertigo

Zitat von: MzKlMu am August 12, 2019, 15:07:38
Hallo,
warum sind keine Beziehungen angelegt, damit ein Außenstehender die Struktur versteht ?
Eine Datenbank ohne Beziehungen ist keine Datenbank. Das ist das A+O einr DB und ist direkt nach den TAbellen anzulegen.
Ich glaube auch nicht, dass die Struktur stimmt, was sind denn die 6 Felder Org1 - 6 und OrgBasis ?
Die Fristentabelle enthält auch keinen Fremdschlüssel zum Mitarbeiter, die PersNr ist dazu nicht geeignet, Du hast ja eine ID in der Mitarbeitertabelle.

Dringender Rat:
Verzichte auf Sonderzeichen jeder Art in Feldnamen.



- Beziehungen: Das hängt damit zusammen, dass ich den betreffenden Teil der Datenbank exportiert habe. (Anhang)

- Struktur: Das stimmt schon so. Die Liste ist importiert aus einem anderen System. Die Org-Stufen sind Untereinheiten der verschiedenen Abteilungen und müssen alle dargestellt werden, da die Mitarbeiter auf verschiedenen Stufen arbeiten. Also zum Beispiel reicht die Beschreibung von Mitarbeiter 1 bis Org-Einheit 2 und die von Mitarbeiter 2 bis Org-Einheit 5.

- Wieso sollte die 'PersNr' nicht geeignet sein? und hier auch nochmal wie in Punkt 2 beschrieben. Diese Liste ist importiert.


MzKlMu

#13
Hallo,
nein, die Struktur stimmt nicht. Es fehlt eine Tabelle zur Zuordnung der Unterheiten in je einem Datensatz und nicht in einem Feld.
Aufzählungsfelder sind in einer Datenbank ungeeignet und verstoßen gegen die Normalisierungsregeln.

Die PersNr ist ein Textfeld und Texte sind als Schlüsselfelder nicht geeignet. Zahlen sind da deutlich geeigneter. Und Du hast doch Primärschlüssel und über diese sollten auch die Beziehungen laufen.
Siehe Bild. Und es ist ja der Sinn eines Primärschlüssels diesen für die Beziehungen zu nutzen. Das gilt sinngemäß auch für die ID der anderen Tabelle. Wenn Du die PersNr als Schlüsselfeld lassen willst, ist die MAID überflüssig.

Die Datenbank bedarf der Überarbeitung. Auf Dauer passt das so nicht. Bei korrektem Datenmodell dürfte auch Dein Problem erledigt sein.
Gruß Klaus

Vertigo

Also ich habe das jetzt folgendermaßen geändert: (Anhang)

Die PersNr / MAPersNr sind jetzt Zahlenfelder.

Die TblGMHFristen wird von einer anderen Quelldatei importiert und betrifft auch nur die Mitarbeiter mit Personalnummern.