|
 |
 |
|
Tussen 2 datums weergeven
Laatste bericht 19 jan 2012 20:01 door Pierre Campe. 15 Antwoorden.
|
Sorterten:
|
| Auteur |
Berichten |
 |
Ferb
 Nieuw Posts:53
 |
| 02 dec 2011 19:03 |
|
Ik wil graag de gegevens uit een datagridview weergeven . Dit gaat goed , maar dan tussen 2 datums weergeven. bv tussen 01-01-2012 en 01-02-2012. Het is een access database , en met deze code haal ik het tevoorschijn. Dit is mijn kolom [datum] Imports System.Data Imports System.Data.OleDb Imports System.Data.Odbc Imports System.Data.DataTable Public Class Form1 Dim provider As String Dim dataFile As String Dim connString As String Dim myConnection As OleDbConnection = New OleDbConnection Dim ds As DataSet = New DataSet Dim da As OleDbDataAdapter Dim tables As DataTableCollection = ds.Tables Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source =" dataFile = "C:\som\Week.accdb" connString = provider & dataFile myConnection.ConnectionString = connString da = New OleDbDataAdapter("Select [plaats], [soort], [datum] from Tabel1", myConnection) da.Fill(ds, "Tabel1") ' replace "items" with the name of the table ' replace [Item Code], [Description], [Price] with the columns headers Dim view1 As New DataView(tables(0)) Dim source1 As New BindingSource() source1.DataSource = view1 DataGridView1.DataSource = view1 DataGridView1.Refresh() End Sub End Class
|
|
|
|
|
Arjan van Huizen
 Veteraan Posts:647

 |
| 02 dec 2011 19:25 |
|
Hallo, dat doe je door de Select aan te passen. Met de Select kies je dus welke data en uit welke table of tables dat moet komen. da = New OleDbDataAdapter("Select [plaats], [soort], [datum] from Tabel1", myConnection) wordt: da = New OleDbDataAdapter("Select [plaats], [soort], [datum] from Tabel1 WHERE [datum] >=#2011-12-01# AND [Datum] <=#2011-12-31#", myConnection) Op de plaats van de datum zul je in bijna alle gevallen een variabele willen schrijven die de gebruiker via bijvoorbeeld een kalender control ingeeft. Waarbij je dan eerst de start en einddatum velden gaat binden aan controls van je Form o.i.d. Dim startdatum as DateTime=Me.StartDatumCalendarControl.Value Dim einddatum as DateTime=Me.EindDatumCalendarControl.Value Daarna de variabelen in je SQL plaatsen. da = New OleDbDataAdapter("Select [plaats], [soort], [datum] from Tabel1 WHERE [datum] >=#" & startdatum & "# AND [Datum] <= #" & einddatum & "#", myConnection) Dit is op zich niet de best-practise overigens, want normaal maak je gebruik van OLEDB of SQLDB parameters waarbij je parameters meegeeft aan je SQL query. Dit heeft met een stukje leesbaarheid, onderhoudbaarheid maar ook veiligheid te maken. Maar daarover moet je misschien als je het bovenstaande stukje helemaal begrijpt, maar eens verder in verdiepen. Een zoekbegrip hierbij is ADO.NET PARAMETERS OLEDB of ACCESS i.p.v. OLEDB als je via Google gaat zoeken. Hoop dat je hier iets verder mee komt.
|
|
Groeten, Arjan
|
|
|
Ferb
 Nieuw Posts:53
 |
| 02 dec 2011 19:55 |
|
Ik zal er eens naar kijken , bedankt. Heb me laten vertellen dat het het makkelijkste is dat ik een SQL database maak. Meer mogelijkheden enz. In Visual studio 2010 kan ik wel een lokale database maken. Bij: Project add New item Local database kiezen Hij heet dan Database1.sdf Provider.NET Framework Data Provider for Microsoft SQL Server Compact 3.5 Als ik een lokale database maak , kan ik dat dan op elke pc gebruiken ? ook waar geen extra software op staat. Het wordt bijgevoegd bij mijn exe , zonder dat het op een server staat en alleen deze gebruiker maakt er gebruik van. |
|
|
|
|
Arjan van Huizen
 Veteraan Posts:647

 |
| 02 dec 2011 23:53 |
|
Hallo, niet helemaal waar dat het gemakkelijker is en dat je meer kan. Een sdf lijkt op een mini versie van een SQL server database en kan gewoon met je applicatie mee in de folder. Het is gewoon een binair bestand, zoals een Access database dat ook is. Het voordeel is dat het een klein bestand is, maar er kan wel minder mee dan een SQL server (Express) of Access database. Queries, Stored Procedures worden bijvoorbeeld niet ondersteund in een sdf bestand, in de andere twee wel. Maar goed, als je maar een paar Select statements e.d. moet doen en het is maar voor 1 gebruiker en is allemaal niet zo spannend qua belasting, snelheid, veiligheid etc. etc., dan kun je rustig gaan werken met een sdf database. De drivers (providers) die de database aanspreken worden gewoon meegeinstalleerd tijdens je setup op die PC van de gebruiker. |
|
Groeten, Arjan
|
|
|
Fred Bunt
 Senior Posts:757

 |
| 03 dec 2011 09:03 |
|
Hoi, ik ben op het moment ook een beetje aan het stoeien met SQL database, maar ben er wel achter gekomen dat voor mij een Queries een vereiste is. Als je niet kan linken, kom je niet ver, voor mijn idee. Lastig vind ik wel, dat op het moment dat je iets aan het bouwen bent voor meerdere personen, dat de lokatie waar de tabellen gezocht wordt, moeilijk te bepalen is van te voren. Je kunt niet standaard zeggen, binnen je programma, dat de tabellen op de D:/ schijf staan. Sommige computers hebben soms geen D:/ schijf. Een optie is, in de root van de C:/ schijf, maar op netwerkniveau, moet je dit sowieso niet willen. Ik vraag mij af, hoe je als programmeur dit kan oplossen, zodat ten alletjden de tabellen worden gevonden, waar ze ook staan, of moet je per computer dit apart regelen, lijk me niet handig |
|
| Ik lees nu Visual basic 2008 de basis (André Obelink) |
|
|
Ferb
 Nieuw Posts:53
 |
| 03 dec 2011 09:24 |
|
Ja dat is waar , ik denk dat ik het maar bij access hou en dan in de dir van mijn programma. Als ik deze code gebruik werkt het . da = New OleDbDataAdapter("Select [plaats], [soort], [datum] from Tabel1 WHERE [datum] >=#2011-12-01# AND [Datum] <=#2011-12-31#", myConnection) Dit heb ik geprobeerd te maken met Datetimepicker maar dat werkt niet ? Dim startdatum As DateTime = Me.DateTimePicker1.Value Dim einddatum As DateTime = Me.DateTimePicker2.Value da = New OleDbDataAdapter("Select [plaats], [soort], [datum] from Tabel1 WHERE [datum] >=#" & startdatum & "# AND [Datum] <= #" & einddatum & "#", myConnection)
|
|
|
|
|
Eric De Decker
 Supernova Posts:2250

 |
| 03 dec 2011 10:53 |
|
Me.DateTimePicker1.Value.ToString("yyyy/MM/dd")
|
|
Eric De Decker
|
|
|
Ferb
 Nieuw Posts:53
 |
| 03 dec 2011 13:16 |
|
Nee , die werkt niet goed. Hij geeft de eind datum wel goed , maar geeft ook alles voor de eerste datum. Dus alles tot de eind datum |
|
|
|
|
Arjan van Huizen
 Veteraan Posts:647

 |
| 03 dec 2011 13:35 |
|
Hoe ziet je code eruit? |
|
Groeten, Arjan
|
|
|
Ferb
 Nieuw Posts:53
 |
| 03 dec 2011 14:02 |
|
Dit heb in nu staan , voor DateTimePicker wat toch wel makkelijker is . Maar werkt niet optimaal Imports System.Data Imports System.Data.OleDb Imports System.Data.Odbc Imports System.Data.DataTable Public Class Form1 Dim provider As String Dim dataFile As String Dim connString As String Dim myConnection As OleDbConnection = New OleDbConnection Dim ds As DataSet = New DataSet Dim da As OleDbDataAdapter Dim tables As DataTableCollection = ds.Tables Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source =" dataFile = "C:\som\Week.accdb" connString = provider & dataFile myConnection.ConnectionString = connString Dim startdatum As DateTime = DateTimePicker1.Value.ToString("yyyy/MM/dd") Dim einddatum As DateTime = DateTimePicker2.Value.ToString("yyyy/MM/dd") da = New OleDbDataAdapter("Select [plaats], [soort], [datum] from Tabel1 WHERE [datum] >=#" & startdatum & "# AND [Datum] <= #" & einddatum & "#", myConnection) da.Fill(ds, "Tabel1") Dim view1 As New DataView(tables(0)) Dim source1 As New BindingSource() source1.DataSource = view1 DataGridView1.DataSource = view1 DataGridView1.Refresh() End Sub
|
|
|
|
|
Hugo Kornelis
 Advanced Posts:323

 |
| 03 dec 2011 19:04 |
|
Dim startdatum As DateTime = DateTimePicker1.Value.ToString("yyyy/MM/dd") Dim einddatum As DateTime = DateTimePicker2.Value.ToString("yyyy/MM/dd") Hier converteer je de datum expliciet naar string (in een opgegeven formaat), en direct daarna weer terug naar DateTime (omdat dat het type van de variabele is). Dit kán misgaan, als VB de datum bijvoorbeeld als yyyy/dd/mm interpreteert i.p.v. yyyy/mm/dd. da = New OleDbDataAdapter("Select [plaats], [soort], [datum] from Tabel1 WHERE [datum] >=#" & startdatum & "# AND [Datum] <= #" & einddatum & "#", myConnection) En hier converteer je de DateTime variabele impliciet naar string (voor de concatenatie), zonder invloed op het formaat - daar krijg je dus een of andere defaul voor. Dit kán misgaan als Access het default formaat van VB niet goed interpreteert. Maak óf de variabelen type string, óf zet de .ToString in de functie waar je de query opbouwt. Verder kan ik je weinig helpen; ik werk nooit met Access als database. |
|
Groetjes, Hugo Kornelis (SQL Server MVP) |
|
|
Eric De Decker
 Supernova Posts:2250

 |
| 03 dec 2011 19:30 |
|
Zoals Hugo ook al aangeeft moet je dit doen: Verander As DataTime in : Dim startdatum As String = DateTimePicker1.Value.ToString("yyyy/MM/dd") Dim einddatum As String = DateTimePicker2.Value.ToString("yyyy/MM/dd") Heb het getest en werkt (heb alleen bedenkingen over bepaalde Dim's die dan weeral niet gebruikt worden en/of verkeerd zijn,maar dit terzake)
|
|
Eric De Decker
|
|
|
Ton Trommelen
 Veteraan Posts:604

 |
| 04 dec 2011 16:03 |
|
Reactie op Fred, (eerder in deze thread) werken met een SQL database is best goed te doen. SQLCompact lijkt alleen bruikbaar voor lokaal gebruik door 1 persoon. Maar de gratis versie SQL2008Express kan best veel en is ook geschikt voor meerdere personen tegelijk. De plaats aangeven waar een en ander staat kan gemakkelijk via een ini-file, die dan ook door anderen (bv een systeembeheerder) makkelijk is te beheren. Als je daar de naam van de server en de naam van de database kunt inlezen ben je klaar. |
|
|
|
|
Fred Bunt
 Senior Posts:757

 |
| 04 dec 2011 17:17 |
|
Gepost door Ton Trommelen op 04 dec 2011 17:03 Reactie op Fred, (eerder in deze thread) werken met een SQL database is best goed te doen. SQLCompact lijkt alleen bruikbaar voor lokaal gebruik door 1 persoon. Maar de gratis versie SQL2008Express kan best veel en is ook geschikt voor meerdere personen tegelijk. De plaats aangeven waar een en ander staat kan gemakkelijk via een ini-file, die dan ook door anderen (bv een systeembeheerder) makkelijk is te beheren. Als je daar de naam van de server en de naam van de database kunt inlezen ben je klaar. Oké handig om te weten, ga hier vast in de toekomst gebruik van maken. Eerst mijn database redden  |
|
| Ik lees nu Visual basic 2008 de basis (André Obelink) |
|
|
Ferb
 Nieuw Posts:53
 |
| 04 dec 2011 19:24 |
|
Heb dit veranderd en het werkt inderdaad . Dim startdatum As String = DateTimePicker1.Value.ToString("yyyy/MM/dd") Dim einddatum As String = DateTimePicker2.Value.ToString("yyyy/MM/dd") mannen bedankt , is opgelost. Ik ga me toch wat meer in database verdiepen denk ik.
|
|
|
|
|
Pierre Campe
 Nieuw Posts:59
 |
| 19 jan 2012 20:01 |
|
@Ferb Ik heb het al dagen geleden gezien hoor, maar nu, nadat ik het draadje "Lege row's van datagridview verbergen" gezien heb, en het grid dat je daar plaatst, ben ik nu wel voor 99,9999% zeker dat er een nogal grote bug in je sql zit hoor uitleg: een datum veld in access is van het datetime datatype, en zal dus behalve een datum ook een tijd bevatten als je nu een aantal records wil selekteren tussen 2 datums, en je formatteerd die datums als "yyyy/MM/dd" dan zal de eventuele tijd informatie verloren gaan, en kan je verkeerde info terugkrijgen vb: da = New OleDbDataAdapter("Select [plaats], [soort], [datum] from Tabel1 WHERE [datum] >=#" & startdatum & "# AND [Datum] <= #" & einddatum & "#", myConnection) voor startdatum zal dat geen probleem zijn hoor, maar voor einddatum zal je niets terugkrijgen, als dat datum veld, buiten een datum,ook een tijd bevat en een datum veld in access bevat ALTIJD een datum EN een tijd maar als het juist middernacht is,dus tijd=0 uur,0 minuten,0 seconden zal je voor einddatum dus WEL records terugkrijgen om het wat te verduidelijken: als einddatum bv 2012/01/19 is dan zal <= #" & einddatum & "#" evalueren naar:<= #" & 2012/01/19 00.00.00 & "#" als er dus een record is dat juist om middernacht aangemaakt is zul je dat terug krijgen, en alle andere die dezelfde datum hebben zal je niet terugkrijgen nog even iets over het "Lege row's van datagridview verbergen" draadje: als je in een grid,dat gevuld is door data uit een database,lege rijen krijgt,of meerdere lege kolommen,is dat gewoonlijk een duidelijk teken dat je tabellen niet of niet goed genormaliseerd zijn, heb je de tabellen wel genormaliseerd ? |
|
|
|
|
| U bent niet geautoriseerd om een antwoord te posten |
|
|
 |
|
|
|
|
 |
|
|