NL Computer Forum

Maak het zelf => Programmeren => Topic gestart door: jvdpeet † op 26 juli 2010, 16:50:37

Titel: Too few parameters.Expected 1.
Bericht door: jvdpeet † op 26 juli 2010, 16:50:37
Hallo idereen,
Ik heb de volgende query: "Select * FROM DemonstratieTabel WHERE InkoopDatum > InkoopDatumGrens ORDER BY Indicator" en stap voor stap door de code gaan levert bij het passeren van de querycode geen fout op. Zodra de routine waarin de query voorkomt verlaten wordt krijg ik de foutmelding in het onderwerp. Zet ik de query op tekst, dan blijft de fout weg. Ik heb twee vragen.
1) Waarom wordt de foutmelding niet gegeven direct na het uitvoeren van de code? Kan de oorzaak zijn dat de routine waarin de query voorkomt wordt aangeroepen in Form_Load?
2) Wat mankeert er aan de query? Als ik de query test met de Query Builder krijg ik geen     fout. 
Nog iets dat mogelijk van belang kan zijn:
De InkoopDatum is een string. Omdat je daarmee niet met > kunt werken (ook met Val krijg ik een fout) heb ik dat probleem omzeild door een variabele InkoopDatumGrens te declareren,  die een waarde te geven en die na > te gebruiken. Deze InkoopDatumGrens zit echter niet in de database. Hoe los ik dit probleem op een nette manier op?
Titel: Re: Too few parameters.Expected 1.
Bericht door: Peter op 26 juli 2010, 22:40:04
Hallo Jan,

Zonder de exacte code en variabele waardes is het lastig zoeken.
Vervang de query eens door:
"Select * FROM DemonstratieTabel WHERE " & chr(34) & InkoopDatum & chr(34) & " > " & chr(34) & InkoopDatumGrens & chr(34) & " ORDER BY Indicator"

Let op de spatie voor en achter het > teken.


Groeten, Peter
Titel: Re: Too few parameters.Expected 1.
Bericht door: jvdpeet † op 27 juli 2010, 15:55:43
Hoi Peter,
Bedankt voor je reactie. Jouw versie van de query geeft de fout niet, maar ik begrijp niet waarom niet. Wil je me uitleggen wat toevoegen van deze quotes precies doet?
Titel: Re: Too few parameters.Expected 1.
Bericht door: Peter op 27 juli 2010, 19:29:05
Citaat
Wil je me uitleggen wat toevoegen van deze quotes precies doet?
Maar natuurlijk. Het zorgt ervoor dat de variabele waardes ook als een waarde in de query staan en niet gefragmenteerd worden als er bijvoorbeeld spaties in voorkomen, waardoor de query zelf verminkt raakt.
Ook wordt de query gevuld met de variabele-waarde en niet met de variabele-naam.


Peter

 
 

Titel: Re: Too few parameters.Expected 1.
Bericht door: Ronald op 27 juli 2010, 20:38:49
Hoi Peter,

Vervang de query eens door:
"Select * FROM DemonstratieTabel WHERE " & chr(34) & InkoopDatum & chr(34) & " > " & chr(34) & InkoopDatumGrens & chr(34) & " ORDER BY Indicator"

Moet dat niet zijn... :

"Select * FROM DemonstratieTabel WHERE InkoopDatum > " & chr(34) & InkoopDatumGrens & chr(34) & " ORDER BY Indicator"

Ik vermoed dat 'Inkoopdatum' de kolomnaam is, en geen variabele. :P

Maar ook 'InkoopDatumGrens' zou een kolomnaam kunnen zijn. Dat weten we pas als Jan laat zien hoe zijn tabel er precies uitziet. :)

Groeten,

Ronald
Titel: Re: Too few parameters.Expected 1.
Bericht door: jvdpeet † op 27 juli 2010, 21:15:53
Hi Peter,
Bedankt voor je reactie. Ik begrijp de oplossing en heb nog een puzzle waar ik niet uit kom.
Als ik de query uitvoer in de Query Builder doet hij het in beide versies: die van jou en die van mij. Kennelijk is de QueryBuilder niet erg betrouwbaar. Maar goed, de fout is weg, maar er is een andere fout (die niet door VB als fout wordt aangemerkt). Als ik de query Run in de QueryBuilder is de tabel keurig gesorteerd. Voer ik de query uit in de programmacode, dan sorteert hij niet.
Ik gebruik alleen de code van de Databasename en de RecordSource als volgt:
Dim InkoopDatumGrens
InkoopDatumGrens = 20000102
datDemonstratie.DatabaseName = ext(App.Path) & "DATABASE\Portef1.mdb"
datDemonstratie.RecordSource = "Select * FROM DemonstratieTabel WHERE " & Chr(34) & InkoopDatum & Chr(34) & " > " & Chr(34) & InkoopDatumGrens & Chr(34) & " ORDER BY Indicator"
Dit is toch voldoende. Als ik de query typ in de eigenschap RecordSource van Eigenschappen werkte het bij  mij altijd wel. Hij zou het dan dus ook in de code moeten doen?
Titel: Re: Too few parameters.Expected 1.
Bericht door: Peter op 27 juli 2010, 23:50:35
Jan,

Probeer eens de tip van Ronald in deze berichtendraad.

Lukt het dan wel?

Citaat
Als ik de query typ in de eigenschap RecordSource van Eigenschappen   werkte het bij  mij altijd wel. Hij zou het dan dus ook in de code   moeten doen?
Wat gebeurt er als je datDemonstratie.Refresh direct na datDemonstratie.RecordSource = ... zet?


Peter
Titel: Re: Too few parameters.Expected 1.
Bericht door: jvdpeet † op 28 juli 2010, 16:32:59
Hallo Peter,
Als ik dat doe verandert er niets, het werkt nog steeds niet. Als ik de query heb uitgevoerd en dan probeer de gesorteerde records in een array in te lezen krijg ik de foutmelding "No current record" bij uitvragen van de tabel. Na afsluiten en opniew opstarten van het systeem en het programma kreeg ik de de fout "Object variable or With block variable not set". Waar zou dat op kunnen slaan? Volledigheidshalve geef ik hier de code die ik gebruik:
In een in Form_Load van het Main wordt een routine aangeroepen met daarin o.a.
datDemonstratie.DatabaseName = ext(App.Path) & "DATABASE\Portef1.mdb"
datDemonstratie.RecordSource = "DemonstratieTabel"
Deze code is bedoeld om de tabel te vullen en wat andere zaken uit te voeren en deze tabel bevat inderdaad records.
In de routine waarin de query wordt gebruikt heb ik als code:
Dim InkoopBedrag, VerkoopBedrag
frmInvestor.datQueryDemonstratie.DatabaseName = frmInvestor.ext(App.Path) & "DATABASE\Portef1.mdb"
frmInvestor.datQueryDemonstratie.Refresh
Dim InkoopDatumGrens
InkoopDatumGrens = 20000102
frmInvestor.datQueryDemonstratie.RecordSource = "Select * FROM DemonstratieTabel WHERE " & Chr(34) & InkoopDatum & Chr(34) & " > " & Chr(34) & InkoopDatumGrens & Chr(34) & " ORDER BY Indicator"

 
Titel: Re: Too few parameters.Expected 1.
Bericht door: jvdpeet † op 28 juli 2010, 19:35:45
Hoi Ronald,
InkoopDatum en InkoopDatumGrens zijn geen van beide kolomnamen. InkoopDatum is een veld in de tabel en InkoopDatumGrens is een externe variabele (dus geen veld in de tabel).
Titel: Re: Too few parameters.Expected 1.
Bericht door: Peter op 28 juli 2010, 19:53:50
Jan,

De datQueryDemonstratie.Refresh staat op de verkeerde plaats.

Vervang deze code:
Dim InkoopBedrag, VerkoopBedrag
frmInvestor.datQueryDemonstratie.DatabaseName = frmInvestor.ext(App.Path) & "DATABASE\Portef1.mdb"
frmInvestor.datQueryDemonstratie.Refresh
Dim InkoopDatumGrens
InkoopDatumGrens = 20000102
frmInvestor.datQueryDemonstratie.RecordSource  = "Select * FROM DemonstratieTabel WHERE " & Chr(34) &  InkoopDatum & Chr(34) & " > " & Chr(34) &  InkoopDatumGrens & Chr(34) & " ORDER BY Indicator"

door deze code:
Dim InkoopBedrag, VerkoopBedrag
Dim InkoopDatumGrens

frmInvestor.datQueryDemonstratie.DatabaseName = frmInvestor.ext(App.Path) & "DATABASE\Portef1.mdb"
InkoopDatumGrens = 20000102
frmInvestor.datQueryDemonstratie.RecordSource  = "Select * FROM DemonstratieTabel WHERE " & Chr(34) &  InkoopDatum & Chr(34) & " > " & Chr(34) &  InkoopDatumGrens & Chr(34) & " ORDER BY Indicator"
frmInvestor.datQueryDemonstratie.Refresh

Als ik de code overneem is InkoopDatum nog onbekend. Ik neem dat die hetzelfde formaat heeft als InkoopDatumGrens.
Verder zijn de variabelen types niet opgegeven waardoor ze het type Variant worden.
Naar mijn mening is het beter het type te gebruiken dat de waarde in de tabel heeft. In het geval van InkoopDatum en InkoopDatumGrens zou dat het type String kunnen zijn.

Verandert dat iets?


Peter
(Sorry, mijn kennis van SQL is niet al te groot.)
Titel: Re: Too few parameters.Expected 1.
Bericht door: jvdpeet † op 28 juli 2010, 21:25:42
Hi Peter,
Geen probleem, mijn kennis van SQL is evenmin groot, zoals je gemerkt zult hebben.
Je hebt natuurlijk gelijk dat het het beste is variabelen gelijk het juiste type mee te geven. Ik had dat ook gedaan, maar omdat vóór jouw toevoeging van Chr(34) de string niet werd geaccepteerd door VB, ik dacht vanwege de > InkoopDatumGrens, heb ik het type weggehaald.
Je laatste aanwijzing opgevolgd, maar hij blijft "no current record" aangeven.   
Titel: Re: Too few parameters.Expected 1.
Bericht door: Peter op 28 juli 2010, 21:47:32
Citaat
Je laatste aanwijzing opgevolgd, maar hij blijft "no current record" aangeven.
Vermoedelijk is er toch iets mis met de query in de regel:
frmInvestor.datQueryDemonstratie.RecordSource = "Select * FROM   DemonstratieTabel WHERE " & Chr(34) & InkoopDatum & Chr(34)   & " > " & Chr(34) & InkoopDatumGrens & Chr(34) & "   ORDER BY Indicator"

Vervang bovenstaande regel door:
Dim sRS As String
sRS = "Select * FROM   DemonstratieTabel WHERE " & Chr(34) & InkoopDatum & Chr(34)   & " > " & Chr(34) & InkoopDatumGrens & Chr(34) & "   ORDER BY Indicator"
frmInvestor.datQueryDemonstratie.RecordSource = sRS
MsgBox sRS

Wat staat er in de MsgBox?


Peter
Titel: Re: Too few parameters.Expected 1.
Bericht door: Ronald op 28 juli 2010, 23:15:18
Hoi Jan,
InkoopDatum en InkoopDatumGrens zijn geen van beide kolomnamen. InkoopDatum is een veld in de tabel en InkoopDatumGrens is een externe variabele (dus geen veld in de tabel).

Laat ik het dan zo vragen: als je de inhoud van die tabel in Excel zou zetten, wat staat er dan bovenaan in de 1e rij (dat noem ik de kolomnamen)?
En wat staat er dan vervolgens daaronder *in* de tabel?

Ik bedoel dus bijvoorbeeld zoiets:

Productcode   Productomschrijving   Inkoopdatum   Stuks
A123          Sigarenuiteigendozen  28-07-2010    12

Groeten,

Ronald
Titel: Re: Too few parameters.Expected 1.
Bericht door: jvdpeet † op 29 juli 2010, 01:18:13
Ronald,
Als ik de tabel bekijk met Visual Data Manager heeft de tabel alleen maar rijen. Maar als je meerdere records in een spreadsheet wilt zetten worden de rijen kolommen en bestaat elke regel uit de samenstellende velden van de rijen. In die zin kun je van kolommen spreken.
 
 
m.vr.gr.,
Jan
Titel: Re: Too few parameters.Expected 1.
Bericht door: jvdpeet † op 29 juli 2010, 01:36:34
Peter,
Als ik deze vervanging uitvoer en het programma draai krijg ik in de MsgBox
"SELECT * FROM DemonstratieTabel WHERE "" > "20000102" ORDER BY Indicator" en geeft het programma de fout "Object variable or With block variable not set". Hij leest en sorteert dus kennelijk de tabel niet, want de MsgBox geeft InkoopDatum als leeg.
Titel: Re: Too few parameters.Expected 1.
Bericht door: Peter op 29 juli 2010, 20:57:07
Jan,

Citaat
in de MsgBox
"SELECT * FROM DemonstratieTabel WHERE "" > "20000102" ORDER BY Indicator"
Dat dacht ik al. De variabele InkoopDatum is leeg en dat geeft dergelijke fouten.
Controleer dus je code of zorg ervoor dat de query niet uitgevoerd wordt als InkoopDatum leeg is.


Peter
Titel: Re: Too few parameters.Expected 1.
Bericht door: jvdpeet † op 30 juli 2010, 13:01:17
Hoi Peter,
De InkoopDatum is in de tabel nergens leeg of 0. Het lijkt er dus op dat hij de tabel niet herkent of kan vinden of de tabel is op dat moment niet beschikbaar. Dat lijkt mij echter stug, want de database en de recordsource worden ingesteld in de Form_Load van het hoofdformulier en dit stadium is het programma allang voorbij wanneer de query wordt uitgevoerd.
Titel: Re: Too few parameters.Expected 1.
Bericht door: Peter op 30 juli 2010, 18:58:00
Hoi Jan,

Volgens mij zitten we niet op 1 spoor. Even een paar vragen.
Wat is nu precies 'InkoopDatum'?
a) Is dat een string die ergens in je VB programma gedeclareerd is, zoals ik dat begrijp in je 1e bericht:
Citaat
Nog iets dat mogelijk van belang kan zijn:
De InkoopDatum is een string.
Zoja, waar wordt InkoopDatum dan gevuld.

b) is 'InkoopDatum' een kolom in de tabel zoals Ronald aangaf in bericht #12.
In dat geval moet de query zijn:
sRS = "Select * FROM DemonstratieTabel WHERE InkoopDatum > " & Chr(34) & InkoopDatumGrens &   Chr(34) & "   ORDER BY Indicator"

Lukt het dan wel?
Graag alle vragen beantwoorden.

Nog een tip:
Log de query en eventueele errors in een logbestand inclusief de sub of functienaam waar de code in staat. Dan kun je beter analyseren wat je code uitvoert.


Peter
 
Titel: Re: Too few parameters.Expected 1.
Bericht door: jvdpeet † op 30 juli 2010, 20:43:21
Hoi Peter,
Hierbij het gevraagde, alsmede twee subs die het geheel in een bepaald kader plaatsen.
InkoopDatum is dus een kolom in Tabel DemonstratieTabel en is in Visual Data Manager gedefinieerd als string.
Titel: Re: Too few parameters.Expected 1.
Bericht door: Ronald op 30 juli 2010, 21:26:54
Hoi Jan,

Ok, het is dus toch de naam van een kolom in de tabel. Die moet dan in ieder geval NIET variabel zijn. :D

Select * FROM DemonstratieTabel WHERE InkoopDatum > " & Chr(34)   & InkoopDatumGrens &  Chr(34) & " ORDER BY Indicator"
Dit zou al beter moeten werken. Van belang kan nog wel zijn welk datatype de InkoopDatum kolom heeft. Dat kun je eventueel in Access nakijken, bij het opmaken van de tabel. Als het een 'echte' datum is, dan zou je nog kunnen proberen met 'InkoopDatumGrens = "2000-10-02".

Wat mij in de code opvalt, is dat je bij het uitlezen van de tabel voor een deel andere kolommen uitleest dan er bij het vullen van de tabel worden aangesproken. Bijvoorbeeld de "NaamFonds" kolom: deze wordt opgevraagd bij het uitlezen, maar niet gevuld bij het vullen van de tabel. Of heeft "NaamFonds" een standaard waarde?

Groeten,

Ronald
Titel: Re: Too few parameters.Expected 1.
Bericht door: jvdpeet † op 30 juli 2010, 22:22:17
Hi Ronald,
De InkoopDatum is gedefinieerd als string, omdat met het gebruikelijke datumformaat
dd-mm-jjjj zo omslachtig  te sorteren valt. Op datums wordt in mijn programma heel vaak gesorteerd, omdat alle bestanden die ik gebruik de datum al in die stringvorm hebben. Dus gewoon een kwestie van gemakzucht (of luiheid als je wilt).   
Je opmerking dat bij het aanmaken van de tabel veld Symbool gebruikt wordt dat bij het ophalen NaamFonds heet is juist, maar deze worden vaak door elkaar gebruikt. Maar om te voorkomen dat de gegevens uit dit veld gewist worden bij veranderen van de naam van het veld in de tabel heb ik het maar zo gelaten. Het was de bedoeling deze aan het einde van de rit aan elkaar gelijk te maken en uit te proberen of de inhoud al dan niet gewist wordt bij veranderen van naam.
 
 
groetjes,
 
Jan
Titel: Re: Too few parameters.Expected 1.
Bericht door: Peter op 31 juli 2010, 13:57:36
Hoi Jan,

In je code mis ik weer het database .Refresh commando.
Als ik dat toevoeg lukt het hier wel en blijft de melding 'error 91...' en 'no current record' weg.
Hieronder de aangepaste en opgeschoonde code:
Public Sub OphalenDemonstratieTabel(TransactieMatrix())

On Error GoTo FoutOphalenDemonstratieTabel

Dim InkoopBedrag As Currency, VerkoopBedrag As Currency
Dim InkoopDatumGrens As String
Dim M As Integer

With frmInvestor.datQueryDemonstratie
   .DatabaseName = frmInvestor.ext(App.Path) & "DATABASE\Portef1.mdb"
   InkoopDatumGrens = "20000102"
   Dim sRS As String
   sRS = "Select * FROM DemonstratieTabel WHERE InkoopDatum > " & Chr(34) & InkoopDatumGrens & Chr(34) & " ORDER BY Indicator"
   .RecordSource = sRS
   .Refresh
   M = 0
   Do While .Recordset.EOF = False
   If .Recordset("InkoopAantal") <> 0 And .Recordset("VerkoopAantal") <> 0 And .Recordset("InkoopDatum") > 20001002 And .Recordset("VerkoopDatum") > 20001003 Then
      M = M + 1
      TransactieMatrix(M, 0) = .Recordset("NaamFonds")
      TransactieMatrix(M, 1) = .Recordset("IndicatorTekst")
      TransactieMatrix(M, 2) = .Recordset("InkoopAantal")
      TransactieMatrix(M, 3) = .Recordset("VerkoopAantal") * .Recordset("VerkoopKoers") - .Recordset("VerkoopAantal")
      TransactieMatrix(M, 4) = .Recordset("InkoopKoers")
      TransactieMatrix(M, 5) = .Recordset("VerkoopKoers")
      TransactieMatrix(M, 6) = .Recordset("InkoopKosten")
      TransactieMatrix(M, 7) = .Recordset("VerkoopKosten")
      TransactieMatrix(M, 8) = .Recordset("InkoopBedrag")
      TransactieMatrix(M, 9) = .Recordset("VerkoopBedrag")
      TransactieMatrix(M, 10) = .Recordset("InkoopDatum")
      TransactieMatrix(M, 11) = .Recordset("VerkoopDatum")
      TransactieMatrix(M, 12) = .Recordset("TransactieSoort")
      TransactieMatrix(M, 13) = .Recordset("HoldingPeriod")
      TransactieMatrix(M, 14) = .Recordset("MFE")
      TransactieMatrix(M, 15) = .Recordset("MAE")
   End If
   .Recordset.MoveNext
Loop
End With
Exit Sub

FoutOphalenDemonstratieTabel:
    FoutBron = Err.Number & " " & Err.Description
    Call frmInvestor.WriteLog("---< " & sRS & " geeft fout " & FoutBron & " in OphalenDemonstratieTabel")
    If FoutBron <> VorigeFout Then
'        Call frmInvestor.WriteLOG("---< " & App.Title & " geeft >---" & Foutbron)
        VorigeFout = FoutBron
        Resume Next
    End If
End Sub


Lukt het nu wel?


Peter
Titel: Re: Too few parameters.Expected 1.
Bericht door: jvdpeet † op 31 juli 2010, 17:57:57
Hoi Peter,
Het is nu gelukt. De tabel wordt keurig gesorteerd en de fouten blijven weg. Heel erg bedankt voor je hulp.
Het valt met je SQL-kennis dus nog wel mee. Rest mij nog een vraag: In welke gevallen is het nodig een Refresh te geven? Ik heb in mijn programma nog een paar andere queries en in geen van deze gevallen was een Refresh nodig.
 
Titel: Re: Too few parameters.Expected 1.
Bericht door: jvdpeet † op 31 juli 2010, 18:01:52
Hoi Ronald,
De query werkt nu goed en zonder fouten. Ik was de Refresh vergeten en Peter maakte mij daarop opmerkzaam. Je opmerking over NaamFonds in de ene routine en Symbool in de andere routine was juist. Het was inderdaad een fout.
Hartelijk bedankt voor je hulp.
 
Titel: Re: Too few parameters.Expected 1.
Bericht door: Peter op 31 juli 2010, 21:27:29
Jan,

Citaat
In welke gevallen is het nodig een Refresh te geven?
Als .DatabaseName of.RecordSource verandert. Het commando .Refresh zorg voor een verversing van je database component in VB. Met de eerste 2 commando's wordt alleen een waarde ingesteld en dus niet automatisch je database component ververst.

Nog een opmerking:
In de sub AanmakenDemonstratieTabel staat 2 keer de regel
     frmInvestor.datDemonstratie.Recordset("InkoopAantal") = TransactieMatrix(i, 2)


groeten, Peter