DLookup werkt wel en werkt niet

Status
Niet open voor verdere reacties.

Rap261

Gebruiker
Lid geworden
2 sep 2008
Berichten
273
Hoi,

Wanneer ik de code
Code:
Me.Text1 = DLookup ("veld1","query1")
in een lege db zet werkt dit prima. De gegevens in Query1 en dan veld 1 worden getoond in Text1

Echter, Wanneer ik dezelfde code in mijn gebouwde db zet (14mb groot) krijg ik de foutmelding:

Run-time error '2001'
You canceled the previous operation

Vervolgens spring het scherm met de macro's open en wordt de code geel opgelicht.
Extra info: wanneer ik op de code ga staan verschijnt de tekst "Me.Text1 = Null"

Wie weet wat er mis is of wat ik fout doe?
Alvast bedankt
 
Laatst bewerkt:
De foutmelding geeft aan dat het tekstveld nog niet is gevuld, en dat klopt uiteraard, omdat de procedure op dat moment een fout tegenkomt, dus hij kan dat veld niet vullen.

Interessanter is het om te bekijken waarmee het tekstveld gevuld zou moeten worden:
het zou bijvoorbeeld kunnen, dat de dLookUp geen waarde heeft om te retourneren, wat een fout oplevert.

Om te voorkomen dat een procedure op een Null-waarde blijft hangen, kun je het commando

On Error Resume Next

erboven zetten; goede kans dat de procedure dan doorgaat met het volgende record.

Eventueel kun je de dLookUp eerst aan een variabele toekennen, en vervolgens een check doen op de variabele, en die vervolgens aan me.Text1 toekennen.
Door een paar stapjes in te bouwen, kun je, bijvoorbeeld na het toewijzen van de lookup aan de variabele, een onderbrekingspunt vastleggen, zodat je stap voor stap per record kunt bekijken wat er eigenlijk wordt ingelezen. Vaak zie je dan al vrij snel wat er aan de hand is.

Michel
 
Michel,

Bedankt voor je reactie.

Het punt is dat het tekstveld (in de query) wel is gevuld. Sterker nog, voor het weekend werkte het wel! Ik weet niet wat er mis is maar wanneer ik een nieuwe db maak met dezelfde code werkt dit wel. Je zou dus zeggen dat het aan de db ligt.
Ik heb al de eigenschappen van de form en combobox (waarin de codes zitten) bekeken t.o.v. een nieuwe db maar vind geen afwijkingen.

Wanneer ik jou code On Error Resume Next erboven zet krijg ik niet meer de foutmelding. De waardes laat ie ook nog steeds niet zien

In je laatste optie heb ik me nog niet verdiept.
Is er trouwens geen ander manier om de waardes uit een query in een textbox te krijgen?

Ik ga weer verder met uitzoeken...
Thanx
 
Ik heb DLoopup verbannen in mijn databases. Ik vind DLookup te traag plus dat ik daarbij uit data uit andere resources moet halen dan access. Ik werk met recordsets en dat werkt altijd.

Voorbeeld:
Code:
Dim rst As New ADODB.Recordset  'hierin bepaal je de recordset
Dim strSql As String 'Hierin plaats je de SQLcode van je query

strSql = "SELECT [Tbl01-Fabrikant].FabrikantID, [Tbl01-Fabrikant].Fabrikantnaam FROM [Tbl01-Fabrikant]";   

rst.Open strSql, CurrentProject.Connection, adOpenStatic, adLockReadOnly, adCmdText 'Openen van recordset, zo ingesteld dat alleen gelezen gaat worden zonder tussentijdse check of gegevens zijn gewijzigd. Dit ivm performance (scheelt een factor 100). Tevens is ook een bepalende factor of je goede indexen op je tabellen legt. 

'Ophalen van gegevens. Afhankelijk hoe je de query hebt hebt opgebouwd (of je maar 1 waarde of meerdere hebt) kan je navigeren door je rst. Ik ga er nu vanuit dat er maar 1 waarde mogelijk is

txtFabID = rst!FabrikantID  'Ophalen van FabId uit de rst 
txtFabNaam = rst!Fabrikantnaam 'Ophalen van FabNaam van de rst

rst.Close 'Sluiten van rst

Ondanks dat het een hele lap aan code is gaat dit enorm snel.
 
Laatst bewerkt:
Ik ben het eigenlijk wel met Floor eens, zelf gebruik ik DLookup ook niet, onder andere vanwege de enorme traagheid ervan.
Als je met On Error Resume Next nu helemaal niks krijgt, betekent dat dat er dus iets anders aan de hand is, ook al omdat je zeker weet dat er een tekstwaarde uit moet komen, en de functie in een andere database wel werkt.

Ik zou op dit moment dan ook niet weten wat er precies fout is.. Ik heb wel eens problemen gehad met ingebouwde standaardfuncties van Access, die bij bepaalde db's ineens fouten gaven. Een functie als Left gaf dan bijvoorbeeld ook een foutmelding... Bleek dat bepaalde geladen bibliotheken blijkbaar de precaire balans in een db goed overhoop kunnen gooien; na verwijderen van wat (niet direct noodzakelijke) bibliotheken deed alles het weer! Misschien ligt daar bij jou ook het probleem?

Michel
 
Code:
Beide bedankt voor jullie reactie!
Ik heb zelf ook gemerkt dat het met DLookup enorm traag wordt. Maar goed ik krijg het nog steeds niet aan de praat.
Als jou methode ook werkt Floor E en ook nog eens zonder vertraging dan wil ik die invoeren.

Ik zal even de situatie schetsen

Situatie:
Ik heb een Combobox met daarin 3 opties. Naast de Combobox staan 3 Textboxen. Als men een keus maakt in de Combo moeten bepaalde gegegevens uit een query naar voren komen en zichtbaar worden in de Textboxen. De Combo heb ik werken via een Followlink senario

Vraag:
Bijgaand treft je jou code aangepast door mij. Enkele regel heb ik niet kunnen veranderen omdat ik niet weet wat ik hier moet invullen
Kun je me helpen met het verder afmaken? Ik heb mijn aanpassingen tussen @ gezet

Code:
Dim rst As New ADODB.Recordset  @Vervang ik ADODB door de naam van mijn query?@
Dim strSql As String 'Hierin plaats je de SQLcode van je query @Waar vind ik deze?@

strSql = "SELECT [@De naam van mijn query@].FabrikantID @Waar vind ik dit?@, [@De naam van mijn query@].Fabrikantnaam @Waar vind ik dit@ FROM [@De naam van mijn query@]";

rst.Open strSql, CurrentProject.Connection, adOpenStatic, adLockReadOnly, adCmdText 'Openen van recordset, zo ingesteld dat alleen gelezen gaat worden zonder tussentijdse check of gegevens zijn gewijzigd. Dit ivm performance (scheelt een factor 100). Tevens is ook een bepalende factor of je goede indexen op je tabellen legt.

'Ophalen van gegevens. Afhankelijk hoe je de query hebt hebt opgebouwd (of je maar 1 waarde of meerdere hebt) kan je navigeren door je rst. Ik ga er nu vanuit dat er maar 1 waarde mogelijk is

@Mijn TextBox@ = rst!FabrikantID  'Ophalen van FabId uit de rst
@Mijn TextBox@ = rst!@De naam van mijn Query@ 'Ophalen van FabNaam van de rst

rst.Close 'Sluiten van rst
 
Laatst bewerkt:
Allereerst:
Het volgende is belangrijk voor een goede werking, plaats de code onder:
Klik met rechtermuisknop op je combox > eigenschappen > tabblad gebeurtenis > na bijwerken

En dan nu antwoord op je vragen, ik behandel ze stuk voor stuk:
Dim rst As New ADODB.Recordset @Vervang ik ADODB door de naam van mijn query?@
Nee. Niet vervangen. We geven hier aan dat we ADODB gaan werken

Dim strSql As String 'Hierin plaats je de SQLcode van je query @Waar vind ik deze?@
Ik definieer hier een variabele van het type string. De naam van de van de variabele heb ik strSql genoemd. Ik had ook jan of miep kunnen doen maar de eerste 3 letters geven aan dat dit een string is (makkelijk tijdens verwerken), had ik kees en miep genomen was het strKees, strMiep enz enz. Dim en String niet veranderen dus.
strSql = "SELECT [@De naam van mijn query@].FabrikantID @Waar vind ik dit?@, [@De naam van mijn query@].Fabrikantnaam @Waar vind ik dit@ FROM [@De naam van mijn query@]";
De SQL code kan kopieren via query ontwerp. Maak je query aan zoals je normaal doet, ga daarna naar weergave > SQL. Kopieer deze code en plaats deze tussen de quotes. Let op: vervang de dubbele quotes in je SQL weergave door enkele.

@Mijn TextBox@ = rst!@De naam van mijn Query@ 'Ophalen van FabNaam van de rst
rst is afkomstig van rst. Hierboven heb je gelezen dat je de SQLcode kan kopieren uit je query ontwerp. Als je in dit query ontwerp gaat kijken (normale weergave) zie in de rij "Veld" allemaal kolomnamen staan. De kolom naam zet je achter het uitroepteken.
 
Ik heb de code aangepast in onderstaand:
Zijn mijn opmerkingen achter en onder de regels correct?

Code:
Dim rst As New ADODB.Recordset  'ADODB met rust gelaten
Dim strSql As String 'Deze regel ook gelaten voor wat het is maar ik zou de naam SQL kunnen veranderen

strSql = "SELECT SELECT Count([Orderprocessing Lopend (Reguliere orders Stukken)].[ISIN code]) AS [CountOfISIN code], Sum([Orderprocessing Lopend (Reguliere orders Stukken)].[Totaal stuks]) AS [SumOfTotaal stuks], Sum([Orderprocessing Lopend (Reguliere orders Stukken)].[(Indicatie) orderbedrag]) AS [SumOf(Indicatie) orderbedrag]"
FROM [Orderprocessing Lopend (Reguliere orders Stukken)];"
'Hierin de gehele SQL code geplakt uit de weergave > SQL. Wel blijft de regel From... in rood gekleurd

rst.Open strSql, CurrentProject.Connection, adOpenStatic, adLockReadOnly, adCmdText 'Openen van recordset, zo ingesteld dat alleen gelezen gaat worden zonder tussentijdse check of gegevens zijn gewijzigd. Dit ivm performance (scheelt een factor 100). Tevens is ook een bepalende factor of je goede indexen op je tabellen legt.

'Ophalen van gegevens. Afhankelijk hoe je de query hebt hebt opgebouwd (of je maar 1 waarde of meerdere hebt) kan je navigeren door je rst. Ik ga er nu vanuit dat er maar 1 waarde mogelijk is

TextOrderprocessing1_1 = rst!Isincode 
TextOrderprocessing2_2 = rst!Totaalstuks 
 'TextOrderprocessing1_1 en 2_2 zijn de namen van mijn textbox
 'Isincode en Totaalstuks zijn de Veldnamen

rst.Close 'Sluiten van rst


Na een keuze uit de combo blijft hij hangen op de regel : FROM [Orderprocessing Lopend (Reguliere orders Stukken)];"
Hoe krijg ik dit goed? dit hoort volgens mij nog bij de SQL code
 
strSql = "SELECT SELECT Count([Orderprocessing Lopend (Reguliere orders Stukken)].[ISIN code]) AS [CountOfISIN code], Sum([Orderprocessing Lopend (Reguliere orders Stukken)].[Totaal stuks]) AS [SumOfTotaal stuks], Sum([Orderprocessing Lopend (Reguliere orders Stukken)].[(Indicatie) orderbedrag]) AS [SumOf(Indicatie) orderbedrag]"
FROM [Orderprocessing Lopend (Reguliere orders Stukken)];"

De regel blijft rood omdat de regel wordt afgebroken:
Verander orderbedrag]" in orderbedrag] " _ (inclusief de spatie voor en na de dubbele quote)
Voor from zet je & "
 
Thanx Floor E, dat probleem is nu opgelost

Wel nog twee vragen:

1) Moet ik de naam strSQL veranderen in de naam van mijn query, bv strOrders of is dit niet nodig?
2) De macro blijft nu hangen op de Textbox regel: TextOrderprocessing1_1 = rst!Aantal
Ik heb geprobeerd de kolom Aantal al tussen " " te zetten maar dit maakt niet uit.
Wat doe ik fout?
 
De naam strSql hoef je niet veranderen.
Heeft rst!Aantal wel waarde? Of is er helemaal niks (ook geen 0) ingevuld?
 
Ok dan laat ik SQL voor wat het is

rst!Aantal heeft wel een waarde ja. ik moet het getal 14 krijgen..
Ik heb de code in een test db gezet waarin maar 1 query en tabel zitten en daar geeft ie dezelfde foutmelding

hieronder de code zoals ik hem nu heb
Code:
Dim rst As New ADODB.Recordset
Dim strSQL As String
strSQL = "SELECT Count([Orderprocessing Lopend (Reguliere orders Stukken)].[ISIN code]) AS [CountOfISIN code], Sum([Orderprocessing Lopend (Reguliere orders Stukken)].[Totaal stuks]) AS [SumOfTotaal stuks], Sum([Orderprocessing Lopend (Reguliere orders Stukken)].[(Indicatie) orderbedrag]) AS [SumOf(Indicatie) orderbedrag]" _
& "FROM [Orderprocessing Lopend (Reguliere orders Stukken)];"

'rst.Open strSql, CurrentProject.Connection, adOpenStatic, adLockReadOnly, adCmdText 'Openen van recordset, zo ingesteld dat alleen gelezen gaat worden zonder tussentijdse check of gegevens zijn gewijzigd. Dit ivm performance (scheelt een factor 100). Tevens is ook een bepalende factor of je goede indexen op je tabellen legt."
TextOrderprocessing1_1 = rst!Aantal
rst.Close

Bijgaand een test bestandje met daarin de code
 

Bijlagen

Laatst bewerkt:
Hoi Ralph,

In mijn Access 2K db kon ik jouw bestand niet openen, maar ik zag wel in je code dat er een quootje staat voor je SQL statement:

'rst.Open strSql, CurrentProject

Die moet daar uiteraard weg, want anders beschouwt Access de hele regel als commentaar. En dan wordt de recordset niet geopend, en heb je dus geen resultaat.

Hopelijk was dat het probleem...

Michel
 
Nee Michel, dit heeft niet geholpen.

Ik heb de ' weggehaald maar nu blijft ie weer hangen op deze regel:
rst.Open strSQL, CurrentProject.Connection, adOpenStatic, adLockReadOnly, adCmdText

Hier nogmaals de code van het test bestandje;
Code:
Dim rst As New ADODB.Recordset
Dim strSQL As String
strSQL = "SELECT SELECT Count(Table1.Field1) AS CountOfField1, Sum(Table1.Field2) AS SumOfField2" _
& "FROM Table1;"
rst.Open strSQL, CurrentProject.Connection, adOpenStatic, adLockReadOnly, adCmdText
Text1 = rst!countoffield1
rst.Close

Lastig zeker?
 
AS SumOfField2" _
na de 2 moet nog een spatie komen (dus voor de de dubbele quote)
 
Ik heb even in je bijlage gekeken. Hierbij de goede code:

Code:
Private Sub FollowLink1(ByVal intIndex As Integer)
Select Case intIndex
Case 0
Dim rst As New ADODB.Recordset
Dim strQuery1 As String
strQuery1 = "SELECT Count(Table1.Field1) AS CountOfField1, Sum(Table1.Field2) AS SumOfField2 FROM Table1;"

rst.Open strQuery1, CurrentProject.Connection, adOpenStatic, adLockReadOnly, adCmdText 'Openen van recordset, zo ingesteld dat alleen gelezen gaat worden zonder tussentijdse check of gegevens zijn gewijzigd. Dit ivm performance (scheelt een factor 100). Tevens is ook een bepalende factor of je goede indexen op je tabellen legt."
Text1 = rst!countoffield1
rst.Close

Case 1
Me.Text2 = DLookup("sumoffield2", "query1")
End Select
End Sub
 
Floor,

Hij werkt nu wel in de test db. Ik ben nog bezig hem werkend te maken in de productie db.
Kan het zo zijn dat wanneer je een query maakt Access op dat moment de namen van de velden vastlegd? Als je daarna de naam veranderd en je laat de code naar de nieuwe naam zoeken dan herkend ie het niet
Volgens mij is dat het probleem met de regel: Text1 = rst!countoffield1 die af en toe niet werkt

Wanneer ik in een case meerder boxen wilt vullen moet ik dan nog een aanpassing doen in de code. Zoals bijvoorbeeld Followlink1, Followlink2
 
Ik snap er werkelijk geen donder meer van

Ik gebruik de code in een test db en het werkt maar wanneer ik de SQL code aanpas krijg ik alleen maar fout meldingen.

rst.Open strQuery1, CurrentProject.Connection, adOpenStatic, adLockReadOnly, adCmdText
schijnt niet goed te zijn
 
Gebruik je overal wel strQuery? In je voorbeeld dat je gepost hebt gebruik je strSql en strQuery door elkaar.
 
Ik weet het maar dat komt omdat ik met meerdere tegelijk bezig ben.

onderstaand de code waarbij ik de regel rst.Open strQuery1, CurrentProject.Connection, adOpenStatic, adLockReadOnly, adCmdText als foutmelding krijg

Code:
Dim rst As New ADODB.Recordset
Dim strQuery1 As String
strQuery1 = "SELECT Count([Orderprocessing Lopend (Reguliere orders Stukken)].Tijd) AS CountOfTijd" _
& "FROM [Orderprocessing Lopend (Reguliere orders Stukken)];"
rst.Open strQuery1, CurrentProject.Connection, adOpenStatic, adLockReadOnly, adCmdText
TextOrderprocessing1_1 = rst!CountofTijd
rst.Close

kan het niet aan de instellingen liggen ofzo?
Ik heb/had hetzelfde probleem met de DLookup functie. In een test db werkt het wel maar in de grote van 14 mb werkt het niet
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan