Sinds ik bezig ben met een .mdb database aan VB6 te hangen heb ik problemen met de volgorde waarin de data in de database gezet wordt.
Ik stuur de volgende code aan via een timer van 10 seconden. Deze kijkt of een database met de naam van die dag nog niet bestaat, waarna die aangemaakt wordt indien nodig, om er vervolgens een entry in te zetten. Deze entries bestaan uit een een datum + tijd in de eerste kolom, en vervolgens 18 keer een setpoint + temperatuur.
Dat levert de volgende database op:
klikbaar
De kolommen van de temperaturen zijn nog even leeg, omdat de juiste hardware nog niet aan de computer hangt, dus zet ie null erin. Geen probleem daar.
Wel een probleem in de volgorde van de tijden. Van boven naar beneden eerst 00:01:50 t/m 00:05:20, vervolgens 00:00:00 t/m 00:01:40 en dan weer verder met 00:05:30. Daarna doet ie alles in de juiste volgorde tot middernacht.
Errug vaag, dus ik ben even aan het spelen gegaan met de volgende resultaten:
Ik wil afsluiten met twee vragen: Wat gebeurt hier en hoe los ik het op?
Ik stuur de volgende code aan via een timer van 10 seconden. Deze kijkt of een database met de naam van die dag nog niet bestaat, waarna die aangemaakt wordt indien nodig, om er vervolgens een entry in te zetten. Deze entries bestaan uit een een datum + tijd in de eerste kolom, en vervolgens 18 keer een setpoint + temperatuur.
Visual Basic:
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
40
41
42
43
44
45
46
47
48
49
50
| Private Function SaveInDatabase() On Error GoTo DatabaseWriteError Dim FileSystem As FileSystemObject Set FileSystem = New FileSystemObject Dim db As Database, FileName As String, n As Byte, rstRecordset As Recordset FileName = ResultFolderStr & "\" & Format(Now, "yymmdd") & ".mdb" ' create filename If (Not FileSystem.FileExists(FileName)) Then ' if database doesn't exists On Error GoTo DatabaseCreateError Set db = DBEngine(0).CreateDatabase(FileName, dbLangGeneral, dbVersion30) ' create the database Dim TblDef As TableDef Set TblDef = db.CreateTableDef("Data") 'create table TblDef.Fields.Append TblDef.CreateField("time", dbText, 22) For n = 1 To 18 TblDef.Fields.Append TblDef.CreateField("adr" & CStr(n) & "_sp", dbSingle) ' setpoints TblDef.Fields.Append TblDef.CreateField("adr" & CStr(n), dbSingle) ' temperatures Next db.TableDefs.Append TblDef ' append to database End If Set db = DBEngine.Workspaces(0).OpenDatabase(FileName) Set rstRecordset = db.OpenRecordset("SELECT * FROM Data", dbOpenDynaset) rstRecordset.AddNew rstRecordset.Fields("time") = Format(Now, "dd-mm-yyyy hh:mm:ss") ' date + time For n = 1 To 18 rstRecordset.Fields("adr" & CStr(n) & "_sp") = Round(Setpoint(n), 1) ' setpoint If (Temperature(n) > -10000) Then ' < -10000 = no data rstRecordset.Fields("adr" & CStr(n)) = Round(Temperature(n), 1) ' temperature Else rstRecordset.Fields("adr" & CStr(n)) = Null End If Next rstRecordset.Update ' update to database Exit Function DatabaseWriteError: Call SaveLogEvent(TLdatabase, 0, TLwriteerror, TLnotemp, "", "Could not write to database, results not saved - error in " & Err.Source & " - " & Err.Description & " (" & Err.Number & ")") Exit Function DatabaseCreateError: Call SaveLogEvent(TLdatabase, 0, TLwriteerror, TLnotemp, "", "Could not create database, results not saved - error in " & Err.Source & " - " & Err.Description & " (" & Err.Number & ")") End Function |
Dat levert de volgende database op:

De kolommen van de temperaturen zijn nog even leeg, omdat de juiste hardware nog niet aan de computer hangt, dus zet ie null erin. Geen probleem daar.
Wel een probleem in de volgorde van de tijden. Van boven naar beneden eerst 00:01:50 t/m 00:05:20, vervolgens 00:00:00 t/m 00:01:40 en dan weer verder met 00:05:30. Daarna doet ie alles in de juiste volgorde tot middernacht.
Errug vaag, dus ik ben even aan het spelen gegaan met de volgende resultaten:
- De fout is reproduceerbaar op meerdere computers op alle mogelijke tijden door de windows klok aan te passen naar middernacht.
- Het maakt niet uit of ik het VB project run, of de uiteindelijke .exe.
- Ik kan de fout beinvloeden door de namen van de kolommen te veranderen. Ik zat eerst op 9 minuten verkeerd met de kolomnamen block_01_sp en dergelijke, dat heb ik teruggekregen naar ongeveer 5 minuten met de huidige kolomnamen.
- Het is geen timing probleem. Ik heb handmatig een sloot kopieen van de database file gemaakt op het moment dat de eerste 50 entries erin werden gezet, en ik zie dat 00:00:00 er als eerste in wordt gezet. Alle entries tot 00:01:40 worden netjes eronder gezet. De entry van 00:01:50 wordt opeens bovenaan gezet, met alles t/m 00:05:20 daaronder. Vanaf 00:05:30 worden alle entries weer helemaal onderaan toegevoegd.
Ik wil afsluiten met twee vragen: Wat gebeurt hier en hoe los ik het op?