Waarde ID-veld in tabel achterhalen

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

EdHa

Verenigingslid
Lid geworden
6 mei 2012
Berichten
57
Hallo,

Als ik beschik over een (door een gebruiker ingevoerde) naam in een Word-formulier, kan ik dan via VBA of door een functie de ID-waarde van de betreffende naam uit de tabel met namen achterhalen?

Vb:
Tabel (Leden)
1-Jan
2-Piet
3-Klaas

Het Word-formulier ontvang ik per mail, daaruit haal ik enkele gegevens via een VBA-script, onder meer de naam (even als voorbeeld). Deze gegevens worden in een Access-formulier overgenomen nadat ze eerst uit Word in een variabele zijn gezet. Als ik nu via een 'bij laden' gebeurtenis de gegevens van bedoelde variabelen in het Access-formulier wil overnemen moet deze naam in een veld komen dat als keuzelijst met invoervak is geformatteerd, omdat de daarin te vermelden gegevens uit een gekoppelde tabel worden gehaald. Als de gebruiker dus in Word "Jan" opgeeft en ik die in de variabele 'naam' zet kan ik die niet in het betreffende veld laten opnemen via VBA omdat dan geern tekst, maar een ID-waarde wordt verwacht die verwijst naar de gekoppelde tabel met namen.

Wat ik dus zoek is hoe ik die ID kan vinden, zodat ik de waarde van de variabele kan vervangen door de bijbehorende ID die wel kan worden overgenomen.

Ik houd mij aanbevolen voor suggesties. En als ik iets heel onhandigs doe dat veel slimmer kan hoor ik het ook graag. Nou ja, graag, ik wil het wel horen, maar ik hoor altijd liever dat ik heel slim bezig ben en dat er een simpele oplossing voor mijn probleem is :)

Groet,
 
Dat laaatste gaat (helaas voor jou) nu niet gebeuren :). Of je hebt het zo onhandig uitgelegd dat ik het niet goed snap, dat kan natuurlijk ook. Je wilt dus vanuit het Word formulier een naam uitlezen, en die naam gebruiken om in de keuzelijst op je formulier de naam uit de koppeltabel op te halen? Ik zie geen probleem namelijk. En dus ook geen al dan niet slimme oplossing... Sowieso moet je nooit de naam (tekst) opslaan, maar altijd het sleutelveld.
 
Wat jammer nu, ik blijf hopen dat ik het een keer goed ga doen.

Anyway, op mijn beurt begrijp ik nu niet goed wat jij bedoelt. En ik heb het kennelijk slecht uitgelegd, hoewel jouw samenvatting van mijn probleem heel adequaat is. Ik krijg een naam, zet die in een variabele en wil vervolgens met het ene gegeven uit de tabel (de naam) het andere ophalen (het sleutelveld, de ID). Dat kan ik nl in mijn Access-formulier invoeren en dan zie ik de naam (twee kolommen, de afhankelijke wijst naar het sleutelveld en krijgt de breedte 0, de andere verwijst naar de naam en krijgt de breedte van de naam).

Wat doe ik nu niet goed of begrijp ik niet? Jij zegt dat ik geen naam (tekst) moet opslaan. Maar dat doe ik toch juist niet? Ik heb jouw wijze lessen opgevolgd en niet in de tabel maar in het formulier het opzoekgedoe geregeld. Maar de gebruiker kent alleen de naam, niet de waarde van het sleutelveld. En om verkeerde spelling te voorkomen wil ik dat de naam niet op goed geluk wordt ingevoerd, maar opgehaald. Anders had ik een ander format kunnen kiezen maar krijg ik weer problemen als de eventueel verkeerd ingevoerde naam wordt opgeslagen in de tabel, waar in dat record een andere staat. Muteren van een naam mag, als daar reden voor is, maar dan wel door een andere in de tabel voorkomende naam te nemen.

Maar ik herhaal dus: hoe vind ik als ik de naam ken de waarde van het sleutelveld? Ik vond ergens iets met DLookup, maar dat werkt wel als je het sleutelveld kent en de naam zoekt maar niet andersom, althans bij mijn poging.
 
Wat ik uit jouw vraag begrijp
... moet deze naam in een veld komen dat als keuzelijst met invoervak is geformatteerd .... kan ik die niet in het betreffende veld laten opnemen via VBA omdat dan geen tekst, maar een ID-waarde wordt verwacht die verwijst naar de gekoppelde tabel met namen.
is dus dat je een tekst wilt opslaan in een veld. En dat is niet goed; dat moet een getalveld zijn. Je keuzelijst heeft namelijk het ID veld als afhankelijke kolom. De tekst die je meegeeft, wil je gebruiken om een waarde uit de keuzelijst te selecteren. Dat kan, maar werkt alleen als je maar één resultaat hebt in de keuzelijst. Bij voornamen lijkt die kans mij gering, en kun je beter een filter maken op de keuzelijst die de lijst dus filtert op basis van de variabele. Krijg je iets als:
Code:
     strSQL=SELECT ID, Naam FROM tNamen WHERE Naam = """ & TempVars("varNaam").Value & """"
     Me.cboNaam.RowSource = strSQL
     Me.cboNaam.ReQuery
Eventueel kun je nog met ListCount checken hoeveel waarden er in de keuzelijst zitten, en bij de waarde één gelijk dat record selecteren.

Overigens begrijp je de functie DLookup niet helemaal, als ik dit lees:
Ik vond ergens iets met DLookup, maar dat werkt wel als je het sleutelveld kent en de naam zoekt maar niet andersom
DLookup gebruik je juist als je een waarde kent, en een andere waarde terug wilt zien. Dan krijg je iets als:
Code:
     DLookup("[ID]","tNamen","[Naam] = """ & TempVars("varNaam") & """")
Deze functie levert dus de ID op terwijl je op Naam zoekt.
 
Dank je, Octafish. Ik ga dit morgen proberen.

Volgens mij begrijpen we elkaar op de inhoud maar begrijp jij niet waarom ik wil wat ik wil. Inderdaad wil ik een getal genereren om in te voeren in mijn formulier (dat ik dan een tekst wil laten zien door de tekstkolom en niet de ID kolom te tonen doet daar immers niet aan af), maar omdat degene die het Wordformulier invult het getal niet kent wil ik op basis van de naam het getal opzoeken. De namen zijn overigens uniek, maak je daar geen zorgen over. Jan, Piet en Klaas waren maar bij wijze van voorbeeld.

Ik meen de functie DLookup wel degelijk begrepen te hebben want een naam vinden op basis van de ID lukte me. Maar kennelijk gebruikte ik andersom een verkeerd format (al die aanhalingstekens maken het er niet eenvoudiger op) waardoor ik steeds een waarde Null terugkreeg en dat mag niet.

Mijn enige probleem is nu nog dat een gebruiker in het word formulier (door anderen opgemaakt zonder keuze af te dwingen uit een lijst) de gezochte naam niet correct invoert, maar dat valt mogelijk te ondervangen met een 'Like' statement. Of kan dat niet?

Anyway, ik denk dat ik munitie heb voor de volgende slag met mijn formulieren. Dank voor het leveren daarvan.

Groet.
 
Als je een unieke naam hebt in de variabele, zal de SQL één waarde opleveren. Dan heb je dus geen keuzelijst nodig op je formulier. Want wat valt er dan nog te kiezen? Dat gezegd hebbende, zijn er wel wat landen op te noemen waarvan ik nu het politieke systeem heb beschreven :). Maar Dlookup werkt m.i. dan net zo goed.

Als je 'fuzzy' gaat zoeken met LIKE, dan kun je er maar beter voor zorgen dat je niet teveel letters gebruikt, want anders levert je keuzelijst (of DLookup) niks op.
Een DLookup gebruiken voor een getalwaarde gaat inderdaad iets anders als zoeken op tekst. Tekst zoeken doe je altijd met een zoekstring. Je zoekt dus op [ID] = 123 en [Naam] = "Jansen". Probleem bij een zoekstring is, dat het dubbele aanhalingsteken een beschermd teken is: je geeft hiermee het begin en het eind van een tekststring aan. En de DLookup heeft zelf óók een dubbele aanhalingsteken nodig. In dat soort gevallen herhaal je het aanhalingsteken; zo weet Access dat het tweede teken als teken wordt gebruikt, en niet als definitieteken. Vandaar dat de laatste zoekstring er zo uit ziet:
"[Naam] = """ & Jansen & """"
Tel maar na :).
 
De DLookup functie werkt nu ik alle aanhalingstekens heb nageteld en goed heb ingevuld. En dat is precies wat ik zocht. Dank voor de hulp maar weer.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan