Labels automatisch aanpassen

Status
Niet open voor verdere reacties.

JeffVDB

Gebruiker
Lid geworden
25 aug 2009
Berichten
106
Ik heb een db met een gelinkte tabel. Nu wil ik in een formulier de velden van deze tabel de labels van deze velden automatisch aanpassen. Kan dat en zo ja hoe? Een voorbeeld:
Brondb Bijschrift Doeldb Bijschrift
Divers1 Divers1 Divers1 Divers1
WORDT
Divers1 Tafellaken Divers1 ?

Dus op mijn formulier moet het ? ook "Tafellaken" als label komen.
Voor mij is dit héél moeilijk? Iemand een oplossing?
 
Als ik zou snappen wat je bedoelt, dan zou ik kunnen zeggen of het moeilijk is of niet. Maar helaas, dat doe ik dus niet :)
Als je een formulier maakt, en je zet er velden op, dan krijgen de labels de naam van het veld, of de naam van het bijschrift dat je apart invult in de tabeleigenschappen. En die wil je nu aanpassen? Wanneer moet dat gebeuren? En wat moet ervoor in de plaats komen?
 
Labels

Wat ik bedoel : de originele db (tempdb.mdb) staat niet op mij pc. Ik krijg die doorgestuurd van een dienst.
In mijn db (Mijndb.mdb) is een tabel (tblMateriaal) gelinkt aan de tabel in tempdb.mdb.
Op het formulier, gelinkt aan tblMateriaal, staan de velden die ik moet invullen om de bestelling te plaatsen.
Er zijn een paar extra velden voorzien om in de toekomst artikelen bij te kunnen bestellen (Divers1, Divers2, ...).
Wanneer de dienst nu beslist om een artikel bij te voegen, verandert zij in haar database (tempdb.mdb) de tabel tblMateriaal het veld "Divers1" in bv MTafellakens, met bijschrift "Tafellakens" en stuurt zij mij de aangepaste db door. Als ik nu mijn db open, wordt de gelinkte tabel wel automatisch aangepast, maar hoe ik krijg op mijn formulier te zien dat Divers1 nu "Tafellakens" is (ik weet trouwens niet welke velden aangepast zijn in de tabel tblMateriaaal. De db tempdb.mdb is beveiligd en niet beschikbaar voor "onbevoegden".)?
Ik hoop dat het nu iets duidelijker is.
 
Er zijn verschillende manieren om dit aan te pakken. Je zou online een tabel kunnen plaatsen waar alle broninformatie instaat (tblmateriaal) met daarin de labels en overige bron informatie. Vanuit de beveiligde database en de database waar je zelf mee werkt refereer je naar die velden. Dit is prima te maken en mits goed ingericht en gebouwd is ook veilig.
Andere mogelijkheid is om via VBA de labels te laten aanpassen:

Code:
Set db = CurrentDb()
Set rs1 = db.OpenRecordset("Table1")  'Table1 is de tabel waarvan de labels wil weten
Dim fld As DAO.Field
For Each fld In rs1.Fields   'Na lopen van de tabel

   form.name_Label = (fld.Name)  'form is de naam van het fomulier, name_label is het label wat een nieuwe naam gaat krijgen
Next
Set fld = Nothing
'Netjes afsluiten

Echter, er zijn velden geserveerd voor in de toekomst. Bij een goed gestructureerde database ontwerp hoeft dit niet. Ik heb daarom het vermoeden dat het ontwerp daarom fundamenteel al fout is.
 
Ik wil u alvast bedanken voor uw inzet.
Ik laat u zien wat ik gedaan heb:
Private Sub Form_Load()
Set db = CurrentDb()
Set rs1 = db.OpenRecordset("tblMateriaal") 'Table1 is de tabel waarvan de labels wil weten
Dim fld As DAO.Field
For Each fld In rs1.Fields 'Na lopen van de tabel

Forms!frmMateriaalKeuze!subfrmMatAlg.lbl1 = (fld.Name) 'form is de naam van het fomulier, name_label is het label wat een nieuwe naam gaat krijgen
Next
Set fld = Nothing
End Sub

Wanneer ik het bewuste formulier open, krijg ik foutmelding 438 : deze eigenschap of methode wordt niet ondersteund door dit object.
Wat doe ik verkeerd?
Wat de opbouw van de db betreft: het is de bedoeling dat de mensen die met deze db moeten werken, niets van programmatuur kennen en daarom moet de db zo gebruiksvriendelijk gemaakt worden. In de tblMateriaal staan nu meer dan 100 artikels. Die zijn onderverdeeld over 5 subformulieren volgens categorie (Algemeen, Bureau, ...). Elk subformulier heeft nu 4 extra velden waarop in de toekomst nieuwe artikelen kunnen aangevraagd worden. Op subformulier Algemeen is dat "Divers 1 Alg", Divers 2 Alg",... . Is dit een verkeerde manier van werken? Als ik dat niet op die manier doe, weet ik niet hoe ik in een formulier die nieuwe velden moet inbrengen, laat staan onder welke rubriek (Algemeen, Bureau of een ander).
Ik wil altijd bijleren.
 
Wat je code betreft: maak die de volgende keer (en als je een goede indruk wilt maken: met terugwerkende kracht ;) ) op met de CODE knop, zoals Floor. Dan ziet de code er een stuk netter uit, en hoef je ook niet meer met kleurtjes te werken.
Kijk in je db eens of de DAO bibliotheek wel is geladen (<Extra>, <Verwijzingen>). De opzet van de db is natuurlijk waardeloos, artikelen doe je nooit op deze manier. Bij bestellingen kies je de artikelen in een doorlopend formulier, en heb je dit probleem nooit. Bovendien loop je nu heel snel tegen het maximum aantal velden aan (255). Dus probeer daar zo snel mogelijk iets anders voor te maken.
Je hebt dus een aparte tabel Artikelen nodig, je hebt al een tabel Bestellingen, en daar komt dan een tabel BestelRegels bij, waarin je het Bestelnummer opneemt, en het Artikelnummer (plus de rest zoals aantal en prijs). In die opzet kun je duizenden artikelen toevoegen zonder dat je ooit maar één regel aan de db hoeft te veranderen. Als dàt niet gebruiksvriendelijk is...
 
Overigens gaat jouw (en FLoor's) code niet werken, omdat je een denkfout maakt.
Code:
    For Each fld In rs.Fields 
        Forms!frmMateriaalKeuze!subfrmMatAlg.lbl1 = (fld.Name)
    Next
Je loopt hier door alle velden van de tabel (is op zich goed) en zet vervolgens elke keer een ander label op hetzelfde label (lbl1). Resultaat: lbl1 krijgt uiteindeljjk de naam van het laatste veld. En dat zal je vast niet willen...
 
Hallo,

ik heb een tijdelijke oplossing gevonden voor dit probleem. Ik geef toe dat de oplossing omslachtig is, maar het werkt. Zie hoe ik het doe voor elke label apart, zowel op het formulier als in het rapport:
Code:
    NeoLbl004 = DLookup("NieuwVeld", "tblMateriaal2", "[ID] = 4")
    If NeoLbl004 <> "" Then
        Me.lbl004.Caption = NeoLbl004
    Else
        Me.lbl004.Caption = DLookup("BestaandVeld", "tblMateriaal2", "[ID] = 4")
    End If
Er staan ongeveer een honderd labels, verdeeld over 5 subformulieren. De code is geschreven voor elk label bij het laden van het formulier en van het rapport. Er is wat (!) knip- en plakwerk aan te pas gekomen, maar het werkt.
Als iemand een betere oplossing kent (For ... next?), ze is altijd welkom.
 
Als je de cursus Access zou volgen, dan zou je daarin gelezen hebben dat er een oplossing is met ongeveer 15 coderegels voor het hele rapport of formulier. En daarbij maakt het niet uit of je er één of 200 labels op hebt staan. Die zou ik er dus op naslaan als ik jou was. Had je ook een hoop tijd gescheeld als je die methode gelijk had gebruikt...
 
Wat de opbouw van de db betreft: het is de bedoeling dat de mensen die met deze db moeten werken, niets van programmatuur kennen en daarom moet de db zo gebruiksvriendelijk gemaakt worden. In de tblMateriaal staan nu meer dan 100 artikels. Die zijn onderverdeeld over 5 subformulieren volgens categorie (Algemeen, Bureau, ...). Elk subformulier heeft nu 4 extra velden waarop in de toekomst nieuwe artikelen kunnen aangevraagd worden. Op subformulier Algemeen is dat "Divers 1 Alg", Divers 2 Alg",... . Is dit een verkeerde manier van werken? Als ik dat niet op die manier doe, weet ik niet hoe ik in een formulier die nieuwe velden moet inbrengen, laat staan onder welke rubriek (Algemeen, Bureau of een ander).

Ik werk zelf met een enigzins vergelijkbare situatie. Het voordeel van de 'brondata' centraal opslaan is dat je heel snel wijzigingen kunt doorvoeren en dat iedereen met dezelfde gegevens werkt.
Bij opstarten van deze applicatie dient eerst te worden ingelogd door de gebruiker. Daarna volgt een versie controle (handig wanneer er nieuwe functionaliteiten worden toegevoegd). Verkeerde versie? Geen toegang, eerst de nieuwe downloaden. Volgorde van eerst inloggen is gekozen ivm de beveiliging.
Artikel informatie veranderd doorlopend en je wil dat er met de laatste (artikel) informatie wordt gewerkt. Door slim gebruik te maken van tijdelijke tabellen kan je een razendsnelle applicatie maken die continu up to date is. In tijdelijke tabellen sla je alle gegevens op die tijdens de duur van deze sessie niet veranderen of heel weinig veranderen. D.m.v. datum-tijd informatie te vergelijken weet je of data inmiddels is veranderd. Voorheen werkte we met gekoppelde informatie waarbij je op de traditionele manier tabellen met elkaar koppeld. Het gevolg was dat bij meer dan 1 gebruiker de performance al merkbaar terug liep, er de hele tijd problemen waren met gelockte tabellen enz.

Nouja, ik kan hier uren over volschrijven maar op deze manier is de applicatie heel goed werkbaar en het aantal gebruikers heeft minimale invloed op performance. Overigens gebruiken we access alleen in de frontend. De backend gebruik ik een andere DBomgeving omdat Access nogal wat beperkingen heeft.
 
Laatst bewerkt:
Als je de cursus Access zou volgen, dan zou je daarin gelezen hebben dat er een oplossing is met ongeveer 15 coderegels voor het hele rapport of formulier. En daarbij maakt het niet uit of je er één of 200 labels op hebt staan. Die zou ik er dus op naslaan als ik jou was. Had je ook een hoop tijd gescheeld als je die methode gelijk had gebruikt...

Alle respect voor je werk in de handleiding. Ik heb enkel een basiscursus Access gevonden en in de 15 hoofdstukken ben ik dit onderwerp niet tegen gekomen Heb ik iets overzien?
Wilt u zo vriendelijk zijn mij een link te geven waar ik dit kan vinden? Ik wil zeker bijleren. Thanks anyway.
 
Ja, dan heb je niet goed gekeken :) In hoofdstuk 13 staat de techniek uitgelegd die je nodig hebt. Hier staat-ie. Wel gebouwd voor rapporten, maar de techniek is hetzelfde. Wellicht dat je 'm daarom niet gezien had.
 
Ja, dan heb je niet goed gekeken :) In hoofdstuk 13 staat de techniek uitgelegd die je nodig hebt. Hier staat-ie. Wel gebouwd voor rapporten, maar de techniek is hetzelfde. Wellicht dat je 'm daarom niet gezien had.

Bedankt voor de moeite. Ik weet nu wat doen. Ik laat u alleszins weten wanneer het gelukt is. Mag de vraag zolang als onopgelost blijven staan?
 
Lijkt mij geen probleem. Het is weliswaar een cursus 'Access voor beginners', maar ik ben me er van bewust dat dit soort onderwerpen niet echt meer onder beginnerstechnieken valt :) Kijk ook eens naar de voorbeeld database die is gepost in het eerst topic van het forum.
 
Eureka.
Ik heb de oplossing gevonden. Nu draait het programma veel sneller. Ik zal de vraag als opgelost merken en voor anderen geef ik hieronder mijn oplossing:
Eerst heb ik in de query op tblMateriaal2 een kolom Label aangemaakt met als gegevens:
Code:
Label:IIf ([Nieuwveld] <>"";[Nieuwveld];[BestaandVeld])
Vervolgens gebruik ik de volgende code bij het laden van elk formulier apart, alleen wordt de "I" aangepast aan de data op het bewuste formulier.
Code:
Dim Label As String
Dim I As Integer
For I = 30 To 49
    Label = DLookup("[Label]", "qAanwezig", "[LBL]= " & I)
        Me("lbl" & I).Caption = Label
        Me("lbl" & I).Visible = True
Next I

Bedankt aan iedereen die mee geholpen heeft.
 
Met een Recordset draait hij nog sneller; DLookup wordt zelfs door Microsoft een trage functie genoemd :)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan