Meerdere standaardwaarden

Status
Niet open voor verdere reacties.

frans83

Gebruiker
Lid geworden
26 okt 2015
Berichten
36
Beste,

Ik zou graag willen weten hoe ik meerdere standaardwaarden kan opgeven in een veld. Op de hulppagina van Microsoft lees ik van alles maar mijn vraag blijft onbeantwoord.

Heb een formulier gemaakt. Daar is een veld die zijn gegevens uit een tabel haalt. Het type van het veld is een "keuzelijst met invoervak" en er zijn meerdere keuzes mogelijk. Nu krijg ik het voor elkaar om één standaardwaarde uit het tabel te selecteren door de expressie =190 te gebruiken (190 staat voor de 190e regel uit het tabel). Nu wil ik er meerdere regels selecteren en heb diverse expressies geprobeerd =190+171; maar dan telt hij alles op, =190 And 171 pakt hij ook niet...

Enig idee hoe ik bv regel 190, 187 en 171 uit de tabel als standaard ingesteld krijg in mijn formulier?

Alvast vriendelijk bedankt voor jullie hulp!

Groet Frans
 
Wat een rare vraag, en als je er logisch over nadenkt, zul je dat wel met mij eens zijn. Een standaardwaarde impliceert dat je één waarde als voorstel in een veld zet. Nooit meerdere. Dat kan dus ook niet. En jouw opzet om daar een record aan te hangen, vind ik ook, op zijn zachts gezegd, heel dubieus. Ik zet daar altijd een vaste waarde in. Of een formule, zoals Date(). Iets wat in ieder geval een herleidbare (vaste) uitkomst oplevert.
 
kan je niet op basis van je eerste tabel, een extra tabel aanmaken met je "voorkeurskeuzes" en deze als nieuwe basis gebruiken om je keuzelijst op te baseren?
JP
 
Bedankt voor jullie reacties!

Ik heb er over nagedacht mr. OctaFish en nee, ik vind het geen rare vraag. Zou het een rare vraag vinden als het veld maar één mogelijkheid had. In dit geval zijn er meerdere keuzes mogelijk dus hoe raar is het om te denken dat er meerdere standaardwaarden mogelijk zijn?

Stel je hebt een formulier waarin je vastlegt wat de eigenschappen van een trui zijn. Alle mogelijke eigenschappen leg je vast in één tabel (tenminste, zo heb ik dat geleerd; zo min mogelijk tabellen aanmaken als het allemaal in één tabel kán). Dus de kleuren, stofsoorten en toevoegingen. Het veld in je formulier verwijst naar dat tabel en bevat het type "keuzelijst met invoervak". Nu heb je een hele reeks met groen/rode truien waarvan de stofsoorten en toevoegingen afwijkend zijn. Je wilt niet steeds de kleuren rood en groen aanvinken omdat je weet dat de eerstvolgende reeks truien rood/groen zal zijn. Het zou in dit geval fijn zijn als voor de aankomende tijd rood en groen al is aangevinkt, dus als standaardwaarden zijn ingesteld.

Het kan zijn dat ik de structuur van Access niet goed genoeg begrijp waardoor ik "anders" redeneer maar dit is wat ik nu nodig heb en wat ik wil. Als iemand een optie heeft voor mijn wens, dan hoor ik die graag. Als een extra tabel aanmaken echt de enige oplossing is dan zal ik daar naar kijken, bedankt voor de tip JEPEDEWE.
 
Je verwart het begrip ‘standaardwaarde’ met het begrip ‘vaste objecteigenschappen’. Jouw opzet zou de mijne niet zijn als ik je verhaal goed begrijp. Maar ik zou de db moeten zien om een (beter) advies te kunnen geven.
 
Ik heb een testdatabase gemaakt om te laten zien wat ik graag zou willen. Bekijk bijlage dbtest.rar

Je ziet, nadat je een nieuwe record toevoegt, dat de standaardwaarde is ingesteld op =3 (blauw), de derde regel uit de tabel tbl_eigensch. Nu wil ik meerdere regels als standaard instellen, bv 2 en 3, rood en blauw. Ik hoop dat je begrijpt wat ik bedoel en wellicht haal ik zaken door elkaar, daarom ben ik hier, om uit zoeken wat ik eventueel niet goed doe. Alvast bedankt.
 
Nu wil ik meerdere regels als standaard instellen, bv 2 en 3, rood en blauw.
Ik hou er niet van om mezelf te herhalen, maar toch nog maar een keer doen: dat kan niet. Een standaardwaarde is altijd maar één waarde. De vraag is of je aanpak goed is, en mijn antwoord zou zijn: nee. Je gebruikt het multi-waarde veld verkeerd. Ik was er al bang voor toen ik dit las:
Alle mogelijke eigenschappen leg je vast in één tabel (tenminste, zo heb ik dat geleerd; zo min mogelijk tabellen aanmaken als het allemaal in één tabel kán). Dus de kleuren, stofsoorten en toevoegingen. Het veld in je formulier verwijst naar dat tabel en bevat het type "keuzelijst met invoervak".

Daar zit namelijk een grote denkfout in. Het klopt dat je alle eigenschappen van een object die dat object bepalen bij elkaar zet. Maar nooit in één veld! Objecten hebben eigenschappen die je bij elkaar zet als elke eigenschap iets zegt over het totale object. De eigenschap is dus afhankelijk van het hele object. Bij een order is een besteldatum zo'n eigenschap, en de KlantID ook. Maar dus niet het bestelnummer van een artikel, want een bestelling bevat vaak meerdere artikelen. Idem dito voor het aantal dat wordt besteld.
Ik snap nog niet precies wat je probeert te doen in je database, maar de eigenschappen die je nu wilt vastleggen, passen niet bij elkaar. Zo is een kleur iets totaal anders als een stof. Of een attribuut als 'knoopjes'.
Zelf ben ik een groot tegenstander van het multi-value veld. Het verknalt in één keer de compatibiliteit van je databse, en je kunt dus nooit meer upgraden naar een hoger platform, of naar een webdatabase. Je moet maar bereid zijn om dat offer te maken. OK, het kan natuurlijk wel, later converteren, maar tegen enorme inspanningen (tijd, geld). Die consequentie zou ik niet te licht nemen!

Jouw db is dus, neem ik aan, maar een heel klein deel van je db, en op basis hiervan kan ik nog steeds geen oordeel vellen wat nu de juiste aanpak is. Maar wellicht dat je het FO kunt beschrijven, dan weten we ook al wat meer.
 
Fijn dat jij jezelf voor mij wilt herhalen, ik voel me daardoor erg speciaal vandaag :cool: Ik begrijp dat de functie "standaardwaarde" maar één waarde kan bevatten. Het voorbeeld wat ik heb gegeven was een voorbeeld. Al was mijn voorbeeld met alleen maar kleuren in het tabel was mijn vraag nog steeds; hoe krijg ik meerdere kleuren als standaardwaarde?

Ik geloof in meerdere wegen naar Rome. Bijvoorbeeld een code waarin je dit aangeeft. Zo van; bij het creëren van een nieuwe record, veld "truireg", selecteer uit tabel "tbl_eigensch" regel 2 en 3.
Lijkt mij een hele simpele code, als ik al die codes zou weten etc. :) Zal me maar eens gaan verdiepen in programmacode, als ik wat heb gooi ik het in de groep.

Bedankt voor je hulp in ieder geval.
 
Je kunt uiteraard met VBA meerdere waarden selecteren/toevoegen aan een tabel of veld, maar dat is niet hetzelfde als je vraag om meer dan één waarde als standaardwaarde te gebruiken. Daarvoor weet je inmiddels het antwoord :). Je vraag proberen te beantwoorden is dus een doodlopende weg.
Als ik jou was, zou ik het principe van velden met meervoudige waarden zo snel mogelijk de grootste oceaan in mieteren. Levert alleen maar ellende op, zoals ik in mijn vorige bericht al aangaf. En je maakt het nodeloos ingewikkeld. Maar ik weet nog steeds niet hoe je processen er uit zien, dus veel hulp kan ik nog niet geven verder. Het zou mij ook hogelijk verbazen als iemand anders dat nu wel kan :).
 
misschien dom voorstel, maar kan je geen waarde aan een bepaalde kleur of wat dan ook geven en je keuzelijst sorteren op die waarde zodat de kleuren die meest voor komen of je voorkeur genieten, bovenaan een lijst staan als je die op die waarde gesorteerd hebt?
eventueel in een afzonderlijke tabel?

JP
 
Ik zou dat als volgt oplossen. In de tbl_eigensch een id toevoegen als bvb. blauw, groen en deze instellen als standaard.
 
@kommer: lezen is een kunst. Ik heb al een paar keer aangegeven dat je maar één standaardwaarde kunt instellen. TS wil meerdere standaardwaarden. En dat kan echt niet.
 
Als ik in de tbl_eigensch ipv "blauw", "groen, blauw" zet dan heb je toch maar één standaardwaarde.
 
OK, blijkbaar is het nodig om mezelf te blijven herhalen om de boodschap door te laten dringen. Maar dit is echt de laatste keer :). @lommer: "blauw", "groen, blauw" kan van zijn levensdagen nooit één standaardwaarde zijn, omdat het a) twee losse strings zijn die je invoert, en b) de tweede string twee waarden bevat. Nogmaals: een standaardwaarde is altijd maar één waarde. Eén. Geen twee, geen drie en die ene bestaat ook nooit uit twee waarden. Punt. Kan niet. Tenzij je Donald Trump heet, dan kan het natuurlijk wel.
Wat wél kan, maar dan heb je een waardeloze tabel gemaakt, is een tekstvak maken waarin je allerlei tekst kwakt. Zoals "groen, blauw". Een tekstvak heeft maar één beperking, en dat is de lengte die je er aan toekent. En zolang je die niet overschrijdt, kan je er in proppen wat je wilt. Wil je 6t kleuren in één tekstvak zetten? Ga vooral je gang. Maar je hebt totaal geen normalisering meer in je database en dan kan je de db net zo goed in Word of Excel maken. Maar ga dan niet in Access werken.

Nog een 'foutje' dat TS maakte, wat niet echt schokkend is, maar dus wel fout:
Nu krijg ik het voor elkaar om één standaardwaarde uit het tabel te selecteren door de expressie =190 te gebruiken (190 staat voor de 190e regel uit het tabel).
Frans heeft blijkbaar een tabel met eigenschappen gemaakt met daarin een (vermoedelijk) Autonummerveld als sleutelveld. De waarde van dat numerieke veld wordt in de tabel opgeslagen. Vandaar dat de standaardwaarde niet "groen" is, maar 190. Dat getal slaat echter niet op het recordnummer maar op de waarde uit het nummerveld. Kun je simpel testen door dat 'recordnummer' te veranderen (als het een eigen veld is) of dat record te verwijderen en opnieuw toe te voegen, waardoor nummer 190 niet meer gebruikt kan worden. Je zult dan zien dat de formule =190 niet de standaardwaarde "groen" in het veld laat zien, maar het getal 190. Omdat Access dus geen waarde 190 meer kan vinden in de tabel.

Kortom: een standaardwaarde moet een waarde zijn die in het gekoppelde veld is terug te vinden, anders werkt het sowieso niet als standaardwaarde. Daarnaast kun je maar één waarde als standaardwaarde instellen. Een veld met meerdere waarden is eigenlijk niks anders als een onzichtbare tabel, waarin voor elke gekozen waarde een nieuw record wordt gemaakt. In de tabel zie je de gekozen waarden terug als tekststring ("Groen; Magenta; 7; S; M; L") bijvoorbeeld in mijn eigen testvoorbeeld) maar feitelijk kijk je dus naar een gekoppelde tabel. In queries heb je ook weinig aan zo'n multi-veld, en zul je het veld willen uitsplitsen. Gelukkig kan dat wel.

Wil je een soort van 'standaardproduct' maken, dan zul je dat moeten programmeren. Zelf zou ik dan een tabel maken waarin je de 'standaardwaarden' van het product in één tekstveld zet, waarbij je dus een record maakt voor elk product waar je vaste waarden voor wilt hebben. Bij het echte aanmaken van een nieuw product, waarbij je de 'standaardwaarden' wilt toevoegen, lees je die waarden uit en gebruik je een lus om de vaste waarden toe te voegen aan het nieuwe record. Eventueel kun je, als je meerdere producten achter elkaar wilt toevoegen, de ingevoerde waarden van het laatste product 'opslaan' en hergebruiken voor het volgende product. Maar de techniek werkt dus op dezelfde manier.
 
Ik heb nooit beweerd dat je groen, blauw als standaardwaarde moet aangeven, ik had het over de tabel met omschrijvingen.
Frans vraagt als standaardwaarde 2 (groen) en 3 (blauw) uit de tabel en dat is niet mogelijk.
Maar als je nu in de tabel een omschrijving toevoegt als groen, blauw en je geeft dit nummerveld op als standaardwaarde.
Dan heb je toch telkens groen, blauw staan als je een nieuw record toevoegt.
 
@lommer: Dat is een uitleg die niet helemaal duidelijk werd uit je vorige bericht. Niet dat dat veel uitmaakt, want je raakt daardoor nog verder van de kant af en dus dieper in de modder. Gekoppelde tabellen wil je relateren aan records in de brontabel. Als je jouw oplossing zou gebruiken, dan heb je niet alleen een starre, niet genormaliseerde tabel, je bent ook nog eens de koppeling met de originele waarden kwijt. Ik moet hard zijn in mijn oordeel: dit is een heilloze weg. Echt, er is geen directe oplossing. Ik zou stoppen met het zoeken naar (weliswaar creatieve) alternatieven. Er is maar één oplossing, en die heb ik al beschreven.
 
@31JEPEDEWE ik heb de gegevens uit de tabel al op alfabetische volgorde gesorteerd omdat er veel mogelijkheden mogelijk zijn. Het zou inderdaad een mogelijkheid zijn om een waarde eraan te koppelen en de meest gebruikte regels te markeren met 1, 2, 3, etc. om de meest gebruikte bovenaan te krijgen. Echter maakt dit de selectie op een gegevens moment erg onoverzichtelijk. Dit komt omdat de tabel voor meerdere formulieren wordt gebruikt. Thanks voor het meedenken!

@lommer ik begrijp wat je bedoeld, een extra record toevoegen in het tabel als combinatie. Dat zou op zich een alternatief zijn echter ben ik het eens met OctaFish m.b.t. normalisatie. Tevens wordt het draaien van query's ook weer ingewikkeld omdat je dan niet alleen op blauw kan selecteren maar ook de combinatie kleuren mee moet nemen. Maakt het erg complex. Thanks voor je bijdrage!

OctaFish zei:
Nogmaals: een standaardwaarde is altijd maar één waarde. Eén. Geen twee, geen drie en die ene bestaat ook nooit uit twee waarden. Punt. Kan niet. Tenzij je Donald Trump heet, dan kan het natuurlijk wel.
:D:D:D

@OctaFish
Heb een code gevonden op een ander forum:
Code:
Private Sub Form_Load()
   Dim i As Integer
   For i = 0 To Me.ListBox_Controlname.ListCount
      Me.ListBox_Controlname.Selected(i) = True
   Next i
End Sub

Als ik dit vertaal naar mijn testdb zou het er zo uit moeten zien:
Code:
Private Sub Form_Load()
   Dim i As Integer
   For i = 0 To Me.ListBox_trui_reg
      Me.trui_reg.Selected(i) = True
      Me.trui_reg.Selected(2) = True
      Me.trui_reg.Selected(3) = True
   Next i
End Sub

Echter werkt dit niet. Ik krijg geen error dus dat vind ik al een prestatie op zich :)
Ik denk aan 1. de commando form_load. Het event zou eigenlijk pas plaats moeten vinden op het moment dat er een nieuw record toegevoegd wordt, is dit dan wel de juiste commando? 2. Is Listbox wel de juiste verwijzing naar "keuzelijst met invoervak"? Ik hoor graag wat jullie ervan vinden! Thanks!
 
Je haalt weer een paar dingen door elkaar. Gelukkig voor de lezer van dit draadje steeds andere dingen, zodat het wel spannend blijft :). Een Listbox (keuzelijst zonder invoervak) op een formulier kun je niet vergelijken met een keuzelijst in een tabel. Sowieso een afgrijselijke uitvinding van Microsoft (keuzelijsten horen niet in een tabel) maar zelfs dan: een keuzelijst is dus geen veld met meervoudige waarden. Dat is namelijk een verborgen tabel, en een keuzelijst is alleen maar een hulpmiddel om de gegevens te laten zien.
De code uit je voorbeeld is in mijn ogen nogal nutteloos; ik heb in mijn hele leven nog nooit een keuzelijst hoeven te maken die bij het openen van een formulier gelijk alle waarden selecteert. Maar goed, je komt gekke dingen tegen op het interweb. Why not? Daarnaast werkt zo'n keuzelijst alleen als het een niet-gebonden keuzelijst is, want anders ben je je gegevens al gelijk aan het slopen bij het openen van het formulier. Dat wil je echt niet....

Goed, ik heb ondertussen toch maar eens gedacht over een oplossing en die is dus, zoals ik al aangaf, best te doen met programmeren. Maar je moet wel nog een kleine aanpassing doen aan je brontabel. Dat is in dit geval de tabel [tbl_eigensch] waarin je alle eigenschappen hebt staan van je truiencollectie. Daar heb ik een Ja/Nee veld bijgezet met de naam [Standaard]. Dat veld vink je aan voor elk artikel dat je bij een nieuwe trui wilt selecteren. Je hebt dus, naar het ID veld en het omschrijvingsveld, nu een Ja/Nee veld waarin je een aantal records hebt aangevinkt.
De volgende stap is natuurlijk die selectie overzetten naar een nieuw record. Dat doe je niet met de gebeurtenis <Bij laden>, want die wordt maar één keer uitgevoerd (is logisch als je er over nadenkt) maar bij de gebeurtenis <Bij aanwijzen>. Deze gebeurtenis wordt bij het bladeren aangesproken en is perfect hiervoor. Je kunt nu namelijk checken of je op een nieuw record staat of niet. En alleen in het eerste geval wordt de code uitgevoerd. Die ziet er zo uit:

Code:
Private Sub Form_Current()
Dim rst As DAO.Recordset
Dim strSQL As String
    If Me.NewRecord Then
        strSQL = "SELECT eigensch_id FROM tbl_eigensch WHERE standaard = TRUE"
        Set rst = CurrentDb.OpenRecordset(strSQL)
        With rst
            Do While Not .EOF
                Me.ListBox_trui_reg.Selected(!eigensch_id - 1) = True
                .MoveNext
            Loop
            .Close
        End With
    End If
End Sub

Je opent met een recordset de tabel [eigensch_id] waar je het sleutelveld ophaalt. Meer heb je niet nodig. De WHERE gebruik je om alleen de geselecteerde eigenschappen in te lezen. Je mag ook de hele tabel inlezen, kan geen kwaad. Dan worden ook de niet-geselecteerde waarden ingesteld. Maar dat is dus overbodig, want die zijn toch al niet geselecteerd. Vandaar alleen de geselecteerde waarden.
Die worden vervolgens met de lus toegekend aan de keuzelijst. Oh ja, voordat ik het vergeet: deze techniek werkt dus alleen bij een keuzelijst, niet bij een keuzelijst met invoervak.
 
Bedankt voor je tijd OctaFish, ga er z.s.m. even rustig voor zitten. Je hoort nog van me.
 
Is goed, ik wacht af :). Als je er niet uit komt, kan ik mijn voorbeeldje posten.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan