Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Environ("Username") mit Text verketten

Begonnen von AOT, August 01, 2017, 15:17:39

⏪ vorheriges - nächstes ⏩

AOT

Liebes Forum,

ich habe ein komisches Phänomen:
In meiner Datenbank will ich in einem Textfeld festhalten, welcher Nutzer eine Änderung an einem Datensatz in einem Formular gemacht hat.

Dazu lese ich über Environ("Username") den Windowsbenutzernamen aus.

Da die Benutzernamen bei uns kryptische Zeichen sind habe ich in einer Tabelle zu den Benutzernamen noch die Klarnamen gespeichert.

In einer Funktion fncUserName verkette ich dann den Benutzername mit dem Klarnamen, den ich per SQL-String aus der Tabelle auslese.

Diese Funktion fncUserName rufe ich beim Ereignis Form_BeforeUpdate des Formulars auf

Das funktioniert, wenn ich die beiden Elemente ohne weiteres Textelemente verkette:

---------------------
Dim rsKlarname As Recordset
Dim strSQLstring As String
Dim strUserKlarname As String

strSQLstring = "SELECT nutzer FROM Nutzer WHERE idm = '" & Environ("username") & "';"
Set rsKlarname = db.OpenRecordset(strSQLstring, dbOpenDynaset)
strUserKlarname = rsKlarname(0) & Environ("Username")
Debug.Print strUserKlarname
fncUserName = strUserKlarname
----------------------

schreibt ganz richtig in Direktfenster und Textfeld
Großmannir35urir

Das ist aber ein bisschen doof lesbar, weswegen ich gerne ein kleines Textelement einfügen würde, z.B.

---------------------
(....)
strUserKlarname = rsKlarname(0) & " - " & Environ("Username")
Debug.Print strUserKlarname
fncUserName = strUserKlarname
----------------------

Dann schreibt er noch richtig
Großmann - ir35urir
in das Direktfenster. In das Textfeld aber schreibt er einfach gar nichts.

Kann das jemand erklären?

Viele Grüße
Jürgen


el_gomero

Hallo Namensvetter,

zeige den Code, der die Zuweisung erledigen soll. Im gezeigten Schnipsel werden nur Variablen befüllt. Code bitte immer in Tags packen, ist dann besser zu lesen.

Ausserdem macht


fncUserName = strUserKlarname


aus meiner Sicht keinen Sinn.
Gruß
Jürgen


Hilfe nach bestem Wissen, ohne Anspruch auf Richtigkeit und Vollständigkeit.
*feedback erwünscht*
Bitte Tipps lesen

AOT

Hallo Namensvetter,

danke für die schnelle Antwort. Das Feld wird so befüllt:

F!Aenderung_Nutzer = fncUserName()

War das gemeint?

Vielen Dank und viele Grüße
Jürgen

el_gomero

ja, das war gemeint ... wenn der Code im offenen Form gestartet wird, schreib mal


Me!Aenderung_Nutzer = fncUserName()


von anderswo gestartet


Forms!Formname!Aenderung_Nutzer = fncUserName()

Gruß
Jürgen


Hilfe nach bestem Wissen, ohne Anspruch auf Richtigkeit und Vollständigkeit.
*feedback erwünscht*
Bitte Tipps lesen

DF6GL

#4
Hallo,


mhmm,  m. E. sollte das so heißen
Function fncUserName() as String
Dim rsKlarname As Dao.Recordset
Dim strSQLstring As String
Dim strUserKlarname As String
Dim strUsername As String

strUsername = Environ("username")

strSQLstring = "SELECT nutzer FROM Nutzer WHERE idm = '" & strUsername & "'"

Set rsKlarname = Currentdb.OpenRecordset(strSQLstring, dbOpenSnapshot)

fncUserName = rsKlarname(0) & " - " & strUsername

End Function


und

Sub Form_BeforeUpdate(Cancel as Integer)
Me!Aenderung_Nutzer = fncUserName()
End Sub




oder kürzer:

:Function fncUserName() as String

Dim strUsername as String
strUsername = Environ("username")

  fncUserName = Currentdb.OpenRecordset("SELECT nutzer FROM Nutzer WHERE idm = '" & strUsername & "'", dbOpenSnapshot)  (0)  & " - " & strUsername
End Function






Und:  Bitte IMMER die vollständigen Prozeduren posten...

Lachtaube

#5
... und weil sich der Benutzername während einer Sitzung nicht ändert, könnte man die Auswertung in eine statische Variablen schreiben.Option Explicit

Public Enum UserNamePart
   unpLoginPart
   unpPlainText
   unpCombined
End Enum

Public Function GetUserName(Optional ByVal NamePart As UserNamePart _
                                           = unpCombined) As String
   Static LoginName As String, PlainName As String

   Const USR_QRY As String = _
         "SELECT nutzer FROM Nutzer WHERE idm = [@idm];"

   If Len(LoginName) = 0 Then
      LoginName = Environ$("USERNAME")
     
      On Error Resume Next 'man weiß ja nie
     
      With CurrentDb.CreateQueryDef(vbNullString, USR_QRY)
         .Parameters("@idm") = LoginName
         PlainName = .OpenRecordset()(0)
      End With
   End If

   Select Case NamePart
      Case unpPlainText: GetUserName = PlainName
      Case unpCombined:  GetUserName = PlainName & " - " & LoginName
      Case Else:         GetUserName = LoginName
   End Select

End Function
Grüße von der (⌒▽⌒)

AOT

Vielen Dank für die vielen und schnellen Antworten!

@Jürgen: veränderter Aufruf hat leider nichts gebracht

@DF6GL: das Environ("Username") vorher als String zu deklariern hatte ich schon probiert. Die ganze Funktion als String war eine neue Idee, hat aber leider nicht funktioniert :-(

@Lachtaube: die Konstantendeklaration ist ein neuer Ansatz. Der Code übersteigt meine bescheidenen VBA-Kenntnisse, aber vielleicht probiere ich es mal.

Noch mal vielen Dank und Grüße aus Franken
Jürgen

DF6GL

Hallo,
funktioniert denn überhaupt mein Vorschlag?

Mit
Zitat...hat aber leider nicht funktioniert...
kann man nichts anfangen..   :(

el_gomero

allmächt - a Frangee ...

Moin Jürgen,

wenn du Hilfe erwartest, solltest du endlich den vollständigen Code posten ...
Gruß
Jürgen


Hilfe nach bestem Wissen, ohne Anspruch auf Richtigkeit und Vollständigkeit.
*feedback erwünscht*
Bitte Tipps lesen

Beaker s.a.

Hallo Jürgen,
Was ist denn ein "Frangee" ?
Bin zu jung oder zu alt um das zu kennen?
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

DF6GL

 ;) ;) ;) 8)

--->
Zitatund Grüße aus Franken

Vorsicht Jürgen, ich bin auch a Frangee    ;D ;D ;D


(aber nur während meiner ersten 3 Jahre..)

el_gomero

@ Franz
ich war wenigstens mal ne Weile in Franken zur Ausbildung ... und wohne in Franken (thal) ;) 
Gruß
Jürgen


Hilfe nach bestem Wissen, ohne Anspruch auf Richtigkeit und Vollständigkeit.
*feedback erwünscht*
Bitte Tipps lesen

Beaker s.a.

Alles klar, - die Italiener.  ;)
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

AOT

Hallo an alle Franken (und sonstige :-)),

Wenn das relevante Formular geändert wird erfolgt über ein Klassenmodul:

Private Sub Form_BeforeUpdate(Cancel As Integer)
On Error Resume Next
If IsNull(Nachname) And IsNull(Organisation) Then
    MsgBox "Die Felder 'Nachname' und 'Organisation' dürfen nicht beide leer sein!" & Chr$(13) & Chr$(10) & "(Rückgängig mit Esc)", 16
    Cancel = True
Else
    void = Touch()
End If
End Sub


Die Funktion Touch() steht in einem allgemeinen Modul

Function Touch()
On Error Resume Next
Dim F As Form
Set F = Screen.ActiveForm
If IsNull(F!Eingabe_Nutzer) Then
    F!Eingabe = Now
    F!Eingabe_Nutzer = fncUserName()
Else
    F!Aenderung = Now
    F!Aenderung_Nutzer = fncUserName()
End If
End Function


Die fncUserName() steht im gleichen allgemeinen Modul:

Public Function fncUserName() As String
Dim db As DAO.Database
Dim rsKlarname As Recordset
Dim strSQLstring As String
Dim strUserKlarname As String

Set db = CurrentDb

strSQLstring = "SELECT nutzer FROM Nutzer WHERE idm = '" & Environ("username") & "';"

Set rsKlarname = db.OpenRecordset(strSQLstring, dbOpenDynaset)

strUserKlarname = rsKlarname(0) & " - " & Environ("Username")

Debug.Print strUserKlarname
fncUserName = strUserKlarname

End Function


Die Ausgabe im Direktfenster stimmt; nur in das Textfeld schreibt er einfach gar nichts. 

Viele Grüße
Jürgen

el_gomero

also bei mir wird ein Eintrag geschrieben. Lass dir mal mit debug.print f.name innerhalb touch den Namen des Forms ausgeben.
Gruß
Jürgen


Hilfe nach bestem Wissen, ohne Anspruch auf Richtigkeit und Vollständigkeit.
*feedback erwünscht*
Bitte Tipps lesen