Ik ben bezig met een urenregistratie systeempje.
Verschillende mensen kunnen op urencodes schrijven. Elke urencode heeft een maximaal aantal beschikbare uren. Voordat de uren opgeslagen kunnen worden moet eerst gecontroleerd worden of er nog wel voldoende uren beschikbaar zijn.
Ik gebruik C# met een MS-SQL2005 database in VS2008. Ik heb drie relevante tabellen:
Op mijn form moet eerst de medewerker worden geselecteerd uit een combobox. Deze combobox wordt gevuld met de Naam en ID uit de medwerkers tabel. Het ID wordt in uren opgeslagen.
Uit de combobox codes moet de juiste code worden geselecteerd. Deze combobox krijgt zijn data via een opgeslagen view die de unieke codes uit de codes tabel haalt.
Op de SelectionChangeCommitted event van deze combobox worden de overige gegevens uit de codes tabel gehaald via dezelfde view. Deze gegevens zoals start en einddatum, de beschikbare en de geboekte uren worden als labels op het form getoond.
Vervolgens worden de uren ingevuld en wordt er gecontroleerd of het aantal geboekte uren plus de nieuwe uren niet meer zijn dan de beschikbare uren.
Indien dit allemaal OK is, wordt de save knop enabled en kan het record worden opgeslagen.
Dit werkt allemaal prima, alleen worden de geboekte uren wel in de database ververst, maar niet in de dataset, zodat als je opnieuw dezelfde urencode selecteert de geboekte uren de oude waarden hebben en men dus gewoon door kan blijven boeken, ook al zijn de uren opgebruikt.
Als het form wordt gesloten en weer wordt geopend zijn de uren wel geupdate.
Waarschijnlijk moet ik een keer extra de gegevens uit de tabel ophalen, maar ik kom er niet uit hoe en waar.
Eerst maar eens wat code.
Overigens heb ik het form gemaakt door de velden te slepen uit de dataset.
Het probleem zit in de update.
Als ik this.vw_uniekeCodesTableAdapter.Fill(this.dataSet.vw_uniekeCodes); doe, dan worden de updates ineens niet goed naar de database gestuurd.
Dan wordt elke keer de eerste urencode uit de combobox verstuurd, ipv de geselecteerde. Maar dat geldt dan weer niet voor de laatste.
Dus als ik meerdere records toevoeg zonder het form te sluiten dan hebben alle records als urencode 14594 (de eerste in de combobx) behalve de laatst toegevoegde. Bij het sluiten van het form gaat het dan wel goed. Maar ik heb geen specifieke code daarvoor gemaakt.
Heeft iemand een idee, waar ik fout zit?
Verschillende mensen kunnen op urencodes schrijven. Elke urencode heeft een maximaal aantal beschikbare uren. Voordat de uren opgeslagen kunnen worden moet eerst gecontroleerd worden of er nog wel voldoende uren beschikbaar zijn.
Ik gebruik C# met een MS-SQL2005 database in VS2008. Ik heb drie relevante tabellen:
- uren
- codes
- medewerkers
Op mijn form moet eerst de medewerker worden geselecteerd uit een combobox. Deze combobox wordt gevuld met de Naam en ID uit de medwerkers tabel. Het ID wordt in uren opgeslagen.
Uit de combobox codes moet de juiste code worden geselecteerd. Deze combobox krijgt zijn data via een opgeslagen view die de unieke codes uit de codes tabel haalt.
Op de SelectionChangeCommitted event van deze combobox worden de overige gegevens uit de codes tabel gehaald via dezelfde view. Deze gegevens zoals start en einddatum, de beschikbare en de geboekte uren worden als labels op het form getoond.
Vervolgens worden de uren ingevuld en wordt er gecontroleerd of het aantal geboekte uren plus de nieuwe uren niet meer zijn dan de beschikbare uren.
Indien dit allemaal OK is, wordt de save knop enabled en kan het record worden opgeslagen.
Dit werkt allemaal prima, alleen worden de geboekte uren wel in de database ververst, maar niet in de dataset, zodat als je opnieuw dezelfde urencode selecteert de geboekte uren de oude waarden hebben en men dus gewoon door kan blijven boeken, ook al zijn de uren opgebruikt.
Als het form wordt gesloten en weer wordt geopend zijn de uren wel geupdate.
Waarschijnlijk moet ik een keer extra de gegevens uit de tabel ophalen, maar ik kom er niet uit hoe en waar.
Eerst maar eens wat code.
Overigens heb ik het form gemaakt door de velden te slepen uit de dataset.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| private void Dagboekje_Load(object sender, EventArgs e) { // Vullen unieke codes: this.vw_uniekeCodesTableAdapter.Fill(this.dataSet.vw_uniekeCodes); // Vullen medewerkers: this.medewerkersTableAdapter.Fill(this.dataSet.Medewerkers); this.urenBindingSource.AddNew(); } private void CodesComboBox_SelectionChangeCommitted(object sender, EventArgs e) { // Ophalen gegevens obv geselecteerde urencode: DataRow[] row = this.dataSet.vw_uniekeCodes.Select("Irisnr = " + irisnr); } private void BtnSaveRecord_Click(object sender, EventArgs e) { this.urenBindingSource.EndEdit(); this.tableAdapterManager.UpdateAll(this.urenDataSet) // Hier moet waarschijnlijk een soort van update komen, // deze optie geeft weer andere problemen: // this.vw_uniekeCodesTableAdapter.Fill(this.dataSet.vw_uniekeCodes); } |
Het probleem zit in de update.
Als ik this.vw_uniekeCodesTableAdapter.Fill(this.dataSet.vw_uniekeCodes); doe, dan worden de updates ineens niet goed naar de database gestuurd.
Dan wordt elke keer de eerste urencode uit de combobox verstuurd, ipv de geselecteerde. Maar dat geldt dan weer niet voor de laatste.
Dus als ik meerdere records toevoeg zonder het form te sluiten dan hebben alle records als urencode 14594 (de eerste in de combobx) behalve de laatst toegevoegde. Bij het sluiten van het form gaat het dan wel goed. Maar ik heb geen specifieke code daarvoor gemaakt.
Heeft iemand een idee, waar ik fout zit?