NL Computer Forum
Maak het zelf => Programmeren => Topic gestart door: jvdpeet † op 8 augustus 2010, 10:55:35
-
Hallo,
Ik gebruik in een programma 2 databound grids. De ene werkt perfect, toont de inhoud van de beteffende Database tabel, accepteert invoer en update de database daarmee, m.a.w., doet alles wat hij doen moet.
De andere laat de rijen en kolommen met de kolomheaders zien, toont de cursor in de eerste rij, eerste kolom, maar als je gegevens probeert in te voeren gebeurt er niets.
Vergelijken van de eigenschappen etc. tussen beide laat geen verschillen zien: alles is in beide aanwezig. Ik begrjp dan ook niet waarom de ene het wel doet en de andere niet. Ik heb het idee dat ik wat simpels over het hoofd zie, maar heb geen idee wat. Heeft iemand een idee? De tabel bevat wel degelijk gegevens.
-
Hoi Jan,
Staan beide DBGrid's op hetzelfde formulier?
Je hebt geen extra code toegevoegd mbt tot een vullen/bewerken/waren van de DBGrid, wat je niet meegenomen hebt naar het niet-werkende grid?
Peter
-
Hoi Peter,
Beide grids staan niet op hetzelfde formulier. De code van het niet-werkende grid is in wezen hetzelfde als van het werkende grid, uiteraard met verschillende DBGrid-naam en naam van de DataSource en de data control en ook een ander formulier. Alle Allow-eigenschappen staan op True.
Volgens alle mij bekende beschrijvingen zou het niet-werkende grid het moeten doen en dus alle gegevens uit de database moeten tonen en alle veranderingen daarin via het grid onmiddellijk in de database moete updaten. Althans zo doet het werkende grid het.
-
Jan,
Dus je kan wel iets invoeren, maar het wordt niet bewaard?
Dat houdt in dat de database koppeling niet goed is. De naam van de controls mogen in principe hetzelfde zijn als van het werkende grid. Ze staan immers op een apart formulier en hebben geeen koppeling met het wel werkende DBGrid.
Heb je toevallig de DBGrid gekopieerd en dus ook wat instellingen onbewust overgenomen waardoor het niet werkende DBGrid verwijst naar het origineel?
Gooi dat DBgrid eens weg en begin met een nieuw DBGrid.
Zonder code is het lastig zoeken.
groeten, Peter
-
Peter,
Nee, ik kan niets invoeren. Het grid accepteert geen invoer: er gebeurt niets. Hier is de code. Het bestand verzenden lukt niet. Bij verzenden wordt er .log achter geplakt als extra extensie en daar kom ik niet omheen. Vandaar de code in de tekst. Sorry.
Hier is de code die gebruikt wordt:
Dim DividendenMatrix()
Private Sub Command1_Click()
' Opvragen dividendgegevens.
If Aanroep2 = "Followup opties" Then
' WijzigenDividenden ' Activeren wanneer gebruikt bij opties.
Else
datDividenden.Recordset.Edit
datDividenden.Recordset.Update
DBGrid2.SetFocus
End If
End Sub
Private Sub Command10_Click()
Call AfdrukkenDividenden(DividendenMatrix(), Teller, TotaalContantDividend, TotaalStockDividendGeld, TotaalStockDividendAantal, TotaalKostenDividend, TotaalDividendBelasting)
End Sub
Private Sub Command2_Click()
' Opslaan in database
On Error GoTo FoutVerwijder
datDividenden.Recordset.Delete
datDividenden.Recordset.MoveNext
' Als het laatste record werd verwijderd, ga naar het vorige record (welke nu het laatste record is).
If datDividenden.Recordset.EOF = True Then
datDividenden.Recordset.MovePrevious
End If
DBGrid2.SetFocus
Exit Sub
FoutVerwijder:
Foutbron = Err.Number & " " & Err.Description & " in Verwijder"
Call frmInvestor.WriteLOG("---< " & App.Title & " geeft >---" & Foutbron)
Resume Next
End Sub
Private Sub Command3_Click()
' Ga naar het laatste record zodat de rij Voeg toe zichtbaar wordt.
datDividenden.Recordset.MoveLast
' Verplaats de cursor naar rij Voeg toe.
DBGrid2.row = DBGrid2.row + 1
DBGrid2.SetFocus
End Sub
Private Sub Command4_Click()
' Eerste dividendregel
datDividenden.Recordset.MoveFirst
DBGrid2.SetFocus
End Sub
Private Sub Command5_Click()
' Volgende dividendregel.
datDividenden.Recordset.MoveNext
' Houd het current record weg van EOF, wat geen geldige positie is.
If datDividenden.Recordset.EOF = True Then
datDividenden.Recordset.MovePrevious
End If
DBGrid2.SetFocus
End Sub
Private Sub Command6_Click()
' Vorige dividendregel
datDividenden.Recordset.MovePrevious
' Houd het current record weg van BOF, wat geen geldige positie is.
If datDividenden.Recordset.BOF = True Then
datDividenden.Recordset.MoveNext
End If
DBGrid2.SetFocus
End Sub
Private Sub Command7_Click()
datDividende.Recordset.MoveLast
DBGrid2.SetFocus
End Sub
Public Sub AnalyseDividenden()
Dim Teller As Integer
ReDim DividendenMatrix(1000, 22)
Dim TotaalContantDividend, TotaalStockDividendGeld, TotaalStockDividendAantal, TotaalKostenDividend, TotaalDividendBelasting
Teller = 1
datDividenden.Recordset.MoveFirst
Do While datDividenden.Recordset.EOF = False
If datDividenden.Recordset("ContantDividend") > 0 Or datDividenden.Recordset("StockDividendGeld") <> 0 Or datDividenden.Recordset("StockDividendAantal") <> 0 Then
DividendenMatrix(Teller, 1) = datDividenden.Recordset("Symbool")
If IsNull(datDividenden.Recordset("NaamAandeel")) Then
datDividenden.Recordset.Edit
datDividenden.Recordset("NaamAandeel") = datDividenden.Recordset("Symbool ")
datDividenden.Recordset.Update
End If
DividendenMatrix(Teller, 2) = datDividenden.Recordset("NaamAandeel")
DividendenMatrix(Teller, 3) = datDividenden.Recordset("ContantDividend")
DividendenMatrix(Teller, 4) = datDividenden.Recordset("StockDividendGeld")
DividendenMatrix(Teller, 5) = datDividenden.Recordset("StockDividendAantal")
DividendenMatrix(Teller, 6) = datDividenden.Recordset("DatumContantDividend")
DividendenMatrix(Teller, 7) = datDividenden.Recordset("DatumStockDividendAantal")
DividendenMatrix(Teller, 8) = datDividenden.Recordset("DatumStockDividendGeld")
DividendenMatrix(Teller, 9) = datDividenden.Recordset("KostenDividend")
DividendenMatrix(Teller, 10) = datDividenden.Recordset("Dividendbelasting")
Teller = Teller + 1
datDividenden.Recordset.MoveNext
Else
datDividenden.Recordset.MoveNext
End If
Loop
Teller = Teller - 1
' Nulstellen van Null-items
For i = 1 To Teller
For j = 1 To 21
If IsNull(DividendenMatrix(i, j)) Then
DividendenMatrix(i, j) = 0
End If
Next j
Next i
' Totaliseren van contant dividend, stockdividend in aantal en stockdividend in geld.
For i = 1 To Teller
TotaalContantDividend = TotaalContantDividend + DividendenMatrix(i, 3)
TotaalStockDividendAantal = TotaalStockDividendAantal + DividendenMatrix(i, 4)
TotaalStockDividendGeld = TotaalStockDividendGeld + DividendenMatrix(i, 5)
TotaalKostenDividend = TotaalKostenDividend + DividendenMatrix(i, 9)
TotaalDividendBelasting = TotaalDividendBelasting + DividendenMatrix(i, 10)
Next i
End Sub
Private Sub Command8_Click()
' Sluiten van scherm Invoeren dividenden
frmOntvangenDividenden.Hide
End Sub
Public Sub AfdrukkenDividenden(DividendenMatrix(), Teller, TotaalContantDividend, TotaalStockDividendAantal, TotaalStockDividendGeld, TotaalKostenDividend, TotaalDividendBelasting)
Printer.Orientation = 2
Printer.FontName = "Courier New"
Printer.FontSize = 8
TotaalDividend = TotaalContantDividend + TotaalStockDividend + TotaalStockDividendGeld - TotaalKostenDividend - TotaalDividendBelasting
frmInvestor.ResultsT.Text = frmInvestor.ResultsT.Text & "Naam Fonds" & Space(3) & "Contant" & Space(2) & "Stockdivi-" & Space(2) & "Stockdivi-" & Space(4) & "Kosten" & Space(2) & "Dividendbe-" & Space(2) & vbCrLf
frmInvestor.ResultsT.Text = frmInvestor.ResultsT.Text & Space(13) & "Dividend" & Space(2) & "dend geld" & Space(2) & "dend aantal" & Space(3) & "Dividend" & Space(1) & "lasting" & vbCrLf
For i = 1 To Teller
frmInvestor.ResultsT.Text = frmInvestor.ResultsT.Text & DividendenMatrix(i, 2) & Space(10 - Len(DividendenMatrix(i, 2))) & Format((Format((DividendenMatrix(i, 3)), "#0.00")), "@@@@@@@@@") & Space(1) & Format(Format(DividendenMatrix(i, 4), "#0.00"), "@@@@@@@@") & Space(3) & Format(Format(DividendenMatrix(i, 5), "#0"), "@@@@@@@@") & Space(6) & Format(Format(DividendenMatrix(i, 9), "#0.00"), "@@@@@@@@") & Space(1) & Format(Format(DividendenMatrix(i, 10), "#0.00"), "@@@@@@@@") & vbCrLf
Next i
frmInvestor.ResultsT.Text = frmInvestor.ResultsT.Text & vbCrLf
frmInvestor.ResultsT.Text = frmInvestor.ResultsT.Text & "Totaal contant dividend" & Space(32 - Len("Totaal contant dividend")) & Format(Format(TotaalContantDividend, "#0.00"), "@@@@@@@@") & vbCrLf
frmInvestor.ResultsT.Text = frmInvestor.ResultsT.Text & "Totaal stockdividend geld" & Space(32 - Len("Totaal stockdividend geld")) & Format(Format(TotaalStockDividendGeld, "#0.00"), "@@@@@@@@") & vbCrLf
frmInvestor.ResultsT.Text = frmInvestor.ResultsT.Text & "Totaal stock dividend aantal" & Space(32 - Len("Totaal stockdividend aantal")) & Format(Format(TotaalStockDividendAantal, "#0"), "@@@@@@@@") & vbCrLf
frmInvestor.ResultsT.Text = frmInvestor.ResultsT.Text & "Totaal kosten dividend" & Space(32 - Len("Totaal kosten dividend")) & Format(Format(TotaalKostenDividend, "#0.00"), "@@@@@@@@") & vbCrLf
frmInvestor.ResultsT.Text = frmInvestor.ResultsT.Text & "Totaal dividendbelasting" & Space(32 - Len("Totaal dividendbelasting")) & Format(Format(TotaalDividendBelasting, "#0.00"), "@@@@@@@@") & vbCrLf
frmInvestor.ResultsT.Text = frmInvestor.ResultsT.Text & "Totaal dividend" & Space(32 - Len("Totaal dividend")) & Format(Format(TotaalDividend, "#0.00"), "@@@@@@@@") & vbCrLf
End Sub
Private Sub Command9_Click()
AnalyseDividenden
End Sub
Private Sub Form_Load()
datDividenden.DatabaseName = frmInvestor.ext(App.Path) & "DATABASE\Portef1.mdb"
datDividenden.RecordSource = "DividendenTab"
datDividenden.Visible = False
End Sub
-
Jan,
datDividenden.RecordSource = "DividendenTab"
Weet je zeker dat dit klopt?
Is deze property ingesteld: DbGrid2.DataSource = datDividenden
Peter
-
Hoi Peter,
Ja, ik weet absoluut zeker dat deze instelling is aangebracht. Ik heb het voor de zekerheid nogmaals gecontroleerd. Juist omdat dit klopt begrijp ik niet dat hij het niet doet.
-
Hoi Jan,
Juist omdat dit klopt begrijp ik niet dat hij het niet doet.
Dat begrijp ik dan ook niet.
Dan moet de huidige database toch ingelezen en getoond worden.
Door de property datDividenden.ReadOnly op True te zetten is de database alleen te lezen en niet te bewerken. Standaard staat die op False.
Vul eens de absolute mapnaam in de Form_Load() event.
Wat ik gedaan heb is een nieuw formulier gemaakt met daarin een standaard Data en DBGrid control.
Link in de IDE het DBGrid control aan het Data control middels DBGrid1.DataSource = Data1
De enige code die uitgevoerd wordt is de Form_Load event zoals je gegeven hebt:
Private Sub Form_Load()
Data1.DatabaseName = frmInvestor.ext(App.Path) & "DATABASE\Portef1.mdb"
Data1.RecordSource = "DividendenTab"
End Sub
Kun je eens hetzelfde doen. Dan zou het toch moeten werken.
groeten, Peter
-
Hoi Peter,
Er komt iets meer duidelijkheid in de zaak. Ik heb net als jij de oude frmOntvangenDividenden
uit het project verwijderd en er een nieuw formulier aan toegevoegd met daarin de data control datDividenden en DBGrid2 (2 omdat in mijn project 1 al in gebruik is) + in de Form_Load de DatabaseName en de RecordSource. Op jouw code DBGrid2.DataSource = datDividenden krijg ik een fout "identifier required. No compatible data source was found for this control. Add MS ADO Data Control to your project" met als toelichting "Je krijgt deze fout als je probeert een nieuw complex bound control te binden aan een oude data source of vice versa."
Ik heb toen in Project/Components Microsoft ADO Data Control 6.0 aangevinkt en het programma-onderdeel opnieuw gedraaid, maar het probleem was niet opgelost. Ik dacht dat ik deze data control al eerder aangevinkt had, te meer daar DBGrid1 van Portefeuille geen fout gaf. Maar misschien moet er eerst opnieuw opgestart worden, wat ik nu ga doen en kom dan hier terug.
-
Peter,
Ik heb het project gesaved en de computer opnieuw opgestart, maar hij blijft vragen om MS ADO datacontrol of MS Data Environment toe te voegen, maar deze staan aangevinkt, dus zijn al aanwezig. Hoe nu verder?
-
Jan,
data control datDividenden en DBGrid2 (2 omdat in mijn project 1 al in gebruik is)
Als DBGrid1 alleen binnen het hoofdformulier bekend is, mag elk ander formulier ook gewoon een DBGrid1 control bevatten.
Dus, frmA.DBGrid1 en frmB.DBGrid1 is geen enkel probleem.
Dat geldt voor alle soorten controls trouwens.
Op jouw code DBGrid2.DataSource = datDividenden krijg ik een fout
Vreemd. Waarom werkt het dan wel op je andere formulier en kreeg je deze fout niet eerder?
Bijgevoegd 2 plaatsjes van de VB6 IDE zoals ik dat hier heb voor jouw project-test.
(http://www.nlcomputerforum.nl/index.php?action=dlattach;topic=1939.0;attach=1039)
(http://www.nlcomputerforum.nl/index.php?action=dlattach;topic=1939.0;attach=1041)
Peter
-
Hoi Peter,
Ik had deze instellingen al op één na, ik had OLE Automation nog niet, maar nu wel. Maar hij doet het nog steeds niet. Het gekke is echter dat ik, ondanks dat ik die niet zelf handmatig ingesteld heb, alle velden met naam in het grid heb. Dit betekent dus dat er wel verbinding met de database is, want daar zullen ze aan ontleend zijn. Alleen het invoeren van gegevens lukt niet, ondanks dat het geen read-only is.
-
Hoi Jan,
De database heb je toevallig niet al ergens anders in Exclusive mode geopend?
Kun je wel met de muis of pijltjestoetsen velden selecteren in het DBGrid ?
Controleer deze properties:
With DBGrid2
.AllowUpdate = True
.DataMode = 0 - Bound
.DataSource = datDividenden
.Enabled = True
End With
With datDividenden
.Connect = Access 2000;
.DefaultType = 2 - UseJet
.Enabled = True
.Exclusive = False
.Options = 0
.ReadOnly = False
.RecordsetType = 1 - Dynaset
End With
Als bovenstaande geen verbetering geeft, open dan eens de projectfile (het .VBP bestand) met Notepad. Post alle regels die beginnen met "Reference=" en "Object="
Peter
-
Hoi Peter,
Ik heb de database niet ergens anders in Exclusive mode geopend. Ik kan wel met de muis en met de pijltjestoetsen van het ene naar het andere vakje gaan, maar als ik iets typ gebeurt er niets. Alle properties die je opgaf zijn correct. Daarom hier de .vbp-regels met "Reference = " en "Object = ".
Reference=*\G{ECDCAED1-6F9C-11D0-B4D0-00A0C911E8B6}#1.0#0#E:\vb5\visdata.exe#VisData Database Utility
Reference=*\G{BE83C60B-9BCA-41FD-9972-CEC06B92E3E9}#2d.0#0#C:\WINDOWS\system32\HoadleyCBOE.dll#HoadleyCBOE
Reference=*\G{124FFB65-E4DB-11D5-89B6-444553540000}#421.0#0#C:\WINDOWS\system32\HoadleyOptionsAddin.dll#HoadleyOptionsAddin
Reference=*\G{00025E01-0000-0000-C000-000000000046}#5.0#0#C:\Program Files\Common Files\Microsoft Shared\DAO\dao360.dll#Microsoft DAO 3.6 Object Library
Reference=*\G{976092BA-719D-4A0F-B088-075933FFA852}#1.0#0#..\..\..\EViews7\EViewsMgr.dll#EViews 1.0 Type Library
Reference=*\G{27796B34-A6F1-4203-895D-EFA9AF2FEF29}#1.0#0#..\..\..\EViews7\EViewsOleDbProvider.dll#EViewsOleDbProvider 1.0 Type Library
Reference=*\G{2A75196C-D9EB-4129-B803-931327F72D5C}#2.8#0#C:\Program Files\Common Files\system\ado\msado15.dll#Microsoft ActiveX Data Objects 2.8 Library
Reference=*\G{C0E45030-5775-11D0-B388-00A0C9055D8E}#1.0#0#C:\Program Files\Common Files\designer\MSDE.DLL#Microsoft Data Environment 1.0
Reference=*\G{B257B8C0-84F6-11D0-B3B0-00A0C9055D8E}#1.0#0#C:\Program Files\Common Files\designer\DEEXT.TLB#Microsoft Data Environment Extensibility Objects 1.0
Object={00025600-0000-0000-C000-000000000046}#5.2#0; Crystl32.OCX
Object={5E9E78A0-531B-11CF-91F6-C2863C385E30}#1.0#0; MSFLXGRD.OCX
Object={F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0; comdlg32.ocx
Object={97304F10-8DA9-11D1-8C48-0080C83EC00F}#1.0#0; graphdtc.ocx
Object={2601F9E0-5409-11D5-89B6-0050DAC5F536}#3.2#0; HoadleyCalendar.ocx
Object={E2D94FA3-F1C9-11D4-B10C-00508B128EF5}#1.0#0; OptiGA.ocx
Object={827E9F53-96A4-11CF-823E-000021570103}#1.0#0; graphs32.ocx
Object={CDE57A40-8B86-11D0-B3C6-00A0C90AEA82}#1.0#0; MSDatGrd.ocx
Object={00028C01-0000-0000-0000-000000000046}#1.0#0; DBGRID32.OCX
Object={831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.0#0; mscomctl.OCX
Object={86CF1D34-0C5F-11D2-A9FC-0000F8754DA1}#2.0#0; mscomct2.ocx
Object={A8B3B723-0B5A-101B-B22E-00AA0037B2FC}#1.0#0; GRID32.OCX
Object={BEC61919-E6C4-11D1-BE7D-C63815000000}#1.0#0; FLEXWIZ.OCX
Object={0842D103-1E19-101B-9AAF-1A1626551E7C}#1.0#0; GRAPH32.OCX
Object={67397AA1-7FB1-11D0-B148-00A0C922E820}#6.0#0; MSAdoDc.ocx
-
Jan,
Ik kan wel met de muis en met de pijltjestoetsen van het ene naar het andere vakje gaan, maar als ik iets typ gebeurt er niets.
Vreemd. De referenties en Objects zijn precies hetzelfde.
Als je geen extra code op je formulier hebt staan dat invoer controleerd of vergrendelt, dan weet ik het ook niet meer.
De enigste tip is nog: begin met een nieuw kaal formulier, zet daarin alleen de Data en DBGrid control en de 2 regels in de Form_Load event om de DBGrid te vullen.
Peter
-
Hoi Peter,
Die laatste tip had ik al opgevolgd, om eventuele andere invloeden uit te sluiten. Ik zal nog eens een nieuwproject maken met alleen dat ene formulier. Andere zaken uit mijn project kunnen dan niets verzieken.
-
Hoi Peter.
Ik heb een nieuw project gemaakt met 1 formulier met de data control en DBGrid1 erop. De code ingevoerd en het project gedraaid. Zelfde resultaat. Er is dus iets mis met dit grid. Maar waarom dan wel bij dit formulier en grid, maar niet bij een vergelijkbare toepassing. Ik heb op internet echer iets gevonden wat het verklaart. Ik heb door de tijd databases gemaakt in verschillende versies van VB. Nu blijkt dat dit grid niet goed werkt voor oudere versies database zoals ADO. Ik ben de link vergeten, maar het artikel heette Q170163. Het is dus mogelijk dat dit toevallig een database is van de oudere versie. Ik zal proberen op internet een vervanger voor dit grid te vinden.
-
Hoi Jan,
Gelukkig dat deze misery opgelost is.
Ik ben de link vergeten, maar het artikel heette Q170163.
Je bedoeld deze pagina?: http://support.microsoft.com/kb/170163/ (http://support.microsoft.com/kb/170163/)
Ik zal proberen op internet een vervanger voor dit grid te vinden.
Is het niet handiger om eenmalig de database aan te passen. Met verschillende soorten databases werken lijkt me nu niet echt makkelijk te onderhouden programma-code op te leveren. :-\
groeten, Peter
-
Hoi Peter,
Ja het is inderdaad handiger met één formaat database te werken, maar ik weet niet hoe er achter te komen wat elke database voor formaat is. Ik heb eens geprobeerd alles te converteren, maar dat was toen geen succes, vanwege het verband tussen Access zoals gebruikt in VB en zoals gebruikt in Microsoft Office Access. Dat gaf toen problemen. En omdat ik verder geen last had van het bestaan van meer dan één formaat heb ik ervan afgezien verder tijd en energie te besteden aan de conversie, te meer waar ik niet wist welke database welk formaat was. (Ik weet echter vrij zeker dat tabel DividendenTab van database Portef1.mdb een ADO-databasetabel is). Een nieuwe database maken en de gegevens overhevelen bracht toen het probleem met zich, dat je gevaar liep de gegevens uit de database te verliezen en omdat deze historische gegevens een cruciale rol spelen in het betreffende programma was ik daar huiverig voor.
Overigens Peter, bedankt voor je vele adviezen. Ik zou er nog graag een krijgen. In bovenstaand artikel Q170163 staat dat in sommige gevallen inderdaad de data niet worden weergegeven en ze bieden daar ook een oplossing voor. Die oplossing heeft te maken met de cursor. Er wordt ook code gegeven om het op te lossen, maar helemaal duidelijk is die oplossing niet voor mij. Ik heb de betreffende code toegevoegd, maar dat geeft een error. Misschien dat het jou wat meer zegt.
-
Hoi Jan,
Ik weet niet welke fout jij krijgt. Deze melding krijg ik:
(http://www.nlcomputerforum.nl/index.php?action=dlattach;topic=1939.0;attach=1061)
Dit werkt wel:
Private Sub DataClass_Initialize()
Dim cn, rs
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
rs.CursorType = adOpenStatic
cn.Provider = "Microsoft.Jet.OLEDB.4.0"
cn.Open "nwind.mdb" '<-- database naam
rs.Open "customers", cn
End Sub
Peter
-
Hoi Peter,
Ik kreeg inderdaad dezelfde fout als jij. Ik heb jouw verbeterde code geprobeerd, maar krijg fout "User-defined type not defined" op
cn = New.ADOBDB.ConnectionSet, maar weet niet hoe te definiëren. Omdat ik aan gebruik van de data control voldoende heb, heb ik geen ervaring met het zelf programmeren van de database.
Jan
-
Jan,
maar krijg fout "User-defined type not defined"
Heb je deze referentie aan je project toegevoegd?
"Microsoft ActiveX Data Objects 2.8 Library"
Peter
-
Hoi Peter,
Ja die zit in de References.
-
Hmm, het wordt steeds gekker ::) .
Vervang de sub eens door deze:
Private Sub DataClass_Initialize()
Dim cn, rs
Set cn = CreateObject("ADODB.Connection")
cn.Provider = "Microsoft.Jet.OLEDB.4.0"
cn.Open "nwind.mdb"
Set rs = CreateObject("ADODB.recordset")
rs.Open "customers", cn
End Sub
Dat zou hetzelfde moeten doen. Hoe doet die het?
Peter
-
Hoi Peter,
Deze geeft precies dezelfde fout op dezelfde regel. Ik heb nog geprobeerd het op te lossen door Dim cn uit te breiden tot Dim cn As Connection, maar ook dat helpt niet.
Groetjes,
Jan
-
:tsja:
Als dit een test-project is, dus zonder verdere database koppelingen, verwijder dan eens de referentie "Microsoft ActiveX Data Objects 2.8 Library".
Sla je project op en sluit VB6 af.
Herstart je computer
Start alleen het VB6 project.
Voeg de referentie weer toe.
Hopelijk scheelt dat.
Peter
-
Hoi Peter,
Dat geeft hetzelfde resultaat.
-
Dat geeft hetzelfde resultaat.
:tsja:
Dan weet ik het ook niet meer. Misschien een meelezer.
Probeer je vraag eens op een ander forum, bijv. MSDEVAPPS (http://community.compuserve.com/n/pfx/forum.aspx?nav=start&webtag=ws-msdevapps) , MSOFFICE (http://community.compuserve.com/n/pfx/forum.aspx?webtag=ws-msoffice) of VBFORUMS (http://www.vbforums.com/index.php?).
Mocht je een oplossing hebben, laat het dan even weten.
groeten, Peter
-
Hoi Peter,
Heb ik gedaan en kreeg het volgende antwoord:
< DBGrid appears to have been intended to work with the long-dead RDO, not ADO. RDO was an old COM wrapper for ODBC that was meant to supplement DAO.
DBGrid's DataSource is an ICursor, not an IRowset. >
Heb de NWind database in jouw code vervangen door de voor dividende toepasselijke database en recordset en ben de Connection-fout nu kwijt zonder dat ik iets anders hier aan veranderd heb, maar krijg nu error 3709 op rs.Open "DividendenTab".
-
Hoi Jan,
maar krijg nu error 3709 op rs.Open "DividendenTab"
Staat er wel ", cn" achter die rs.Open opdracht?
Plaats deze regel voor de regel rs.Open "DividendenTab":
rs.ActiveConnection = cn
Peter
-
Hoi Peter,
Die cn was ik inderdaad vergeten. Nu is de fout weg, maar ondanks dat er geen fouten meer zijn doet hij nog steeds niets. Mogelijk krijg ik nog meer reacties op dat andere forum.
-
Hoi Jan,
Mooi dat de fout opgelost is. Het enige wat deze code doet is de database openen en een koppeling maken met de recordset. Dat lijkt dus te werken.
Het vullen van de grid en het weer loskoppelen en sluiten van de database is dus niet inbegrepen. Dat moet je nog doen!
Hier staat een voorbeeld:
http://www.timesheetsmts.com/adotutorial.htm (http://www.timesheetsmts.com/adotutorial.htm)
Peter
-
Hoi Peter,
We zijn dus weer een stapje verder. Ik heb nu een aanpassing gemaakt en hoewel er misschien wel iets te veel code in staat, heb ik alleen iets toegevoegd en zo min mogelijk weggehaald. Wat vind je van deze code?
<Dim cn, rs
Set cn = CreateObject("ADODB.Connection")
cn.Connection.Open
cn.Connection.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source" & _
App.Path & "\DATABASE\Portef1.mdb;Mode=Read|Write"
cn.Open App.Path & "\DATABASE\Portef1.mdb"
Set rs = CreateObject("ADODB.recordset")
rs.Open "DividendenTab", cn
>
Ik krijg nu error 3704. Ik heb geprobeerd die weg te krijgen door cn.Connection.Open toe te voegen, maar dat helpt niet. Kennelijk heeft het gesloten zijn betrekking op iets anders dan Connection. Waarschijnlijk moet ik cn.Connection.Open weghalen en
cn.Open App.Path & "\DATABASE\Portef1.mdb" een regel of twee naar voren halen.
groeten,
Jan
-
Hoi Jan,
Even eerst algemene opmerking. Plaats programma-code gescheiden van normale tekst zodat de code niet verminkt wordt door html-code die in de berichten-editor gebruikt wordt.
Dat doe je door op de knop (http://www.nlcomputerforum.nl/Themes/silentwave_20rc3/images/bbc/code.gif) boven de berichteneditor te klikken en de programma-code ertussen te plaatsen.
Je krijgt dan bijvoorbeeld:
[ code]Dit is programma-code.[ /code]
error 3704...
Ja, dat klopt. De errortekst lijkt me vrij duidelijk: "The operation requested by the application is not allowed if the object is closed.
Even door de code stappen en je komt bij cn.Connection.Open uit.
Dat kan daar nog niet want cn.ConnectionString of cn.Provider is niet ingesteld.
Bekijk dit eens en pas de veldnamen aan die jij gebruikt.
Dim cn, rs
Dim DBfile As String
DBfile = App.Path & "\DATABASE\Portef1.mdb"
Set cn = CreateObject("ADODB.Connection")
cn.Open "Provider = Microsoft.Jet.OLEDB.4.0;Data Source = " & DBfile & ";Mode=Read|Write"
'maak een recordset
Set rs = cn.Execute("Select * From country")
' doorloop de recordset en toon alle elementen van de kolom 'name'
Do While Not rs.EOF
MsgBox rs("name")
rs.MoveNext
Loop
'sluit de recordset en database
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
groeten, Peter
-
Hoi Peter,
Deze code werkt inderdaad zonder fouten en toont alle waarden in een kolom van de tabel. Dit betekent dat er inderdaad verbinding is met de databasetabel. Maar ondanks de Read | Write accepteert het grid nog steeds geen invoer.
Er ontbreekt dus kennelijk toch nog een instelling.
Jan
-
Hoi Peter,
VBFORUM gaf het volgende commentaar op de in het voorgaande gebruikte code:
Using cn.Execute to open a recordset is the wrong thing to do, for the same reason as before - because it opens a Read-only recordset (and also Forward-Only, which isn't right either).
Jan
-
Hoi Jan,
Kijk het eens naar dit voorbeeld. Het maakt gebruik van een listbox, 4 textboxen en 2 commandbuttons. De code en commentaar regels spreken hopelijk voor zich.
De database bestaat uit een tabel 'country' met daarin de velden 'name', 'capital', 'continent', 'area' en 'population'. De eerste 3 velden zijn strings, de laatste 2 velden zijn nummeriek.
Option Explicit
Dim cn, rs
Private Sub Form_Load()
Set cn = New ADODB.Connection
cn.Provider = "Microsoft.Jet.OLEDB.4.0"
cn.Open App.Path & "\database\portef1.mdb"
Call RefreshList
End Sub
Private Sub Form_Unload(Cancel As Integer)
'sluit database koppelingen en geef geheugen vrij
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
End Sub
Private Sub RefreshList()
'ververs lijst
Set rs = cn.Execute("Select * From country")
'doorloop alle records en vul lijst met landnamen
List1.Clear
Do While Not rs.EOF
List1.AddItem rs("name")
rs.MoveNext
Loop
End Sub
Private Sub List1_Click()
'toon gegevens van land
Dim rs2
Set rs2 = cn.Execute("Select * From country Where name = '" & List1.List(List1.ListIndex) & "'")
Text1(0).Text = rs2("capital")
Text1(1).Text = rs2("continent")
Text1(2).Text = rs2("area")
Text1(3).Text = rs2("population")
Set rs2 = Nothing
End Sub
Private Sub Text1_KeyPress(Index As Integer, KeyAscii As Integer)
'invoerveld alle velden van record
'update het record als op ENTER gedrukt wordt
Dim ix As Integer
Dim sql As String
Dim rs2
If KeyAscii = vbKeyReturn Then
KeyAscii = 0 'geen piepje
Select Case Index 'welk veld is gewijzigd?
Case 0: sql = "capital"
Case 1: sql = "continent"
Case 2: sql = "area"
Case 3: sql = "population"
End Select
sql = "Update country Set " & sql & "='" & Text1(Index).Text & "' where name='" & List1.List(List1.ListIndex) & "'"
Set rs2 = cn.Execute(sql)
ix = Index + 1
If ix > Text1.UBound Then ix = 0
Text1(ix).SetFocus 'zet focus op volgend invoerveld
Set rs2 = Nothing
End If
End Sub
Private Sub cmdNewRecord_Click()
'nieuw record toevoegen
Dim sql As String, stmp As String
Dim rs2
stmp = InputBox("Landnaam:", "Record toevoegen")
If Trim(stmp) <> "" Then
sql = "Insert Into country (name,capital,continent,area,population) Values ('" & stmp & "','capital','continent',0,0)"
Set rs2 = cn.Execute(sql)
Set rs2 = Nothing
End If
Call RefreshList
End Sub
Private Sub cmdDeleteRecord_Click()
'record verwijderen
Dim sql As String
Dim ix As Integer
Dim rs2
ix = List1.ListIndex
If ix > 0 Then
If MsgBox("Wis Record '" & List1.List(ix) & "' ?", vbYesNo) = vbYes Then
sql = "Delete From country Where name='" & List1.List(ix) & "'"
Set rs2 = cn.Execute(sql)
Set rs2 = Nothing
End If
End If
Call RefreshList
End Sub
(http://www.nlcomputerforum.nl/index.php?action=dlattach;topic=1939.0;attach=1080)
Peter
-
Hoi Peter,
Ik heb dit voorbeeld aangepast met mijn eigen database en tabel om te zien of de listbox wel deed wat het grid zou moeten doen. Ik neem tenminste aan dat dat de bedoeling was van dit voorbeeld. Ik heb een error verbeterd. Set cn = New ADODB.Connection
gaf error "user-defined type not defined". Ik heb dit vervangen door Set cn = CreateObject("ADODB.Connection")
Ik kreeg ook de fout "Procedure declaration does not match description of event or procedure having the same name", maar volgens mij is er niets mis met de betreffende procedure Text1_KeyPress(KeyAscii As Integer).
-
Hoi Peter,
Ik heb dit voorbeeld aangepast met mijn eigen database en tabel om te zien of de listbox wel deed wat het grid zou moeten doen. Ik neem tenminste aan dat dat de bedoeling was van dit voorbeeld. Ik heb een error verbeterd. Code: [Selecteer] (http://www.nlcomputerforum.nl/javascript:void(0);)Set cn = New ADODB.Connection gaf error "user-defined type not defined". Ik heb dit vervangen door Code: [Selecteer] (http://www.nlcomputerforum.nl/javascript:void(0);)Set cn = CreateObject("ADODB.Connection") Ik kreeg ook de fout "Procedure declaration does not match description of event or procedure having the same name", maar volgens mij is er niets mis met de betreffende procedure Text1_KeyPress(KeyAscii As Integer).
-
Jan,
De bedoeling van dit voorbeeld is aangeven hoe je records leest, bewerkt en wegschrijft.
Set cn = New ADODB.Connection gaf error "user-defined type not defined". Ik heb dit vervangen door
Dat mag. Ik had de referentie "Microsoft ActiveX Data Objects 2.8 Library" aangevinkt. Als je dat niet doet, moet je idd CreateObject() gebruiken.
maar volgens mij is er niets mis met de betreffende procedure Text1_KeyPress(KeyAscii As Integer).
De 4 Textboxen, allemaal Text1 genaamd, zijn een array van 4 elementen. Waarschijnlijk heb je 4 losse TextBox controls gebruikt; Text1 t/m Text4.
Dat kan ook maar in dit voorbeeld is een array van controls veel handiger.
De procedure Text1_KeyPress(KeyAscii As Integer) moet dus ook zijn Text1_KeyPress(Index As Integer, KeyAscii As Integer)
Peter
-
Hoi Peter,
Bedankt voor deze uitleg.
Ik had van de textboxen net als jij een control array gemaakt en heb nu de parameterlijst van KeyPress aangepast. Als ik nu klik op een item in de listbox krijg ik de gegevens uit de database in de betreffende textboxen. Er is dus duidelijk iets mis met DBGrid1.
-
Als ik nu klik op een item in de listbox krijg ik de gegevens uit de database in de betreffende textboxen.
Kun je ze aanpassen en opslaan?
Peter
-
Hoi Peter,
Ik kan ze niet aanpassen en ook geen nieuwe records toevoegen. Bij toevoegen krijg ik de fout op Symbool "Gegevens komen niet overeen in criteriumexpressie op Symbool". Volgens mij is Symbool bij het aanmaken van tabel DividendenTab ingesteld als string en dat is hij in ADOGrid volgens mij ook.
Als ik alles afsluit en Visual Basic opnieuw opstart en een record probeer toe te voegen via Add-in/Data Manager kan ik in tabel DividendenTab wel symbool invoeren zonder bovenstaande fout te krijgen maar in ContantDividend en de andere velden wordt alleen het decimaalteken geaccepteerd en geen getallen. Als ik het record dan wil updaten krijg ik fout "Data type conversion error".
Vóór werken met ADOGrid (en wellicht ook vóór werken met DBGrid1 kon ik zonder problemen records toevoegen.
Heb je wellicht ook een soortgelijk voorbeeld als ADOGrid om het datatype van de velden van DividendenTab uit te lezen?
-
Heb je wellicht ook een soortgelijk voorbeeld als ADOGrid om het datatype van de velden van DividendenTab uit te lezen?
Zoiets,
Plaats een label control (Label3) op je form en via kopieren/plakken maak je er 4 in een array.
Deze functie zet het veld-type om naar tekst:
Private Function GetDataType(DataType As Long) As String
'geef DataType als string terug
Dim txt As String
Select Case DataType
Case adEmpty: txt = "(0) No value"
Case adSmallInt: txt = "(2) A 2-byte signed integer."
Case adInteger: txt = "(3) A 4-byte signed integer."
Case adSingle: txt = "(4) A single-precision floating-point value."
Case adDouble: txt = "(5) A double-precision floating-point value."
Case adCurrency: txt = "(6) A currency value"
Case adDate: txt = "(7) The number of days since December 30, 1899 + the fraction of a day."
Case adBSTR: txt = "(8) A null-terminated character string."
Case adIDispatch: txt = "(9) A pointer to an IDispatch interface on a COM object. Note: Currently not supported by ADO."
Case adError: txt = "(10) A 32-bit error code"
Case adBoolean: txt = "(11) A boolean value."
Case adVariant: txt = "(12) An Automation Variant. Note: Currently not supported by ADO."
Case adIUnknown: txt = "(13) A pointer to an IUnknown interface on a COM object. Note: Currently not supported by ADO."
Case adDecimal: txt = "(14) An exact numeric value with a fixed precision and scale."
Case adTinyInt: txt = "(16) A 1-byte signed integer."
Case adUnsignedTinyInt: txt = "(17) A 1-byte unsigned integer."
Case adUnsignedSmallInt: txt = "(18) A 2-byte unsigned integer."
Case adUnsignedInt: txt = "(19) A 4-byte unsigned integer."
Case adBigInt: txt = "(20) An 8-byte signed integer."
Case adUnsignedBigInt: txt = "(21) An 8-byte unsigned integer."
Case adFileTime: txt = "(64) The number of 100-nanosecond intervals since January 1,1601"
Case adGUID: txt = "(72) A globally unique identifier (GUID)"
Case adBinary: txt = "(128) A binary value."
Case adChar: txt = "(129) A string value."
Case adWChar: txt = "(130) A null-terminated Unicode character string."
Case adNumeric: txt = "(131) An exact numeric value with a fixed precision and scale."
Case adUserDefined: txt = "(132) A user-defined variable."
Case adDBDate: txt = "(133) A date value (yyyymmdd)."
Case adDBTime: txt = "(134) A time value (hhmmss)."
Case adDBTimeStamp: txt = "(135) A date/time stamp (yyyymmddhhmmss plus a fraction in billionths)."
Case adChapter: txt = "(136) A 4-byte chapter value that identifies rows in a child rowset"
Case adPropVariant: txt = "(138) An Automation PROPVARIANT."
Case adVarNumeric: txt = "(139) A numeric value (Parameter object only)."
Case adVarChar: txt = "(200) A string value (Parameter object only)."
Case adLongVarChar: txt = "(201) A long string value."
Case adVarWChar: txt = "(202) A null-terminated Unicode character string."
Case adLongVarWChar: txt = "(203) A long null-terminated Unicode string value."
Case adVarBinary: txt = "(204) A binary value (Parameter object only)."
Case adLongVarBinary: txt = "(205) A long binary value."
Case adArray: txt = "(0x2000) A flag value combined with another data type constant. Indicates an array of that other data type."
Case Else: txt = "(" & Str(DataType) & ") Undocumented datatype."
End Select
GetDataType = txt
End Function
Zet dit bij de code in List1_Click():
Label3(0).Caption = GetDataType(rs2("capital").Type)
Label3(1).Caption = GetDataType(rs2("continent").Type)
Label3(2).Caption = GetDataType(rs2("area").Type)
Label3(3).Caption = GetDataType(rs2("population").Type)
Peter
-
Hoi Peter,
Bedankt voor dit codevoorbeeld.
Kan de oorzaak voor het niet accepteren van input door het grid gelegen zijn in het feit dat ik grid DBGrid gebruik i.p.v. DataGrid? Als dat zo is begrijp ik niet dat in de toepassing waarin het weergeven en updaten wel werkt ook Databound Grid gebruikt wordt en niet DataGrid.
Of ontbreekt er soms een bepaalde instelling?
-
Hoi Jan,
Of ontbreekt er soms een bepaalde instelling?
Even vereenvoudigen:
Je hebt een project met een formulier waar het wel in werkt.
Dan voeg je een formulier toe.
Je maakt een copy van het control dat wel werkt, plakt dat op het nieuwe formulier, en vervolgens eventueel nog de bijbehorende programmacode kopieert en aanpast op het nieuwe formulier.
Dan ligt het zeker niet aan het control. Het kan dus aan de database liggen.
In het voorbeeld werd met TextBox controls gewerkt. Probeer het daar eerst eens mee. Al is het maar 1 kolom. Het gaat erom of je dan wel de database kun bewerken.
groeten, Peter
-
Hoi Peter,
Ik had het over jouw voorbeeld met de textboxen. Daarin werkte wel het in de textboxen plaatsen van de inhoud van de tabel door aanklikken van het betreffende symbool in de ListBox, maar kon ik geen gegevens veranderen of toevoegen. Ik heb de indruk dat dat aan de listbox ligt, want als ik voordat ik dit project opstart gegevens in de tabel probeer te veranderen of records toe te voegen via de Visual Data Manager gaat dat zonder problemen. Probeer ik ditzelfde via commandknop Record toevoegen in het formulier met de data control en de listbox dan lukt dat niet en het lukt evenmin als ik het dan weer, onmiddellijk na gebruiken van de ListBox, probeer via de Visual Data Manager. Het ziet er dus naar uit dat de listbox ergens een lock gezet heeft.
-
Jan,
Daarin werkte wel het in de textboxen plaatsen van de inhoud van de tabel door aanklikken van het betreffende symbool in de ListBox, maar kon ik geen gegevens veranderen of toevoegen.
Je hebt wel op de ENTER toets gedrukt om de wijziging te bevestigen?
Krijg je een foutmelding? Zoja, welke?
Ik heb de indruk dat dat aan de listbox ligt, want ...
Die redenatie snap ik niet. De listbox wordt netjes gevuld, want je ziet de velden van het record dat je aanklikt in de listbox.
Een record toevoegen heeft niets meer met de listbox te maken. Alleen hoe de variabele CN gekoppeld is aan de database (read/write mode, met of zonder wachtwoord en dergelijke) of de juiste SQL commando bepalen of een record toegevoegd kan worden.
Het ziet er dus naar uit dat de listbox ergens een lock gezet heeft.
Mogelijk heeft de code in Form_load de database als readonly gezet.
Vervang daar de code eens in:
cn.Provider = "Microsoft.Jet.OLEDB.4.0"
cn.Mode = adModeReadWrite
cn.Open App.Path & "\database\portef1.mdb"
Op deze site (http://www.planetsourcecode.com/vb/scripts/ShowCode.asp?txtCodeId=64111&lngWId=1) staat een .ZIP bestand met daarin een goed uitleg hoe je het DataGrid control kunt gebruiken.
Al met al blijf ik me toch afvragen of het niet verstandiger is de database om te zetten naar een andere structuur.
groeten, Peter
-
Hoi Peter,
Het deleten van records werkt goed en het toevoegen van nieuwe records waarschijnlijk ook, maar ik krijg daarbij de fout dat de datattpen niet overeenstemmen.
Om er achter te komen wat de datatypen zijn om zo te weten hoe ik de in houd van de textboxen moet converteren heb ik de volgende code gemaakt.
Private Sub Command1_Click()
Dim adoConnection As ADODB.Connection
Dim adoRSFields As ADODB.Recordset
Dim sConnection As String
Set adoConnection = New DODB.Connection
sConnection = "Provider=Microsoft.Jet.OLEDB.3.51;Data _ Source=N:\Program Files\Microsoft Visual _ Studio\Prive\Beleggen\DATABASE\portef1.mdb\DividendenTab"
adoConnection.Open sConnection
Set adoRSFields = adoConnection.OpenSchema _(adSchemaProviderTypes)
Do Until adoRSFields.EOF
Debug.Print "Data Type:" & adoRSFields!TYPE_NAME _ & vbTab & "Columns Size: " & adoRSFields! _ COLUMN_SIZE
adoRSFields.MoveNext
Loop
Set adoRSFields = Nothing
adoConnection.Close
Set adoConnection = Nothing
End Sub
maar ik krijg dan op sConnection = de fout "Can't open a database created witha previous version of your application". Dit komt mij onwaarschijnlijk voor, want de databasetabel is bij mijn weten aangemaakt met Visual Data Manager van VB 6.0.
-
Hoi Peter,
Dat grid-voorbeeld is inderdaad heel goed en is erg duidelijk.
Bedankt, ik zal het zeker gebruiken.
Hoe kan ik eventueel de structuur van de database aanpassen? Ik zou niet weten welke versie hij is. Omzetten via Microsoft Office Access heb ik al eens eerder geprobeerd, maar dat leverde problemen op. De betreffende bestanden waren door Visual Basic 6.0 niet te lezen.
-
Hoi Jan,
Ik zou niet weten welke versie hij is.
Met behulp van onderstaande code kan je dat opvragen.
Plaats een commandbutton (cmdGetVersion) op je formulier en deze code:
Private Sub cmdGetVersion_Click()
Dim sfile As String
Dim txt As String
sfile = App.Path & "\database\portef1.mdb"
txt = GetVersion(sfile)
If txt <> "" Then MsgBox txt
End Sub
Function GetVersion(strDbPath As String) As String
'Geef van meegegeven bestand het versienummer van ACCESS en JET terug
Dim dbs As Database
Dim strAccVersion As String, strJetVersion As String
Dim txt As String
Const conPropertyNotFound As Integer = 3270
On Error GoTo Err_GetVersion
'Open the database and return a reference to it.
Set dbs = OpenDatabase(strDbPath)
'Check the value of the AccessVersion and Version property.
strAccVersion = dbs.Properties("AccessVersion")
strJetVersion = dbs.Properties("Version")
'Strip the two leftmost digits
strAccVersion = Left(strAccVersion, 2)
'Based on the value of the AccessVersion property,
'return a string indicating the version of Microsoft Access
'used to create or open the database.
Select Case strAccVersion
Case "02": txt = "2.0"
Case "06": txt = "95"
Case "07": txt = "97"
Case "08": txt = "2000"
Case "09": txt = "2002"
Case Else: txt = "[" & strAccVersion & "]"
End Select
GetVersion = "Access " & txt & " , JET " & strJetVersion
Exit_GetVersion:
On Error Resume Next
dbs.Close
Set dbs = Nothing
Exit Function
Err_GetVersion:
If Err.Number = conPropertyNotFound Then
MsgBox "Property not Found."
Else
MsgBox "Error: " & Err & vbCrLf & Err.Description
End If
Resume Exit_GetVersion
End Function
Peter
-
Hoi Peter,
Bedankt voor deze code. Ik krijg er de volgende fout mee: "Property not found" op strAccVersion = dbs.Properties("AccessVersion")
Ik heb me inmiddels wat meer verdiept in ADO en heb daarbij in de VB-literatuur ontdekt, dat ADO alle vorige versies zonder problemen aan zou moeten kunnen en dat conversie naar een latere versie niet nodig zou moeten zijn. Wat is jouw ervaring hiermee?
-
Hoi Jan,
Ik krijg er de volgende fout mee: "Property not found" op
Is het wel een echt Microsoft Access database of heb je de extensie .mdb misbruikt?
Wat is jouw ervaring hiermee?
Nul.
Peter
-
Hoi Peter,
Het is gegarandeerd een Access-database. Ik beschik over geen andere databases.
-
Jan,
Het is gegarandeerd een Access-database.
Vreemd. Kun je dat bestand dan eens sturen voor onderzoek, eventueel via een prive-bericht.
Peter
-
Hoi Peter,
Als ik in strAccVersion = dbs.Properties("AccessVersion") van "AccessVersion" "Version" maak gaat het wel zonder fout. Ik krijg dan dat het een Access 2.0 Jet 2.0 is. Het databasebestand kun je natuurlijk krijgen als dat nog nodig is.
-
Hoi Jan,
"AccessVersion" "Version"
Dat zijn 2 verschillende properties zoals je ook kan zien in de programmacode. In ieder geval is het dan een erg oude JET 2.0 database engine, uit pakweg 1993 !
Dat bestand mag je sturen.
Peter
-
Hoi Peter,
Ik heb er ook een Access 3.0 versie bij. Het valt op dat de Access-versie en de Jet-versie gelijk zijn. Is dat toeval of hoort dat zo?
Kan het zijn dat dit komt omdat ik van Accessversion Version
gemaakt heb. Dit is nl. hetzelfde als strJetVersion
.
Ik wil het bestand wel opsturen, maar het forum weigert het bestand. Hoe kan ik het versturen?
-
Jan,
Stuur het dan maar via de mail.
Peter
-
Peter,
Wat is het emailadres?
-
Beste Jan,
Ik wil het bestand wel opsturen, maar het forum weigert het bestand. Hoe kan ik het versturen?
Ik weet niet wat voor extensie dat bestand heeft, maar sowieso als je er een .zip bestand van maakt, zal het zeker lukken om het wél in een Forumbericht te plaatsen. :)
Groeten,
Ronald
-
Hoi Ronald,
Bedankt voor deze tip.
-
Hoi Ronald,
Het lukt ook niet met een zipbestand. Als ik de extensie veranderen van zipx in rar vermeldt hij het bestand als attachment toch als winzip-bestand en weigert het te verzenden.
-
Hoi Jan,
.zipx is inderdaad niet toegestaan (ik had trouwens nog nooit van die extensie gehoord), een .zip bestand kan wel. Maar alleen als bijlage bij een Forumbericht. Bijlagen bij een privé-bericht zijn niet mogelijk.
Je kunt het bestand ook mailen naar info apenstaartje nlcomputerforum punt nl (dan zet ik het wel ergens voor je neer) :)
Groeten,
Ronald
-
Hoi Peter,
Het heeft wat moeite gekost, maar hier is dan eindelijk het databasebestand.
-
Hoi Jan,
Het heeft wat moeite gekost, maar hier is dan eindelijk het databasebestand.
Er is iets vreemds met dat portef1.mdb aan de hand:
a) Het is nogal groot: ongeveer 160MB terwijl als ik het met Access2000 bekijk er maar 2 kleine tabellen inzitten.
b) Het heeft de JET 2.0 Engine in zich terwijl er ook Access2000 en Access2007 eigenschappen in staan. Mogelijk dat je zelf die eigenschappen toegevoegd hebt maar dat lijkt me onwaarschijnlijk.
JET 2.0 is iets uit de jaren 1993-1995 !!
Klopt het dat die database maar 2 tabellen bevat?
Ik zal eens wat testen met dat bestand maar dat wordt wat later deze week.
Wordt vervolgd, Peter
-
Hoi Peter,
Dat het bestand zo groot is komt waarschijnlijk omdat ik het niet gecomprimeerd heb en er indertijd meer gegevens in hebben gezeten. De toevoegingen die je signaleert heb ik er niet bewust aan toegevoegd. De database zelf dateert inderdaad uit het begin van de jaren negentig, maar de tabellen zijn later toegevoegd onder VB 6.0. Deze database bevat niet zoveel data, dus het zou niet al te veel werk zijn om de hele database opnieuw te maken onder VB 6.0. We komen er dan achter of het niet tonen van de opgehaalde gegevens uit de tabel in het grid door de database veroorzaakt wordt.
Als je wat tests wilt uitvoeren op de database, graag. Dat je daar niet meteen tijd voor hebt is geen probleem.
Tot slot kan ik je melden dat ik de toepassing in de tutorial met het data grid gemaakt heb en dat ook deze de gegevens niet laat zien.
Als je geïnteresseerd bent, kan ik je die toepassing gezipt toesturen.
Wat ik nog uitproberen wil is deze grid-applicate toepassen op de voorbeeld databases van VB 6.0. Als deze wel lukken, dan is de database inderdaad de oorzaak.
-
Hallo Jan,
Ik zal eens wat testen met dat bestand maar dat wordt wat later deze week.
De resultaten van het testen met je bestand portef1.mdb:
Zowel met een DBGrid control als met een ADODB koppeling kan ik lezen en schrijven in je database.
Dat betekend dus dat er met de database niets mis is.
Het lukt jouw niet met de voorbeeldcode.
Dan blijft er m.i. maar 1 ding over en dat is een ontbrekende of verminkte koppeling ergens in Windows.
Welke versie van het bestand %systemroot%\system32\msjet40.dll heb je?
(%systemroot% is normaal c:\windows)
Is MS Access op dezelfde computer geinstalleerd? Zoja, welke versie?
groeten, Peter
-
Hoi Peter,
Heel erg bedankt voor het testen van de database. Dat er met het databasebestand niets mis is, daar was ik inmiddels ook achter gekomen. Immers, met een geheel nieuw onder ADO gemaakte identieke database lukte het ook niet om de gegevens zichtbaar en updatebaar te maken. De versie van msjet40.dll is 4.0.9511.0.
MS Access is op dezelfde computer geïnstalleerd en is onderdeel van Microsoft Office 2003. Er heeft ook nog een tijdje Office 2007 op deze computer gestaan, maar die versie beviel me niet en heb ik dus verwijderd. Misschien een mogelijke oorzaak en niet helemaal verwijderd door het uninstallen?
-
Hoi Jan,
De versie van msjet40.dll is 4.0.9511.0.
Die heb ik ook.
Heb je Access 2003 opnieuw geinstalleerd nadat je Access 2007 verwijdert hebt?
groeten, Peter
-
Hoi Peter,
Die heb ik inderdaad na verwijderen van versie 2007 opnieuw geïnstalleerd. Er staat in de map System32 van Windows nog een andere dll met msjet, namelijk msjetoledb met versie 4.0.9502.0.
-
Hoi Jan,
Er zijn meer bestanden die hiervoor gebruikt worden. Voor een volledige lijst en updates , kijk eens op
http://support.microsoft.com/kb/239114/ (http://support.microsoft.com/kb/239114/)
Peter
-
Hoi Peter,
Ik heb het bestand van de link die je geeft uitgeprint en zal die bekijken. Als het probleem niet in de VB-code opgelost kan worden is het logisch de fout in de bestanden waarvan VB gebruik maakt te zoeken. Dat het probleem daar ligt, betwijfel ik echter. Zoals je gezien zult hebben bevat de database portef1.mdb ook nog een tabel PortefeuilleTab. Ook deze gebruikt DBGrid en deze geeft de gegevens wel correct weer in het grid en de gegevens zijn ook updatebaar.
Als tabel DividendenTab iets zou missen, zou PortefeuileTab dat ook moeten doen. Vandaar dat ik eerder voor DivdendenTab een kopie van PortefeuilleTab heb gebruikt en de code heb aangepast. Ondanks dat werkt DividendenTab niet correct met het grid.
Ik wil eens proberen als Provider Microsoft.Jet.OLEDB.2.0
te gebruiken en het DataGrid en de data control van ADO weer terug te vervangen door DBGrid1en de data control van DAO
3.51. Ik moet dan waarschijnlijk ook DAO3.51 aanvinken in Project/References.
groeten,
Jan
-
Hoi Jan,
Ik wil eens proberen als Code: [Selecteer] (http://www.nlcomputerforum.nl/javascript:void(0);)Provider Microsoft.Jet.OLEDB.2.0 te gebruiken
Dat werkt alleen als je ook JET 2.0 geinstalleerd hebt!
Zoals je gezien zult hebben bevat de database portef1.mdb ook nog een tabel PortefeuilleTab. Ook deze gebruikt DBGrid en deze geeft de gegevens wel correct weer in het grid en de gegevens zijn ook updatebaar.
Tja, dat is inderdaad vreemd. En je weet zeker dat de DBGrid en Data control mbt DividendenTab goed ingesteld staan:
Data1.Connect = Access 2000
Data1.DefaultType = Use Jet
Data1.Exclusive = False
Data1.Options = 0
Data1.ReadOnly = False
Data1.RecordSet = DynaSet
DBGrid.AllowUpdate = True
(dit zijn de standaard waardes)
Peter
-
Hoi Peter,
Ik heb al deze instellingen gecontroleerd en deze stemmen alle overeen met wat je opgeeft.
Ik heb je artikel over het meest recente servicepack voor de MS Jet 4.0 database-engine gelezen. Zou het zin hebben het meest recente servicepack te installeren? Jij hebt dezelfde versie van msjet40.ddl als ik en bij jou doet het grid het wel, dus ik vrees dat installeren van dat servicepack voor ons doel niet veel zal opleveren. Maar je kunt nooit weten. Als ik het servicepack verwijder, is dan de oorspronkelijke toestand volledig hersteld of komen er dan moeilijke toestanden?
-
Hoi Jan,
Deze service-pack update verandert niet alleen bestanden maar ook register-instellingen. Aangezien je bestanden zo te lezen in uptodate zijn, kan het dus ook aan de register-instellingen liggen. In hoeverre je dat weer ongedaan kunt maken kan ik niet zeggen.
Ik denk dat het beter is om eerst wat register-instellingen te vergelijken.
Klik op Start - Uitvoeren
Typ REGEDIT en klik op OK.
(Let op, verander geen instellingen!)
Blader in de linker kolom naar HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet
Rechtsklik op deze subsleutel en klik op Exporteren
Geef de bestandsnaam JET.TXT in en klik op Opslaan (dus niet opslaan als .REG)
Sluit Regedit af.
Voeg dit bestand als bijlage toe aan een bericht.
Peter
-
Hoi Peter,
Onder de sleutel ......... SOFTWARE komt Jet niet voor. Als ik 'Zoeken' aanklik voor Jet krijg ik de tekst "Microsoft JET.OLEDB3.51".
-
Jan,
Onder de sleutel ......... SOFTWARE komt Jet niet voor.
Dat klopt. Je moet eerst nog de subsleutel Microsoft openen!
Hier nogmaals de volledige sleutelreeks:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet
Als ik 'Zoeken' aanklik voor Jet krijg ik de tekst "Microsoft JET.OLEDB3.51".
Dat kan. Waarschijnlijk staat ie dan op de sleutel HKEY_CLASSES_ROOT\.jod
Dit is normaal.
Peter
-
Hoi Peter,
In de betreffende sleutel bevat Jet de onderdelen 3.0, 3.5 en 4.0.
-
Hoi Jan,
In de betreffende sleutel bevat Jet de onderdelen 3.0, 3.5 en 4.0.
Ja dat kan, maar ik wil alle subsleutels en waardes daarvan zien.
Voer dus aub de instructies uit in bericht #75.
Peter
-
Hoi Peter,
Ik heb Jet geselecteerd en afgedrukt naar een bestand, maar dat geeft een soort objectcode en is dus onleesbaar. Als ik het afdruk naar de printer krijg ik keurig de tekst (71 bldz.). Hoe komt dat?
-
Jan,
Ik heb Jet geselecteerd en afgedrukt naar een bestand,
Afgedrukt naar een bestand?
Vul het venster Registerbestand exporteren als volgt in:
(http://www.nlcomputerforum.nl/index.php?action=dlattach;topic=1939.0;attach=1143)
Klik dan op Opslaan
Peter
-
Hoi Peter,
Hier het gezipte Jet-register.
-
Jan,
Pas deze instelling in het register eens aan:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines]
SandBoxMode = 2
Herstart de computer.
Probeer daarna nog eens je VB6 programma.
Er staan ook een aantal verwijzingen naar station F:\
Is dat een andere schijf, partitie of een netwerkmap?
Heb je op F: het office pakket geinstalleerd?
Scheelt dit?
Peter
-
Hoi Peter,
Veranderen van Sandbox Mode van 3 in 2 heeft niet geholpen. Ik heb inderdaad Microsoft Office op partitie F geïnstalleerd.
-
Hoi Peter,
Zou het helpen om met een cursor te werken om dit probleem op te lossen?
-
Hoi Jan,
Wat bedoel je met "met een cursor te werken" ?
Peter
-
Hoi Peter,
In ADO kun je werken met een zogenaamde cursor. Je hebt daarbij de volgende opties:
CursorType = adOpenDynamic ' zonder beperkingen door de recordset bewegen
CursorType = adOpenKeyset ' als dynamic cursor, maar je kunt nu ook
' de veranderingen van andere gebruikers bekijken
CursorType = adOpenForwardOnly 'spreekt voor zich
CursorType = adOpenStatic ' als dynamic, maar zonder de veranderingen van andere gebruikers te kunnen lezen.
Met de cursor kun je door de recordset bewegen op CursorType manier.
Ik dacht, als je met de cursor werkt moet hij als dat niet gaat een fout geven waarom het niet gaat. Misschien werkt het zo niet, maar het zou me logisch lijken.
-
Hoi Jan,
Je kunt altijd proberen of dit voor jou werkt.
Als ik hier een ADO query uitvoer, is .CursorType = 0 en .LockType = 1.
De waardes kan ik trouwens niet wijzigen.
Peter
-
Omdat het hier behandelde probleem ook met deskundige hulp niet opgelost kon worden heeft de door Peter gegeven codevoorbeelden mij duidelijk gemaakt dat ik kennelijk onvoldoende kennis had van het databasegedeelte van Visual Basic 6.0. De overgang van VB 5.0 naar 6.0 ging zo probleemloos, dat ik ook nooit naar extra informatie gezocht heb. Ook het ontbreken van Microsoft systeemdocumentatie over VB 6.0 was daar debet aan. Ik heb inmiddels mijn kennis van ADO uitgebreid en heb de oorzaak van alle problemen gevonden. Het vullen van het grid lukte aanvankelijk met drie tabellen en na overgang van een geleende versie van MicrosoftVisual Studio 6.0 Enterprise editie naar een nieuwe aangeschafte Pro versie van Microsoft Visual Studio 6.0 werkte er twee toepassingen nog wel en de derde niet. In de ToolBox zag ik alleen maar de oudere versie van de data control en deze gebruikte ik nog steeds, maar de code die Peter mij gaf werkte daar niet voor. Doordat ik op een geven moment een foutmelding kreeg dat er geen compatible data source voor dit control was en ik een ADO data control of DataEnvironment aan het project moest toevoegen, ondanks dat de ADO data control aangevinkt was in Project/Components, ben ik verder gaan zoeken en dat bracht aan het licht dat de ADO data control net in het niet-zichtbare gedeelte van de ToolBox viel. Ik had dus steeds de verkeerde data control op het formulier. Waarom de oude databound versie met de VB5 data control plotseling in 2 gevallen nog werkte en in het derde geval niet is mij nog steeds een raadsel. Mogelijk heeft het te maken met de overgang van Enterprise naar Pro versie.
Overigens idereen bedankt voor de ontvangen hulp. Vooral Peter heeft daarin een groot aandeel gehad.
-
Hoi Jan,
ben ik verder gaan zoeken en dat bracht aan het licht dat de ADO data control net in het niet-zichtbare gedeelte van de ToolBox viel. Ik had dus steeds de verkeerde data control op het formulier.
Dat verklaart een hoop. De oudere control zal een aantal dingen niet kunnen to.v een nieuwere versie. Wat er precies gewijzigd is is helaas nooit helemaal duidelijk.
Dat je beide control-versies in 1 project kunt gebruiken is al helemaal verwarrend.
In ieder geval is dit probleem nu dus opgelost door de nieuwste control te gebruiken.
Bedankt voor de feedback.
groeten, Peter
-
Hoi Peter,
Waarschijnlijk zal ik de andere twee onderdelen, die de oude data control gebruiken, in de naaste toekomst ook vervangen door de ADO data control. Hoe uniformer, hoe beter. Ik wil dat niet meteen doen, want ik hoop er toch nog eens achter te komen, waarom er 2 onderdelen met precies dezelfde systematiek, maar met een andere tabel niet werken met de oude data control en de eerste wel. Deze eerste tabel is eerder gemmaakt dan de andere twee en dat is dan ook waarschijnlijk de reden dat hij wel werkt. Maar ik dacht dat de database bepalend was en niet de tabellen daarvan. Maar kennelijk reageert VB op de onderdelen van een database.