Entwickler-Ecke
Datenbanken (inkl. ADO.NET) - Daten in Access Datenbank schreiben
okrim - Mo 03.03.14 02:02
Titel: Daten in Access Datenbank schreiben
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
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
Th69 - 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 })?
okrim - 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 - 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 - Mo 03.03.14 13:42
So jetzt habe ich herausgefunden das die Wochentage in einem Array sind
C#-Quelltext
1:
| uint[] aWeekdays = { 0, 0, 0, 0, 0, 0, 0 }; |
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 - 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 - 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
http://www.mycsharp.de/wbb2/thread.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 - 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 - Mo 03.03.14 14:53
Th69 hat folgendes geschrieben : |
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 - 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 - 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 - 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
Th69 orientieren.
Zusammen ergibt das ungefähr dieses Interface für die benötigte Methode.
C#-Quelltext
1: 2: 3: 4: 5: 6:
| public enum DayType { WorkDay, Weekend, Holiday }
public Dictionary<DateTime, DayType> GetListOfDayTypes(DateTime from, DateTime to) { } |
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
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
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: break; case DayType.Weekend: break; case DayType.Holiday: break; default: break; } } |
Th69 - 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. ;-)
okrim - 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 - 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 - 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 - 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. - 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.
okrim - 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. - 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.
okrim - Mo 03.03.14 18:57
Ich beschäftige mich ja damit, grob übeschlagen beschäftige ich mich jetzt schon 30 Stunden genau damit, ich google und mach, nur fehlt mir hier der Ansatz aber irgendwie wird es schon klappen, zur not gebe ich halt den Urlaub wieder jeden Tag einzeln ein und mach mit den sachen weiter die ich alleine hinbekomme.
Trozdem Danke an alle!
Gruß Mirko
okrim - Di 04.03.14 22:36
Hallo Th69,
wollte mal fragen ob das mit dem DateTime.DayOfWeek so in der Art gemeint hast?
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| public Dictionary<DateTime, DayType> GetListOfDayTypes(DateTime dtBeginDate, DateTime dtEndDate) { Dictionary<DateTime, DayType> result = new Dictionary<DateTime, DayType>(); while (dtBeginDate <= dtEndDate) { if (dtBeginDate.DayOfWeek == DayOfWeek.Saturday || dtBeginDate.DayOfWeek == DayOfWeek.Sunday) result.Add(dtBeginDate, DayType.Weekend); else if (dtBeginDate.IsFeiertag()) result.Add(dtBeginDate, DayType.Holiday); else result.Add(dtBeginDate, DayType.WorkDay); dtBeginDate = dtBeginDate.AddDays(1); } return result; } |
nur mit der Methode IsFeiertag(DateTime)
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| public bool IsFeiertag(DateTime dtDate) { foreach (Feiertage feiertag in this._feiertagsMatrix[this._bundesLand]) { if (dtDate == GetFeiertagDatum(feiertag, dtDate.Year)) return( true ); } return (false); } |
komme ich nicht ganz klar, wie kann ich da IsFeiertag ersetzen?
Wäre nett wenn ihr mir nochmal einen Tipp geben könntet.
Gruß Mirko
Ralf Jansen - Mi 05.03.14 00:35
Zitat: |
komme ich nicht ganz klar, wie kann ich da IsFeiertag ersetzen? |
IsFeiertag ist die Methode eine Klasse der du deinen DateTime übergibst und einen Bool zurückbekommst.
Also die Klasse erzeugen die die Methode hat falls es noch keine Instanz dieser Klasse gibt und dann die Methode aufrufen.
Der Methode dann deinen dtBeginDate DateTime übergeben und den zurückgegeben Boolean prüfen.
Th69 - Mi 05.03.14 11:17
Hallo okrim,
sofern deine beiden geposteten Methoden innerhalb einer Klasse (dem Kalenderrechner) sind, einfach
C#-Quelltext
1: 2:
| else if (IsFeiertag(dtBeginDate)) result.Add(dtBeginDate, DayType.Holiday); |
so aufrufen.
Und ja, dein Code bzgl.
DayOfWeek ist richtig so (evtl. solltest du diese Abfrage in eine Methode - wie von Ralf vorgeschlagen - packen).
Ich nehme mal an, du bist mit der Syntax von
Erweiterungsmethoden (extension methods) [
http://msdn.microsoft.com/de-de/library/bb383977.aspx] nicht so vertraut (so wie Ralf die Methoden formuliert hat, z.B.
from.IsFeiertag()). Dies entspricht einfach dem Aufruf
IsFeiertag(from).
okrim - Do 06.03.14 18:29
Hallo Ralf,
hallo Th69,
ich danke auch erst mal recht Herzlich für eure Hilfe.
@ Th69
warum oder aus welchem Grund wäre es besser wenn ich die Abfrage vom Wochenende in eine Methode packe?
@ alle
dann habe ich das nächst Problem und zwar habe ich jetzt ja in der Klasse Kalenderrechner folgenden Code stehen
C#-Quelltext
1:
| public enum DayType { WorkDay, Weekend, Holiday } |
und
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| public Dictionary<DateTime, DayType> GetListOfDayTypes(DateTime dtBeginDate, DateTime dtEndDate) { Dictionary<DateTime, DayType> result = new Dictionary<DateTime, DayType>(); while (dtBeginDate <= dtEndDate) { if (dtBeginDate.DayOfWeek == DayOfWeek.Saturday || dtBeginDate.DayOfWeek == DayOfWeek.Sunday) result.Add(dtBeginDate, DayType.Weekend); else if (IsFeiertag(dtBeginDate)) result.Add(dtBeginDate, DayType.Holiday); else result.Add(dtBeginDate, DayType.WorkDay); dtBeginDate = dtBeginDate.AddDays(1); } return result; } |
und wie Ralf gesagt hat habe ich in Form1, da wo ich das ganze dann auch in meine Datenbank schreiben will den restlichen Code von Ralf
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| foreach (var tuple in GetListOfDayTypes(dtBeginDate, dtEndDate)) { switch (tuple.Value) { case DayType.WorkDay: break; case DayType.Weekend: break; case DayType.Holiday: break; default: break; } } |
nur erkennt das Form1 "GetListOfDayTypes" nicht da bekomme ich den Fehler "Der Name "GetListOfDayTypes" ist im aktuellen Kontext nicht vorhanden." muss ich dies noch von Kalenderrechner an Form1 übergeben?
Und wie ist das mit dem Enum sind da jetzt die Daten (z.B. Wochenende inkl. Datum) gespeichert?
Dank im voraus!!!
Gruß Mirko
Ralf Jansen - Do 06.03.14 18:38
Ohoh.
Das nützt glaube ich rein gar nix wenn wir dir jetzt sagen was du machen musst. Du tust es dann einfach verstehst nicht warum und fragst dann was als nächstes zu tun ist.
Wir haben dir hier ein paar Einzelteile hingeworfen damit du dich damit beschäftigst und darüber verstehst was notwendig ist.
Im Moment scheint dir jegliches Verständnis für die Struktur einer Anwendung zu fehlen. Was sind Klassen, was sind Methoden, wie ruft man die auf etc.
Am besten solltest du nochmal die Bücher rauskrammen und ein paar Grundlagen objektorientierter Programmierung nachlesen sonst wir das hier nicht mehr als ~Fernsteuerung~.
Christian S. - Do 06.03.14 19:51
Ralf hat es gut auf den Punkt gebracht. Daher schließe ich an dieser Stelle das Thema auch, das hat keinen Sinn.
Und außerdem hat das Thema schon lange nichts mehr mit dem zu tun, was im Titel steht bzw. in welcher Sparte es ist.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!