genereren waarden in Access 2013

Status
Niet open voor verdere reacties.

carl99

Gebruiker
Lid geworden
6 jan 2014
Berichten
33
Geacht Forum,

Ik heb een database gemaakt voor mijn muziekbestanden van CDs.

hoofdtabel: CDS
subtabel: DISCS: Elke CD kan een of meerdere Discs bevatten
subsubtabel: TRACKS: Elke Disc kan een of meerdere Tracks bevatten

Op subtabel Discs wil ik per CD laten nummeren van 1 t/m 20 : Veld is numeriek ==> Dus elke CD begint de Disc-teller op 1. Gebruiker mag dit niet aanpassen

Op subtabel Tracks wil ik per Disc laten ophogen van 01,02,03.....maar soms ook 01,02a,02b,02c,03...... Veld is Korte tekst. ==> Dus op elke Disc begint de Track-teller op 01. Gebruiker mag dit wel aanpassen.

Hoe dit te programmeren of in te regelen in Access 2013.

Bij voorbaat Dank.

Carl
 
Je zult daar functies voor moeten hebben die nummers genereren. Als voorbeeldje een functie die een volgnummer genereert op basis van een offertenummer.
Code:
Function VolgNummer() As String
Dim sVeld As String, sTabel As String, sWaarde As String, strSQL As String
Dim arr As Variant
Dim Nummer As Integer, Jaar As Integer
Dim rst As ADODB.Recordset
Dim cnConn As ADODB.Connection

    sVeld = "[offertenummer]"            'Hier het veld dat je gebruikt voor het volgnummer.
    sTabel = "[tbl_offerte]"          'Hier de tabelnaam waar het volgnummer in staat.
    
    strSQL = "SELECT TOP 1 " & sVeld & " FROM " & sTabel & " WHERE (" & sVeld & " Is Not Null) ORDER BY " & sVeld & " DESC"
    
    Set cnConn = CurrentProject.Connection
    Set rst = New ADODB.Recordset
    rst.Open strSQL, cnConn, adOpenKeyset, adLockOptimistic, adCmdText
    With rst
        If Not .BOF And Not .EOF Then sWaarde = .Fields(0).Value
        .Close
    End With
    
    If sWaarde & "" = "" Then GoTo GeenNummer
    arr = Split(sWaarde, "-")
    Jaar = CInt(arr(0))
    If Jaar = Year(Date) Then
        Nummer = CInt(arr(1)) + 1
    Else
        Nummer = 1
    End If
    VolgNummer = Jaar & Format(Nummer, "-0000")
    Exit Function
    
GeenNummer:
    VolgNummer = Year(Date) & "-0001"

End Function
De functie is makkelijk aan te passen naar je eigen situatie, lijkt mij.
 
Beste OctaFish,

Dank je wel voor je antwoord.

Ik ben nog niet zo sterk in dit programmeerwerk.

VolgnummerA (teller van het aantal Discs per CD, 1,2,3,4,5,6,7,8,9,etc....) is voldoende om deze numeriek te maken?

VolgnummerB (teller van het aantal tracks per Disc, 01,02a,03a,03b,04,etc....) is dus een string.

Ik wil volgnummerA plaatsen in de CDS tabel en ik wil VolgnummerB plaatsen in de Disc tabel
Is dit de juiste beredenering.

Wellicht dat je het stukje programmeerwerk kan aanpassen aan volgnummerA (geval numeriek) en desbetreffende tabel.

Hieruit kan ik volgnummerB wel herleiden hoop ik?

Bij Voorbaat Dank.

Carl
 
Ik zou zelf geen teller in de tabel CDS zetten; het aantal discs wordt tenslotte bepaald door het aantal records in Discs. En waarom beperken tot 20? Ik ken cd boxen met 24 of meer schijfjes. Die zal je toch ook kwijt willen? Overigens is een CD een zelfstandige entiteit, die uit minimaal 1 en maximaal 1 exemplaar bestaat. Een CD derhalve is derhalve gewoon een Disc. Ik zou die tabel dus eerder Recordings o.i.d. noemen. Maar als het verschil tussen CD en DISC voor jou duidelijk is en wél bestaat, dan heb ik natuurlijk niks gezegd. Alleen hoop ik dan niet dat je de db ook bij iemand anders gaat uitzetten :)

Het volgnummer dat je gaat genereren, doe je op een formulier, en niet in een tabel. Daar kun je het volgnummer als Standaardwaarde voor het volgnummerveld gebruiken. Je roept de functie dan aan met de vereiste parameters, als die er tenminste zijn. Bij VolgnummerB heb je het probleem dat je een tekstveld gebruikt met numerieke waarden. Dat geeft problemen met sorteren, tenzij je, zoals je ook wilt, voorloopnullen gebruikt. Maar de lengte van de string is dus ook mede bepalend, omdat je een achtervoegsel wilt. De functie moet dus het getal uit het nummer halen en ophogen, of de letter ophogen. Dat zijn twee verschillende taken, die je dus goed moet splitsen in de functie.
 
Beste OctaFish,

Over de naamgeving valt altijd te discussi�ren. Ik zie een CD als de basis (ook qua gegevens (artiest, bestelnummer, label,etc...) die weer uit 1 of meerdere Discs (zoals jij zegt: recordings) bestaat.

De link tussen de tabellen CDS en Discs wordt bepaald door CD_NR.
Aangezien volgnummerA het aantal Discs behorende bij een CD bijhoudt, kan deze opgeslagen worden in tabel CDS, in de record waar de unieke sleutel CD_NR staat.

In de tabel CD komt maar een keer het unieke CD_NR voor.
In de tabel Disc komt deze meerdere keren voor.

Tabel DISCS:

DISC_NR primaire sleutel (komt niet in beeld in de Form)
unieke sleutel bepaald door CD_NR en DISC_CODE (waar het volgnummerA voor gaat dienen)
Voorbeeld: CD_NR /DISC_CODE ==> CD Nummer 1 kan DISC_CODE 1,2,3,4,5........ bevatten.

Tabel TRACKS:

TRACK_NR: primaire sleutel (komt niet in beeld in de Form)
unieke sleutel bepaald door DISC_NR (link met DISCS) en TRACK_CODE (waar volgnummerB voor gaat dienen)
Voorbeeld DISC_NR /TRACK_CODE ==> Disc 1 kan TRACK_CODE 01,02a,02b,03,04,05a,05b,05c..... bevatten.

Dit is zo'n beetje de achtergrond van het verhaal.

Hoe ziet dan het programmeerverhaal er uit?

Carl
 
Aangezien volgnummerA het aantal Discs behorende bij een CD bijhoudt, kan deze opgeslagen worden in tabel CDS, in de record waar de unieke sleutel CD_NR staat.
En dat is dus een misvatting. Het aantal schijfjes blijkt al uit het aantal records in de tabel Discs. Dus wat is de winst van het opslaan? Bovendien: er is geen enkele relatie tussen de waarde die je in CDS opslaat, en het aantal records dat je hebt. Je kunt met het grootste gemak invullen dat een CD 43 schijfjes heeft, terwijl je maar 2 discs hebt ingevuld. Waar blijf je dan met je data-integriteit? Alle gegevens die je in je database opslaat moeten zonder uitzondering overeenkomen met de gerelateerde gegevens en te allen tijde daaruit zijn af te leiden. En daar is dus duidelijk geen sprake van.
Kom je niet uit de functies, dan zou ik zeggen: post een voorbeeldje. Want ik ga 'm niet zo voor je bouwen :).
 
Dag OctaFish,

Ik heb een bijlage toegevoegd met een screenshot van de Form.

Onder DISCS staat 1 en 2 ==> Dit zou via een VolgnummerA (numeriek, zonder aanpassing van de gebruiker) moeten verlopen.
Echter Het aantal verschilt per CD. Maximum wordt bepaald door wat is ingevoerd onder CD (Amount of DISCS)

Onder TRACKS staat 01,02,03......14 ==> Dit zou via een VolgnummerB (alfanumeriek, met mogelijke aanpassing van de gebruiker) moeten verlopen.
In sommige gevallen kan immers 02a,02b,02c ingevuld worden.
Het aantal TRACKS verschilt per DISC.

==> Het aantal records in tabel DISCS is dus niet gelijk aan wat er per CD aan aantal DISCS bestaat.

Als je nog meer informatie nodig hebt, dan verzorg ik deze natuurlijk.

Hartelijk Dank voor je input.

groet

Carl
 

Bijlagen

==> Het aantal records in tabel DISCS is dus niet gelijk aan wat er per CD aan aantal DISCS bestaat.
Kijk nog eens goed naar je eigen plaatje: [Amount of Discs] =2, en hoeveel records heb je in het subformulier Discs? Tenzij ik mij heel sterk vergis, staat daar toch echt: 1 van 2. Nogmaals: het aantal schrijven per cd wordt bepaald door het aantal schijven dat je aanmaakt in Discs. Dus totaal niet nodig om dat apart in te voeren en op te slaan. Je kunt dat ook ontzettend makkelijk op je hoofdformulier zetten, want je kunt het aantal records in Discs zo uitlezen.
Zonder de db wordt het echt lastig om de functies voor je te maken, of te zien wat je er zelf van gebrouwen hebt (hebben we natuurlijk veel liever, want dan bouw je de kennis zelf op). Maar ik ga de db zo natuurlijk niet nabouwen, al was het maar omdat ik het niet met alle velden eens ben :).
 
Dag OctaFish,

Amount of Discs = 2 ==> 1 van 2 betekent toch dat er 2 DISCS zijn.

De tabellen met ingevoerde waarden zijn toegevoegd.

Ter verduidelijking:

Een CD bestaat uit een of meer DISCS. Een volgnummerA moet zorgen dat de nummering van deze DISCS per CD automatisch gaat.
Een DISC bestaat uit een of meer TRACKS. Een volgnummerB moet een voorstel geven. Bijvoorbeeld: track 1 = 01 Track 2 =02. De gebruiker moet dit nog aan kunnen passen vanwege 02a,02b,02c..

De getoonde form is ook een invoerformulier.
Juist bij de invoer van deze gegevens zou de volgnummers toegepast moeten worden.

Ik hoop dat je zo genoeg informatie hebt.


Groet,

Carl
 

Bijlagen

Amount of Discs = 2 ==> 1 van 2 betekent toch dat er 2 DISCS zijn.
Ofwel praten we langs elkaar heen, ofwel je snapt niet wat ik bedoel. Ik zeg namelijk steeds al dat het aantal DISC records (2 dus in je voorbeeld) gelijk moet zijn aan het aantal dat je intypt in Amount of Discs. En dat derhalve dat veld overbodig is. De functie voor het disc volgnummer is heel simpel te maken, omdat dat een puur numeriek veld is.

De gebruiker moet dit nog aan kunnen passen vanwege 02a,02b,02c..
De tweede functie zou ik zo maken dat hij automatisch doornummert bij een nieuw record. Dus als de gebruiker 01 als startnummer ziet, dan is het volgende nummer 02, en de daaropvolgende 03. Zet de gebruiker daar een 'a' achter, zodat het nummer 03a wordt, dan lijkt het mij logisch dat het volgende nieuwe trackrecord het nummer 03b is. Want 04 is dan niet logisch,want waarom anders de a? Die IntelliSense logic maakt de functie een stuk lastiger. Maar uiteraard wel te doen. Jammer genoeg moet ik nog steeds zelf een db maken van je tabellen, al zijn die nog wel te importeren in een database. Maar ik had liever de db erbij gehad, al was het maar omdat je alles vanaf het formulier moet starten, en dat heb ik nu dus niet!
 
Goedemorgen OctaFish,


Over het gebruik van AmountofDiscs heb je natuurlijk gelijk.
Waarom iets door de gebruiker laten invullen, als dat later blijkt door de invoer.

Ik ben nu bezig om het db-bestand dusdanig klein te maken, dat ik het hier kan bijvoegen.
Het totale bestand is nl. 1,7Gb, ook na RAR.

Ik ga nu eerst de database comprimeren, en dan RAR-en.
Kikken of dit helpt.

Tot Later.

Carl
 
Dat is inderdaad pittig! Eventueel kun je een bestandje nog op www.mijn bestand.nl zetten of een vergelijkbare site, dan kunnen we hem daar weghalen. Het gaat in eerste instantie om de programmastructuur zoals tabellen en de formulieren; de hoeveelheid data boeit verder niet, al is het wel handig als je er een paar records in hebt staan. Wellicht dat de grootte wordt veroorzaakt door je bijlagenveld. Als je dat er uit gooit, zou hij snel moeten krimpen. Zou ik overigens toch al niet gebruikt hebben, want je db wordt er zo groot van :).
 
Dag OctaFish,

Hierbij de db als een zip-file.

Ik hoop dat je nu voldoende informatie hebt.


Bedankt voor je geduld.


Carl
 

Bijlagen

Dag OctaFish,

Heb je het zip-file inmiddels uitgepakt en kunnen bekijken?

Voor VolgnummerA (teller voor het aantal Discs per CD) heb ik een query gemaakt.
Het resultaat is een lijst met het juiste aantal DISCS per CD.

De SQL regel is: SELECT CDS.CD_NR, Count(CD_DISC.DISC_FOLLOW) AS AantalVanDISC_FOLLOW
FROM CDS INNER JOIN CD_DISC ON CDS.CD_NR = CD_DISC.CD_NR
GROUP BY CDS.CD_NR;

Echter als ik deze in de standaardwaarde ga plaatsen, krijg ik #NAAM? error als retour.

Groet,

Carl
 
Ik heb er inderdaad al naar gekeken, maar verder nog niet veel mee gedaan moet ik zeggen. Ik had in een eigen db al de Excel tabellen geïmporteerd en gefatsoeneerd (ArtiestID bijvoorbeeld i.p.v. ArtiesNaam. Probeer dat soort constructies te vermijden en koppel zoveel mogelijk op Numerieke velden). Maar ik zal er in de pauze weer een blik op werpen.
 
Op jouw advies heb ik de database gereconstrueerd. Alle tabellen zijn voorzien van numerieke IDS (Autonummering)
Moest daarna nog wel de relaties, indexes, formulieren en queries aanpassen, dat werk is gedaan.

Ik hoop dat je tijd heb voor me.

Groet

Carl
 
Het is even een drukke tijd i.v.m. de deadline van de Nieuwsbrief, maar ik doe mijn best :).
 
Dag Michel,


Ik heb een kopie van de huidige database toegestuurd, met alle aanpassingen op tabelniveau.

Zou je nog kunnen kijken naar de volgnummers en/of de TIJDquery (zie andere vraag)

Met vriendelijke groet,

Carl
 

Bijlagen

Ik zal vanavond een blik werpen op je vragen.
 
Je zou kunnen beginnen met de grootste blunder uit je db te halen: Radiohead is een Engelse band, geen Amerikaanse. Dat was goed schrikken ;).
Verder heb je nog een foutje volgens mij: je hebt bij bijvoorbeeld 10CC een letterverdeling in de tracknummering 01a, 01b en 01c maar je hebt daarboven ook het record 01 met het complete nummer. De duur van de plaat klopt dan natuurlijk niet, als je 1 nummer twee keer meetelt.
De functie voor het Discnummer ziet er zo uit:
Code:
Function fncDiscNummer(Disc As Integer) As Integer
Dim strSQL As String
Dim iNum As Integer
Dim tmp
    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 & ") " _
        & "ORDER BY CDS.CD_NR, DISC_INFO.DISC_FOLLOW DESC;"
    With CurrentDb.OpenRecordset(strSQL)
        If .RecordCount = 0 Then
            iNum = 1
        Else
            iNum = .Fields(0).Value + 1
        End If
        .Close
    End With
    fncDiscNummer = iNum

End Function
En je gebruikt hem zo als standaardwaarde: =fncDiscNummer([CD_NR]). Dit werkt alleen als je het koppelveld ([CD_NR]) ook op je formulier zet.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan