[MS Access] Persoonlijke mededeling met "fOSUserName()"

Pagina: 1
Acties:
  • 493 views sinds 30-01-2008
  • Reageer

  • bazs2000
  • Registratie: November 2000
  • Laatst online: 31-07 08:16

bazs2000

Pixels zo groot als een atoom

Topicstarter
Ik zit met een (het is geen probleem want het werkt) ongemakkelijk stukje werk in MS Access.
Ik heb een hekel aan applicaties/databases waarop je moet inloggen want de mens heeft al genoeg wachtwoorden om te onthouden. :)

Ik heb dus een database die kijkt naar de gebruikersnaam waarmee je inlogt op het werkstation. Het is een hele aardige functie "=fOSUserName()" wat in een module staat en het werkt echt heel mooi. Omdat je niet meer met een Access workgroup hoeft te werken kun je ineens heel gemakkelijk rechten toekennen op basis van een tabel in de database, precies wat ik wil.

Alleen heb ik iets wat ik nogal jammer vind en waar ik vanaf wil.

Een situatieschets:

Je opent de database en een hidden form opent (gestart met een macro genaamd Autoexec).
Op dit formulier staat een tekstvak met als standaard waarde "=fOSUserName()". Deze wordt, zodra het formulier wordt geopend, gevuld met jouw gebruikersnaam.
Wanneer dit formulier geopend wordt, wordt er dmv OnLoad() een macro gestart die een query uitvoert en kijkt of de gebruikersnaam voorkomt in een tabel en een formulier opent op basis van de gegevens die deze heeft kunnen vinden.

Het formulier opent met een mededeling "Hallo [voornaam] [achternaam]" en er staat één knop met een macro erachter. Klik erop en de hidden form zal samen met het welkomscherm gesloten worden en een ander formulier zal vervolgens worden geopend.

Dit is de Vbcode achter "=fOSUserName()":
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Declare Function apiGetUserName Lib "advapi32.dll" Alias _
"GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long

Function fOSUserName() As String
    Dim lngLen As Long, lngX As Long
    Dim strUserName As String
    strUserName = String$(254, 0)
    lngLen = 255
    lngX = apiGetUserName(strUserName, lngLen)
    If lngX <> 0 Then
        fOSUserName = Left$(strUserName, lngLen - 1)
    Else
        fOSUserName = ""
    End If
End Function

Wat ik nu wil is dit:
Ik wil dat het welkomscherm wordt geopend en meteen dmv "=fOSUserName()" de gebruikersnaam pakt en meteen de query wordt uitgevoerd en deze gegevens in datzelfde welkomscherm gooit. Dit alles met het openen van één formulier, ik heb nu van alles geprobeerd en ik kan nog maar één ding doen (volgens mij) en dat is een hele ranzige manier wat er niet uitziet omdat ik dat dmv een macro het welkomscherm open, gebruikersnaam grabbelt, formulier sluit, query draait en het formulier weer opent.

Alleen een gek zou zoiets doen en dus zoek ik naar een andere oplossing.

Kunnen jullie mij een zetje in de goede richting helpen? Ik hoop erachter te komen hoe het makkelijk kan want "=fOSUserName()" is retehandig maar als je een persoonlijke mededeling wilt geven op basis van deze functie dan kom ik niet veel verder dan de hierboven beschreven omweg. Google laat mij in de steek wat dit betreft omdat er veel staat beschreven maar niets waar ik iets aan heb omdat het allemaal over het loggen van gebruikersnamen gaat en dergelijke.

Ik ben al vanaf vorige week vrijdag bezig om het netter te krijgen maar ik zie het allemaal niet meer.

Krankzinnige muziek vind je hier.


  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Access is meer iets voor Officesuites en -software; ik verplaats je topic even :)

SA > OFF

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • Pyrowired
  • Registratie: Februari 2004
  • Laatst online: 05-01-2025
Ik gebruik meestal de Access functie Environ("<systeemvariabele>") (voor login namen dus Environ("username") )om gegevens van bijvoorbeeld een gebruiker op te halen en dan dmv een lookup het restant van zijn/haar gegevens op te halen.
Deze functie wordt in Access 2003 echter gezien als een "gevaarlijke" functie en levert weer problemen op omdat er dan extra popups tevoorschijn komen.

Maar heb je het gebruik van de <shift> toets uitgezet bij het openen van de db? Want door <shift> in te drukken bij het openen wordt access gewoon geopend zonder de autoexec uit te voeren.
Maak je echter gebruik van de runtime versie van Access voor de gebruikers dan werkt het gebruik van <shift> niet.

Zolang de zon schijnt, blijf ik binnen.


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Ik weet niet of ik snap wat je bedoelt, maar als ik in access iets bouw staat bijna standaard een splash formulier als opstartformulier ingesteld. In jouw geval zou dat het welkomstbericht zijn. Vervolgens maak ik gebruik van het ontimer event van het formulier om te doen wat er gedaan moet worden en uiteindelijk het welkomstformulier te sluiten.

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • bazs2000
  • Registratie: November 2000
  • Laatst online: 31-07 08:16

bazs2000

Pixels zo groot als een atoom

Topicstarter
@Pyrowired:
Ik hoef alleen maar een inlognaam te hebben en fOSUserName is daar uitermate geschikt voor. Omdat ik Access 97 gebruik heb ik geen last van popups of andere nare meldingen dus dat is wat mij betreft prima. Onder Access 2000 is alles ook mooi en goed dus ik hoef niet echt een andere functie te gebruiken. Hoe je de 'shift-methode' kunt omzeilen is mij ook bekend dus dat is niet het punt. :)

@Niesje:
Ik wil dat mijn splash opent, gebruikersnaam ophaalt, query draait en naar gegevens zoekt, deze gegevens in mijn splashscherm zet.

Afbeeldingslocatie: http://i18.photobucket.com/albums/b149/bazs2000/Splash_SDOR.jpg

Zo ziet het eruit wanneer je het nu de DB start (het andere formulier zit erachter).

Krankzinnige muziek vind je hier.


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Is dit een antwoord?
-frmSplash als opstartscherm instellen, tekstboxjes aanmaken voor de weer te geven gegevens.
-in form_open():
sql string opbouwen inclusief where voorwaarde op inlognaam en toewijzen als recordsource voor het formulier; iets als
me.recordsource="select * from gebruikers where inlognaam='" & fOSUsername & "'"
(óf recordset ophalen en waarden handmatig toewijzen aan niet afhankelijke velden.)
- controleren of er wel een gebruiker met die inlognaam bekend is, ic of formulier/recordset wel records heeft
- foutmelding weergeven of formulier laten zien.

II: In timerevent bv na 0,5 of 1 seconde:
- vervolgformulier openen
- frmsplash sluiten

[ Voor 4% gewijzigd door Lustucru op 01-07-2005 11:46 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • bazs2000
  • Registratie: November 2000
  • Laatst online: 31-07 08:16

bazs2000

Pixels zo groot als een atoom

Topicstarter
Oké, dat lukt me niet, ik doe het ergens fout maar waar?

SQL:
1
me.recordsource = SELECT [TBL_Gebruik_Users.Gebruikersnaam] from [TBL_Gebruik_Users] Where [TBL_Gebruik_Users.Gebruikersnaam] =  & fOSUserName & 

Komt met niets terug. Gebruik ik een wildcard na "SELECT" dan komt er ook niets uit.
Ik loop even vast. :?

Al doe ik ipv fOSUsername een vaste waarde (gebruikersnaam die in de tabel voorkomt) dan komt er ook niets uit. De zoekstring heb ik nu al op meerdere manieren geprobeerd op te bouwen maar de enige waarde die ik krijg te zien is "#NAAM" wat een ander woord is voor "Ik snap er niks van".

Edit:
Voor ik het vergeet, Ook met quotes heb ik zitten vogelen maar ook dat gaat niet op.
SQL:
1
me.recordsource="SELECT [TBL_Gebruik_Users.Gebruikersnaam] from [TBL_Gebruik_Users] Where [TBL_Gebruik_Users.Gebruikersnaam]"=" & fOSUserName & "

[ Voor 33% gewijzigd door bazs2000 op 01-07-2005 13:36 ]

Krankzinnige muziek vind je hier.


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

bazs2000 schreef op vrijdag 01 juli 2005 @ 13:29:
SQL:
1
me.recordsource="SELECT [TBL_Gebruik_Users.Gebruikersnaam] from [TBL_Gebruik_Users] Where [TBL_Gebruik_Users.Gebruikersnaam]='" & fOSUserName & " '"
qua syntax is deze variant correct, mits je er nog de extra spatie voor de sluitende single quote uithaalt.
edit:
nu staat er opeens iets heel anders in je bericht wat echt niet klopt... |:(
Mocht hij dan nog geen resultaten geven dan zou je de string kunnen debug.printen en met copy/paste in het queryontwerpraster kunnen gooien. Inhoudelijk is het wel een rare query, je vraagt de gebruikersnaam op met als voorwaarde dat gebruikersnaam ='x'. Waarom vraag je iets wat je al weet?
select gebruikersnaam from tbl_gebruik_users where gebruikersnaam='foo'
moet dat niet zijn:
select gebruikersnaam from tbl_gebruik_users where inlognaam_oid='foo'


Dat je #naam als foutmelding te zien krijgt heeft een andere oorzaak: de tekstbox is gebonden aan een veld dat niet in je query voorkomt. Maw. aan welk veld is je textbox gebonden en hoe heten de velden in je tabel?

[ Voor 8% gewijzigd door Lustucru op 01-07-2005 13:51 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Verwijderd

Pyrowired schreef op donderdag 30 juni 2005 @ 21:05:
Ik gebruik meestal de Access functie Environ("<systeemvariabele>") (voor login namen dus Environ("username") )om gegevens van bijvoorbeeld een gebruiker op te halen en dan dmv een lookup het restant van zijn/haar gegevens op te halen.
Deze functie wordt in Access 2003 echter gezien als een "gevaarlijke" functie en levert weer problemen op omdat er dan extra popups tevoorschijn komen.

Maar heb je het gebruik van de <shift> toets uitgezet bij het openen van de db? Want door <shift> in te drukken bij het openen wordt access gewoon geopend zonder de autoexec uit te voeren.
Maak je echter gebruik van de runtime versie van Access voor de gebruikers dan werkt het gebruik van <shift> niet.
Dit is wel een handige manier, die ook toepas, gebruikers hoeven nu namelijk maar een keer in te loggen.

  • bazs2000
  • Registratie: November 2000
  • Laatst online: 31-07 08:16

bazs2000

Pixels zo groot als een atoom

Topicstarter
Ik ben erg dom als het op kijken aankomt.

Oké, hij haalt nu de gegevens op:
Visual Basic .NET:
1
2
3
Private Sub Form_Open(Cancel As Integer)
Me.RecordSource = "SELECT TBL_Gebruik_Users.Voornaam , TBL_Gebruik_Users.Achternaam from TBL_Gebruik_Users Where TBL_Gebruik_Users.Gebruikersnaam='" & fOSUserName & "'"
End Sub

De twee textvelden krijgen als besturingselementbron "Voornaam" en "Achternaam" (precies de velden die worden opgehaald) en het werkt.

Ohja, ik had mijn stukje uit de eerdere post veranderd omdat ik meerdere dingen probeerde. Daar vloeide iets doms uit, nadat ik dat had veranderd kwam jij met jouw advies en ben ik door gaan modderen met mijn foute stukje. |:(

Anyway, ik wist wel dat het makkelijker kon (zie openingspost) maar wist niet hoe en dit is een waardevolle les geweest want ik kan nu mijn inlogmethode (zonder dat de gebruiker ook maar iets invult) opnieuw maken zodat het beter en sneller werkt (meerdere macro's is niet bevorderlijk voor de performance. :)

Mag ik jullie allen bedanken? :)

[ Voor 6% gewijzigd door bazs2000 op 01-07-2005 14:25 ]

Krankzinnige muziek vind je hier.

Pagina: 1