Zelfde formulier gebruiken voor query

  • Onderwerp starter Onderwerp starter Jors
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

Jors

Gebruiker
Lid geworden
1 okt 2006
Berichten
142
Hallo,
wederom een vraag over mijn database. Deze werkt nu (na alle hulp die ik hier heb gehad) goed, alleen zit ik nog met een verbeterpunt.

Momenteel gebruik ik een formulier als hoofdformulier met daarin een subformulier met prijsgegevens.

Hiernaast gebruik ik een formulier met tekstvakjes om te kunnen zoeken. Hiertoe heb ik het eerder genoemde hoofdformulier gekopieerd en onder Gegevens -> recordbron een query ingesteld waarbij ik als criteria verwijs naar de namen van de tekstvakjes op het zoekformulier.

Dit werkt allemaal prima. Nu zit ik alleen met het volgende: als ik nu iets wijzig in het normale hoofdformulier moet ik dit ook nog een keer wijzigen op het gekopieerde "zoekformulier". Omdat ik de opmaak en alles verder allemaal hetzelfde wil houden op beide formulieren is dit soms omslachtig omdat ik alles tweemaal moet doen.

Is er een (eenvoudige) manier om de query toe te passen op het hoofdformulier wanneer er in gezocht wordt, en deze query niet toe te passen wanneer ik het formulier 'gewoon' open?

Ik hoop dat ik de situatie duidelijk geschetst heb. Zo niet, dan hoor ik dat graag.

Bvd
 
Helemaal snappen doe ik het niet, vrees ik.... Als je twee formulieren hebt die qua indeling identiek zijn, dan moet je ze alletwee apart aanpassen als er iets in de bron verandert. Daarom is het denk ik slimmer om met één formulier te werken, die je op je startformulier met verschillende knoppen opent in verschillende modi door een opstartparameter mee te geven. Zo houd je één formulier, en bespaar je jezelf dus een hoop werk.
Om een formulier te openen in toevoegmodus:
Code:
    DoCmd.OpenForm stDocName, , , , acFormAdd

Om een formulier te openen in bewerkingsmodus:
Code:
    DoCmd.OpenForm stDocName, , , , acFormEdit
 
Hhmm bedankt voor je reactie, maar ik geloof dat ik iets anders bedoel. Je hebt gelijk dat ik beter 1 formulier kan gebruiken; daar wil ik ook naar toe.

Ik wil alleen met een knop een query kunnen uitvoeren op hetzelfde formulier en dit lukt me niet.

Want ik tot nu toe heb is het volgende:

Code:
Dim db As dao.Database
Dim qdf As dao.QueryDef
Dim strSQL As String
Set db = CurrentDb
Set qdf = db.QueryDefs
strSQL = "SELECT tblMeubilair.Fabrikant, tblMeubilair.Model, tblMeubilair.[Categorie nr], tblMeubilair.[Subcategorie nr], tblMeubilair.[Omschrijving standaarduitvoering], tblMeubilair.GemPrijs " & _
"FROM tblMeubilair WHERE (((tblMeubilair.Fabrikant) Like " * " & [Forms]![frmZoekopdracht].[qFabrikant1] & " * ") And ((tblMeubilair.Model) Like [Forms]![frmZoekopdracht].[qModel1] & " * ") And ((tblMeubilair.[Categorie nr]) Like [Forms]![frmZoekopdracht].[qCatnr1] & " * ") And ((tblMeubilair.[Subcategorie nr]) Like [Forms]![frmZoekopdracht].[qSubcatnr1] & " * ") And ((tblMeubilair.[Omschrijving standaarduitvoering]) Like " * " & [Forms].[frmZoekopdracht].[qOmschr1] & " * ") And ((tblMeubilair.GemPrijs) < [Forms]![frmZoekopdracht].[qMaxPrijs1] And (tblMeubilair.GemPrijs) > [Forms]![frmZoekopdracht].[qMinPrijs1]))" & _
"ORDER BY tblMeubilair.[Categorie nr], tblMeubilair.[Subcategorie nr], tblMeubilair.Fabrikant, tblMeubilair.Model;"
qdf.SQL = strSQL
DoCmd.OpenForm "frmMeubilair", acNormal

Volgens mij ben ik op de goede weg maar ergens gaat iets fout, want ik krijg de volgende melding:

Typen komen niet met elkaar overeen.

De plek waar ik deze info vandaag heeft, geeft achter "Set qdf = db.QueryDefs" nog een naam van een query. Maar het is mij niet geheel duidelijk waar deze naar moet verwijzen.

Hopelijk is mijn vraag nu duidelijker..
 
Om te beginnen vraag ik mij af of je query wel werkt.... ik heb zo mijn twijfels.
Het qdf probleem is simpel; als je een querydef definieert, moet je een query hebben waarin je de query kan opslaan. En die heb je niet. Volgens mij moet dit beter werken (met aangepaste sql):

Code:
Sub testje()
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim strSQL As String
Set db = CurrentDb
strSQL = "SELECT Fabrikant, Model, [Categorie nr], [Subcategorie nr], [Omschrijving standaarduitvoering], GemPrijs " _
    & "FROM tblMeubilair " _
    & "WHERE ((Fabrikant Like '" & [Forms]![frmZoekopdracht].[qFabrikant1] & "*')" _
    & "And (Model Like '" & [Forms]![frmZoekopdracht].[qModel1] & "*')" _
    & "And ([Categorie nr] Like '" & [Forms]![frmZoekopdracht].[qCatnr1] & "*') " _
    & "And ([Subcategorie nr] Like '" & [Forms]![frmZoekopdracht].[qSubcatnr1] & " *')" _
    & "And ([Omschrijving standaarduitvoering] Like '*" & [Forms].[frmZoekopdracht].[qOmschr1] & " *)" _
    & "And (GemPrijs < " & [Forms]![frmZoekopdracht].[qMaxPrijs1] & " And GemPrijs > " & [Forms]![frmZoekopdracht].[qMinPrijs1] & ")) " _
    & "ORDER BY [Categorie nr], [Subcategorie nr], Fabrikant, Model;"
Set qdf = db.CreateQueryDef("NieuweQuery", strSQL)
DoCmd.OpenForm "frmMeubilair", acNormal
End Sub

Overigens vraag ik me af waarom je wildcards in de keuzelijstenfiltering gebruikt. Een keuzelijst gebruik je juist om een volledige waarde te selecteren...
 
Die query werkt op zichzelf wel.. Als ik hem gewoon als query zelf uitvoer doet ie t wel. Als ik deze open op mijn zoekformulier verschijnen de juiste records.. Dus ik neem toch aan dat ie om te zetten moet zijn als code..

Maar op de manier die je net liet zien werkt ie niet... Ik krijg wederom een foutmelding, nu: "Deze eigenschap of methode wordt niet ondersteund door dit object"

Die wildcards zijn inderdaad compleet overbodig, die zal ik weghalen.
 
Laatst bewerkt:
Dat de originele query zelf wel werkt, snap ik ook wel, want die heb je in het ontwerpscherm zo gemaakt door de formuliervelden aan te roepen in het criteriumveld. Alleen: als je een query opbouwt via VBA moet je niet de verwijzing naar he formulierveld gebruiken, maar de waarde van dat formulierveld. En daarvoor is de aanpassing dus bedoeld. Als je de Like variant weghaalt, wordt het wel overzichtelijker:

Code:
Sub testje()
Dim db As Database
Dim qdf As QueryDef
Dim strSQL As String
Set db = CurrentDb()
strSQL = "SELECT Fabrikant, Model, [Categorie nr], [Subcategorie nr], [Omschrijving standaarduitvoering], GemPrijs " _
    & "FROM tblMeubilair " _
    & "WHERE ((Fabrikant = " & [Forms]![frmZoekopdracht].[qFabrikant1] & ")" _
    & "And (Model = " & [Forms]![frmZoekopdracht].[qModel1] & "*)" _
    & "And ([Categorie nr] = " & [Forms]![frmZoekopdracht].[qCatnr1] & ") " _
    & "And ([Subcategorie nr] = " & [Forms]![frmZoekopdracht].[qSubcatnr1] & ")" _
    & "And ([Omschrijving standaarduitvoering] = " & [Forms].[frmZoekopdracht].[qOmschr1] & ")" _
    & "And (GemPrijs < " & [Forms]![frmZoekopdracht].[qMaxPrijs1] & " And GemPrijs > " & [Forms]![frmZoekopdracht].[qMinPrijs1] & ")) " _
    & "ORDER BY [Categorie nr], [Subcategorie nr], Fabrikant, Model;"
[B]Dim tmp
tmp = InputBox("", "", strSQL)
[/B]Set qdf = db.CreateQueryDef("NieuweQuery", strSQL)
DoCmd.OpenForm "frmMeubilair", acNormal
End Sub

Kijk eens wat er gebeurt als je de tekenreeks uit de inputbox in een nieuwe query plakt. Je zou in ieder geval een werkende query moeten krijgen. Geeft de SQL fouten, dan kun je die aan de hand van de SQL wel herkennen, en aanpassen in de VBA code. Het gaat dan vaak om ontbrekende spaties, waardoor commando's aan elkaar geplakt worden, of ontbrekende quootjes bij tekstvelden.
 
Dat de originele query zelf wel werkt, snap ik ook wel, want die heb je in het ontwerpscherm zo gemaakt door de formuliervelden aan te roepen in het criteriumveld. Alleen: als je een query opbouwt via VBA moet je niet de verwijzing naar he formulierveld gebruiken, maar de waarde van dat formulierveld. En daarvoor is de aanpassing dus bedoeld.

Ok excuus, dat wist ik niet.

Maar ik krijg nog steeds de zelfde foutmelding...

Namelijk:

Fout 438 tijdens uitvoering:

Deze eigenschap of methode wordt niet ondersteund door dit object

Is dit een kwestie van komma's of spaties of is hier iets anders aan de hand?
 
Als je in je VBA scherm op <Foutopsporing>, <db compileren> klikt, stopt hij dan ook bij die regel? Zo ja, kijk dan eens in de bibliotheken welke er geladen zijn? (<Extra>, <Verwijzingen>) En in welke volgorde.
 
Zowel <db compileren> als <verwijzingen> is "grayed out", maw ik kan er niet op klikken..

Bij foutopsporing geeft ie alle regels mbt het strSQL = als geel weer, dus daar moet die fout zitten. Alleen waar begrijp ik niet.

//Edit

Betekent dit dat er geen bibliotheken geladen zijn? Kan het probleem daar in liggen? Ik heb namelijk die SQL code gewoon overgenomen omdat ik die ergens tegenkwam, maar voor de rest heb ik nergens SQL gebruikt.. Zover reikt mijn kennis namelijk niet.
 
Laatst bewerkt:
Als je de db niet kunt compileren, heb je ofwel nog een routine lopen, of ziet-ie geen problemen. Wat, weten we, niet waar is. Standaard laat Access altijd een paar bibliotheken, waaronder DAO 3.6, dus die zou je in ieder geval moeten zien.
Controleer ook nog of je de Macrobeveiliging op Midden of Laag hebt staan. Als laatste kun je nog proberen om de db te Comprimeren en Herstellen.
 
Ik heb nogmaals gekeken en ik zag dat verwijzingen wel beschikbaar was als ik niet in foutopsporing zat.. Als ik hier kijk zie ik de volgende actieve verwijzingen:

-Visual Basic For Applications
-Microsoft Access 12.0 Object Library
-OLE Automation
-Microsoft Office 12.0 Access database enigne Object Library

Deze vier zijn actief en dan zijn er nog ene boel die niet zijn aangevinkt. Is dit genoeg of is er een specifieke die actief moet zijn?

//Edit

Meer naar beneden staat inderdaad ook Microsoft DAO 3.6 Object Library, maar die staat niet aangevinkt. Wanneer ik dit doe krijg ik de volgende foutmelding:

De opgegeven naam is strijdig met een bestaand projec, een bestaande module of een bestaande projectbibliotheek
 
Laatst bewerkt:
Je moet minstens nog Microsoft DAO 3.6 library activeren om met recordsets en querysets te kunnen werken. Daarmee zou het al moeten kunnen werken.
Het vreemde is dat je in je eerste code wel DAO objecten toewijst aan variabelen. Die doen het uiteraard niet als de bijbehorende bibliotheek niet is geladen.
 
Ja ik vroeg me al af waar DAO voor stond inderdaad ;)

Maar zie mijn edit van de post waar je net op reageerde.. Ik krijg een foutmelding. Moet ik die DAO regel eerst weghalen in mijn code oid?
 
Beetje vreemd wel. Ik raad je aan om een nieuwe db te maken, en alle tabellen, formulieren etc. daarin te importeren. Is minder werk dan het lijkt, en je hebt in ieder geval een schone db die alle bibliotheken goed heeft staan. Althans: meestal staat DAO wel aangevinkt in een lege db.
 
Zelfs als ik een nieuwe db start en direct naar verwijzingen ga krijg ik exact dezelfde foutmelding... idd vreemd... :S
 
Ik heb het probleem gevonden; als ik "Microsoft Office 12.0 Access database enigne Object Library" afvink dan kan ik Microsoft DAO 3.6 wel aanzetten.

Echter, het resultaat is hetzelfde: wederom de foutmelding "Typen komen niet met elkaar overeen"

Kan dit probleem niet in het definieren van een variabele zitten? Niet dat ik hier problemen zie in de code, maar dat is toch wel wat de foutmelding zegt, of zit ik er naast?

//EDIT

ik heb de code even vereenvoudigd tot

Code:
Dim db As Database
Dim qdf As QueryDef
Dim strSQL As String
Set db = CurrentDb()
strSQL = "SELECT Fabrikant, Model " _
    & "FROM tblMeubilair " _
    & "WHERE ((Fabrikant = [Forms]![frmZoekopdracht].[qFabrikant1])" _
    & "And (Model = [Forms]![frmZoekopdracht].[qModel1]))" _
    & "ORDER BY Fabrikant, Model;"
Set qdf = db.CreateQueryDef("NieuweQuery", strSQL)
DoCmd.OpenForm "frmMeubilair", acNormal

Nu krijg ik geen foutmelding! Dus wrs had je gelijk wat betreft de query.

Alleen het beoogde resultaat is nog niet bereikt. Want:
-het formulier dat opent laat nog steeds alle queries zien
-er wordt wel een query gemaakt waarin de geselecteerde records staan, alleen het formulier wordt dus niet geopend op basis van deze query
-bij het herhalen van de query geeft ie aan dat de bestaande query al bestaat. Hij zou m dus eigenlijk moet updaten maar dat doet ie niet

Enig idee hoe ik dit kan oplossen?
 
Laatst bewerkt:
Heel vreemd dat je de Access library niet kunt gebruiken i.c.m. DAO 3.6... Jammer genoeg heb je in ieder geval de Access library nodig, want dat is (zeg maar) het hart van Access. Door die uit te zetten ben je dus een beetje voodoo aan het bedrijven ;)
Je zou in ieder geval nog de db kunnen compileren (<Foutopsporing>, <db compileren>); dat mag geen fouten opleveren. Vind je daar fouten mee, dan heb je nog een probleem. En dat moet dan uiteraard worden opgelost.
Wat betreft de querydefinitie: je kunt een query maar één keer aanmaken, dus er zijn twee oplossingen. Je kunt de definitie eerst verwijderen, of je kunt de query bijwerken. In beide gevallen loop je tegen een probleem op; bij het verwijderen moet de query wel bestaan, anders krijg je een foutmelding, en bij het bijwerken idem dito. Je zou dus een foutroutine kunnen inbouwen voor één van de twee opties. Bijvoorbeeld:

Code:
    On Error Resume Next
    CurrentDb.QueryDefs.Delete sTempQuery
    Set qTemp = CurrentDb.CreateQueryDef(sTempQuery, strSQL)
    qTemp.SQL = strSQL

Of deze variant:

Code:
On Error GoTo GeenTemp
Set qTemp = db.QueryDefs("qTmpExport")
QueryInstellen:
qTemp.SQL = strSQL
Exit Sub
 
GeenTemp:
    On Error Resume Next
    tmp = db.CreateQueryDef("qTmpExport", strSQL)
    Set qTemp = db.QueryDefs("qTmpExport")
    GoTo QueryInstellen

Krijg je een werkende query als je de sql in een inputbox zet? En is het formulier wel aan de juiste query gekoppeld?
 
Krijg je een werkende query als je de sql in een inputbox zet? En is het formulier wel aan de juiste query gekoppeld?

De query werkt inderdaad wel. Als ik hem open zie ik inderdaad de juiste selectie, ook met die inputbox als tussenstap.

Wat betreft het koppelen van het formulier aan die query, daar gaat het denk ik mis. Ik weet niet exact hoe dit gaat maar ik wil het formulier op twee manieren kunnen openen: zonder query filter er overheen en mét. In dit geval dus duidelijk mét.

In eerste instantie dacht ik dat het kon door simpelweg een query te maken (genaamd qryMeubilair) en dan het formulier als volgt te openen:

Code:
DoCmd.OpenForm "frmMeubilair", acNormal, qryMeubilair

maar dit werkt op een of andere manier niet, ondanks dat de help functie van MS Office suggereert dat wel zou moeten werken.

De vraag is dus nu hoe ik deze filter over het formulier leg (aka de query koppel aan het formulier)
 
Ik weet niet of je een query als filter kunt/moet gebruiken voor een formulier. Zelf zou ik dat in ieder geval niet zo snel doen. Wèl open ik een formulier met een ingesteld Filter. Het formulier houdt dan een vaste gegevensbron, en je gooit daar een extra filter overheen om de selectie te maken.
Andere optie is, om het formulier in Hidden Designmodus te openen, de recordbron te veranderen, en het formulier weer te sluiten. En vervolgens normaal te openen.
Zijn de bibliotheken al weer werkend?
 
Wèl open ik een formulier met een ingesteld Filter. Het formulier houdt dan een vaste gegevensbron, en je gooit daar een extra filter overheen om de selectie te maken.

Dit lijkt mij inderdaad de beste optie. Is dit de manier die we hierboven proberen werkend te krijgen?

De bibliotheken zijn weer ingesteld als eerst, dus de vier oorspronkelijke.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan