Autor Beitrag
okrim
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82

Win 7
C# (VS 2010 Express)
BeitragVerfasst: Mo 03.03.14 02:02 
Hallo ihr alle,

und wieder komme ich nicht weiter.
Ich mache gerade ein Programm wo ich die Stunden von der Arbeit Täglich schreibe. Bis jetzt musste ich wenn ich eine Woche Urlaub hatte in meinem Kalender den Montag an Klicken und Urlaub eintragen, was ich mit einer CheckBox mache, die dann nach einem Klick auf ein Buttton Einfügen automatisch in mein dataGridView Urlaub und 8 Stunden Arbeitszeit einträgt, zugleich werden die Daten in eine Access Datenbank geschrieben, das gleich muss ich dann auch für Dienstag, Mittwoch und so weiter machen.
Jetzt war mein Gedanke wenn ich auf die checkBox Urlaub Klicke, kommt eine Abfrage wie lange, das klappt auch wunderbar, ich gebe dann über ein dataTimePicker an bis wann und es rechnet mir Automatisch die Arbeitstage aus.

Mein Problem ist jetzt nur das ich ein Anfangs und ein Enddatum habe ich weiß wie viel Arbeitstage, nur weiß ich nicht wie ich das jetzt in meine Access Datenbank bekomme, vor allem wenn ich zwei Wochen Urlaub eintragen will dann darf ja am Samstag und am Sonntag kein Urlaub eingetragen werden, oder wenn ein Feiertag vorhanden ist dann muss Feiertag und nicht Urlaub geschrieben werden.

Ich hoffe ich nerve nicht mit meinen Fragen, wollte eigentlich nur was einfaches Programmieren, man merkt halt werdend der Nutzung immer wieder was man noch verbessern könnte und so kommt eins zum anderen und ich denke da kommt noch einiges :D

Hab hier mal ein Ausschnitt wie ich bisher in die Datenbank geschrieben habe
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
OleDbConnection cn2 = new OleDbConnection(dbconnect);
            cn2.Open();
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                string grid_kunde = row.Cells[0].Value.ToString();
                string grid_taetigkeiten = row.Cells[1].Value.ToString();
                string grid_stunden = row.Cells[2].Value.ToString();
                string grid_datum = row.Cells[3].Value.ToString();
                string grid_kw = row.Cells[4].Value.ToString();
                string grid_tag = row.Cells[5].Value.ToString();
                string grid_monat = row.Cells[6].Value.ToString();
                string sql_abfrage2 = "INSERT INTO [data_kunden_stunden] (kunde, taetigkeit, stunden, datum, kw, tag, jahr, monat) VALUES ('" + grid_kunde + "', '" + grid_taetigkeiten + "', '" + grid_stunden + "', '" + grid_datum + "', '" + grid_kw + "', '" + grid_tag + "', '" + jahr + "', '" + grid_monat + "')";
                OleDbCommand cmd2 = new OleDbCommand(sql_abfrage2, cn2);
                cmd2.ExecuteNonQuery();
            }
            cn2.Close();

was mir in dem fall ja nicht viel bringt da ich ja direkt in die Datenbank schreiben muß, da das dataGridView immer nur für ein Tag ist.
Normal schreibe ich folgendes in die Datenbank
Kunde = ist der Kunde bei dem ich war und im Fall von Urlaub steht da dann Urlaub
Tätigkeiten = da schreibe ich rein ob ich Vorort oder Bürotätigkeiten gemacht habe, im Fall von urlaub bleibt es leer
Stunden = im Fall von urlaub 8 Stunden
kW = ist die Kalenderwoche
tag = ist der Wochentag (Mo, Di usw.)
Monat = ist Monat (01, 02 usw.)

Ich schreib nur soviel in die Datenbank da ich später noch eine Auswertung machen will und da dachte ich besser bisschen mehr wie zu wenig.
Werde mal noch einen Snapshot von meiner Programm oberfläche hinzufügen nur zum besseren verständnis.


Würde mich freuen wenn ihr mir wieder Helfen könnt.

Gruß Mirko
Einloggen, um Attachments anzusehen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 03.03.14 10:40 
Hallo okrim,

kannst du denn den Kalenderrechner so umschreiben, daß du nicht nur die Anzahl der Arbeitstage zurückerhältst, sondern eine Liste (z.B. von einem Enum DayType { Work, Weekend, PublicHoliday })?

Für diesen Beitrag haben gedankt: okrim
okrim Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82

Win 7
C# (VS 2010 Express)
BeitragVerfasst: Mo 03.03.14 11:18 
Hallo Th69,
mal schauen, hab zwar noch kein Plan, aber ich probiere es mal.
Melde mich wieder, ob oder ob nicht :D

Gruß Mirko
okrim Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82

Win 7
C# (VS 2010 Express)
BeitragVerfasst: Mo 03.03.14 11:58 
Hmmm ... jetzt bin ich ales im Debuggmodus durch gegangen und ganz ehrlich blick ich es nicht wie und wo die Feiertage und Wochenenden abgezogen werden :nixweiss:
Aber ich gebe nicht auf :D
okrim Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82

Win 7
C# (VS 2010 Express)
BeitragVerfasst: Mo 03.03.14 13:42 
So jetzt habe ich herausgefunden das die Wochentage in einem Array sind
ausblenden C#-Quelltext
1:
uint[] aWeekdays = { 0000000 };    // Array mit Anzahl der Wochentage (Index 0 = alle Sonntage, 1 = alle Montage etc.)					

Somit ist die erste und die letzte 0 der Sonntag und der Samstag, nur hab ich jetzt noch das Problem das das Array in der Klasse KalenderRechner ist und ich mein Programm ablauf in Form1 habe.

Wie kann ich jetzt von Form1 auf das Array in KalenderRechner zugreifen?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 03.03.14 14:00 
Habe ich was verpasst oder warum sollten wir dir deinen Code erklären? Wie hast du denn geschrieben wenn du denn nicht verstehst?
okrim Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82

Win 7
C# (VS 2010 Express)
BeitragVerfasst: Mo 03.03.14 14:30 
Hallo Ralf,
den hab ich nicht geschrieben, das ist der Kalenderrechner den mir Th69 empfohlen hat hier der Link
www.mycsharp.de/wbb2...d.php?threadid=84720
habe ihn in mein Projekt integriert, hab das ganze auch zum laufen gebracht, nur komm ich jetzt nich weiter?

Gruß Mirko
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 03.03.14 14:39 
Da das eine lokale Variable der Methode ist kannst du die nur anstatt dem zusammengerechneten Wert, der dich vermutlich nicht interessiert, zurückgeben. Oder verpasse der GetArbeitstage Methode noch einen weiteren Out Parameter in dem du das Array zurückgibst.

Um dir irgendwas sinnvolles zu raten wäre aber wichtig zu verstehen was du damit willst. Wofür brauchst du das Array? Zu dem was du bisher in diesem Thread gefragt hast sehe ich keinerlei Zusammenhang.
okrim Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82

Win 7
C# (VS 2010 Express)
BeitragVerfasst: Mo 03.03.14 14:53 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Hallo okrim,

kannst du denn den Kalenderrechner so umschreiben, daß du nicht nur die Anzahl der Arbeitstage zurückerhältst, sondern eine Liste (z.B. von einem Enum DayType { Work, Weekend, PublicHoliday })?


ich dachte ich kann so das ganze Spliten, so das ich Arbeitstage, Wochenendtage und Feiertage extra habe. Aber das habe ich wohl falsch verstanden :bawling:
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 03.03.14 15:00 
Mag sein. Es sieht für micht so aus als das du genau je Tag abspeichern willst ob es ein Urlaubstag oder sonstwas war.
Dazu bräuchest du doch die Information
02.03.2014 Sonntag -> kein Arbeitstag
03.03.2014 Montag -> Arbeitstag (außer in bestimmten Sonderfällen)
etc.

Das Array liefert dir aber die Info dein Zeitraum bestand aus x Sonntage, y Montage, z Dienstage etc. Wie soll dir das weiterhelfen?
Du bräuchtest eher eine Methode dir dir als Ergebnis ein Liste von Datum - Arbeitstag Ja/Nein Paaren auf die Eingabe eines Zeitraums liefert.
okrim Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82

Win 7
C# (VS 2010 Express)
BeitragVerfasst: Mo 03.03.14 15:08 
Ja genau ich will z.B.
Montag -- Urlaub
Dienstag -- Urlaub
Mittwoch -- Feiertag
usw.
am Wochenende bleibt der Eintrag leer

Wie bekomme ich so eine Methode hin?

Ich weiß man sollte die Finger weglassen von Sachen von den man keine Ahnung hat, es war auch nicht geplant das es kompliziert wird, aber mir macht das Programmieren auch Spaß und irgendwie hat mich jetzt auch der Ehrgeiz gepackt :D
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 03.03.14 15:45 
Zitat:
Wie bekomme ich so eine Methode hin?


a.) Formuliere den Algorithmus der zu lösen ist.
b.) Programmiere ihn

Beginnen wir mit der Formulierung des Algorithmus.
etc.
a.) Die Eingaben. Vermutlich ein Zeitraum also ein von Datum und ein bis Datum (denkbare weitere Daten wären ein Land, die Person, die Lokalität um die konkrete Feiertagsregel zu bestimmen. Ignorieren wir erstmal).
b.) Die Ausgabe. Vermutlich eine Liste der Tage im Zeitraum und einen Typ was das für ein Tag ist. Beim Typ können wir uns z.b. an dem Vorschlag von user profile iconTh69 orientieren.

Zusammen ergibt das ungefähr dieses Interface für die benötigte Methode.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
public enum DayType { WorkDay, Weekend, Holiday }

public Dictionary<DateTime, DayType> GetListOfDayTypes(DateTime from, DateTime to)  
{
// TODO
}


c.) Der Algorithmus.
Du möchtest für jeden Tag im übergeben Zeitraum einen Datensatz im Ergebnis. Also brauchst du eine Schleife die vom from Datum bist zum to Datum läuft.
Im Schleifenkörper solltest du dann ein konkretes Datum haben das du prüfst ob es ein Wochenende oder Feiertag (entsprechende Prüfungen sind in dem von dir angesprochenen Code) ist.
Dieses Ergebnis (Datum + ermittelten Typ) schreibst du dann in ein Dictionary und gibst dieses von der Methode zurück.
In etwa

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
public Dictionary<DateTime, DayType> GetListOfDayTypes(DateTime from, DateTime to)
{
    Dictionary<DateTime, DayType> result = new Dictionary<DateTime, DayType>();  
    while (from <= to)
    {
        if (from.IsWeekend())
            result.Add(from, DayType.Weekend);
        else if (from.IsFeiertag())
            result.Add(from, DayType.Holiday);
        else
            result.Add(from, DayType.WorkDay);
        from = from.AddDays(1);
    }
    return result;
}

d.) Der Aufrufer der Methode/Algorithmus
Dieser iteriert über das zurückgegebene Dictionary und erzeugt je Satz im Dictionary ein passenden Eintrag in der Datenbank.
In etwa
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
foreach (var tuple in GetListOfDayTypes(from, to))
{
    switch (tuple.Value)
    {
        case DayType.WorkDay:
            // Arbeitstag für tuple.Key eintragen
            break;
        case DayType.Weekend:
            // Wochenende für tuple.Key eintragen
            break;
        case DayType.Holiday:
            // Urlaub für tuple.Key eintragen
            break;
        default:
            break;
    }
}


Zuletzt bearbeitet von Ralf Jansen am Mo 03.03.14 16:06, insgesamt 2-mal bearbeitet
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 03.03.14 15:55 
Hallo,

und dann noch als Ergänzung zu Ralf's Beitrag:
Der Kalenderrechner bietet eine Methode IsFeiertag(DateTime), die du einfach nutzen kannst. Und ob ein Samstag oder Sonntag vorliegt, kannst du mittels der DateTime.DayOfWeek-Eigenschaft herauskriegen.
So nun steht schon fast der gesamte Code hier. ;-)

Für diesen Beitrag haben gedankt: okrim
okrim Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82

Win 7
C# (VS 2010 Express)
BeitragVerfasst: Mo 03.03.14 16:01 
Ich danke euch recht herzlich und schau mal ob ich damit zurecht komme, auf den ersten Blick kapier ich es noch nicht so richtig, aber ich spiele mal bischen rum, sollte ich es nicht hin bekommen melde ich mich halt nochmal :D

Nochmal Danke
Gruß Mirko
okrim Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82

Win 7
C# (VS 2010 Express)
BeitragVerfasst: Mo 03.03.14 16:23 
Also die Metode schreibe ich ja in die Klasse Kalenderrechner.

Allerdings bekomme ich für IsFeiertag und IsWeekend noch Fehler

"System.DateTime" enthält keine Definition für "IsFeiertag", und es konnte keine Erweiterungsmethode "IsFeiertag" gefunden werden, die ein erstes Argument vom Typ "System.DateTime" akzeptiert. (Fehlt eine Using-Direktive oder ein Assemblyverweis?)

Und wie ist das mit Punkt d. den muß ich in mein Form1 einfügen, oder?

Ich stehe gerade voll auf dem Schlauch :(
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 03.03.14 16:32 
Zitat:
"System.DateTime" enthält keine Definition für "IsFeiertag", und es konnte keine Erweiterungsmethode "IsFeiertag" gefunden werden, die ein erstes Argument vom Typ "System.DateTime" akzeptiert. (Fehlt eine Using-Direktive oder ein Assemblyverweis?)


Das waren auch nur Platzhalter. Ersetze es durch was passendes (steckt in der Kalenderrechner Klasse und im letzten Hinweis von TH69).

Zitat:
Und wie ist das mit Punkt d. den muß ich in mein Form1 einfügen, oder?


Denn mußt du da einfügen wo du die Daten in die Datenbank schreiben willst. Wenn das deine Form macht dann dort.
okrim Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82

Win 7
C# (VS 2010 Express)
BeitragVerfasst: Mo 03.03.14 17:33 
Ich rafffff es nicht, ich hab überhaupt kein plan was ich mache oder machen soll, bin wohl doch zu doff, weis nicht mal nach was ich googlen soll.
Ihr lacht besimmt über mich, warscheinlich sind das Grundlagen die man wissen sollte, ich aber leider nicht weiß.

Könnt ihr mir vielleicht nochmal einen Tip geben?

Gruß Mirko
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 03.03.14 17:41 
Du musst schon konkrete Fragen stellen, sonst weiß man ja nicht, wo man Dir helfen soll :nixweiss:

Vielleicht musst Du Dich auch einfach mal länger mit den Grundlagen beschäftigen, anstatt durch Code aus dem Internet Programme "zusammenzukleben". Du merkst ja jetzt selber, dass man damit zwar kurzfristig schnelle Erfolge verbuchen kann, man dann aber irgendwann nicht mehr weiter kommt.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
okrim Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82

Win 7
C# (VS 2010 Express)
BeitragVerfasst: Mo 03.03.14 17:56 
Hallo Christian,

ich weiß das es besser wäre wenn ich mal ganz von vorne anfangen würde, allerdings habe ich das erste mal so ein Programmausschnitt aus dem Internet, denn alles was ich davor gemacht hab, hab ich mit Hilfe von Google und dem bisschen wissen was ich habe gemacht, wenn es gar nicht mehr geklappt hat habt ihr mir ja immer super geholfen, ich mach das ja nur so Hobbymäßig nebenbei, daher ist es auch nicht so einfach von vorne Anzufangen, wenn man nicht dran bleiben kann.

zu meinem Problem ich habe jetzt von Ralf und von Th69 den Code bekommen und weiß nicht wie ich ihn einbinden kann oder soll, ich habe ihn in den Kallenderrechner eingefügt und weiß nicht weiter.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 03.03.14 18:47 
Klingt für mich nach "Ich habe kein Bock, mich damit zu beschäftigen, also macht Ihr das mal für mich".

Bitte beschäftige Dich so weit mit den Dingen, die Dir hier gezeigt werden, dass Du zumindest gezieltere Fragen stellen kannst. Dass Dir hier fertige Programmteile präsentiert werden, die Du ohne Verstehen weiterbenutzt, wird so nicht weiter gehen. Wenn Du keine Eigeninitiative zeigst, werde ich den Thread für 24h schließen, um Dir Zeit zu geben, Dich selber reinzudenken.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Dieses Thema ist gesperrt, Du kannst keine Beiträge editieren oder beantworten.

Das Thema wurde von einem Team-Mitglied geschlossen. Wenn du mit der Schließung des Themas nicht einverstanden bist, kontaktiere bitte das Team.