Verticaal zoeken in Access

Status
Niet open voor verdere reacties.

Ralbers

Gebruiker
Lid geworden
8 jul 2011
Berichten
190
Hallo allemaal,

Ik ben bezig met een database met een zo gebruiksvriendelijkmogelijke invoermogelijkheid

Daarvoor heb ik een formulier gemaakt
Dat werkt eigenlijk vrij goed.
Op het onderste stukje na

screen formulier database.jpg

Ik zou namelijk graag willen dat ik daar de gegevens van de vorige regel kan zien
zoals in het voorbeeld zijn we gegevens aan het invullen voor regel 2404
Ik zou dan graag dat onderaan een paar cellen van regel 2403 weergegeven worden.
In mijn ogen klinkt dat als vert.zoeken() of index()
Maar ik zou niet weten hoe ik dit moet aanpassen bij access

Moet ik dan met querys werken? eventueel hulpkolomen maken in de tabel zelf?

Ik heb ook een screentje van de relaties toegevoegd
Het formulier heeft hierbij betrekking op de tabel database


screen relaties database.jpg

Heeft iemand tips hoe ik dit kan verbeteren?
 
Wat je kan verbeteren, is in ieder geval je Relaties tussen de tabellen. Die zijn nu namelijk 100% nutteloos. Dat komt omdat je op geen enkele manier <Referentiële integriteit afdwingen> gebruikt, en dat houdt in dat je net zo goed het veld [Sofi nummer] aan het veld [Eindtijd] (tabellen [Uren] en [Medewerkers]) kan koppelen. Die werkt namelijk net zo goed (of slecht).
Verder is de tabel [Medewerkers] niet genormaliseerd, en dat zou ik ook zeker dus nog doen.Als ik velden zie als [Pauze 1] .. [Pauze 5] en [Uren Tarief1] t/m [Uren Tarief1] dan begint er van alles te jeuken...
En dan de koppeling tussen [Database] en [Beschikbare dozen]? In [Dozen] heb je nog wel een sleutelveld, maar je probeert een niet-sleutelveld te koppelen aan een niet-sleutelveld. Gaat niet lukken. In [Database] moet je het (vermoedelijke tekst)veld Doos vervangen door een numeriek veld DoosID, dan kun je ze netjes koppelen.
En dat heeft dus nog niet eens wat met je vraag te maken ;)

Access kent geen DLookup of Index, zoals Excel, dus je kunt niet zomaar het voorlaatste record (ik neem aan dat je dat bedoelt, en dat het veld [ID] in [Uren] een Autonummerveld is) opzoeken. Je zult daar een apart formulier, of (wellicht handiger) een keuzelijst voor moeten maken die als basis een query heeft die het voorlaatste record laat zien. Wat an sich dus wel kan. Maar repareer eerst je database, zou ik zeggen :)
 
Bedankt voor je tips
Zoals je ziet ben ik met access nog niet zo heel ervaren
Ik zal er zeker gebruik van maken
De gegevens voor de velden [pauze 1] ... [pauze 5] enzo worden allemaal aangeleverd met excelbestanden. Er zijn alleen 2 verschillende aanlevermethodes die allebei ondersteund moeten worden. Dus dat is inderdaad een hele brede tabel maar daar worden niet altijd alle gegevens in gevuld

In de [database] is doos inderdaad een tekst. Ik heb me al vaker gerealiseerd dat een nr mooier zou zijn. Maar aangezien er al diverse dashboards op aangesloten zijn is het mij iets te veel moeite dit even aan te passen. Ook moet in het formulier natuurlijk gekozen worden uit de tekst. Want doos 4 zegt niemand niks

Ik wil inderdaad de gegevens uit het autonummerveld wat ervoor komt weten. Deze velden zijn echter puur ter info en moeten dus niet ingeschakeld zijn. Toen ik hieraan begon klonk het redelijk simpel maar het valt toch tegen.

Ik zal eens gaan klooien met een apart formulier
 
Ook moet in het formulier natuurlijk gekozen worden uit de tekst. Want doos 4 zegt niemand niks
Normaal gesproken gebruik je daarvoor een keuzelijst met invoervak, die je baseert op de tabel Dozen. Je ziet (en kiest) dan op basis van de tekst, en je slaat het IDnummer op. Maar als je geen zin hebt om dat aan te passen, dan zou ik dat ID veld verwijderen (doe je niks mee) en het veld Doos in [Beschikbare dozen] promoveren tot sleutelveld. Dan kan je in ieder geval de relatie goed leggen.
De makkelijkste manier is niet een formulier maken, maar een keuzelijst. Die kun je vervolgens uitzetten. Sowieso kun je niks met de gegevens in een keuzelijst, dus de gebruiker kan ook niks slopen. Ook niet als hij gewoon aan staat.
 
Ja ik snap dat het zo werkt. Zo was ik het een half jaar geleden ook van plan te maken
Maar ook toen was mijn kennis niet genoeg en heb ik met heel wat geklooi een keuzelijst met de tekst gemaakt.
Ik weet dat dat beter kan En snap zeker wat je bedoelt maar het wekt zo dus dat onderdeel laat ik denk ik zo
Omdat bij de export naar excel constant gefilterd word en vergeleken word naar die tekst.
 
heb je geen voorbeeldje waarmee getest kan worden?

Had iets vergelijkbaars en opgelost met een subform waarbij het veld waar het omgaat de standaardwaarde meekrijgt uit het subform. (=[Subformnaam].[Form]![veldnaam]

Naamloos.jpg
 
Da's denk ik niet helemaal wat TS bedoelt, want daarmee zie je niet het voorlaatste record. Maar zonder voorbeeldje blijft het lastig om een structureel bruikbaar antwoord te geven. Maar ik heb TS natuurlijk wel wat huiswerk meegegeven, dus wellicht dat hij daar de prio aan heeft gegeven :)
Zoals ik in post #4 al aangaf, is een keuzelijst veruit het makkelijkst, omdat je die overal wel neer kunt zetten, en de recordbron niet wordt beïnvloed door het hoofdformulier (doet een subformulier soms wel). De syntax om het voorlaatste record te laten zien, kun je hier wel uithalen:
[SQL]SELECT TOP 1 Factuurnummer, BedrijfID, Naam, Betreft, Factuurdatum, Vervaldatum, Betaald, Betaaldatum FROM Factuur
WHERE (Factuurnummer < Val(DMax("[Factuurnummer]","[Factuur]"))) ORDER BY Factuurnummer DESC;[/SQL]
 
Ik heb toch even een voorbeeld database gemaakt
Ik heb alle gegevens eruit gehaald dus ik hoop dat het toch duidelijk is

Bekijk bijlage vb database - kopie.rar

Het probleem heeft niet echt hoge prioriteit

Maar ik zou nu gewoon heel graag willen weten hoe het zit
Dus eigenlijk is het nu vooral om mijn kennis te vergroten

Ik heb geprobeerd zoveel mogelijk je wijzigingen door te voeren

Ik ben enigzins bekent met sql
Maar het lukt me niet om die dmax() formule erin te krijgen
ik krijg dan constant een foutmelding
 
Laatst bewerkt:
Je bijlage is prima in orde :). Die DMax heb je alleen nodig als je het voorlaatste record wilt weten. Jouw oplossing werkt prima als het om het laatste record gaat. Al kan hij iets logischer:
Code:
SELECT TOP 1 Doos FROM [Database] GROUP BY Doos, Id ORDER BY Id DESC;
 
Ja zover had ik het idd dankzij jouw voorbeeld stukje uitgevogeld

Alleen dat where stukje krijg ik er niet fatsoenlijk in
Code:
where (id<val(Dmax("[id]","[doos]")))

Dit geeft een foutmelding

Maarja is moeilijk google want dan kom je iedere keer gewoon bij group by
En ik wil dus net de 1 na hoogste hebben
 
En ik wil dus net de 1 na hoogste hebben
Typefout (je bedoelt niet), of bedoel je echt net? Mij lijkt het dat je de laatste wilt hebben voor als je een nieuw record toevoegt; dan heb je niet zoveel aan het voorlaatste. Of, nog een optie, je wilt het voorlaatste record zien afhankelijk van het geselecteerde record. Dat heeft namelijk ook nog wel zin. Sec het voorlaatste record zien, ongeacht waar je staat, heeft denk ik weinig nut.
 
Laatst bewerkt:
als je bij het invoeren in de 100e regel zit
wil ik de waardes weten voor de 99e regel
zit je in de 150e regel
wil ik de waardes weten voor de 149e

Dus die formule dmax() die jij in je voorbeeld van post 7 had komt denk ik aardig in de richting
Dus hij moet een lijstje maken met alle waardes kleiner dan de huidige waarde
En daarbij dan de top 1 van pakken
Dat laatste doet hij al
Alleen hij moet de huidige waarde negeren
 
In dat geval heb je geen DMAX nodig, maar moet je een vergelijking maken op basis van het actieve record op het formulier. Ik heb het voorbeeldje een beetje uitgebreid (nog steeds middels een keuzelijst die gevuld wordt) en laat nu het laatste record zien op basis van een Factuur+Bedrijf. Dus je ziet met deze code de voorlaatste factuur van het actieve bedrijf. Die code kun je uiteraard zelf wel aanpassen, als je een andere selectie wilt zien.
Code:
SELECT TOP 1 Factuur.Factuurnummer, Factuur.BedrijfID, Bedrijven.Bedrijfsnaam, Factuur.Factuurdatum, Factuur.Aanmaningsdatum, Factuur.Betaald, Factuur.Betaaldatum 
FROM Bedrijven INNER JOIN Factuur ON Bedrijven.ID = Factuur.BedrijfID 
WHERE (((Factuur.Factuurnummer)<[Formulieren]![Facturen]![Factuurnummer]) AND ((Factuur.BedrijfID)=[Formulieren]![Facturen]![BedrijfID])) ORDER BY Factuur.Factuurnummer DESC;
 
Ik kom volgens mij al in de buurt

Hij doet het afentoe wel
maar als ik dan naar een andere record ga vernieuwd hij niet

Dit is de sql die ik nu heb
Code:
SELECT TOP 1 Database.Doos, Database.Id
FROM [Database]
WHERE (((Database.Id)<[forms]![invoer]![id]))
ORDER BY Database.Id DESC;
 
Een formulier werkt de niet-gevonden objecten niet bij als het eenmaal is geopend. Die gebeurtenis moet je nog toevoegen. Zelf gebruik ik de gebeurtenis <Bij wijzigen> van het formulier. Daar geef je de opdracht ReQuery op de keuzelijst.
 
Het werkt
Ik heb nu een macro gevonden bij de standaardacties van access
vernieuwen
Alleen ik moet nog een goede trigger vinden om die macro te starten

Het in het formulier al wel een aantal dingen geprobeerd en kan niet echt 1 goede trigger vinden

behalve bij iedere knop en tekstvak toevoegen als die gewijzigd word
Maar dat moet makkelijker kunnen lijkt mij
 
Heb je mijn antwoord wel gelezen? :)
 
ja maar dat werkt niet dat met bij wijzigen

Maar wel als ik het bij alle cellen doe denk ik
dus daar ga ik maandag mee beginnen;)
 
Je had natuurlijk moeten zeggen: er bestaat helemaal geen gebeurtenis <Bij wijzigen>. Wel dapper dat je dan toch op zoek gaat naar die gebeurtenis! Is dus een foutje van mij (moet je maar geen antwoorden zonder computer maken). Ik bedoelde de gebeurtenis <Bij aanwijzen>. En cellen? Welk programma gebruik jij? :)
 
Zijn wel velden als <Bij gegevenswijziging> en<Bij wijziging gegevensverzameling> Maar die bieden allemaal niet het gewenste resultaat

Maar <Bij aanwijzen> werkt perfect. (ookal vind ik dat onlogisch klinken maar dat zal wel aan mij liggen)

Ik ben iets meer thuis in Excel dus ik viel automatisch terug op cellen. Maar ik bedoelde natuurlijk Tekstvakken en knoppen
Maar dat is nu mooi niet nodig

Ik denk dat het zo perfect werkt

Ontzettend bedankt voor de hulp
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan