Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Access Abfrage umstrukturieren

Begonnen von zer0core, Juli 06, 2016, 13:27:54

⏪ vorheriges - nächstes ⏩

zer0core

Hallo Leute folgende Problemstellung:

Es geht um die Tabelle tbl_Lehrjahr_2016-2017.
In den einzelnen Spalten werden die IDs der einzelnen Orgaeinheiten gespeichert.
Mein Ziel ist es nun für jede einzelne Orgaeinheit zu filtern wann welcher Azubi kommt.

LG

MaggieMay

Hallo,

dazu muss leider gesagt werden, dass die Tabelle so nicht Bestand haben kann. Weder legt man eine Tabelle pro Lehrjahr an, noch definiert man Datenfeldnamen, die eigentlich ihrem Inhalt entsprechen sollten.

So wäre das schon eher datenbank-tauglich:
tbl_Termine
Termin_ID            - Autowert-ID
Lehrjahr               - Zahl oder Text, je nach Codierung
Azubi_ID_f           - Fremdschlüssel auf Azubi-Tabelle
Termin                - Datum
OrgEinheit_ID_f    - Fremdschlüssel auf Organisationseinheit
Freundliche Grüße
MaggieMay

zer0core

Hallo Maggy,

Danke für deine Antwort
das musste ich leider so machen, da ich in einem Endlosformular die Daten für jeden Azubi anzeigen lasse.
Ich weiß nicht, wie ich es es sonst in einem Formular umsetzen kann.

LG

MaggieMay

Zum reinen Anzeigen gibt es andere Möglichkeiten, bspw. eine Kreuztabellenabfrage.

Zur Datenpflege und Auswertung ist dein Tabellenentwurf absolut unbrauchbar. Denk nur mal an nachfolgende Lehrjahre! Wieviel Aufwand willst du da jeweils treiben, bis alle Daten, inkl. Datenfelder, Formulare und Berichte, sowie Abfragen angepasst sind? Das heißt doch praktisch für jedes Lehrjahr ein neues Programm schreiben zu müssen!
Freundliche Grüße
MaggieMay

zer0core

Ich habe eine Funktion geschrieben, die die Tabellen und Abfragen automatisch anlegt.
Die Datensatzherkunft der Formulare ist dynamisch.

Beaker s.a.

Hallo,
ZitatMein Ziel ist es nun für jede einzelne Orgaeinheit zu filtern wann welcher Azubi kommt.
Wie willst du den filtern, wenn die Orgaeinheit in keiner der anderen Tabellen
referenziert ist?
Zitatdas musste ich leider so machen,
Musste heisst aber nicht muss.
Beschäftige dich mit Maggies Antwort, und, um das zu verstehen, google mal
nach dem Stichwort "Normalisierung".
Ansonsten kannste gleich mit Excel weitermachen; - Access ist doch eh nur
eine abgespeckte Version davon, hab ich mal gelesen  ;).

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

MzKlMu

Hallo,
Zitatdas musste ich leider so machen, da ich in einem Endlosformular die Daten für jeden Azubi anzeigen lasse.
das geht mit dem Dateum als je ein Datensatz ganz einfach, einfacher wie Du es jetzt hast.
Du musst das umbauen, anders wird das nichts.

Wozu die Tabelle mit den Orgaeinheiten, da gibt es ja keine Beziehung.
Gruß Klaus

MaggieMay

@Klaus:
Zitatda gibt es ja keine Beziehung
Die Beziehung gäbe es lt. Beschreibung zu jedem Datenfeld der Lehrjahrestabelle.
Das darzustellen bzw. einzurichten wäre allerdings eine Fleißaufgabe, die der TE sich offensichtlich erspart hat.
Ein weiteres Indiz dafür, dass dieser Ansatz in der Praxis keinen Sinn macht.
Freundliche Grüße
MaggieMay

MzKlMu

Hallo,
das hatte ich irgendwie überlesen, ich sah nur die einsame Tabelle.  :D
Gruß Klaus

zer0core

Danke für eure Antworten.
Das mit der Kreuz Tabelle wusste ich nicht.
Wenn ich diese dann exportieren möchte habe ich als Überschrift jeweils das Datum bloß blöd formatiert. 01_01_2016 zum Beispiel.
Bitte noch ein kleiner Tipp wie ich das lösen kann.

Lg

MzKlMu

Hallo,
ZitatDas mit der Kreuz Tabelle wusste ich nicht.
wo steht hier was von einer Kreuztabelle ?

Der Aufbau der DB ist vollständig unbrauchbar, hast Du das nicht aus den Antworten herausgelesen ?
Gruß Klaus

zer0core

Ich habe es jetzt so gemacht wie Maggy es gesagt hat.
In Ihrem 2. Post steht das mit der Kreutabellenabfrage.

MaggieMay

Hallo,
Zitat von: zer0core am Juli 07, 2016, 09:06:45
Datum bloß blöd formatiert. 01_01_2016 zum Beispiel
du könntest das Datum zumindest so formatieren, dass es korrekt sortiert wird,
bspw. so:
Pivot Format(Termin, "YYYYMMDD")
oder so:
Pivot Format(Termin, "YYYY-MM-DD")
oder wie stellst du dir das vor?
Freundliche Grüße
MaggieMay

Lachtaube

Blöd ist auch, dass eine Person nur einem Kurs zugeordnet werden kann, was eher unrealistisch ist - oder?!
Grüße von der (⌒▽⌒)

zer0core

Die Formatierung des Datums konnte ich mit Hilfe einer separaten Abfrage und der Caption Eigenschaft lösen.
Ich möchte ein komplettes Jahr bereits im vorhinein in die Tabelle Termine einfügen.
Geht es irgendwie das ich nicht eine Schleife benötige, die jeden Datensatz einzeln hinzufügt?

zur Zeit sieht der Code so aus:

    Dim lngJahr As Long
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    Dim i As Integer
    Dim arr() As Variant
    Dim datDatum As Date
    Dim datStartDatum As Date

     
    lngJahr = cboLehrjahr.Column(0)
    datStartDatum = GetDayInMonth(vbMonday, 1, 9, lngJahr)
     
     Set db = CurrentDb
     Set rst = db.OpenRecordset("SELECT tbl_Personal.ID " _
    & "FROM tbl_Kurse INNER JOIN tbl_Personal ON tbl_Kurse.ID = tbl_Personal.ID_Kurs " _
    & "WHERE (((tbl_Kurse.Ende)>#9/1/" & lngJahr & "#) AND ((tbl_Kurse.Beginn)<#9/2/" & lngJahr & "#));", dbOpenDynaset)
   
     arr = RecordsetInArrayEindimensional(rst)
     rst.Close
     
     For i = LBound(arr) To UBound(arr)
        datDatum = datStartDatum
            For intI = 1 To 53
                CurrentDb.Execute "Insert INTO tbl_Termine (Azubi_ID, Termin, Lehrjahr) VALUES (" & arr(i) & ", '" & datDatum & "', " & lngJahr & ")"
                datDatum = datDatum + 7
            Next
     Next i

    MsgBox "Erledigt"


ich habe es in ein Array geschrieben, da es laut google performanter ist.
Jedoch dauert das anlegen von ca. 2500 Datensätzen bis zu 3 Minuten.