Opgelost Macro’s in access

Dit topic is als opgelost gemarkeerd
Een lege db is niet zo heel handig, want het gaat er om dat je nieuwe nummers maakt op basis van de bestaande gegevens. Dus een voorbeeldje met wat records er in, is beter werkbaar.
 
ik heb er nu een aantal gegevens in staan. In de tabel instrument daar staan al mijn echte lidnummers. Maar de overige gegevens heb ik er een paar ingezet, wat fictieve namen zijn. Ik kan hier natuurlijk niet het hele ledenbestand van mijn harmonie delen. Iets met avg. kun je er zo iets mee?
Wat ik dus wil, is als ik een nieuw lid invoer, dat dat lidnummer dan ook direct in de subformulieren komt. En het lidnummer wordt zonder streepje. Dus bv 202301, dan 202302, als dit automatisch erin kan komen te staan als ik een nieuw lid invoer is dat erg fijn.
 

Bijlagen

  • nieuw administratie leden kopie1 (2).zip
    329 KB · Weergaven: 1
Wat ik dus wil, is als ik een nieuw lid invoer, dat dat lidnummer dan ook direct in de subformulieren komt.
Dat is weer een andere vraag.
Voor lidmaatschapgegevens werkt dat al. Het subformulier voor de instrumenten moet je nog koppelen aan het hoofdformulier.
 
hoe meer ik aan het uitproberen ben, hoe meer ik het spoor bijster raak. Kun je beide dingen uitleggen aan de hand van eigen database? ik zie het gewoon even allemaal niet meer
 
Kun je beide dingen uitleggen aan de hand van eigen database?
Ik heb alle tabellen leeg gemaakt om het overzicht te krijgen.
Vervolgens heb ik:
  • Relaties gelegd tussen de tabellen
relaties.jpg
  • Heb ik subformulier voor de instrumenten gekoppeld aan het hoofdformulier
loppelen.jpg
Daarna 1 lid toegevoegd met 1 lidmaatschapgegeven record en 2 instrumenten.
Zie de tabellen voor de vulling.
 

Bijlagen

  • nieuw administratie leden kopie2.zip
    281,9 KB · Weergaven: 1
Ik heb de db aangepast; hier is-tie werkend.
 

Bijlagen

  • nieuw administratie leden.zip
    253,8 KB · Weergaven: 6
Ik heb de db aangepast; hier is-tie werkend.
Dank je wel. Het fenomeen modules was mij onbekend in access. ik zal me eens verdiepen in die dingen. Wat ik nog niet kan volgen is de naam "module1" en de functie funlidnummer. Die laatste wordt gestart vanuit het formulier en is daarin gekoppeld aan het tekstvak lidnummer. (Ik had verwacht dat de functie als standaardwaarde ook terug zou komen in de veldeigenschappen in de tabel, maar dat is niet zo.)
ik kan geen VBA en in de oude versie kon ik daar om heen werken. Waar wordt de module aangeroepen en hoe?
 
Ik had verwacht dat de functie als standaardwaarde ook terug zou komen in de veldeigenschappen in de tabel, maar dat is niet zo.
Ik ook en daarom heb ik je misschien onbedoeld op dat spoor gezet (waarvoor mijn excuses).
Het toekennen van het lidnummer op tabelniveau leek me het enige mogelijk voordeel van de oplossing van Octafish. Nu dat niet zo blijkt te zijn zie ik echt niet wat het voordeel van zijn oplossing is. Je moet nog steeds programmeren en de oplossing werkt op formulierniveau. Zoek de verschillen 😆
Octafish zal dat ongetwijfeld onberispelijk kunnen uitleggen.
 
Onberispelijk, zeker. Maar dat ga ik niet doen. Heeft niet zoveel zin. Ik heb nooit gezegd dat het op tabelniveau kon, en dat het een functie aanroep was in het formulier. OVerigens denk ik dat het wel degelijk op tabelniveau kan met een tabelmacro. Maar dat zou ik eerst moeten uitzoeken.
 
Onberispelijk, zeker. Maar dat ga ik niet doen. Heeft niet zoveel zin. Ik heb nooit gezegd dat het op tabelniveau kon, en dat het een functie aanroep was in het formulier. OVerigens denk ik dat het wel degelijk op tabelniveau kan met een tabelmacro. Maar dat zou ik eerst moeten uitzoeken.
er zijn vast meerdere mogelijkheden. Voor ons belangrijk dat het nu gaat werken. En om te snappen wat je gedaan hebt is de vraag van ons waar wordt de module aangeroepen en hoe?
 
Heel simpel antwoord: modules roep je niet aan :). Er zijn drie soorten modules in Access: Algemene modules, Klasse modules en Gebonden Klasse modules.
1. Algemene modules
Dit zijn modules die je maakt vanuit het VBA venster met het menu <Invoegen>, <Module>
In een algemene module zet je functies en procedures die in algemene zin gebruikt worden. Die functies en procedures kun je overal in gebruiken.

2. Klasse modules
Dit zijn modules die je maakt vanuit het VBA venster met het menu <Invoegen>, <Klasse Module>
Hierin maak je specifieke klasse procedures. Dat is een beetje buiten het kader om dat hier uit te leggen.

3. Gebonden Klasse modules
Deze variant vind je bij Formulieren; als je een procedure schrijft op een formulier, is die procedure in beginsel alleen te gebruiken op dat formulier.
Zodra je vanuit een formulier bij <Eigenschappen> op het tabblad <Gebeurtenissen> klikt, en je maakt daar een <Gebeurtenisprocedure>, kom je terecht op een Formulier module. Hierop maak je code die alleen voor dat formulier bedoeld is.

Access Modules.jpg
Voor ons belangrijk dat het nu gaat werken. En om te snappen wat je gedaan hebt is de vraag van ons waar wordt de module aangeroepen en hoe?

En nu komen we bij je vraag: dat is dus totaal onbelangrijk :). Sowieso is de naam van een module niet interessant, zolang je maar in de gaten houdt dat een object een unieke naam moet hebben. Een procedure beschouw ik in dit geval dus even als een object, en een module ook. Een module met de naam "Volgnummer" combineren met de functie "Volgnummer" gaat nooit werken: twee objecten met dezelfde naam. Ik maak er een gewoonte van om mijn modules een voorvoegsel te geven (modBestanden, modFotoApp in het voorbeeld) en functies ook een voorvoegsel. Dus liefst noem ik mijn functie dan funVolgnummer. Dat hoeft niet (consequent ben ik ook niet, zoals je ziet) maar het helpt wel.

Waar je functies opslaat, maakt ook helemaal niet uit. In het plaatje zie je 10 modules, maar alle functies en procedures die er op staan kan ik overal gebruiken met dezelfde naam. Je gebruikt dus de naam van de module nooit als je een functie aanroept. Tenzij je twee of meer identieke functies hebt staan op meerdere modules. Helaas is dat niet verboden, maar je hebt niet zo snel door welke versie dan uiteindelijk gebruikt wordt.

Functies kun je op een formulier aanroepen op de manier zoals ik je verteld heb: in jouw geval dus door in de eigenschap <Standaardwaarde> de functie aan te roepen met =Lidnummer(). En omdat deze functie op een module staat, werkt hij.

Het voordeel van deze constructie is, dat je hem op allerlei andere formulieren óók kan gebruiken. Wil je een functie écht universeel maken, dan moet je hem nog wel enigszins aanpassen, maar in beginsel hoef je, als de functie klaar is, hem dan alleen op het specifieke veld te zetten en je bent klaar.
 
Bedankt voor je uitleg. Het werkt nu bijna zoals ik wil, echter maakt hij nummer 20232305. maar ik zou liever 202305 (dus de 23 voor 05 weglaten) kan dat?? en zo ja hoe?
 
En waarom zou je dat willen? Dat is alleen nuttig als je maximaal 99 nummers per jaar nodig hebt. Zo niet, dan kun je niet meer sorteren op de nummers omdat er dan ongelijke aantallen cijfers in het getal zitten. Moet je niet willen.

Is die grens van 99 nummers OK, dan kun je de code simpel aanpassen, lijkt mij. Het gaat dan om deze regels:
Code:
        iNummer = Right(sWaarde, 4) + 1
Dat moet dan worden:
Code:
        iNummer = Right(sWaarde, 2) + 1
Deze aanpassing:
Code:
    If iJaar = CStr(Year(Date)) Then
        funLidnummer = iJaar & Right("00" & iNummer, 2)
    Else
        funLidnummer = Year(Date) & "01"
    End If
En dezeaanpassing:
Code:
GeenNummer:
    funLidnummer = Year(Date) & "01"
Dan heb je ze volgens mij allemaal.
 
gelukt!! thanks. en als het ooit zover komt dat ik meer dan 99 leden per jaar erbij krijg bij onze harmonie, dan weet ik wat ik moet veranderen. Maar helaas denk ik dat dat niet gaat lukken
 
Ik weet niet of dat een kwalijke zaak is; als elk lid na elke repetitie een rondje geeft, kom je dan nooit meer thuis :).
 
Terug
Bovenaan