genereren waarden in Access 2013

Status
Niet open voor verdere reacties.
Radiohead: Je hebt helemaal gelijk. Nog niet alle CoO gecontroleerd.

10CC: Je hebt alweer gelijk. Ga ik aanpassen.

De code waar moet ik deze plaatsen?

Groet

Carl
 
De functie in een willekeurige module, en de functieaanroep in de standaardwaarde.
 
Dag Octafish,

Helaas kon ik niet eerder reageren.

Ik heb de code geplaatst op de Form CDS en de standaardwaarde ingesteld conform jouw suggestie.

Ik krijg nu als retour #naam? foutmelding.

Het is me ook onduidelijk het volgende: "WHERE (CDS.CD_NR = " & Disc & ") "

Wat gebeurd daar?

Alvast bedankt.

Carl
 
Je hebt de codes niet in een nieuwe of bestaande module gezet? Waarom niet?
 
Een formulier is een Klasse module, dus wel een soort module maar dan anders. Als je in menu <Invoegen> kijkt, vind je daar de optie <Module>.
 
Het gaf eerst nog een TYPE foutmelding, maar ik heb nu zowel CD_NR van CDS en CD_NR van DISC_INFO onzichtbaar op het formulier geplaatst.

Nu werkt het.

Wat betekent deze zin eigenlijk?

"WHERE (CDS.CD_NR = " & Disc & ") "

Bedankt

Carl
 
WHERE is je criterium waar je op filtert. In een query zou je de vergelijking dus in de regel Criteria zien staan. In deze regel filter je dus op records waarvan het tabelveld[CDS.CD_NR] gelijk is aan het formulierveld [Disc].
 
Dank je wel voor de uitleg. Het is me nog niet helemaal duidelijk Het tabelveld [CDS.CD_NR] moet toch vergeleken worden met het formulierveld van CDS.CD_NR of DISC_INFO.CD_NR.
Waarom dan " & Disc & ") "

Groet,


Carl
 
Een formulierveld heeft altijd een eigen naam, of dat is gekoppeld aan een veld of niet. Ga je de waarde van dat formulierveld gebruiken in een opdracht, dan kun je dus verwijzen naar de naam van het formulierobject. En dat doe ik in deze code. Meestal gebruik ik genormaliseerde namen, dus als ik een tabelveld [CD_NR] heb, dan noem ik het formulierveld als het een tekstveld is txtCD_NR. Als ik een keuzelijst maak noem ik hem cboCD_NR of lstCD_NR, afhankelijk of het een keuzelijst met voorkeursvak is of niet. Zodat je in je code altijd weet of je naar een formulierobject of tabelveld verwijst.
 
Een formulierveld heeft altijd een eigen naam, of dat is gekoppeld aan een veld of niet. Ga je de waarde van dat formulierveld gebruiken in een opdracht, dan kun je dus verwijzen naar de naam van het formulierobject. En dat doe ik in deze code. Meestal gebruik ik genormaliseerde namen, dus als ik een tabelveld [CD_NR] heb, dan noem ik het formulierveld als het een tekstveld is txtCD_NR. Als ik een keuzelijst maak noem ik hem cboCD_NR of lstCD_NR, afhankelijk of het een keuzelijst met voorkeursvak is of niet. Zodat je in je code altijd weet of je naar een formulierobject of tabelveld verwijst.
Meestal schrijf ik de code trouwens zo:
Code:
"WHERE (CDS.CD_NR = " & Me.Disc & ") "
Zodat je gelijk verwijst naar het formulier (met Me.).
 
De naam van een object vind je altijd bij de <Eigenschappen> op het tabblad <Overige> onder het kopje <Naam>.
 
In geval van "WHERE (CDS.CD_NR = " & Me.Disc & ") " ga je dus zoeken naar een formulierveld verwant met en gelijk aan het veld CDS.CD_NR
 
Ik heb je een klein beetje om het tuintje geleid, want het antwoord zou goed kunnen zijn als het op een formulier stond, maar de regel komt uit de functie, niet uit het formulier. Me.Disc is daarom fout. Dus ik pak de functie er weer even bij.
Code:
Function fncDiscNummer(Disc As Integer) As Integer
    strSQL = "SELECT TOP 1 DISC_INFO.DISC_FOLLOW " _
        & "FROM CDS INNER JOIN DISC_INFO ON CDS.CD_NR = DISC_INFO.CD_NR " _
        & "WHERE (CDS.CD_NR = " & Disc & ") "
Hier zie je achter Function tussen de haakjes (Disc As Integer) staan. Hierbij is Disc de parameter die je meegeeft als je de functie aanroept. Dat kan een formulierveld zijn met de naam [PietjePuk], of het veld kan [Disc_NR] heten, dat maakt voor de functie zelf allemaal niet uit. In de functie wordt de waarde in de parameter DISC gezet. En die wordt dus verder in de query gebruikt die wordt opgebouwd in de functie.
Als je de hele query in de variabele tmp zou zetten
Code:
tmp = Inputbox("","",strSQL)
en je voert de functie uit, dan stopt hij even met de inputbox, waar de opgebouwde SQL in staat. Die kun je kopiëren, en in een nieuwe query plakken. De code hierboven gebruik ik dus heel vaak om de opbouw van een SQL code te controleren. Vaak zit er een fout in (spatie te weinig bijvoorbeeld) en dan doet de functie het niet. Door de query te testen, zie je waar de fout zit.
Dus om het verhaal samen te vatten: In de functie geef je een waarde mee die in Disc wordt gezet. In de query wordt die waarde letterlijk in de WHERE constructie gezet, zodat je fysiek op een echte waarde filtert.
 
Dank je voor de uitleg.
Ik ga verder aan de slag voor de nummering van de Tracks.

Bedankt.

Carl
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan