Formulier waarde in query

Status
Niet open voor verdere reacties.

test1000

Gebruiker
Lid geworden
7 jul 2017
Berichten
258
Hoi,

Ik heb een tabel met gebruikersnaam en bedrijfsnummer. Maw iedere gebruiker mag alleen gegevens zien van zijn bedrijf.
Vb tabel

Naam bedrijfsnummer
Jan 200 or 400
An 100


Op een formulier heb ik een knop die een query oproept met de gegevens afhankelijk van wie is ingelogd. (heb een functie username() gemaakt op formulier. Dus het formulier weet wie is ingelogd.
Vb An ziet enkel de gegevens van bedrijf 100. Jan van 200 en 400.
Voor An werkt die query wel. Voor Jan niet.

In de query bij veld "Bedrijf" heb ik [forms]![gegevens]![bedrijfsnummer]

Dus voor An werkt deze query wel. Bij meerdere bedrijfsnummers niet (voor Jan)

Wat kan de reden hiervoor zijn ?

Alvast bedankt.
 
Laatst bewerkt:
Ik denk dt je het systeem wel wat slimmer kan maken. Om te beginnen: filteren m.b.v. een formulier ([forms].[gegevens].[bedrijfsnummer]) is nooit handig; de query werkt niet als het formulier niet geopend is. Veel beter is het om de filtering 'hard' in te programmeren. Bijvoorbeeld met VBA, of door gebruik te maken van een TempVar waarin je de Username zet. Dat je daar een aparte functie voor maakt, terwijl het maar één regel code is, vind ik dan wel een aardig stukje huisvlijt :).
Daarnaast je een filter gemaakt voor één waarde, niet voor meer. Dat werkt dus niet als je meerdere waarden wilt kunnen filteren. Wat ik meestal doe, is een criterium IN(#1, #2, #3 etc) gebruiken wat die beperking omzeilt. Dat werkt namelijk ook als je maar één getal hebt. Die getallen moet je dan uiteraard wel eerst samenbrengen in een string, en dat doe ik dus met VBA. Maar dat kan denk ik wel omdat je het formulier ook aftrapt via een knop. Dan kun je in die procedure dus ook de bedrijven in een string zetten.
 
Ik zou verwachten als ik een veld heb op het formulier 'text1' en de waarde haal ik op uw de tabel. Dus ik zie op het formulier, veld text1', de waarden 200 or 400 staan dat wanneer ik dit veld neem in de query dat het dan wel zou werken.
Want de query bevat natuurlijk ook nog andere selecties op andere velden.
Dus begrijp niet wat je bedoelt met IN(#1,#2, ...)

Is het maw niet eenvoudig mogelijk om een veld van een tabel te nemen, waarin meerdere waarden staan, om dit veld te nemen voor een selectie ?
Dat zou ik toch verwachten van Access :)
 
Ik weet niet hoe je de db hebt ingericht, maar die ‘eenvoudige manier’ die je wilt, heb ik aangegeven (met IN(200;400)). Dat werkt perfect. Jij zet de filtering blijkbaar in het tekstveld. Maar dat is exact dat: een tekstveld. Het filter wordt dan behandeld als tekstreeks, dus als: “100 Or 200”. En niet als 100 Or 200. Dat kan ook, maar op dezelfde manier, met VBA de filtering maken.
Post anders een voorbeeldje, dat kijkt een stuk makkelijker.
 
Hoi,

In bijlage een testdatabase.
Afhankelijk van de Windows user weet het programma voor welke bedrijf of bedrijven de omzet mag getoond worden.
Als voorbeeld heb ik de data ook als tekst geschreven. In dit voorbeeld is Ann ingelogd en zij is verantwoordelijk voor de bedrijven 100 en 500.
Als ik op de knop "Run" klik moet de som van de omzet getoond worden van de toegewezen bedrijven. In dit voorbeeld 100 en 500.
 

Bijlagen

  • Omzet.zip
    32,7 KB · Weergaven: 31
Je voorbeeld is wel heel summier: je gebruikt functies (username(), bedrijf()) die er niet inzitten, een knop zonder code en query die moet worden aangeroepen middels die knop die ontbreekt. Dat wordt wel héél veel knutselen zo :). Die functie UserName vond ik al niet zo handig (immers maar één regel code), maar de functie Bedrijf? Wat moet ik me dáár bij voorstellen?
 
De gebruikers loggen in op een terminal server.
Adhv de Windows loginname kan ik in de tabel "tbluser" terugvinden voor welke bedrijven men verantwoordelijk is.
Daarom had ik ook geschreven als voorbeeld dat gebruiker Ann was ingelogd en zij is verantwoordelijk is voor bedrijf 100.
Jan is verantwoordelijk voor de bedrijven 200 en 400.
De velden in het rapport mag je daarom negeren. Omdat jij u niet gaat aanmelden op terminal server.
Dan is het de bedoeling om de records van tabel omzet te laten zien afhankelijk van welke gebruiker er is ingelogd.
Maar welke code ??? Mij lukt het niet.
Heb ook al geprobeerd met
Code:
Docmd.Openform
maar ik blijf met het probleem dat in de tabel 200 or 400 als tekst wordt geïnterpreteerd en niet als "code".
Maw de or als functie en niet als tekst.
Daarom geen code achter de knop.
Hopelijk dat het nu wat duidelijker is.

Ivm username kan je oproepen via code
Code:
environ("username")
maar dan kan ik de naam niet weergeven op het formulier. Of ben ik fout ?
 
Laatst bewerkt:
Je kunt een User makkelijk op een formulier zetten op deze manier:
Code:
Private Sub Form_Load()
    Me.user = Environ("Username")
End Sub
Daar heb je dus verder geen functie voor nodig. Ook kun je de User bij het starten/inloggen in de database in een TempVar zetten. Dat is nog makkelijker, want dan kun je de user overal gebruiken, op formulieren en zelfs in queries.
Wat betreft je filter: zoals ik al zei, gaat dat zo nooit werken. Een tekst kun je niet als getalfilter (en dat wil je) omzetten. Maar met IN kan dat dus wél. Maar ik vind je aanpak dus niet geweldig.

Kijken we bijvoorbeeld naar de tabel [Omzet], dan zie ik meerdere bedrijven met dezelfde 'naam'. Lijkt mij onwenselijk. Je hebt bijvoorbeeld bij Jan staan dat hij de bedrijven 200, 400 en 500 mag zien (200 Or 400 Or 500) maar er ís dus geen bedrijf 400. Om de bedrijven op een correcte manier te koppelen aan users, kun je twee manieren gebruiken (correcte dus ;)). Je kunt een aparte tabel maken voor de koppelingen, of je kunt een keuzelijst met meervoudige keuzes opnemen in de tabel Users (lastiger, dus door de meeste beginners toegepast ;)). Beide opties moet je op dezelfde manier gebruiken: je moet ze uitlezen en de gekozen combinatie dus in een filter zetten (inderdaad, met IN).
 
Het was een 'test'database die ik snel ik elkaar heb gestoken.
Maar het gaat om het principe en dat is "op welke manier kan ik zo'n tekstveld (200 or 400) gebruiken om een filter te maken ?
Want met IN zou het wel moeten lukken. Maar op welke manier programmeren ?
Sorry, maar ik ben de draad kwijt.
Snap totaal niet wat je wil zeggen.
Wat ik begrijp is idd dat je een tekstveld niet als getalfilter kan gebruiken.
Maar op welke manier met IN ..... ????

Wel bedankt ivm "username" code en voorstel met tempvar. Ga ik zeker gebruiker.
Wel eerst opzoeken op welke manier ik tempvar moet programmeren :)
 
Laatst bewerkt:
Net geprobeerd bij
Code:
form_load
de code
Code:
me.user = environ("username")
Krijg de foutmelding "Compileerfout. Kan de methode of het gegevensveld niet vinden".
Moet er een bepaalde module geladen worden ??

Onderstaande heb ik ooit op het internet gevonden :

Code:
Public Function UserName()
    UserName = Environ$("UserName")
End Function

Call the function using the formula:
Code:
=Username()
 
Ok zal de functie weggooien maar uw commando werkt niet bij mij.
Ofwel doe ik iets verkeerd of zijn niet alle modules actief.
Maar ik krijg een foutmelding.

En ivm een tekstveld in een filter gebruiken met IN weet ik ook niet hoe te programmeren.
Wat ik kan doen is met de functies Left , Mid en Right de bedrijven knippen.
 
Wat ik kan doen is met de functies Left , Mid en Right de bedrijven knippen.
Daar zou ik al helemaal niet op terugvallen; zoek een degelijke oplossing, zoals degene die ik voorstel :). Bij mij doet de username het prima op jouw formulier, dus daar ligt het niet aan. Ik zal zometeen een voorbeeldje posten met een IN constructie, al is het jammer dat ik eerst een aantal dingen zelf nog moet maken, zoals de query. Da’s dan eigenlijk zonde van mijn tijd, die ik liever in de oplossing steek :).
 
Sorry OctaFish, maar heb uw zin
Je kunt een aparte tabel maken voor de koppelingen, of je kunt een keuzelijst met meervoudige keuzes opnemen in de tabel Users (lastiger, dus door de meeste beginners toegepast ). Beide opties moet je op dezelfde manier gebruiken: je moet ze uitlezen en de gekozen combinatie dus in een filter zetten (inderdaad, met IN).
1.000 maal gelezen maar zou absoluut niet weten wat je bedoelt. Laat staan dat ik kan beginnen met code of iets dergelijks.
Je hebt mij al dikwijls goed geholpen of mij op het rechte pad gezet maar nu ..... is Chinees voor mij :)
 
Ik zou zeggen: zet een iets uitgebreider voorbeeld neer, waarin iets valt te filteren, en ik maak daarin wel een voorbeeldje. Het is namelijk niet zo heel ingewikkeld, maar je moet de procedure waarmee je de query opent dus wat uitbreiden. Je moet eerst een Recordset openen die het filter ‘ophaalt’ uit de tabel (welke variant je ook kiest) en die waarden in een string zet.
Die string wordt dan het filter voor de query. Zelf gebruik ik een ‘vaste tijdelijke’ query waarvan ik de SQL code steeds aanpas (met een QueryDef). Er zit dus géén filter meer in dat een geopend formulier nodig heeft, wat jij hebt geprobeerd.
Deze variant werkt dus altijd. En verandert alleen als je hem via het menu aanpast.

Het zal je hopelijk duidelijk worden a.d.h.v. een voorbeeld.
 
Zie voorbeeld.
heb geprobeerd een code in te voeren.
Dus afhankelijk van de user die is ingelogd mag de cijfers zijn van het bijhorende bedrijf.
Q_omzet filteren met 'bedrijf' dat bij de userlogin te vinden is in tbluser1

En environ("username") als veld zichtbaar lukt ook niet.
Bij form_load staat er code om strfilter te bepalen.

Achter de knop zou een overzicht moeten komen van de records die behoren bij de username en bedrijf.
 

Bijlagen

  • Omzet.zip
    68 KB · Weergaven: 22
Laatst bewerkt:
Ik heb aardig wat moeten verbouwen aan je formulier en je code, maar zo is het wel werkend. Dus je zal er niet zoveel problemen mee hebben :). Persoonlijk zou ik niet met losse queries werken, en al helemaal niet met queries met daarin een filter op basis van een formulier, zoals ik al aangaf. Dit is veel stabieler.
 

Bijlagen

  • Omzet v2.zip
    31 KB · Weergaven: 31
In de voetbal zeggen je hebt Champions League en provinciaal niveau.
Ik zit nog op provinciaal niveau te voetballen :)

Wat aanpassingen aangebracht aan de access.
Ik krijg nu wel resultaat ivm filter bedrijf maar nog niet het juiste resultaat:-(

Zie voorbeeld.
De query waaruit het 'bedrijf' moet gefilterd worden heeft een aantal velden waarin de filter keihard is ingevuld.
Ik weet dat dit niet perfect is maar moet ik nog een oplossing voor vinden.
In dit voorbeeld, om het eenvoudig te houden en geen bedrijfsinfo te moeten posten, in de query q_omzet is de filter voor jaar keihard op 2019 gezet. En de maand keihard op 02 (februari).
Maw als de de query "q_omzet" draait krijg je alle omzet te zien van alle bedrijven voor het jaar 2019 en maand februari.
En nu is het de bedoeling om afhankelijk van wie is ingelogd van het jaar 2019 / februari enkel de bedrijven te laten zien waarvoor zij/hij verantwoordelijk is.
In dit voorbeeld, dankzij OctaFish, wordt de query opnieuw opgebouwd en krijgt de gebruiker zijn bedrijven te zien. Dat is al perfect.
Maar de filter jaar = 2019 + maand = 02 ben ik dan kwijt.

Dus wat ik eigenlijk zoek is de query "q_omzet" behouden blijft met zijn al ingestelde filters maar dan extra filter van het bedrijf (of bedrijven) gekoppeld bij de user.
In voorbeeld q_omzet_backup is de oorspronkelijke query.
 

Bijlagen

  • Omzet.zip
    86 KB · Weergaven: 26
Is er een reden om het datumfilter hard in te stellen? Ik neem aan dat je het filter dynamisch wilt hebben, dus wellicht is het handiger om dat gelijk ook maar in te bouwen.
 
De datumfilter is omdat mijn inspiratie op is :)
Je moet het bekijken als een voorbeeld.
Maar ik kan de productie database met gekoppelde SQL tabellen ed niet posten op 'helpmij.nl'.
Daarom het voorbeeld van datum keihard in de query gezet.

Dus je moet vertrekken van het principe.
Bestaat er een mogelijkheid om de bestaande query, in dit voorbeeld 'q_omzet', met zijn al ingebouwde filters te nemen om daarna uw code op los te laten (=filter op bedrijf)?
Uw code is 'filteren op bedrijf'.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan