Autor Beitrag
Talemantros
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Mi 19.11.14 18:00 
Hallo,
ich würde gerne eine Laufzeit eines Geräts in einer Datenbank ablegen.
Hier zu soll der Benutzer auswählen können wieviel Stunden dieses Gerät eigentlich laufen soll.

Da ich später mit dem Soll und dem Ist rechnen will frage ich mich gerade wie ich das am Besten direkt zu Beginn richtig abbilde.

In der MySQL Datenbank würde ich "Time" wählen als Datenbankfeld

In welcher Form würdet ihr den Benutzer die Eingaben machen lassen?
TextBox? und wenn ja wie prüfe ich ob es eine gültige Zeitangabe wäre, oder eher was anderes?

Hatte auch erst an Comboboxen gedacht die ich vorfülle mit 00:15 - 24:00 oder so !!?

Danke

Gruß
Daniel
Yankyy02
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 138
Erhaltene Danke: 21

Win 11 x64
C# (VS 2022 - Rider)
BeitragVerfasst: Mi 19.11.14 20:33 
Hallo Talemantros,

solltest du die Oberfläche in WPF schreiben dann würde sich der TimePicker anbieten. wpftoolkit.codeplex....;referringTitle=Home
Ansonsten würde ich das mit einer TextBox machen und Regex für die Prüfung hernehmen damit nur gültige Werte eingegeben werden können.
Das ganze soll nur als Denkanstoss dienen sollte also jemand bessere Vorschläge haben nur her damit!

LG
Gery

_________________
the quiter you become, the more you are able to hear
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Do 20.11.14 08:24 
Hi,
also WPF kommt erstmal nicht in Frage.
Ist eine WinForm Anwendung. Dann versuche ich mich mal mit dem regex schlau zu lesen.

Aber grundsätzlich wäre es ok...

Datenbank: Feld = Time
Property: string

Ich habe es mit Property DateTime versucht, aber da meckert er an, dass er es nicht konvertieren könnte?!

Gruß
Daniel
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 20.11.14 11:26 
Aus deiner Frage wird nicht ganz klar ob du einen Zeitraum oder einen Zeitpunkt eingeben willst. Einen Zeitpunkt kannst du mit einem DateTimePicker eingeben (Format = Time; ShowUpDown=true). Wenn du nur Zeiträume kürzer als 24 Stunden brauchst kannst du denn dann auch noch verwenden.

Zur Ablage in der Datenbank kommt es auch wieder drauf an ob du einen Zeitraum oder einen Zeitpunkt meinst. Time klingt eher nach Zeitpunkt. Aber ich würde selbst wohl eher den Zeitraum, wenn das gemeint war, in irgendeine sauber vergleichbare Basis Einheit umrechnen (absolute Anzahl Sekunden oder ähnlich) und als Ganzzahl in der Datenbank speichern. Vom DateTime aus dem DateTimePicker solltest du einfach über die TimeSpan Klasse die absoluten Sekunden, oder was auch immer, bekommen können.
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Do 20.11.14 16:49 
Hallo,
also es geht tatsächlich um einen Zeitraum.
Beispiel: Maschine 1 soll Montags 8 Stunden genutzt werden.

Dies dachte ich als 08:00 in die Datenbank zu schreiben.

Am Ende wollte ich dann anzeigen lassen können, dass sie vielleicht nur 7 Stunden lief und als Differenz dann 1 Stunde Fehlzeit hatte oder so

Das mit dem TimeSpan versuche ich mir nachher mal genauer anschauen.
Habe ich so noch nicht genutzt und kann ich mir bisher nicht viel drunter vorstellen.
Die Grundidee habe ich verstanden..

Vielen Dank

Gruß
Daniel
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Do 20.11.14 21:25 
Hallo nochmal,
leider muss ich euch damit noch mal behelligen.
Also ich habe nun folgendes versucht.

IN der MySQL Datenbank ist das Feld z.B,; Montag ein Bigint

In der Klasse habe ich die Property auf Long gesetzt.
nun lasse ich beim auslesen der Datenbank den Wert convert.toDateTim

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
        public static MachineSwitchTime GetLastSwitchTimeForMachine(string uebergabe)
        {
            strSql = "Select maschgrund.bezeichnung, montag, dienstag, mittwoch, donnerstag, freitag, "
                        + "samstag, sonntag, gueltigvon from maschzeiten join maschgrund "
                        + "on maschzeiten.maschine=maschgrund.maschgrundid "
                        + "where maschgrund.bezeichnung=?bezeichnung and maschzeiten.aktiv =?aktiv";

            MachineSwitchTime myMachine = new MachineSwitchTime();

            using (MySqlConnection conn = new MySqlConnection(connStr))
            {
                using (MySqlCommand cmd = new MySqlCommand(strSql, conn))
                {
                    conn.Open();

                    cmd.Parameters.AddWithValue("?aktiv"1);
                    cmd.Parameters.AddWithValue("?bezeichnung",uebergabe);

                    MySqlDataReader dr = cmd.ExecuteReader();

                    while (dr.Read())
                    {
                        myMachine.ActiveSince = dr.GetDateTime("gueltigvon");
                        myMachine.Monday = Convert.ToDateTime(dr["montag"]);
                        //myMachine.Thuesday= dr.GetDateTime("dienstag");
                        //myMachine.Wendsday= dr.GetDateTime("mittwoch");
                        //myMachine.Thursday= dr.GetDateTime("donnerstag");
                        //myMachine.Friday= dr.GetDateTime("freitag");
                        //myMachine.Saturday= dr.GetDateTime("samstag");
                        //myMachine.Sunday= dr.GetDateTime("sonntag");
                    }

                    conn.Close();
                }
            }

            return myMachine;
        }


Und in der UserCOntrol lasse ich das DataBinding des DateTimePickers mit dem Value füllen als Datum.

Leider meckert er nun die "TimeSpan" an, aber leider komme ich da gerade nicht klar mit.
Könnt ihr euch noch mal für mich bemühen?

Danke

Gruß
Daniel

Edit: Irgendwie habe ich da ein Denkfelhler mit Long und Convert.toDatetim...ich probiere es weiter aber bin über Hilfe uach dankbar :-)

Edit2: Habe nun Convert.toin64 um die Property als Long zu füllen. Da kommt nun aber der Fehler, dass Timespan nicht in Iconvertable konvertiert werden kann...argh :-)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 20.11.14 22:07 
Zitat:
IN der MySQL Datenbank ist das Feld z.B,; Montag ein Bigint

In der Klasse habe ich die Property auf Long gesetzt.

Was stellt den der BigInt in der Datenbank dar? Einen Zeitraum in Sekunden so wie vorgeschlagen hatte oder was anderes?
Was soll Monday in der Klasse darstellen einen Zeitraum?
Zitat:
myMachine.Monday = Convert.ToDateTime(dr["montag"]);

Was soll das wenn Monday ein long ist wie soll da ein DateTime reinpassen. Eine Variable vom Typ long kann genau einen Typen beinhalten eben einen long nix anderes.
Zitat:
Edit2: Habe nun Convert.toin64 um die Property als Long zu füllen. Da kommt nun aber der Fehler, dass Timespan nicht in Iconvertable konvertiert werden kann...argh :-)

Ich weiß nicht was du da konvertieren willst. BigInt und long sind das gleiche. Und ein DataReader hat Methoden um die Spalten in einem bestimmten DAtentyp zu bekommen. Dee Array Zugriffsoperatorer ist üblicherweise die letzte Wahl beim DataReader nimm lieber einfach dr.GetInt64("montag").

Wenn du dann einem Timespan bekommen willst dann erzeuge daraus einfach einen Timespan per Konstruktor. Z.b new Timespan(Stunden, Minuten, Sekunden). Für Stunden, Minuten, Sekunden halt das passende einsetzen. Wenn du für den DateTimePicker direkt den DateTime angeben willst kannst du das auch direkt per datetimepicker.Value = DateTime.Today.AddSeconds(myMachine.Monday) wenn Monday Sekunden darstellt. Für einen DateTime musst du ja Datum + Uhrzeit angeben und wir nehmen hier einfach das heutige. Nachher beim auslesen ist dir ja das Datum wiederum egal da du dir nur den Uhrzeit teil schnappst und in Sekunden (oder was auch immer) zurückrechnest.
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Do 20.11.14 23:37 
Hallo Ralf,
irgendwie reden wir aneinander vorbei.
Würde gern andersrum anfangen...

Würde gern deinen Vorschlag umsetzen mit den Sekunden.
Wenn ich dafür die Datenbank als BigInt (Long) mache, wie bekomme ich den dann die Auswahl aus dem DateTimePicker da rein?

Auswahl wäre 5 Stunde im DateTimePicker (05:00:00) und dies wären 18000 Sekunden...

Vielleicht komme ich so rum mit.

Danke

Gruß
Daniel
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 20.11.14 23:55 
Zitat:
Wenn ich dafür die Datenbank als BigInt (Long) mache, wie bekomme ich den dann die Auswahl aus dem DateTimePicker da rein?


ausblenden C#-Quelltext
1:
var seconds = (long)dateTimePicker.Value.TimeOfDay.TotalSeconds;					
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Fr 21.11.14 12:13 
Guten Morgen zusammen,
also soweit habe ich es erstmal hinbekommen.
Würde es hier posten. Auf der einen Seite als Ergebnis, auf der anderen Seite für die konstruktive Kritik :-)

Ich habe nun folgende Klasse

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
    public class MachineSwitchTime
    {
        public long Id { get; set; }
        public long Machine { get; set; }
        public DateTime Monday { get; set; }
        public DateTime Thuesday { get; set; }
        public DateTime Wendsday { get; set; }
        public DateTime Thursday { get; set; }
        public DateTime Friday { get; set; }
        public DateTime Saturday { get; set; }
        public DateTime Sunday { get; set; }
        public DateTime ActiveSince { get; set; }
        public DateTime ActiveUntil { get; set; }
        public bool Active { get; set; }
    }


In dem UserControl habe ich Datetimepicker für die Eingabe der Stunden und eins für das Datum
Diese sind mit einer BindingSource und Databinding an die Modellklasse geknüpft und werden geladen beim Klicken auf ein TreeNode

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
        private void treeMaschinen_AfterSelect(object sender, TreeViewEventArgs e)
        {
            localMachine = MachineMethods.GetLastSwitchTimeForMachine(e.Node.Text);
            bsMachine.DataSource = localMachine;
        }


Hier der Methode steckt dann

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
        public static MachineSwitchTime GetLastSwitchTimeForMachine(string uebergabe)
        {
            strSql = "Select maschgrund.maschgrundid as id, maschgrund.bezeichnung, montag, dienstag, mittwoch, donnerstag, freitag, "
                        + "samstag, sonntag, gueltigvon from maschzeit join maschgrund "
                        + "on maschzeit.maschine=maschgrund.maschgrundid "
                        + "where maschgrund.bezeichnung=?bezeichnung and maschzeit.aktiv =?aktiv";

            MachineSwitchTime myMachine = new MachineSwitchTime();

            using (MySqlConnection conn = new MySqlConnection(connStr))
            {
                using (MySqlCommand cmd = new MySqlCommand(strSql, conn))
                {
                    conn.Open();

                    cmd.Parameters.AddWithValue("?aktiv"1);
                    cmd.Parameters.AddWithValue("?bezeichnung",uebergabe);

                    MySqlDataReader dr = cmd.ExecuteReader();

                    while (dr.Read())
                    {
                        myMachine.Id = dr.GetInt64("id");
                        myMachine.ActiveSince = dr.GetDateTime("gueltigvon");
                        myMachine.Monday = DateTime.Today.AddSeconds(dr.GetInt64("montag"));
                        myMachine.Thuesday = DateTime.Today.AddSeconds(dr.GetInt64("dienstag"));
                        myMachine.Wendsday = DateTime.Today.AddSeconds(dr.GetInt64("mittwoch"));
                        myMachine.Thursday = DateTime.Today.AddSeconds(dr.GetInt64("donnerstag"));
                        myMachine.Friday = DateTime.Today.AddSeconds(dr.GetInt64("freitag"));
                        myMachine.Saturday = DateTime.Today.AddSeconds(dr.GetInt64("samstag"));
                        myMachine.Sunday = DateTime.Today.AddSeconds(dr.GetInt64("sonntag"));
                    }

                    conn.Close();
                }
            }

            return myMachine;
        }


Zum Speichern wird dann folgendes genutzt

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
        public static void SetNewSwitchTime(MachineSwitchTime machine)
        {
            strSql = "Insert Into maschzeit (maschine, montag, dienstag, mittwoch, donnerstag, freitag, samstag, sonntag, gueltigvon, gueltigbis) "
                     + "Values (?maschine, ?montag, ?dienstag, ?mittwoch, ?donnerstag, ?freitag, ?samstag, ?sonntag, ?gueltigvon, ?gueltigbis)";

            using (MySqlConnection conn = new MySqlConnection(connStr))
            {
                using (MySqlCommand cmd = new MySqlCommand (strSql, conn))
                {
                    conn.Open();

                    cmd.Parameters.AddWithValue("?maschine", machine.Machine);
                    cmd.Parameters.AddWithValue("?montag", (long)machine.Monday.TimeOfDay.TotalSeconds);
                    cmd.Parameters.AddWithValue("?dienstag", (long)machine.Thuesday.TimeOfDay.TotalSeconds);
                    cmd.Parameters.AddWithValue("?mittwoch", (long)machine.Wendsday.TimeOfDay.TotalSeconds);
                    cmd.Parameters.AddWithValue("?donnerstag", (long)machine.Thursday.TimeOfDay.TotalSeconds);
                    cmd.Parameters.AddWithValue("?freitag", (long)machine.Friday.TimeOfDay.TotalSeconds);
                    cmd.Parameters.AddWithValue("?samstag", (long)machine.Saturday.TimeOfDay.TotalSeconds);
                    cmd.Parameters.AddWithValue("?sonntag", (long)machine.Sunday.TimeOfDay.TotalSeconds);
                    cmd.Parameters.AddWithValue("?gueltigvon", Convert.ToDateTime(machine.ActiveSince));
                    cmd.Parameters.AddWithValue("?gueltigbis", Convert.ToDateTime("31.12.2099"));


                    cmd.ExecuteNonQuery();

                    conn.Close();
                }
            }

        }


Eine Sache würde mich allerdings noch interessieren bevor ich einen neuen Eintrag mache.

Wie schreibe ich einen SQL String auf MySQL der mir alle Zeilen ausgibt wo das heutige Datum zwischen "gueltigvon" und "gueltigbis" liegt.

Danke

Gruß
Daniel

P.S.: Ich weiß, dass ich noch deutsche und englische Begriffe mische und dies nicht tun sollte, aber zur Zeit komme ich damit besser klar.
Diese kleinen Übungstools bekommt eh kein anderer in die Finger :-)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 21.11.14 13:35 
Zitat:
Wie schreibe ich einen SQL String auf MySQL der mir alle Zeilen ausgibt wo das heutige Datum zwischen "gueltigvon" und "gueltigbis" liegt.

dev.mysql.com/doc/re...tml#operator_between

Zitat:
P.S.: Ich weiß, dass ich noch deutsche und englische Begriffe mische und dies nicht tun sollte, aber zur Zeit komme ich damit besser klar.
Diese kleinen Übungstools bekommt eh kein anderer in die Finger


Wenn es egal wäre wäre es kein Übungstool ;) Richtiges Naming muss mann auch üben. Die meisten Anfänger schreiben gefüllt auch eher falschen Code weil sie den Dingen nicht den richtigen Namen geben und selbst dann aufgrund des Namens falsch über das Problem nachdenken.

Als Beispiel, unabhängig von der deutsch-englisch Problematik. public DateTime Monday { get; set; }. Hier solltest du dich fragen was ein 3.ter Leser der aus irgendeinem Grund deinen Code warten muss sich dabei denkt. Voraussichtlich sowas wie "Welcher Montag ist gemeint und warum brauch ich für jeden Wochentag eine eigene Property? In meinem Kalender kommt der Dienstag eigentlich immer nach einem Montag. Ich kann also Dienstag aus Montag berechnen da brauch ich keine weiteren Properties." Das kann man lösen indem man klarer ausdrückt das ein Zeitraum an diesem Tag gemeint ist. Entweder durch die Wahl eines anderen Datentyps, wie zum Beispiel TimeSpan der klar aussagt das es ein Zeitraum ist anders als DateTime wo man einen Zeitpunkt erwartet, oder/und im Naming der Property ala RuntimeOnMonday. 3.te Möglichkeit wäre ein Kommentar aber das solltest du an einem solchen Punkt als Niederlage empfinden wenn man dafür einen Kommentar braucht.
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Fr 21.11.14 15:00 
Hey,
das mit dem Between funktioniert noch nicht leider.
Danke aber für den Hinweis.

Wegen der eindeutigen Properties und so muss ich schon sagen, dass du da definitiv recht hats.
Werde versuchen dies anzunehmen und in Zukunft auch darein mehr Kopfschmalz zu investieren.

Danke

Gruß
Daniel

Edit: Super hat geklappt!

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
            strSQL = "Update maschzeit Set aktiv = 1 where (?heute between gueltigvon and gueltigbis)";

            using (MySqlConnection conn = new MySqlConnection (connStr))
            {
                using (MySqlCommand cmd = new MySqlCommand (strSQL, conn))
                {
                    conn.Open();

                    cmd.Parameters.AddWithValue("?heute", DateTime.Now.ToShortDateString());

                    cmd.ExecuteNonQuery();

                    conn.Close();
                }
            }