Hallo

Welkom, Gast. Alsjeblieft inloggen of registreren.

Recent

497 gasten, 0 leden

Welkom, Gast. Alsjeblieft inloggen of registreren.

27 april 2024, 10:59:33

Login met gebruikersnaam, wachtwoord en sessielengte

Nieuws

Welkom op het vernieuwde NL Computer Forum!

Auteur Topic: DBGrid1 toont kolommen zonder inhoud, maar accepteert geen invoer  (gelezen 30843 keer)

0 leden en 1 gast bekijken dit topic.

Offline jvdpeet †
  • Senior lid
  • ****
  • Berichten: 365
  • Geslacht: Man
Re: DBGrid1 toont kolommen zonder inhoud, maar accepteert geen invoer
« Reactie #30 Gepost op: 17 augustus 2010, 14:02:34 »
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.
 

Offline Peter

  • Sysop
  • *****
  • Berichten: 5.683
  • Geslacht: Man
Re: DBGrid1 toont kolommen zonder inhoud, maar accepteert geen invoer
« Reactie #31 Gepost op: 17 augustus 2010, 14:24:29 »
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


Peter

Offline jvdpeet †
  • Senior lid
  • ****
  • Berichten: 365
  • Geslacht: Man
Re: DBGrid1 toont kolommen zonder inhoud, maar accepteert geen invoer
« Reactie #32 Gepost op: 17 augustus 2010, 16:53:19 »
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
 

Offline Peter

  • Sysop
  • *****
  • Berichten: 5.683
  • Geslacht: Man
Re: DBGrid1 toont kolommen zonder inhoud, maar accepteert geen invoer
« Reactie #33 Gepost op: 18 augustus 2010, 00:08:01 »
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 boven de berichteneditor te klikken en de programma-code ertussen te plaatsen.
Je krijgt dan bijvoorbeeld:
[ code]Dit is programma-code.[ /code]
Citaat
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

Offline jvdpeet †
  • Senior lid
  • ****
  • Berichten: 365
  • Geslacht: Man
Re: DBGrid1 toont kolommen zonder inhoud, maar accepteert geen invoer
« Reactie #34 Gepost op: 18 augustus 2010, 13:10:28 »
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

Offline jvdpeet †
  • Senior lid
  • ****
  • Berichten: 365
  • Geslacht: Man
Re: DBGrid1 toont kolommen zonder inhoud, maar accepteert geen invoer
« Reactie #35 Gepost op: 18 augustus 2010, 16:19:17 »
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

Offline Peter

  • Sysop
  • *****
  • Berichten: 5.683
  • Geslacht: Man
Re: DBGrid1 toont kolommen zonder inhoud, maar accepteert geen invoer
« Reactie #36 Gepost op: 19 augustus 2010, 11:44:45 »
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





Peter

Offline jvdpeet †
  • Senior lid
  • ****
  • Berichten: 365
  • Geslacht: Man
Re: DBGrid1 toont kolommen zonder inhoud, maar accepteert geen invoer
« Reactie #37 Gepost op: 19 augustus 2010, 20:23:34 »
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).

Offline jvdpeet †
  • Senior lid
  • ****
  • Berichten: 365
  • Geslacht: Man
Re: DBGrid1 toont kolommen zonder inhoud, maar accepteert geen invoer
« Reactie #38 Gepost op: 19 augustus 2010, 20:26:21 »
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]Set cn = New ADODB.Connection gaf error "user-defined type not defined". Ik heb dit vervangen door   Code: [Selecteer]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).

Offline Peter

  • Sysop
  • *****
  • Berichten: 5.683
  • Geslacht: Man
Re: DBGrid1 toont kolommen zonder inhoud, maar accepteert geen invoer
« Reactie #39 Gepost op: 19 augustus 2010, 21:04:11 »
Jan,

De bedoeling van dit voorbeeld is aangeven hoe je records leest, bewerkt en wegschrijft.

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

Citaat
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

Offline jvdpeet †
  • Senior lid
  • ****
  • Berichten: 365
  • Geslacht: Man
Re: DBGrid1 toont kolommen zonder inhoud, maar accepteert geen invoer
« Reactie #40 Gepost op: 19 augustus 2010, 22:15:41 »
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.
 
 

Offline Peter

  • Sysop
  • *****
  • Berichten: 5.683
  • Geslacht: Man
Re: DBGrid1 toont kolommen zonder inhoud, maar accepteert geen invoer
« Reactie #41 Gepost op: 19 augustus 2010, 22:33:25 »
Citaat
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

Offline jvdpeet †
  • Senior lid
  • ****
  • Berichten: 365
  • Geslacht: Man
Re: DBGrid1 toont kolommen zonder inhoud, maar accepteert geen invoer
« Reactie #42 Gepost op: 20 augustus 2010, 17:12:20 »
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?
 

Offline Peter

  • Sysop
  • *****
  • Berichten: 5.683
  • Geslacht: Man
Re: DBGrid1 toont kolommen zonder inhoud, maar accepteert geen invoer
« Reactie #43 Gepost op: 20 augustus 2010, 21:05:40 »
Citaat
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

Offline jvdpeet †
  • Senior lid
  • ****
  • Berichten: 365
  • Geslacht: Man
Re: DBGrid1 toont kolommen zonder inhoud, maar accepteert geen invoer
« Reactie #44 Gepost op: 22 augustus 2010, 11:17:53 »
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?