Ideensammlung Urlaubsplaner

  • VB.NET
  • .NET 4.0

Es gibt 44 Antworten in diesem Thema. Der letzte Beitrag () ist von tragl.

    Kasi schrieb:

    Hier eine Idee für Gesamtübersicht mit Datagridview


    Hey, das würde sich gut zum Eintragen für den einzelnen Mitarbeiter machen, kannst du mir ne Sample-Solution dazu anhängen?
    Ansonsten ist mein Planer tatsächlich dafür gedacht, für etliche Mitarbeiter / diverse Standorte, Abteilungen etc. alles einzutragen und anzuzeigen.
    Die Anzeige regeln die ListViews in "Übersicht"

    LG
    Originaler (noch) Nichtskönner :D
    sehe ich das richtig das du alles 12x(also je Monat) erstellst ?

    hast du schon mal mit PIVOT gearbeitet?
    habe hier ein paar Tabellen mit Daten gefüllt
    hier der Enwurf


    und das ergebnis


    die SQL Anweisung sieht so aus

    VB.NET-Quellcode

    1. TRANSFORM First(tbl_Grund.GR_Kuerzel) AS ErsterWertvonGR_Kuerzel
    2. SELECT Format([TA_Datum],"yyyy") AS Jahr, Format([TA_Datum],"mmm") AS Monat, tbl_Mitarbeiter.MA_Name AS Mitarbeiter, tbl_Abteilung.AB_Beizeichnung AS Abteilung
    3. FROM tbl_Grund INNER JOIN ((tbl_Abteilung INNER JOIN tbl_Mitarbeiter ON tbl_Abteilung.AB_ID = tbl_Mitarbeiter.AB_ID) INNER JOIN tbl_Tage ON (tbl_Mitarbeiter.MA_ID = tbl_Tage.MA_ID) AND (tbl_Abteilung.AB_ID = tbl_Tage.AB_ID)) ON tbl_Grund.GR_ID = tbl_Tage.GR_ID
    4. GROUP BY Format([TA_Datum],"yyyy"), Format([TA_Datum],"mmm"), tbl_Mitarbeiter.MA_Name, tbl_Abteilung.AB_Beizeichnung, tbl_Abteilung.AB_ID
    5. PIVOT Format([TA_Datum],"dd") In ("01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31");


    Vorteil : ist du kannst jetzt per Jahr Monat und Abteilung Filtern

    Nachteil : du kannst hier nix bearbeiten, ist nur die Übersicht



    in .Net mit DGV

    VB.NET-Quellcode

    1. Imports System.Data.OleDb
    2. Public Class Pivot
    3. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    4. Dim FrozenColumsCount As Integer = 4
    5. Dim Ssql As String = "TRANSFORM First(tbl_Grund.GR_Kuerzel) AS ErsterWertvonGR_Kuerzel"
    6. Ssql &= " SELECT Format([TA_Datum],'yyyy') AS Jahr, Format([TA_Datum],'mmm') AS Monat, "
    7. Ssql &= " tbl_Mitarbeiter.MA_Name AS Mitarbeiter, tbl_Abteilung.AB_Beizeichnung AS Abteilung"
    8. Ssql &= " FROM tbl_Grund INNER JOIN ((tbl_Abteilung INNER JOIN tbl_Mitarbeiter ON"
    9. Ssql &= " tbl_Abteilung.AB_ID = tbl_Mitarbeiter.AB_ID) INNER JOIN tbl_Tage ON"
    10. Ssql &= " (tbl_Mitarbeiter.MA_ID = tbl_Tage.MA_ID) AND (tbl_Abteilung.AB_ID = tbl_Tage.AB_ID)) ON"
    11. Ssql &= " tbl_Grund.GR_ID = tbl_Tage.GR_ID"
    12. Ssql &= " GROUP BY Format([TA_Datum],'yyyy'),"
    13. Ssql &= " Format([TA_Datum],'mmm'), tbl_Mitarbeiter.MA_Name,"
    14. Ssql &= " tbl_Abteilung.AB_Beizeichnung,tbl_Abteilung.AB_ID"
    15. Ssql &= " PIVOT Format([TA_Datum],'dd') In"
    16. Ssql &= " ('01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31');"
    17. Dim con As OleDbConnection = New OleDbConnection("Provider=Microsoft.jet.oledb.4.0;Data Source=D:\DotNet\Sample DotNet\JahrPlaner_Pe\UPlaner.mdb")
    18. Dim cmd As OleDbCommand = New OleDbCommand(Ssql, con)
    19. con.Open()
    20. Dim myDA As OleDbDataAdapter = New OleDbDataAdapter(cmd)
    21. Dim myDataSet As DataSet = New DataSet()
    22. myDA.Fill(myDataSet, "MyTable")
    23. DataGridView1.DataSource = myDataSet.Tables("MyTable").DefaultView
    24. DataGridView1.AllowUserToAddRows = False
    25. con.Close()
    26. con = Nothing
    27. With DataGridView1
    28. 'Days width
    29. For i As Integer = 4 To .Columns.Count - 1
    30. .Columns(i).Width = 22
    31. Next
    32. End With
    33. 'Freeze first 4 columns
    34. For i As Integer = 0 To FrozenColumsCount - 1
    35. DataGridView1.Columns(i).Frozen = True
    36. Next
    37. End Sub
    38. Private Sub DataGridView1_CellFormatting(sender As Object, e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
    39. For Each row As DataGridViewRow In DataGridView1.Rows
    40. For Each cell As DataGridViewCell In row.Cells
    41. If IsDBNull(cell.Value) Then
    42. cell.Style.BackColor = Color.White
    43. ElseIf cell.Value = "Ur" Then 'UR=Urlaub
    44. cell.Style.BackColor = Color.DarkKhaki
    45. ElseIf cell.Value = "Kr" Then 'Kr = Krank
    46. cell.Style.BackColor = Color.Aquamarine
    47. '
    48. 'ElseIf .....
    49. End If
    50. Next
    51. Next
    52. End Sub
    53. End Class


    Image:

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Kasi“ ()

    Kasi schrieb:

    sehe ich das richtig das du alles 12x(also je Monat) erstellst ?

    jain, es werden insgesamt 13 listviews bei Klick auf Ausgabe gefüllt

    Kasi schrieb:

    hast du schon mal mit PIVOT gearbeitet?

    ja, aber nur in excel

    Kasi schrieb:

    Nachteil : du kannst hier nix bearbeiten, ist nur die Übersicht

    das is wirklich ein Nachteil. Ich kann in meinen ListViews zwar auch nix bearbeiten, die ziehen aber die Daten immer aktuell aus dem DataSet.

    Ich arbeite auch (noch) nicht mit Datenbank, sondern nur mit DataSet und XML - es könnte auch gut sein, dass das so bleiben muss. ;)
    Dein Design vom DataGridView wäre eine schicke Methode für die Anlage von Urlaub/Krank etc. pro Mitarbeiter gewesen - wird aber wohl eher schwierig umzusetzen.
    Originaler (noch) Nichtskönner :D

    Neu

    Dein Design vom DataGridView wäre eine schicke Methode für die Anlage von Urlaub/Krank etc. pro Mitarbeiter gewesen - wird aber wohl eher schwierig umzusetzen.


    da ist nix schwer umzusetzen.
    du weist wie ein Jahr aufgebaut ist oder ?

    hier ein Ansatz

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. 'add Day Columns
    3. Dim x As Integer
    4. Dim columns As DataGridViewColumn() = New DataGridViewColumn(30) {}
    5. For i = 0 To columns.Length - 1
    6. Dim col As DataGridViewColumn = New DataGridViewTextBoxColumn()
    7. Dim j As Integer
    8. x = CInt(j + i + 1)
    9. col.HeaderText = CStr(x)
    10. columns(i) = col
    11. col.Width = 25
    12. Next
    13. DataGridView1.Columns.AddRange(columns)
    14. 'add Months to HeaderCell
    15. Dim NYear As Integer = 2020
    16. For i As Integer = 1 To 12
    17. Dim mon As New DateTime(NYear, i, 1)
    18. Dim row As Integer = 0
    19. row = DataGridView1.Rows.Add()
    20. DataGridView1.Rows(row).HeaderCell.Value = mon.ToString("MMM")
    21. DataGridView1.RowHeadersWidth = 60
    22. Next
    23. 'add some empty lines
    24. With DataGridView1
    25. For j = 3 To 12 Step 4
    26. .Rows.Insert(j, 1)
    27. .Rows(j).Height = 8
    28. For i As Integer = 0 To DataGridView1.Columns.Count - 1
    29. Me.DataGridView1(i, j).Style.BackColor = Color.SlateGray
    30. Next
    31. Next
    32. End With
    33. DataGridView1.AllowUserToAddRows = False
    34. End Sub


    gruss
    kasi

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Kasi“ ()

    Neu

    Kasi schrieb:

    da ist nix schwer umzusetzen.


    Mit schwer umzusetzen meinte ich folgendes:
    Ich wähle einen Mitarbeiter, "dein Grid" öffnet sich und ich kann schön in jede Cell klicken und was eintragen -> das wird dann im DTS gespeichert.
    Aktuell löse ich das ja so, das man einen Zeitraum (oder einzelne Tage) in einem Dialogfeld anlegen muss, das Grid wäre eine handlichere Methode ;)
    Originaler (noch) Nichtskönner :D