IF Then: verwijzen naar veld in tabel

Status
Niet open voor verdere reacties.

Rap261

Gebruiker
Lid geworden
2 sep 2008
Berichten
273
Goede middag,


Ik heb een If Then situatie waarbij de If staat voor een wel of niet gevuld veld in een tabel. Echter krijg ik de verwijzing naar de tabel niet voor elkaar zonder foutmelding.

Tabel naam is Vendor
Veld naam is Text29

Ik heb verschillende combinaties geprobeerd op onderstaande code maar kom er niet uit. Wie kan me helpen?

Code:
If IsNull(Table!Vendor.Text29) Then
 
Michel, code hangt onder een combo op een formulier.
 
En wat wil je precies? Is je formulier aan een tabel (Vendor) gekoppeld?
 
Ja dat klopt en zal het proberen uit te leggen..

Ik heb een formulier met een combo waarin een Vendor wordt geselecteerd. Verder heb ik op het formulier een lijstje met diensten die zij evt leveren met daarnaast bij elke dienst een button voor details. Deze buttons worden actief als de vendor dezee dienst levert Als laatste staat er een text box waar de details van de dienst in worden getoond.

De vendors en hun diensten staan in een Tabel Vendor. De tabel heeft voor elke dienst een apart veld. Indien de vendor een bepaalde dienst levert, staat deze vermeld in het bijbehorende veld. Levert de verder de dienst niet dan is het veld leeg

Dan nu: boven noemde ik al "Deze buttons worden actief als de vendor deze dienst levert". De buttons worden al dan niet actief gemaakt door de If IsNull Then formule alleen moet IsNull verwijzen naar een veld in de Vendor tabel. Dit lukt me niet
 
Ik lees ook dat IsNull niet gelijk is aan Empty (mijn geval) dus wellicht dat ik hier al fout zit..
Zit nu te stoeien met If Table.Vendor.Text29 = "" Then..
 
Laatst bewerkt:
Ik snap het nog steeds niet; je zegt dat het formulier is gekoppeld aan de tabel [Vendor]. Waarom dan een keuzelijst op dat formulier waarin je een Vendor selecteert? Dat is bepaald onlogisch. Tenzij het een keuzelijst is (in de koptekst bijvoorbeeld) die je gebruikt om een Vendor record op het formulier op te zoeken? Dan heeft die keuzelijst verder weinig met het verhaal te maken, want dan heb je ook tekstvelden met de Vendor gegevens op het formulier.

En wat bedoel je met 'Lijstje met diensten'? Is dat een keuzelijst (al dan met met invoervak)?
En heb je een aparte tabel [Diensten], die is gekoppeld aan de tabel [Vendor] d.m.v. een koppeltabel [Vendor-Diensten]? Of heb je in Vendor voor alle diensten Ja/Nee velden gemaakt (selectievakjes op je formulier) waarin je aanvinkt welke dienst geleverd wordt?

Hoe dan ook: je hoofprobleem (de formule If IsNull(Table!Vendor.Text29) Then) zal altijd fout lopen, omdat je deze constructie niet kunt maken. Je kunt namelijk niet naar een veld in een tabel verwijzen. Een verwijzing moet altijd één waarde opleveren, en als je naar een tabel verwijst, is dat niet het geval. Je zult dus met DLookup moeten gaan werken.
Je kunt wèl naar een waarde op je formulier verwijzen, want dat is wel altijd één waarde: If IsNull(Me.Text29) Then
Is nog een stuk makkelijk ook. Maar ik krijg lichte kriebels als ik denk aan hoe de db er uit ziet... (alleen al de veldnamen! Hoe denk je ooit een db goed te kunnen onderhouden als je veldnamen gebruikt die echt helemaal niks zeggen?)
 
Michel, we spreken elkaar wel vaker op dit forum, wellicht dat je eea van mij moet weten..
Er is maar een code die ik uit mijn hoofd ken, DoCmd.openForm "X"'. De rest trek ik van internet en probeer ik aan te passen om het bij mij te laten werken. Op die manier maak ik in 5 jaar tijd 2 DB's en de 3e werk ik nu aan. Qua onderhoud, ik zet overal "groene" stukjes text neer die beschijven wat de code doet zodat ik het later, tijdens onderhoud, makkelijk herken.
Dat ik de data via omwegen laat zien en veldnamen benoem die helemaal niks zeggen dat zou goed kunnen. Voor de experts onder ons zal dit een nachtmerrie zijn en de haren een week doen overeind staan, voor mij betekend het wel dat ik als leek het grootste gedeelte zelfstandig kan doen. Wees blij anders zie je Rap261 de hele dag voorbij komen..

Laat helder zijn dat de hulp van de expert enorm wordt gewaardeerd, maar begrijp dat de leek het hele geheel alleen nog maar vanuit een gebruikers point of view bekijkt vanwege gebrek aan ervaring en kennis. We willen dit maar waarom werkt het nou niet? Tja dan blijkt dat we al moeite hebben met het woord "gekoppeld"..


Michel, wel gekoppeld in de zin dat dit formulier zijn data haalt uit alleen de tabel Vendor. Niet gekoppeld in de zin van bound/unbound wat dan jou vraag moet zijn geweest. Excuus voor de misleiding
Voor wbt onderstaand, zie de printscreen die wellicht meer duidelijkheid geeft.

En wat bedoel je met 'Lijstje met diensten'? Is dat een keuzelijst (al dan met met invoervak)?
En heb je een aparte tabel [Diensten], die is gekoppeld aan de tabel [Vendor] d.m.v. een koppeltabel [Vendor-Diensten]? Of heb je in Vendor voor alle diensten Ja/Nee velden gemaakt (selectievakjes op je formulier) waarin je aanvinkt welke dienst geleverd wordt?

Voorbeeld.JPG

Boven in staat de combo voor de keuze van de vendor. Links staan 9 label met de service. De "details" buttons die ernaast staand moeten dus enabled worden als de bijbehorende service in de tabel Vendor is beschreven. Dit wil ik doen met Me.button1.Enabled = true/false optie. Als je dan op de button klikt dan moet de beschreven service getoond worden in de "details" textbox en dit wil ik doen met DLookup die ik weer als code onder de button plaats.

Terug naar het begin.. In eerste instantie moet dus worden bepaald of een veld in Vendor wel of niet gevuld is met inhoud, dit dacht ik te kunnen doen met If IsNull Then en dan te verwijzen naar een veld in een tabel maar dit blijkt dus niet te kunnen? Is het wel mogelijk op een andere manier bv met If Table.Vendor.Text29 = "" Then.. ?
 
Het feit dat je je nog te weinig kennis en ervaring hebt zal natuurlijk niemand tegen je gebruiken :) Maar toch:
Dat ik de data via omwegen laat zien en veldnamen benoem die helemaal niks zeggen dat zou goed kunnen.... Voor mij betekend het wel dat ik als leek het grootste gedeelte zelfstandig kan doen.
Als je een nieuwe tabel maakt, is het geen enkele moeite om de velden [Voornaam], [Achternaam] een [Adres] te noemen i.p.v. [Text1], [Text2] en [Text3]. En door goede namen te gebruiken kun je later veel beter zien wat je aan het doen bent. Dus je maakt het jezelf moeilijker in plaats van makkelijker...
En deze opmerking:
Michel, wel gekoppeld in de zin dat dit formulier zijn data haalt uit alleen de tabel Vendor. Niet gekoppeld in de zin van bound/unbound wat dan jou vraag moet zijn geweest.
Maakt de verwarring er ook niet minder op :). Een formulier is gebonden, of niet-gebonden. In het eerste geval heb je er een query of tabel aan gekoppeld, in het tweede niet. Jouw formulier is dus gekoppeld aan de tabel [Vendor], en derhalve een gekoppeld formulier. Uit je plaatje maak ik op dat de keuzelijst met invoervak <Vendor> inderdaad gebruikt wordt om een vendor op te zoeken, dus dat is verder OK. Maar dan:
Links staan 9 labels met de service
Labels? Geen tekstvakken? Of zeg je 'labels' maar bedoel je tekstak?
Maar goed, als ik het een beetje snap, dan wil je dat op basis van de waarden in de bij de labels behorende velden het tekstveld <Details> gevuld wordt. En dat moet dan met de knoppen gebeuren.

Wat de knoppen betreft: je kunt net zo goed een CLICK event op de labels gebruiken; dan kunnen de knoppen weg. Blijft de skyline van Rotterdam wat beter in beeld ;)
Verder kan het een heel stuk simpeler, als je alle (tabel)tekstvelden gewoon op je formulier zet, en dezelfde grootte en plek geeft als het huidige tekstvak. Je zet ze dus in beginsel allemaal boven elkaar. Je kunt er uiteraard maar één zien, maar dat boeit niet, want je moet ze ook nog eens onzichtbaar maken (nog meer Rotterdam in beeld :) )

Door op de labels te klikken, maak je het bijbehorende tekstvak dan zichtbaar. De labels zelf kun je ofwel vet opmaken om ze te onderscheiden, ofwel onzichtbaar. In beginsel kun je een label niet uitschakelen, dus als een tekstvak leeg is, en het label is zichtbaar kun je er op klikken en verschijnt het lege tekstvak. Ik denk dan: nou en? Dan zie ik maar een leeg tekstvak. Bij een vet label (indicatie van een gevuld tekstvak) zie je het tekstvak met de inhoud.
In code ziet dat er zo uit:

Code:
Private Sub Form_Current()
    With Me
        If .Naam & "" <> "" Then .Naam_Bijschrift.Visible = True Else: .Naam_Bijschrift.Visible = False
        If .Achternaam & "" <> "" Then .Achternaam_Bijschrift.FontBold = True Else: .Achternaam_Bijschrift.FontBold = False
        If .Merk & "" <> "" Then .Merk_Bijschrift.FontBold = True Else: .Merk_Bijschrift.FontBold = False
    End With
End Sub

Code:
Private Sub Achternaam_Bijschrift_Click()
    With Me
        .Merk.Visible = False
        .Achternaam.Visible = True
        .Naam.Visible = False
    End With
End Sub

Code:
Private Sub Merk_Bijschrift_Click()
    With Me
        .Merk.Visible = True
        .Achternaam.Visible = False
        .Naam.Visible = False
    End With
End Sub

Code:
Private Sub Naam_Bijschrift_Click()
    With Me
        .Merk.Visible = False
        .Achternaam.Visible = False
        .Naam.Visible = True
    End With
End Sub
In de Form_Current heb ik twee varianten: één die het label verbergt (kan je er niet op klikken) en één die labels vet maakt. De 3 subroutine's er onder maken dus het eigen tekstvak zichtbaar, en de rest onzichtbaar.
 
Laatst bewerkt:
Michel, thanks!
Ik heb je optie met visible true/false toegepast. Zie bijgaand het voorbeeldje.

Bekijk bijlage VoorbeeldDB.zip

Wel heb ik gekozen voor de buttons en niet voor een click op de Labels (zijn ook Labels en geen textboxen) puur voor het design..
En wat Rotterdam betreft.. de Zwaan is al volop in beeld als men de DB opstart :thumb:

Nog wel een reactie op een wel of niet gebonden formulier..
je geeft aan dat wanneer een formulier gebonden is (bound) er een query of tabel aan het formulier is gekoppeld. Dat klopt in mijn geval maar zoals je kunt zien in de print screen geeft zowel de combo als het grote tekstvak beide unbound aan. Hier zou ik dus uit opmaken dat het formulier juist weer niet is gebonden. Daarbij, ik heb andere formulieren waar ik in sommige tekstvakken een Dlookup heb staan en als ik vanuit de Design mode kijk staat in deze tekstvakken dan wel bound. Dus gebonden. Blijft lastig hoor dat programmeren maar dat maakt het ook weer een uitdaging.

Bedankt voor je meedenken en hulp!!
 
Een ongebonden tekstvak op een gebonden formulier maakt voor het formulier niet uit, dat blijft gewoon gebonden. In dat tekstvak (of de keuzelijst) zie je dan tekst of gegevens die niets met de onderliggende bron te maken hebben. En dus op elke pagina dezelfde tekst laten zien. Op een rapport bijvoorbeeld (dat is gekoppeld aan een query) gebruik je niet-gebonden tekstvakken voor de vaste tekst. De variabele gegevens komen uit de query.
Overigens kun je labels er zodanig uit laten zien dat niemand ze kan onderscheiden van een knop. En omgekeerd ;)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan