Door records navigeren binnen formulier

Status
Niet open voor verdere reacties.

HHunnekens

Gebruiker
Lid geworden
16 apr 2013
Berichten
63
Goedemiddag,

Graag zou ik binnen een formulier een record willen kunnen vinden o.b.v. een criterium.

Er is een control ( tekstvak ) met de naam : txtVerkoopprijsBasiseenheid. Dit is gekoppeld aan een query veld genaamd VerkoopprijsBasiseenheid.

Bedoeling is om nadat een nieuw product is gekozen ( voor een prijslijst ) middels een combobox, dat dan vervolgens de recordpointer/cursor direct komt te staan op het dan nog lege veld
VerkoopprijsBasiseenheid behorend bij dat nieuwe record. Dat veld is dus gekoppeld aan een tekstvak genaamd txtVerkoopprijsBasiseenheid.

'K zit d'r al een tijdje aan te prutsen om de syntaxis e.d. goed te krijgen, maar 't wil nog niet lukken !

M'n gedachte tot dusverre is :

Eerst zorgen dat op de focus wordt gezet op (de inhoud van) het tekstvak "txtVerkoopprijsBasiseenheid", hetgeen als volgt gebeurt ( en ook lukt ) :
DoCmd.GoToControl "txtVerkoopprijsBasiseenheid"
Vervolgens quasi de recordpointer zetten op dat tekstvak ( het is een doorlopend formulier met kolommen ) waar de inhoud nog gelijk is aan Null. Dit lukt dus nog niet.

M'n vraag : "Hoe dit laatste wel goed voor elkaar te krijgen ?"

Mijn gedachte zou zijn - tot dusverre - dat dit zou moeten kunnen lukken met DoCmd.FindRecord ... ( zie svp onderstaand )


Voorbeeld met code :

Code:
Private Sub cboProduct_AfterUpdate()
    Me.cboProduct.Enabled = False
    Me.cboProduct.Visible = False
    Me.txtArtikelnr = Me.cboProduct.Column(1)
    'Teneinde de tabel ook te vullen met ook het veld betreffende het artikelnummer de onderstaande regel
    Me.txtKlantnrTabel = Me.txtKlantnr
    Me.Requery
    Me.txtArtikelnr.Enabled = True
    'De volgende regel is bedoeld ter voorbereiding van het vinden van een record met nog niet ingevulde verkoopprijs
    DoCmd.GoToControl "txtVerkoopprijsBasiseenheid"
    'Het volgende statement zou bedoeld zijn om het record te vinden waar het veld VerkoopprijsBasiseenheid nog niet is ingevuld ( dus gelijk is aan Null)
    'de volgende regel werkt echter niet !
    [B]DoCmd.FindRecord "", , True, , True[/B]
End Sub

Hopend op een goede aanwijzing :thumb:

Bvd, mvg,


Hans
 
Er is zoveel dat ik niet snap, dat ik eigenlijk niet weet waar ik beginnen moet... Een poging dus.
Er is een control ( tekstvak ) met de naam : txtVerkoopprijsBasiseenheid. Dit is gekoppeld aan een query veld genaamd VerkoopprijsBasiseenheid.
Heb je een eigen query voor een tekstveld? Waarom? Een tekstveld heeft niet, zoals een keuzelijst, een Rijbron. Of bedoel je dat het hele formulier de query als Recordbron gebruikt?

Bedoeling is om nadat een nieuw product is gekozen ( voor een prijslijst ) middels een combobox, dat dan vervolgens de recordpointer/cursor direct komt te staan op het dan nog lege veld
VerkoopprijsBasiseenheid behorend bij dat nieuwe record. Dat veld is dus gekoppeld aan een tekstvak genaamd txtVerkoopprijsBasiseenheid.
Je kiest geen veld op een formulier, maar een object zoals een tekstveld. Dat tekstveld is dan gekoppeld aan een tabelveld. Een Recordpointer wijst (de clou zit in de naam) een record aan, geen object. De cursor kun je uiteraard met VBA in een tekstveld laten zetten. Kan uiteraard ook met de tabtoets, als de veldvolgorde goed is. Maar als je een veld [VerkoopprijsBasiseenheid] noemt, nam heb je de prijs toch al in de tabel met Artikelen staan? Waarom vul je het veld dan niet vanuit de keuzelijst als je een artikel kiest?

Mijn gedachte zou zijn - tot dusverre - dat dit zou moeten kunnen lukken met DoCmd.FindRecord ... ( zie svp onderstaand )
En hier raak je me echt kwijt; je bent een nieuw record aan het invullen, waarin je een artikel kiest. Wat moet je dan in hemelsnaam met FindRecord? Niet alleen ga je dan van je nog niet compleet ingevulde record af (allicht dat je dan in de problemen komt met verplichte velden die nog niet zijn ingevuld), maar waarom?

Code:
Private Sub cboProduct_AfterUpdate()
    Me.cboProduct.Enabled = False
    Me.cboProduct.Visible = False

Waarom maak je de keuzelijst èn disabled, èn onzichtbaar? Heb je wel eens een onzichtbaar object aangeklikt? Kan niet. Enabled of niet. Dus onzichtbaar maken is al genoeg. (al heb ik uiteraard geen idee waarom dat zou moeten; bovendien zijn ze op je doorlopend formulier ook gelijk op het hele formulier voor alle records weg)


Code:
    Me.Requery
Nog zo'n actie waarvan ik denk: waarom? Met Requery reset je het formulier, en gaat de recordpointer naar het eerste record. En daar was je echt niet aan het werk...
En dan kan ik nog wel even doorgaan... Wellicht dat ik er, met een db bij de hand, wèl chocola van kan maken, en dan het licht zie, maar nu is het èrg donker...
 
Toelichting

Goedemorgen,

Om je weer terug op de weg te krijgen :

Het betreft zo'n doorlopend kolommenformulier. Doel ervan is om :

- enerzijds gegevens in te voeren ( per klant, per product, verkoopprijzen, steeds met een ingangsdatum ) ;
- anderzijds om het historisch verloop ervan te tonen. Zo kunnen er per klant meerdere records zijn voor hetzelfde product ( maar andere ingangsdatum prijsafspraak ).

Door deze verkoopprijsafspraken dus gesorteerd op eerst artikelnummer en dan op ingangsdatum weer te geven, heeft de gebruiker een mooi bruikbaar overzicht.

De gebruiker krijgt dat kans om te dubbelclicken op het tekstvak artikelnummer ( in beginsel in het onderste - nieuw toe te voegen - record ), waarna de combobox met artikelen van start gaat en verschijnt ( deze laat ik weer verdwijnen na de keuze om het formulier mooi schoon en overzichtelijk te houden ).

Na de keuze van het toe te voegen artikelnummer via dus cboProduct ( event dat dan optreedt heet cboProduct_AfterUpdate() ) wordt dan het tekstvak betreffende het artikelnummer ( txtArtikelnr ) gevuld en komt er een nieuw record in mijn tabel met prijsafspraken.

Vervolgens vindt er dan inderdaad wel een Me.Requery plaats op het formulier, juist teneinde de nieuwe regel op de juiste plek in het ( quasi ook historisch prijsverloopoverzicht ) te zetten. De gebruiker heeft dan gelijk z'n zicht op het verloop van prijzen voor dat artikelnummer.

VERVOLGENS zou ik dan m'n recordpointer graag willen plaatsen op de regel die/het record dat dan nog geen ingevulde verkoopprijs heeft ( dit moet immers vervolgens worden ingevuld ).

Voor dit laatste wil ik dus graag de recordpointer graag automatisch kunnen laten plaatsen ( via VBA code ) op het tekstvak voor de verkoopprijs ( txtVerkoopprijsBasiseenheid ).

Vandaar mijn vraagstelling : "Hoe dit laatste voor elkaar te krijgen ?". Hierbij vermoedend dat dit zou moeten kunnen middels DoCmd.FindRecord ?? Hiervan krijg ik de syntaxis echter nog niet goed ...

Hopend dat e.e.a. alsnog voldoende duidelijk is.

Mvg,

Hans
 
Laatst bewerkt:
Je toelichting is in die zin verhelderend dat ik nu zie hoe je denkt te moeten werken. Persoonlijk zou ik het nooit zo doen; mij echt veel te ingewikkeld. En ik denk dat je gebruikers door al dat heen en weer geschiet (veranderende formulierweergaven en zo) er ook niet echt vrolijk van zullen worden. Dus ik zou eerst een tegenopzetje willen voorstellen:
Je doorlopende formulier is op zich prima; je hebt in het subformulier een (historisch) overzicht van prijzen per artikel. Niks mis mee. Dat formulier heb je zodanig gemaakt dat je hem ook voor toevoegen kunt gebruiken: prima!
Bij mij is zo'n formulier dan zodanig, dat je ofwel met de Navigatieknop <Nieuw record> een nieuw record kan toevoegen, ofwel (als ik niet zo lui ben) middels een aparte knop op het subformulier die hetzelfde doet. Vervolgens heb je dan een leeg record, KlantID is gekoppeld aan het hoofdformulier, dus dat hoeft niet ingevuld. Datum kun je automatisch in laten vullen (huidige dag) en uiteraard nog aanpassen. Het artikel selecteer je vervolgens met een keuzelijst. Ik heb graag een standaardprijs bij de artikelen, dus die staat ook in de tabel Artikelen, en die vul ik dan in op het tekstvak [Prijs] met de gebeurtenis <Bij klikken> op de keuzelijst cboArtikel. Daarmee vul ik tevens het niet-gebonden tekstvak <Artikelomschrijving>, want je wilt naast het artikelnummer ook wel kunnen zien om welk artikel het gaat. Maar je slaat dat uiteraard niet op. Omdat de prijs vanuit de keuzelijst wordt gevuld, is het tekstobject gewoon gekoppeld aan het tabelveld, en is de prijs dus prima te wijzigen. Je vult vervolgens netjes alle andere velden in, als die er zijn. Velden die niet gewijzigd kunnen/hoeven te worden, zoals AutoID en Artikelomschrijving, krijgen geen tabtoets, zodat je er ook niet in kunt werken/klikken. En vervolgens kun je met de knop <Opslaan> het record bewaren, en het formulier verversen met Requery.

Al die toeters en bellen die jij in wilt bouwen, zijn dus helemaal niet nodig; en het verbergen van keuzelijsten ook niet. Ik heb zelf ook wel eens geëxperimenteerd met een tekstveld en een keuzelijst voor ArtikelID, waarbij bij het invoeren de keuzelijst zichtbaar is, en bij het bekijken het tekstveld, maar ik vind dat ondertussen een onzinnige actie, die ook nog eens extra nodeloos werk oplevert. Een keuzelijst ziet er wat mij betreft goed genoeg uit.
 
Oplossing alsnog zelf gevonden ...

Goedemorgen,

Dank voor je reactie.

Ik snap je redenering, echter, zelf zit ik - vooralsnog - kennelijk toch nog wat meer in 'n "experimenteerfase" met "toeters & bellen". Wellicht dat dat in een later stadium wat gaat afvlakken, maar toch ...

Enfin, 'n goed werkende oplossing voor mijn specifieke casus bleek uiteindelijk het volgende :

Code:
Private Sub cboProduct_AfterUpdate()
    Me.cboProduct.Enabled = False
    Me.cboProduct.Visible = False
    Me.txtArtikelnr = Me.cboProduct.Column(1)
    'Teneinde de tabel ook te vullen met ook het veld betreffende het artikelnummer de onderstaande regel
    Me.txtKlantnrTabel = Me.txtKlantnr
    'De verkoopprijs vooralsnog in 1e instantie op € 0,00 zetten om 'm daarna alsnog door gebruiker te laten invullen
    Me.txtVerkoopprijsBasiseenheid = 0
   [B] 'Record op juiste plek laten zetten in volgorde t.b.v. overzicht en focus gebruiker bij ingeven verkoopprijs middels Requery[/B]
    Me.Requery
    Me.txtArtikelnr.Enabled = True
    [B]'De volgende regels zijn bedoeld ter voorbereiding van het vinden van een record met nog niet ingevulde verkoopprijs[/B]
    DoCmd.GoToControl ("txtVerkoopprijsBasiseenheid")
    'in tekstvak bedrag € 0,00 invullen als zoekbedrag ( dat tekstvak ook te gebruiken in combi met commandotoets voor zoeken )
    Me.txtZoekBedrag = 0
    'Het volgende statement bedoeld om het record te vinden waar het veld VerkoopprijsBasiseenheid vooralsnog is ingevuld met waarde € 0,00
    'de gebruiker komt dan op de plek waar hij gelijk de juiste verkoopprijs alsnog moet invullen
    [B]DoCmd.FindRecord Me.txtZoekBedrag.Value[/B]
End Sub

Met dank en vriendelijke groet,

Hans
 
Laatst bewerkt:
Misschien moet ik je tot die tijd maar aan laten modderen; tegen de tijd dat je toe bent aan snelle en simpele oplossingen, spring ik wel weer in :)
 
Yep, altijd handig om te weten ...

... dat d'r iemand is met meer ervaring dan ikzelf. Zal d'r dus allicht graag nog vaker gebruik van willen maken :thumb:

Mvg,

HH
 
Maar begin vooral bij simpele oplossingen; een chirurg in opleiding laten ze ook niet gelijk in de hersenen wroeten...
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan