vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Mails senden, abrufen und decodieren - ganz easy ;-)  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

ADO.NET / Datenbanken
SQL-Syntax für Wochenplaner 
Autor: effeff
Datum: 06.03.15 14:49

Hallo,

ich habe eine SQL-Express-Datenbank mit drei Tabellen.

Tabelle 1, "Personal": ID, Nachname, Vorname, Personalnummer
Beispiel:
1, Müller, Heinz, 165436
2, Schmidt, Gustav, 154234
3, Bibo, Bärbel, 156783

Tabelle 2, "Abwesenheitsgrund": ID, Abwesenheitsgrund
Beispiel:
1, Urlaub
2, krank
3, Wochenende
4, Fortbildung

Tabelle 3, "Planung": ID, Datum, ID_Personal, ID_Abwesenheitsgrund
Beispiel:
1, 2015-03-06 00:00:00.000, 2, 1
2, 2015-03-06 00:00:00.000, 2, 1
3, 2015-03-06 00:00:00.000, 2, 2
4, 2015-03-06 00:00:00.000, 2, 2
5, 2015-03-06 00:00:00.000, 2, 1
6, 2015-03-06 00:00:00.000, 2, 3
7, 2015-03-06 00:00:00.000, 2, 3

So... und nun steht mir unheimlich einer auf dem Schlauch, um daraus folgende DataTable zu machen:

Nachname, Vorname, Personalnummer, Abwesenheitsgrund am 06.03.2015, Abwesenheitsgrund am 07.03.2015, Abwesenheitsgrund am 08.03.2015, Abwesenheitsgrund am 09.03.2015, Abwesenheitsgrund am 10.03.2015, Abwesenheitsgrund am 11.03.2015, Abwesenheitsgrund am 12.03.2015

Oder übersetzt:

Müller, Heinz, 165436, Urlaub, Urlaub, krank, krank, Urlaub, Wochenende, Wochenende

Hat jemand eine Idee, wie ich das am geschicktesten realisieren kann?

EALA FREYA FRESENA

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: SQL-Syntax für Wochenplaner 
Autor: Manfred X
Datum: 06.03.15 15:05

Hallo!

Willst Du eine (beliebige) Liste von Datumswerten (für Abwesenheitsgrund) abfragen?
Warum willst Du alle Angaben in einer Tabelle zusammenfassen?
Wäre es nicht einfacher, eine Liste (Tabelle) der betroffenen Personen zu erstellen
und in einer zweiten Liste die Abwesenheitstage und -Gründe (1:N-Verknüpfung über
PersonalID, Datarelation)?

Übrigens: Was ist mit Feiertagen? Streiktagen?
Oder wenn jemand "unentschuldigt" fehlt? (Rest-Kategorie: andere Gründe)

Beitrag wurde zuletzt am 06.03.15 um 15:18:36 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: SQL-Syntax für Wochenplaner 
Autor: effeff
Datum: 06.03.15 15:37

Hallo!

Ich benötige für eine definierte Zeit, also z. B. entweder eine Woche oder einen Monat eine Auflistung aller Personen mit deren Hinweis auf Anwesenheit respektive Abwesenheit. Bsiher hatte ich mir etwas zusammengefrickelt, was aber beim Ablauf zu lange dauert; Man kann zusehen, wie die Datensätze nach und nach einzeln geholt werden...

Dein Vorschlag mit der getrennten Anzeige von Personen und deren "Werten" hat zwar etwas für sich, dennoch finde ich die Komplettanzeige aller Daten für übersichtlicher, da man sich gleich für alle Personen für z. B. eine Woche die Daten anzeigen lassen kann.

Feiertage sind eine weiterer Abwesenheitsgrund; Streiktage erübrigen sich...

EALA FREYA FRESENA

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: SQL-Syntax für Wochenplaner 
Autor: Manfred X
Datum: 06.03.15 15:48

Wenn Du die Abfrage wie vorgeschlagen aufgliederst und eine Datarelation zwischen die Tabellen setzt,
kannst Du über eine Linq-Abfrage blitzschnell Deine Tabelle daraus aufbauen.

Allerdings verstehe ich den Zweck Deiner Tabelle noch nicht so ganz.
Für eine Kapazitätsplanung benötigt man vermutlich die Arbeitsstunden, die pro Person angesetzt werden können.
Wie sieht es bei einer Halbtags-Abwesenheit (z.B. Arztbesuch) oder Angestellten mit einer Halbtags-Stelle aus?

Da das Wochenende als Abwesenheitsgrund gilt, wird offenbar mitunter auch am Wochenende gearbeitet.
Es wäre möglich, daß jemand an allen Wochentagen arbeitet -> es gibt keinen Abwesenheitsgrund.
Taucht so eine Person in der Liste deshalb nicht auf?




Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: SQL-Syntax für Wochenplaner 
Autor: effeff
Datum: 06.03.15 16:05

Moin!

Der Zweck der Tabelle ist der, anzuzeigen, wer an welchem Tag anwesend oder aus irgendeinem Grund abwesend war bzw. sein wird, und zwar wochenweise; Eine Auflistung nach Stunden ist nicht eingebaut. In der jetzigen Tabelle ist per CellFormattingEvent hinterlegt, dass Abwesenheiten rot markiert werden, Anwesenheiten grün und spezielle Abwesenheiten in cyan. Damit ist eine grober Überblick über den Personalstand schnell möglich. Wir reden hier übrigens von knapp unter 20 Leuten. Der Vorteil dieser Darstellungsweise der Daten ist auch, dass sie 1:1 als Excel-Datei ausgegeben werden kann.

Die Gründe für Abwesenheit sind inklusive Halbtagsgeschichten eingetragen. Am Wochenende wird normalerweise nicht gearbeitet, was aber nicht heißt, dass es nicht einmal dazu kommen könnte bzw. dieses schon geschehen ist, was z. B. dann der Fall sein kann, wenn die Telefonanlage umgerüstet wird, ich neue Server einrichten muss, etc; Zudem gibt es Gründe dafür wegen anderer Terminarbeiten.

EALA FREYA FRESENA

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: SQL-Syntax für Wochenplaner 
Autor: Manfred X
Datum: 06.03.15 17:27

Kleines Beispiel ...
Public Class frmRelation
 
    Dim ds As New DataSet
    Dim dtPersonal As New DataTable
    Dim dtAbsent As New DataTable
    Dim dtPlanung As New DataTable
 
    Dim dgv As New DataGridView With {.Parent = Me}
 
 
    Private Sub frmRelation_Load(sender As System.Object, _
        e As System.EventArgs) Handles MyBase.Load
 
        'Testdaten erzeugen
        '==================================
        'Abgefragte Personalliste
        With dtPersonal
            .Columns.Add("PersonID", GetType(Integer))
            For i As Integer = 0 To 19
                .Rows.Add(i)
            Next i
 
            Dim pk() As DataColumn = {.Columns(0)}
            .PrimaryKey = pk
            .TableName = "Personal"
            ds.Tables.Add(dtPersonal)
        End With
 
        Dim monday As Date = CDate("9.3.2015") 'Der Wochenstart
 
        'Abgefragte Abwesenheitsliste
        With dtAbsent
            With .Columns
                .Add("ID", GetType(Integer))
                .Add("PersonalID", GetType(Integer))
                .Add("Datum", GetType(Date))
                .Add("AbsentID", GetType(Integer))
            End With
            .PrimaryKey = {.Columns(0)}
 
            Dim rndm As New Random, z As Integer
            For i As Integer = 0 To dtPersonal.Rows.Count - 1
                z += 1
                .Rows.Add(z, i, monday.AddDays(rndm.Next(0, 7)).Date, _
                          rndm.Next(0, 5))
                z += 1
                .Rows.Add(z, i, monday.AddDays(rndm.Next(0, 7)).Date, _
                          rndm.Next(0, 5))
            Next i
 
            .TableName = "Absent"
            ds.Tables.Add(dtAbsent)
        End With
 
 
        'Relation erstellen 
        '=====================================================================
        ds.Relations.Add(New DataRelation _
            ("PersonalAbsent", dtPersonal.Columns("PersonID"), _
                               dtAbsent.Columns("PersonalID")))
 
 
        'Planungsliste per DataRelation aufbauen (Spaltenumsetzung)
        '====================================================================
        With dtPlanung
            With .Columns
                .Add("PersonalID", GetType(Integer))
 
                'Datums-Spalten erstellen
                For i As Integer = 0 To 6
                    .Add(Format(monday.AddDays(i), "Short Date"), _
                         GetType(Integer))
                Next i
            End With
 
            'Personal-Zeilen  
            For i As Integer = 0 To dtPersonal.Rows.Count - 1
                dtPlanung.Rows.Add(i)
            Next i
 
            With dtPersonal
                For i As Integer = 0 To .Rows.Count - 1
 
                    'Childrows für Person abfragen 
                    Dim cr() As DataRow = _
                        .Rows(i).GetChildRows("PersonalAbsent")
 
                    If Not cr Is Nothing Then    
                        For k As Integer = 0 To cr.Length - 1
 
                            'Datumspalte ermitteln
                            Dim coldatum As String = _
                                CType(cr(k)("Datum"), String)
 
                            'Zeile für Person finden (optional, Index = i)
                            Dim r() As DataRow = _
                            dtPlanung.Select _
                            ("PersonalID=" & CType(cr(k)("PersonalID"), String))
 
                            'Abwesenheitsgrund in die Datumspalte eintragen
                            r(0)(coldatum) = cr(k)("AbsentID")
                        Next k
                    End If
                Next i
            End With
        End With
 
        dgv.DataSource = dtPlanung
    End Sub
End Class


Beitrag wurde zuletzt am 06.03.15 um 17:37:35 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: SQL-Syntax für Wochenplaner 
Autor: effeff
Datum: 11.03.15 15:07

Hallo!

Das ist ein komplett anderer Ansatz, als ich bisher benutzte... Diese Denkweise hatte ich noch nicht mal...

Ich bedanke mich bei Dir, dass Du Dir die Mühe gemacht hast, ein Beispiel zu posten und meinen Horizont zu erweitern!

Ich werde nächste Woche berichten, wenn ich wieder offiziell arbeiten werde!

EALA FREYA FRESENA

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel