standaard waarde in tabel m.b.v. combobox

Status
Niet open voor verdere reacties.

henkypenky

Gebruiker
Lid geworden
13 jul 2012
Berichten
110
Hallo,

Ik wil met een Streepjescodescanner artikelen inscannen en opnemen in een tabel.
Dit scannen gaat goed, hij scanned het GTIN nummer.
Ik wil echter ook de persoon die scant in de tabel opnemen en een projectnummer waar de materialen bij horen.
Deze waarden wil ik kiezen met elk een combobox.

Mijn probleem is ik weet niet hoe ik deze gekozen waarden in de tabel opgenomen krijg totdat ik ze weer wijzig met een andere waarde.
Van belang is dat ik deze waarde niet voor elk te scannen artikel steeds opnieuw hoef te kiezen.

Wie weet een oplossing?

Henny
 
Laatst bewerkt:
Dat kun je doen door de eigenschap DefaultValue aan te passen van die keuzelijsten. Zoals je waarschijnlijk weet heeft een veld (en een object) de eigenschap <Standaardwaarde>. Die kun je gebruiken om bij het maken van een nieuw record de gewenste waarde als standaard te hebben. Ik doe dat meestal door bij het klikken op een keuzelijst (waarbij je dus een waarde kiest) tevens de eigenschap DefaultValue aan te passen. Daarmee bereik je dat bij elke verandering (= klik in de keuzelijst) er een nieuwe standaardwaarde is ingesteld.
 
Hallo Octafish,


"door bij het
klikken op een keuzelijst de eigenschap Default Value aan te passen"

Hoe ziet dit aanpassen er dan uit?


Is het een "Gebeurtenis -Bij klikken- macro"? VBA code?
 
Ja, dat is inderdaad een gebeurtenis op <Bij klikken>. Iets als:
Code:
Me.cboPersoon.DefaultValue = Me.cboPersoon.Value
 
Hallo,

Ik heb je suggesties verwerkt maar zie nog niet hoe deze standaard waarden dan in de tabel terecht moet komen.
Kun je me vertellen wat de missing link tussen de Comboboxen en tabel Geboekte materialen is?
Ik heb het bestand meegestuurd mocht je het willen inzien.




Bedankt en een fijne jaarwisseling!

Henny
 

Bijlagen

  • artikelen scannen - Helpmij.rar
    137,4 KB · Weergaven: 43
Laatst bewerkt door een moderator:
Ik zal daar morgen wel even naar kijken. Al is het allemaal niet zo moeilijk; tekstvelden en keuzelijsten kun je gewoon aan een veld in een tabel hangen, en dan worden ze gevuld met wat je invoert. Een standaardwaarde doet op zich niks, tot je een nieuw record aanmaakt. Dan wordt het veld gevuld met de standaardwaarde. Is maar goed ook, want je wilt pas een record maken als je échte gegevens invult. En niet als je op de knop <Nieuw record> drukt; je moet de handeling kunnen annuleren.
 
Hallo Octafish,

Het is me nog niet gelukt de velden in de tabel "Tab_Geboekte_Materialen" met de waarden uit de combobox te vullen.
Zie je nog kans het gestuurde bestandje te bekijken?

Groeten Henny
 
Ik snap niet helemaal wat de bedoeling is; ik zie bijvoorbeeld geen keuzelijst met invoervak die je zou kunnen koppelen.
 
Bij openen opent Frm_Inloggen met Combobox Inlognaam, daarna Combobox Leverancier,
daarna in het grotere formulier Combobox Project.
Deze waarden zouden steeds standaard in de tabel Tab_Geboekte_Materialen moeten komen.
 
Het kwartje is nog niet gevallen, kun je nog eens kijken waar het mis gaat?

Dank je

Groeten Henny
 
Gebruik de Tempvars techniek om je waarden uit de keuzelijsten in het geheugen van de PC te laden en je kan ze dan overal in je DB gebruiken, even daar op googlen en je hebt allerlei voorbeelden.
 
Ik vind twee formulieren voor één procedure met elk één keuzelijst lichtelijk overdreven en nodeloos gecompliceerd; alleen dat al kan simpeler. Het werken met TempVars is in dit geval dan ook helemaal niet nodig, want je kunt als je alles op één formulier zet (zelfs in de huidige situatie is dat geen probleem) de data ook via de OpenArgs overzetten. Kortom: het openen van het formulier "Frm_GeboekteMaterialen" kan al vele malen simpeler.
Je probleem wordt veroorzaakt doordat je de twee keuzelijsten aan je twee inlogformulieren hebt gekoppeld. Daar moet je dus ogenblikkelijk vanaf stappen, want die moet je dus aan je tabel koppelen. Door de data via OpenArgs in te lezen, hou je de Besturingselementbron vrij en kun je de velden dus koppelen. Bij het laden van het formulier vul je de keuzelijsten vanuit de OpenArgs.

Ik heb voor het gemak de twee inlogformulieren (wie bedenkt dat eigenlijk?) in één formulier gezet, en dan krijg je dit als resultaat.
 

Bijlagen

  • artikelen scannen - Helpmij.zip
    188,5 KB · Weergaven: 44
OpenArgs en Tempvars, ik had van beiden nog nooit gehoord, ik zal het eens gaan bestuderen.
bedankt voor de input en het aanpassen van het bestand!
 
Ik wil ik op het aangepaste inlogformulier ook het projectnummer kunnen kiezen waar de materialen aan moeten worden toegekend.
Ik heb een keuzelijst toegevoegd op het inlogformulier en de code proberen aan te passen. De middelste keuzelijst geeft echter nog niet de juiste inhoud door naar de tabel.
wat mis ik hier nog?

Code:
Private Sub Form_Load()
    With Me
        If Not .OpenArgs = "" Then
            .txtInlognaam.Value = Split(.OpenArgs, "|")(LBound(Split(.OpenArgs, "|")))
            .txtLeverancier.Value = Split(.OpenArgs, "|")(LBound(Split(.OpenArgs, "|")))
            .TxtProjectnummer.Value = Split(.OpenArgs, "|")(UBound(Split(.OpenArgs, "|")))
            .Filter = "[Id_Personeel] = " & Me.txtInlognaam.Value _
                & " AND [Id_Leverancier] = " & Me.txtLeverancier.Value _
                & " AND [Id_Projectnummer] = " & Me.TxtProjectnummer.Value
            .FilterOn = True
        End If
        .Aantal.SetFocus
    End With
End Sub


De focus valt verder nog niet op het nieuwste record maar op de bovenste record.
Code:
DoCmd.OpenForm "Frm_GeboekteMaterialen", WindowMode:=acDialog, OpenArgs:=Me.CboPersoneel & "|" & Me.CboLeverancier & "|" & Me.cboProjectnummer
 
Je gebruikt twee keer dezelfde positie uit de matrix voor twee verschillende velden (LBound(Split(.OpenArgs, "|")); dat is niet handig. Met LBound en UBound haal je de eerste en laatste positie op uit een matrix, ongeacht hoeveel elementen die bevat. Handig als je die snel wilt hebben, maar onbruikbaar als je de overige elementen uit de matrix wilt gebruiken. LBound is namelijk altijd de onderste, en UBound altijd de bovenste. In mijn voorbeeld werkt dat perfect, omdat je daar exact twee elementen hebt. Dan is LBound altijd de eerste, en UBound altijd de tweede. Kan niet missen. Bij 3 elementen werkt dat natuurlijk niet voor de middelste waarde. Dan moet je dus andere manieren gebruiken.

Nou zijn daar verschillende manieren voor. Om te beginnen: je kunt de waarden gelijk gebruiken. Split(.OpenArgs, "|")(0) doet namelijk precies hetzelfde. Dat wil zeggen: als je met 0 begint! Zelf gebruik ik graag Option Base 1 in een module zodat het eerste element op positie 1 staat, en niet 0. Dat oogt natuurlijker. Vandaar mijn voorkeur voor LBound, omdat die altijd de goede waarde uitleest, ongeacht waar de matrix mee begint. (geldt uiteraard ook voor UBound).
Daarmee kom je er ook, zeker als je de variabele eerst in de array zet. Dan krijg je dit:
Code:
    Dim arr As Variant
    With Me
        If Not .OpenArgs = "" Then
            arr = Split(.OpenArgs, "|")
            .txtInlognaam.Value = arr(0)
            .txtLeverancier.Value = arr(1)
            .TxtProjectnummer.Value = arr(2)
            .Filter = "[Id_Personeel] = " & Me.txtInlognaam.Value _
                & " AND [Id_Leverancier] = " & Me.txtLeverancier.Value _
                & " AND [Id_Projectnummer] = " & Me.TxtProjectnummer.Value
            .FilterOn = True
        End If
        .Aantal.SetFocus
    End With

Maar dit werkt ook alleen weer prima als je weet welke onderwaarde je gebruikt. Daarom combineer ik dit dan vaak zo, in combinatie met vaste namen voor mijn tekstvelden:
Code:
    Dim arr As Variant, i As Integer
    With Me
        If Not .OpenArgs = "" Then
            arr = Split(.OpenArgs, "|")
            For i = LBound(arr) To UBound(arr)
                Me("Textbox" & i).Value = arr(i)
            Next
            .Filter = "[Id_Personeel] = " & arr(LBound(arr)) _
                & " AND [Id_Leverancier] = " & arr(LBound(arr)+1) _
                & " AND [Id_Projectnummer] = " & arr(LBound(arr)+2)
            .FilterOn = True
        End If
        .Aantal.SetFocus
    End With

Nou ja, zo kun je dus nog wel even doorgaan :). Zeker met een matrix met veel elementen, is het het overwegen waard om de objecten een vast naamstramien te geven, dan kun je met weinig code veel doen.
 
Het is (je) gelukt!
Het werkt naar wens nu.

Klein dingetje nog:
Hoe kan ik onderstaande code nog aanpassen zodat de focus direct op de nieuwe regel valt?
Code:
DoCmd.OpenForm "Frm_GeboekteMaterialen", WindowMode:=acDialog, OpenArgs:=Me.CboPersoneel & "|" & Me.CboLeverancier & "|" & Me.cboProjectnummer

Heb je voor mij (absolute beginner) misschien nog een goede tip (boek?) om me verder in VBA te bekwamen?

Bedankt voor je goede hulp.

Groeten Henny
 
Ik snap niet wat je met ‘nieuwe regel’ bedoelt. Wellicht een nieuw record?
 
Dan moet je een nieuw record toevoegen door met GoTo de optie NewRecord te gebruiken. Ik zou het nooit doen, en daar altijd een knop voor gebruiken, anders zit je tot Sint Juttemis nieuwe records aan te maken. En je autonummering om zeep te helpen.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan