Registreren  Inloggen
vrijdag 18 mei 2012
Forums » Database » Access » Tussen 2 datums weergeven  
VBCentral Forums
Tussen 2 datums weergeven
Laatste bericht 19 jan 2012 20:01 door Pierre Campe. 15 Antwoorden.
Printervriendelijk
  •  
  •  
  •  
  •  
  •  
Sorterten:
VorigeVorige VolgendeVolgende
U bent niet geautoriseerd om een antwoord te posten
Auteur Berichten Opgelost
FerbGebruiker is offline
Nieuw
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 HuizenGebruiker is offline
    Veteraan
    Veteraan
    Posts:647
    Avatar

    --
    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

    FerbGebruiker is offline
    Nieuw
    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 HuizenGebruiker is offline
    Veteraan
    Veteraan
    Posts:647
    Avatar

    --
    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 BuntGebruiker is offline
    Senior
    Senior
    Posts:757
    Avatar

    --
    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)
    FerbGebruiker is offline
    Nieuw
    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 DeckerGebruiker is offline
    Supernova
    Supernova
    Posts:2250
    Avatar

    --
    03 dec 2011 10:53
    Me.DateTimePicker1.Value.ToString("yyyy/MM/dd")

    Eric De Decker
    FerbGebruiker is offline
    Nieuw
    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 HuizenGebruiker is offline
    Veteraan
    Veteraan
    Posts:647
    Avatar

    --
    03 dec 2011 13:35
    Hoe ziet je code eruit?
    Groeten,
    Arjan

    FerbGebruiker is offline
    Nieuw
    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 KornelisGebruiker is offline
    Advanced
    Advanced
    Posts:323
    Avatar

    --
    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 DeckerGebruiker is offline
    Supernova
    Supernova
    Posts:2250
    Avatar

    --
    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 TrommelenGebruiker is offline
    Veteraan
    Veteraan
    Posts:604
    Avatar

    --
    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 BuntGebruiker is offline
    Senior
    Senior
    Posts:757
    Avatar

    --
    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)
    FerbGebruiker is offline
    Nieuw
    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 CampeGebruiker is offline
    Nieuw
    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


    Sponsors

    TechDays 2012

    Volg ons via TwitterVolg ons op LinkedIN    Volg ons op LinkedIN    Volg ons via de RSS feed
    Copyright 2005-2012 VBcentral.nl   |  Privacybeleid  |  Gebruiksovereenkomst