Afterupdate ga naar record

Status
Niet open voor verdere reacties.

Powerblade

Gebruiker
Lid geworden
21 mrt 2008
Berichten
60
Hallo allemaal,

Ik heb een kleine probleempje en kom er zelf niet uit. hier gaat het om het volgende:

Ik heb en subform met:

combo: Keuzelijst met invoervak39
veld: productnaam
veld Aantal_

nu gaat het om het volgende:

als ik Keuzelijst met invoervak39(productid) 1 kies, dan komt de productnaam automatisch in het veld productnaam ( afterupdate : ....column() )..... dit werkt allemaal prima.
daarna komt de focus terug ( setfocus) naar de combo productid.

Als ik vervolgens weer productid 1 kies, dan kijk hij of deze product id al bestaat, als JA, dan wordt aantal met +1 verhoogd, zoniet dan gaat hij naar nieuwe record. ( dit werkt ook prima ).

Maar nu is mijn probleem:

ik heb 3 records bijvoorbeeld:
productid
1
2
3

Nu ben ik bij nieuwe record en ik kies vervolgens weer productid 1, dan krijg ik:
Productid
1
2
3
1

maar ik wil dat hij controleerd of er al een record met productid 1 bestaat, zo ja, dan moet hij naar die record gaan en aantal weer met +1 vermeerdere en de focus weer op product id zetten bij het betreffende record.

Code:
Private Sub Keuzelijst_met_invoervak39_AfterUpdate()

If (IsNull([Aantal_])) Then
Me![Productnaam] = Me![Keuzelijst met invoervak39].Column(0)
Me![Categories] = Me![Keuzelijst met invoervak39].Column(2)
Me![Aantal_] = 1
Me![cboproductid] = [Keuzelijst met invoervak39]
[Productnaam].SetFocus
[Keuzelijst_met_invoervak39].SetFocus

ElseIf [Productnaam] = Me![Keuzelijst met invoervak39] Then
Me![Productnaam] = Me![Keuzelijst met invoervak39].Column(0)
Me![Categories] = Me![Keuzelijst met invoervak39].Column(2)
Me![Aantal_] = ([Aantal_] + 1)
[Productnaam].SetFocus
[Keuzelijst_met_invoervak39].SetFocus
        
        
        
        ElseIf [Productnaam] <> Me![Keuzelijst met invoervak39].Column(0) Then
            DoCmd.GoToControl "Subformulier detail factuur"
            DoCmd.GoToRecord , , acNewRec
            
            [Productnaam].SetFocus
            [Keuzelijst_met_invoervak39].SetFocus
        
 
              
 
        
        
    End If
End Sub
 
Om te beginnen: je programmeert behoorlijk slordig. En dan bedoel ik niet alleen het rare inspringen en de vele overtollige lege regels, maar met name dingen als:
Code:
        Me![Aantal_] = ([Aantal_] + 1)
        [Productnaam] <> Me![Keuzelijst met invoervak39].Column(0)

Wat opvalt aan deze chaos is dat je nergens gebruik maakt van de IntelliSense. En te pas en te onpas de collecties gebruikt (het !). Zit totaal geen logica in.
Objecten die je aanmaakt zou je een herkenbare en logische naam moeten geven zodat je ze in je code ogenblikkelijk herkent. Spaties in objectnamen is daarbij een enorme hindernis, want Access accepteert geen spaties in namen. En die worden dus vervangen door underscores. Maar dat kun je voorkomen door simpelweg geen spaties te gebruiken. En een veldnaam Aantal_ ? Zelfde verhaal eigenlijk. En sla je nu de productnaam ook nog eens op, naast het ProductID? Datarendundantie als dat zo is!
Logischer zou ook zijn om het gebonden veld van de keuzelijst vooraan te zetten en die kolom te verbergen. Het tekstvak Productnaam zou dus bij mij een niet-gebonden tekstvak zijn met als besturingselementbron de kolom met productnaam uit de keuzelijst. En dat geldt uiteraard ook voor het tekstvak Categorie. En ProductID is in dit geval gewoon een tekstveld, want de keuzelijst die je nu gebruikt is neem ik aan niet-gebonden en wordt alleen gebruikt om het product te selecteren.
Kortom: bij mij zou de code er zo uitzien:

Code:
Private Sub cboProduct_Click()
    If IsNull(Me.Aantal) Then
        Me.Aantal = 1
        Me.ProductID = Me.cboProduct
    ElseIf Me.ProductID = Me.cboProduct Then
        Me.Aantal = Me.Aantal + 1
    ElseIf Me.ProductID <> Me.cboProduct Then
        DoCmd.GoToRecord , , acNewRec
        Me.cboProduct.SetFocus
    End If
End Sub

Of dit werkt? Geen idee, want ik vind het een hele rare constructie.... Ik heb honderden databases gebouwd ondertussen, en in elke variant waarbij op de een of andere manier een bestelling of levering gemaakt moest worden, zette ik een keuzelijst voor het product in het formulier en een tekstveld txtAantal waarin de gebruiker dan het gewenste aantal kan typen. Klaar, volgend record. Nog nooit heb ik van iemand gehoord dat die werkwijze te makkelijk was, en of dat niet met een losse keuzelijst kon waarin je 48 keer op hetzelfde product moest klikken als je 48 flieberwutsels nodig had. En ik verwacht die vraag de komende 100 jaar ook niet :).
 
Beste Octafish,

klopt helemaal wat je zegt. Dit was ook een van de eerste databasejes die ik destijds had gemaakt. Totaal een blunder :) weet ik...

Eigenlijk is de vraag heel simpel. Vroeger gebruikte ze deze prog met de hand om een simpele bonnetje ( kassa ) te maken. Nu willen ze met de barcode scanner doen.

Dus ze willen productcode scannen, Als er nog geen record bestaat, maakt hij deze aan. ( nieks bijzonders )
Is het een nieuwe product, dan moet er een nieuwe record maken en deze nieuwe product toevoegen met aantal 1.
Als er vervolgens product wordt gescand die al bestaat in een van de vorige records, dan moet het desbtreffende regel aantal met +1 vermeerderen, zonder dat er weer een nieuwe record maakt, zodat er niet van het zelfde product 2 of meer aanwezig zijn.

Dus als het moet en je hebt een slimmere manier :) kunnen we van orginele:rolleyes: code afwijken....

bedankt voor de moeite...:thumb:
 
Dus ze willen productcode scannen, Als er nog geen record bestaat, maakt hij deze aan. ( niks bijzonders )
Is het een nieuwe product, dan moet er een nieuwe record maken en deze nieuwe product toevoegen met aantal 1.
Zeg je niet hier 2 keer hetzelfde? Althans: zo lees ik het :). Bij een nieuw product bestaat immers nog geen record...

Maar je verhaal is nu iets anders, en duidelijker. Er wordt dus niet met de hand een product gekozen maar met een barcode. Die zal dan wel aan de kassa gekoppeld zijn zoals je in de tweede zin suggereert. Een barcode is in dat geval niet veel meer dan een hele snelle typist die een product voor je invult. Het aantal moet dan wel nog worden ingevuld. Daarbij hebben de meeste kassa's nog wel een (toetsenbord) display waarop je het aantal artikelen kan intypen voordat je het artikel opslaat. En het is nog altijd een stuk sneller om bij de slijter één fles whisky te scannen en dan 12 in te voeren bij aantal (ieder zijn hobby ;) ) dan 12 keer dezelfde fles scannen. Al zou ik niet graag de cassières de kost geven die dat wél doen. Sterker nog: in de zelfscan super doe ik dat meestal ook. Maar dat komt omdat ik daar geen aantal kan invoeren, maar moet wachten tot het Plusje op het scherm staat waarmee ik met elke druk het aantal met 1 kan ophogen of verlagen. Eigenlijk wat jij ook doet/wilt. In mijn geval (de super) is het gewoon sneller om 2 of meer keer te scannen.

Mijn oplossing zou overigens totaal anders zijn, en ook flexibeler (want je kunt er ook mee verlagen). Gebruik de scanner puur om het artikel in te voeren, en verder niks. Desnoods met het veld [Aantal] gevuld met de waarde 1, want dat hoeft de scanner niet te doen (gewoon een standaardwaarde voor het veld instellen). Dan scan je dus een artikel en dat zie je gelijk in je subformulier terug: veld [ProductID] vul je vanuit de scanner (mag een keuzelijst zijn). De overige velden (Productnaam, Prijs, etc) worden gevuld vanuit de keuzelijst. Alleen de prijs zou ik opslaan, de rest is puur informatief. Want productgebonden. Op het subformulier kun je het veld [Aantal] met de hand vullen (gewoon tekstveld tenslotte) of het aantal met 2 knoppen aanpassen: + knop voor ophogen, - knop voor verlagen. Ja, verlagen lijkt mij een noodzakelijke toevoeging, want wat doe je als iemand per ongeluk één keer teveel scant? Moet je het aantal toch kunnen verlagen! Die 2 knoppen kun je in de detailsectie zetten (pakken ze het actieve record op) of in de koptekst van het subformulier. De laatste oplossing is iets mooier (minder knoppen in beeld) maar iets lastiger omdat je dan het juiste record moet afvangen. Maar da's allemaal niet zo moeilijk.
Ik maak zoiets momenteel voor een bakkerij, en dat werkt prima. Al heeft die ook een virtueel toetsenbord op het touchscreen waarmee je gelijk het juiste aantal kunt intypen. Want dat is en blijft veruit het makkelijkst.
 
Bedankt voor de gedetailleerde werkwijze. zit er goed uit.

Nu de eigenlijk vraag waar deze topic eigenlijk over had moeten zijn:o :

1) je scan een product, vb kaas productid: 5, je krijgt een regel ( record ) met de desbetreffende gegevens wat je wilt.... en eventueel aantal = 1 ( met of zonder + en - knop, afhankelijk naar wens ;) )
=> focus komt terug naar scanvak.


2) je scant het volgende product, vb komkommer productid 6, code kijk of deze id en de al aangemaakt record dezelfde product is, zo ja => aantal +1 zo niet maakt het een nieuwe record aan en vult desbetreffende gegevens in die hoort bij id 6 vb.

nu heb ik 2 records, 5 en 6.

3) nu komt de eigenlijk vraag: nu heeft de klant eigenlijk 2x kaar gekocht, maar de eerste kaas was bij begin van de band gelegd en de 2e aan het einde, en nu komt het 3e product die gescant wordt. Nu moet de code eigenlijk kijken of deze kaas ID al hiervoor is gescant en aanwezig is. Zo ja=> ga naar betreffende record en zet aantal +, 1 zoniet, maak een nieuwe record aan met de kaas gegevens....

waar ik eigenlijk vastzit is: Nu moet de code eigenlijk kijken of deze kaas ID al hiervoor is gescant en aanwezig is. Zo ja=> ga naar betreffende record en zet aantal +, 1

met beetje onderzoek kwam ik uit op findfirst, een van de mogelijkheden, maar heb geen ervaring met deze....

Dus, als je mij hiermee kan helpen....:o

By the way, de manier hoe jij bepaalde wensen oplost spreekt mij erg aan, bedenken van oplossingen is meer van belang zie ik, dan alleen maar codes te schrijven...

Ach ja, als iedereen even slim was....... :rolleyes:

Ik ben benieuwd hoe de code van je eruit zal zien, waarin mijn vraag in verwerkt is....
 
Dank je voor het compliment :). Ik probeer inderdaad zoveel mogelijk achter de vraag te komen; sec een oplossing geven werkt soms wel, maar meestal proef ik uit een vraag een probleem dat is ontstaan door een verkeerde werkwijzeprocedure. En in dat geval moet je, vind ik, ook naar de procedures kijken want je moet een probleem zo hoog mogelijk in de boom afvangen.
Voor jouw oplossing zou ik werken met een volledige recordset instructie. Je maakt dus een query aan (in VBA uiteraard) die controleert of het gescande artikel al bestaat voor de levering. Dus in de query zet je een WHERE argument met:
Code:
WHERE [ProductID]=" & Me.txtProductID

Die recordset wordt eerst geopend. Als de COUNT van de recordset 0 oplevert is de recordset leeg. Conclusie: artikel bestaat niet. Je kunt een boolean maken die op True wordt gezet. De recordset kan dan worden gesloten. Werkwijze: open de tabel in een recordset, gebruik rs.AddNew om het artikel toe te voegen. Is de COUNT 1 (of meer, maar dat zou niet moeten kunnen als alles goed werkt) dan bestaat het artikel, en moet het aantal worden verhoogd. Werkwijze: open de tabel in een recordset met de parameter WHERE [ProductID]=" & Me.txtProductID, gebruik rs.Edit om het veld Aantal bij te werken.
De toevoeg/bijwerk sequence gebruik je a.d.h.v. de boolean variabele die je hebt toegewezen bij de COUNT recordset. Dus als bCheck=True(Count=0) dan rs.Add, als bCheck=False (Count>0) dan rs.Edit uitvoeren.
 
hmmm, Ok de logica kan ik nog volgen :D, maar heb query in vba nooit gedaan, dus zou je in dit verband in mijn voorbeeldcode, dit stukje in verwerken?

dan kan ik daaruit even verder perfectioneren naar de wens van de klant...

dank voor de uitleg...:thumb::thumb::thumb:
 
Een query in VBA ziet er exact hetzelfde uit als een query in de SQL weergave :).
 
Dank voor de aansturing. Ben er helemaal uit. Ik zal de vba code posten zodat mocht er iemand anders naar opzoek zijn, dan heeft degene ook een verwijzing welke richting hij moet gaan denken.;)

Dank zover voor alle hulp..:thumb:

Code:
Dim rs As DAO.Recordset

If IsNull(Me.Aantal_) Then
        Me.Aantal_ = 1
        Me.Productnaam = Me.Keuzelijst_met_invoervak39.Column(0)
        Me.Categories = Me.Keuzelijst_met_invoervak39.Column(2)
        Me.cboproductid = Me.Keuzelijst_met_invoervak39
        Me.Productnaam.SetFocus
        Me.Keuzelijst_met_invoervak39 = ""
        Me.Keuzelijst_met_invoervak39.SetFocus

    ElseIf Not IsNull(Me.Keuzelijst_met_invoervak39) Then
        'Save before move.
        If Me.Dirty Then
            Me.Dirty = False
        End If
        'Search in the clone set.
        Set rs = Me.RecordsetClone
        rs.FindFirst "[ProductId] = " & Me.Keuzelijst_met_invoervak39
        If rs.NoMatch Then
            ' MsgBox "Not found: filtered?"
        'Me.Productnaam <> Me.Keuzelijst_met_invoervak39.Column(0) Then
        DoCmd.GoToRecord , , acNewRec
            If IsNull(Me.Aantal_) Then
                Me.Aantal_ = 1
                Me.Productnaam = Me.Keuzelijst_met_invoervak39.Column(0)
                Me.Categories = Me.Keuzelijst_met_invoervak39.Column(2)
                Me.cboproductid = Me.Keuzelijst_met_invoervak39
                Me.Productnaam.SetFocus
                Me.Keuzelijst_met_invoervak39 = ""
                Me.Keuzelijst_met_invoervak39.SetFocus
            End If
        
        Else
            'Display the found record in the form.
            Me.Bookmark = rs.Bookmark
            Me.Productnaam = Me.Keuzelijst_met_invoervak39.Column(0)
        Me.Categories = Me.Keuzelijst_met_invoervak39.Column(2)
        Me.Aantal_ = Me.Aantal_ + 1
        Me.Productnaam.SetFocus
        Me.Keuzelijst_met_invoervak39 = ""
        Me.Keuzelijst_met_invoervak39.SetFocus
            
        End If
        Set rs = Nothing
    End If
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan