Waarde opzoeken in gerelateerde tabel

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

Jors

Gebruiker
Lid geworden
1 okt 2006
Berichten
142
Goedendag,
ik heb wederom hulp nodig. Ik heb twee tabellen die aan elkaar gekoppeld zijn met een Id-veld. Dit is een nummer.

In een van de twee tabellen staat de naam van het object dat hoort bij het Id-veld, in de andere tabel staan de prijsgegevens van het object.

Nou wil ik in een formulier dat gebaseerd is op de prijsgegevens, de naam van het bijbehorende object tonen ipv het Id-nummer. Ik denk dat ik dit kan doen met de SELECT opdracht maar ik kom er niet uit hoe ik dit werkend kan krijgen.

Zelf had ik het volgende bedacht, maar dit gaat niet goed. Momenteel verschijnt gewoon de onderstaande code in het tekstvak doordat de definitie van de variabele tussen twee haakjes staat. Maar dat is niet het enige wat er niet goed gaat volgens mij..

Code:
Dim strSQL As String
strSQL = "SELECT Model FROM tblMeubilair WHERE tblPrijsgegevens.Meubel-id = tblMeubilair.Id"
txtMeubel.Value = strSQL
 
Je kunt in een tekstvak geen query gebruiken. Althans: wat je nu doet is de sql in het tekstvak zetten, en dat wil je uiteraard niet.
Je zult de query dus moeten openen, en het resultaat ervan ophalen. Dat gaat bijvoorbeeld zo:
Code:
Dim strSQL As String
strSQL = "SELECT Model FROM tblMeubilair WHERE tblPrijsgegevens.Meubel-id = " & Me.MeubilairId
With CurrentDb.OpenRecordset(strSQL)
    If .RecordCount > 0 Then
        Me.txtMeubel.Value = .Fields(0)
    End If
    .Close
End With
 
Laatst bewerkt:
Bedankt voor je reactie. Helaas werkt de code nog niet, ik krijg namelijk de volgende foutmelding:

"Er zijn te weinig parameters. Het verwachte aantal is: 1."
 
De code is uiteraard een voorbeeld; als je een tekstveld ophaalt, zul je er quootjes bij moeten zetten. Om te kijken of een sql code werkt, zet ik 'm vaak in een inputbox, kopieer ik vervolgens de sql, en maak ik met die code een nieuwe query aan. Krijg je een foutmelding, dan zit er een fout in de sql. Ik vermoed dat je daar mee te maken hebt...
 
Sorry maar dit gaat wel erg snel. Welk leesteken is een "quootje"? Is dat gewoon een " ?

Als ik de variabele strSQL in een msgbox zet krijg ik de gehele regel te zien:

SELECT Model FROM tblMeubilair WHERE tblPrijsgegevens.Meubel-id = tblMeubilair.Id

Dus kennelijk pakt ie die 'selectie' gewoon als een string. Het gebruik van die tekens is me niet geheel duidelijk. Verder dan dat een tekst tussen aahalingstekens moet kom ik niet..
 
Met een msgbox kom je niet zo veel verder, tenzij je daar wel uit kunt kopieren. Ik doe het meestal zo:

Code:
Dim tmp
tmp=Inputbox("","",strSQL)

Vervolgens kopieer je de code uit de inputbox, en maak je een nieuwe query aan. Die hoef je verder niet op een tabel te baseren, dus het selectievenster kun je gelijk sluiten. Nu heb je i.p.v. een weergeven knop links een knop met SQL. Omdat er nog niks is uiteraard. Die optie kies je, en de tekst die er staat (SELECT vermoedelijk) haal je weg. En vervang je door de gekopieerde tekst.
Als je nu de query uitvoert, moet je de gewenste record(s) zien. Is dat niet het geval, bijvoorbeeld doordat er een foutmelding komt, of doordat er geen resultaat is, dan kun je vanuit de query verder onderzoeken wat er mis is. Als jouw vergelijkingsveld een tekstveld is, dan moeten er dus aanhalingstekens omheen. Ik vermoed echter dat de fout hier ligt:

SELECT Model FROM tblMeubilair WHERE tblPrijsgegevens.Meubel-id = tblMeubilair.Id

Je hebt een koppelteken gebruikt in een veldnaam. Dat is, net als het gebruik van spaties, ten sterkste af te raden. Access denkt nu dat je twee velden hebt, i.p.v. 1.

Ik denk dat dit beter werkt:
SELECT Model FROM tblMeubilair WHERE tblPrijsgegevens.[Meubel-id] = tblMeubilair.Id

Zoals aangegeven: nog mooier is het natuurlijk als je de veldnamen aanpast, en de koppeltekens en eventuele spaties verwijdert, of vervangt door een underscore teken. Dus bijvoorbeeld: MeubelID of Meubel_id
 
Met een msgbox kom je niet zo veel verder, tenzij je daar wel uit kunt kopieren. Ik doe het meestal zo:

Code:
Dim tmp
tmp=Inputbox("","",strSQL)

Vervolgens kopieer je de code uit de inputbox, en maak je een nieuwe query aan. Die hoef je verder niet op een tabel te baseren, dus het selectievenster kun je gelijk sluiten. Nu heb je i.p.v. een weergeven knop links een knop met SQL. Omdat er nog niks is uiteraard. Die optie kies je, en de tekst die er staat (SELECT vermoedelijk) haal je weg. En vervang je door de gekopieerde tekst.
Als je nu de query uitvoert, moet je de gewenste record(s) zien. Is dat niet het geval, bijvoorbeeld doordat er een foutmelding komt, of doordat er geen resultaat is, dan kun je vanuit de query verder onderzoeken wat er mis is. Als jouw vergelijkingsveld een tekstveld is, dan moeten er dus aanhalingstekens omheen. Ik vermoed echter dat de fout hier ligt:

Onder het motto beter laat dan nooit wil ik graag even terugkomen op deze vraag.
Ik heb gedaan wat je zei en de tekst uit de inputbox gekopieerd in query met een SQL code.
Waneer ik deze query nu run vraag ie om een parameter op te geven. Voer ik dan het ID in dat behoort bij een bepaald meubel, dan geeft ie inderdaad de goede naam! Dus hij werkt wel!

Echter, nu moet ik deze nog zo zien te implementeren in mijn formulier dat ie automatisch niet het ID laat zien, maar de naam van het meubel. Zoals gezegd krijg ik bij de code die je bovenstaand heb gesuggereerd een foutmelding.

Dus de vraag is eigenlijk nu hoe ik deze SELECT code op de juiste manier implementeer in mijn formulier zodat in een veld niet het ID wordt weergegeven, maar de gekoppelde modelnaam.

Bvd!

//Edit: even ter aanvulling; ik heb je aanpassing in de naam van het veld Meubel-id overgenomen en er MeubelID van gemaakt.
 
Laatst bewerkt:
Hij hoort, als je de query uitvoert, niet om een parameter te vragen. Dat duit er op dat er een foutje in de query zit. Hij hoort de waarde van het Id te laten zien als criterium op het veld dat je daarvoor gebruikt. Kun je de tekst die je gebruikt uit de inputbox hier zetten?
 
Hhm, dat zou inderdaad moeten. Maar als ik die query puur run obv onderstaande code dan is er toch geen waarde van een ID veld die hij als criterium kan gebruiken en daarom vraagt hij er toch om?

Dit is de tekst uit de inputbox:

Code:
SELECT Model FROM tblMeubilair WHERE tblPrijsgegevens.MeubelID = tblMeubilair.Id
 
Dat is inderdaad niet goed. Het zou iets moeten zijn als:

Code:
SELECT Model FROM tblMeubilair WHERE tblPrijsgegevens.MeubelID = 123

Vermoedelijke oorzaak: hij leest de meubelid niet goed uit. En ik zie de fout al in mijn voorbeeldcode :o

Code:
strSQL = "SELECT Model FROM tblMeubilair WHERE tblPrijsgegevens.Meubel-id = " & Me.MeubilairId

Probeer 'm nog maar eens... (wel nog de MeubilairID goed uit het formulier lezen...
 
Nu komt er idd een getal achter het = teken te staan! Het gaat dus de goede kant op. Echter de query vraagt nog steeds om een invoer en volgens mij komt dat doordat de verwijzing nog niet helemaal goed is.

Ik denk dat het als volgt moet zijn:

Code:
strSQL = "SELECT Model FROM tblMeubilair WHERE ID = " & Me.MeubelID

de code me.meubelID moet namelijk overeenkomen met de code in veld "ID" in tblMeubilair. Klopt deze gedachtegang?

Ik denk van wel want hij voert de query nu in 1 keer uit!

Nou moet ik deze waar alleen nog in het tekstveld in mn formulier krijgen.. Daar zal ik nu mee aan de slag gaan, suggesties zijn welkom ;)
 
Als ik nu bovenstaande code verder uitvoer geeft hij bij de regel

Code:
 Me.txtMeubel.Value = .Fields(0)

de foutmelding: "Kan het element niet vinden in deze collectie."
 
Je hebt nu dus deze code?

Code:
Dim strSQL As String
strSQL = "SELECT Model FROM tblMeubilair WHERE ID = " & Me.MeubelID
With CurrentDb.OpenRecordset(strSQL)
    If .RecordCount > 0 Then
        Me.txtMeubel.Value = .Fields(0)
    End If
    .Close
End With

Als je in de VBA code op de regel With CurrentDb.... gaat staan, en je drukt op <F9> kun je, als je de code uitvoert, vanaf die regel door de code heen stappen. Om naar de volgende regel te gaan druk je steeds op <F8>. Als je bij de regel Me.txtMeubel komt, moet je dan de muis boven .Fields(0) houden, zodat je kunt uitlezen wat er in het veld staat. Kun je op die manier controleren of er een waarde wordt opgehaald?
 
Er wordt geen waarde opgehaald ben ik bang. Als ik mijn muis boven .Fields(0) (of (2) in mijn geval) hou staat er deze foutmelding als ik eerder al zei:

.Fields(2)= <Kan het element niet vinden in deze collectie.>
 
En als je de SQL rechtstreeks in een query plakt krijg je wel een uitkomst? Dat is een beetje vreemd...
 
Ik heb ontdekt waar het mis gaat. Als ik .Fields(0) doe pakt ie m wel. Dat begrijp ik alleen niet helemaal, want de waarde die moet worden overgenomen staat in de derde "kolom" van de tabel. Dit is toch .Field(2)?

//Edit: ik snap t al denk ik; er wordt in dat SELECT commando maar 1 veld geselecteerd (Model) dus daarom is er alleen een .fields(0). Onderstaande vraag is nog wel van toepassing.

Nu krijg ik dus in principe wel de waarde uit het gevraagde veld, alleen wordt in elke regel van mij subformulier nu de naam weergegeven corresponderend met het nummer van de bovenste (aka actieve) regel, terwijl in elke regel een andere naam zou moeten staan... Als ik een andere regel aanklik in het subformulier veranderen alle namen in de naam corresponderend bij het geselecteerde ID. Hoe pak ik dit aan?
 
Laatst bewerkt:
Als je de code één keer uitvoert, heb je uiteraard maar één MeubelID. Blijkbaar wil je kunnen bladeren door de records. Dan moet je dus elke keer opnieuw het nummer ophalen en inlezen. Ik denk dat het wel lukt als je de procedure ook bij de gebeurtenis <Bij Aanwijzen> van het formulier zet.
 
Hij staat momenteel al bij aanwijzen van het subformulier waarop het script uitgevoerd moet worden. En hij laadt dan dus maar 1 naam.

Als ik een ander regel aanwijs veranderen alle records in dat meubelID, hij 'onthoudt' dus ook niet wat bijbehorend ID is.
 
Kun je een voorbeeldje maken? Liefst (uiteraard ;) ) in 2003 format?
 
Tuurlijk. Hoe wil je dit voorbeeldje hebben? Moet ik een access 2003 als filetje bijvoegen?
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan