Supportnet / Forum / Datenbanken
variabler Steuerelement Tip Text
Frage
Hi haloo,
manchmal muß ich nicht nur wissen, wann ein Datensatz geändert wurde, sondern auch wann die letzte Änderung an einem einzelnen Feld vorgenommen wurde. Das Datum zu speichern ist nu’ kein Problem, nur: Wie stelle ich es im Formular möglichst unauffällig dar? Cool wäre, im „Steuerelement Tip Text“ eine Variable unterzubringen, in der der Inhalt des zugehörigen Datumsfeldes Platz findet. Ich fahre mit der Maus über ein Textfeld und nach zwei, drei Sekunden erscheint das Datum. Geht so was? Kann man die „Steuerelement Tip Texte“ per VBA auch komplett ein- und ausschalten?
Thx und gute Nacht
Karli
Antwort 1 von 14071
Hi Karli,
und wie wärs ein Steuerelement unterzubringen, das unsichtbar ist und nur bei Bedarf sichtbar gemacht wird?
Gruß
Jürgen
und wie wärs ein Steuerelement unterzubringen, das unsichtbar ist und nur bei Bedarf sichtbar gemacht wird?
Gruß
Jürgen
Antwort 2 von _gau_
Mal angenommen, du hast ein Feld [Nachname], dazu ein Feld [NnChange] mit dem Datum der letzten Änderung des Feldes.
Dann könntest du beim Laden des Formulars folgendes machen:
Dann müßtest du noch bei Änderung des Feldes das Änderungsdatum (und auch den TipText) aktualisieren:
(ich geb das Datum formatiert aus)
PS: Bin kein Access-Profi ;-) aber es scheint so zu funzen...
[gau]
Dann könntest du beim Laden des Formulars folgendes machen:
Private Sub Form_Load()
'Änderungsdatum in TipText des Feldes schreiben
Me.Nachname.ControlTipText = "geändert am " & Format([NnChange], "dd.mm.yyyy")
End Sub
Dann müßtest du noch bei Änderung des Feldes das Änderungsdatum (und auch den TipText) aktualisieren:
Private Sub Nachname_Change()
'Änderungsdatum aktualisieren
[NnChange] = Now
Me.Nachname.ControlTipText = "geändert am " & Format([NnChange], "dd.mm.yyyy")
End Sub
(ich geb das Datum formatiert aus)
PS: Bin kein Access-Profi ;-) aber es scheint so zu funzen...
[gau]
Antwort 3 von karli
Ja bestens!!
Jürgen, dein Tip war schon eine gute Lösung. Aber über so einen "gau" kann ich mich nur freuen. Hattest du nicht gerade Geburtstag? Das klappt wie geschmiert.
Danke und Servus
Karli
Jürgen, dein Tip war schon eine gute Lösung. Aber über so einen "gau" kann ich mich nur freuen. Hattest du nicht gerade Geburtstag? Das klappt wie geschmiert.
Danke und Servus
Karli
Antwort 4 von _gau_
@karli
Spaßvogel - Ich bin etwas älter als 16 ;-))
Aber ich mag solchen schwarzen Humor...
[gau]
Spaßvogel - Ich bin etwas älter als 16 ;-))
Aber ich mag solchen schwarzen Humor...
[gau]
Antwort 5 von karli
Hallo Leute,
wie kann ich den im Code eines Formulars ein einzelnes Feld einer beliebigen Tabelle auswerten? Irgendwo muß ich für den nächsten Start speichern, ob die Control Tip Texte nun angezeigt werden sollen oder nicht. Da steh’ ich auf dem Schlauch und dachte, ich mache eine Tabelle tbl_einstellungen die nur ein Recordset enthält. In einem Feld speichere ich 0 oder 1 und werte dann dieses Feld beim Öffnen der Formulare aus. Wie müßte dann die Bedingung in VBA aussehen? Oder geht das auch eleganter?
Ciao Karli
wie kann ich den im Code eines Formulars ein einzelnes Feld einer beliebigen Tabelle auswerten? Irgendwo muß ich für den nächsten Start speichern, ob die Control Tip Texte nun angezeigt werden sollen oder nicht. Da steh’ ich auf dem Schlauch und dachte, ich mache eine Tabelle tbl_einstellungen die nur ein Recordset enthält. In einem Feld speichere ich 0 oder 1 und werte dann dieses Feld beim Öffnen der Formulare aus. Wie müßte dann die Bedingung in VBA aussehen? Oder geht das auch eleganter?
Ciao Karli
Antwort 6 von con-ny
Grüß dich Karli,
vielleicht etwas umständlich aber so klappt’s:
Dim DB As Database
Dim R As Recordset
Dim A As Byte
Dim sql As String
sql = "select info from tbl_einstellungen where id = 1"
Set DB = CurrentDb
Set R = DB.OpenRecordset(sql)
A = R(0)
und mit A kannst du dann wie gewohnt zaubern. Wenn du mehrere User hast, kannst du für jeden ein RS in der Tabelle tbl_einstellungen anlegen und in sql bequem auswerten.
Gruß von conny
vielleicht etwas umständlich aber so klappt’s:
Dim DB As Database
Dim R As Recordset
Dim A As Byte
Dim sql As String
sql = "select info from tbl_einstellungen where id = 1"
Set DB = CurrentDb
Set R = DB.OpenRecordset(sql)
A = R(0)
und mit A kannst du dann wie gewohnt zaubern. Wenn du mehrere User hast, kannst du für jeden ein RS in der Tabelle tbl_einstellungen anlegen und in sql bequem auswerten.
Gruß von conny
Antwort 7 von karli
das fluppt, Conny
so komm' ich klar, aber 's ist schon ganz schön aufwendig oder?!
Dank sei dir und gute Nacht!
Karli
so komm' ich klar, aber 's ist schon ganz schön aufwendig oder?!
Dank sei dir und gute Nacht!
Karli
Antwort 8 von _gau_
Hallihallo,
als ich meinen eigenen Vorschlag (mit dem Änderungsdatum eines Feldes im TipText) nochmal überdacht habe, fiel mir ein entscheidender Fehler auf!
Dummerweise aktualisiere ich oben den TipText nur beim Laden des Formulars (Private Sub Form_Load()). Damit erscheint im TipText immer nur das Änderungsdatum des betreffenden Feldes aus dem ERSTEN Datensatz!
Es muß jedoch immer beim Wechsel zu einem neuen Datensatz aktualisiert werden! (Ereignis: "Beim Anzeigen")
Daher statt Form_Load() unbedingt Form_Current() verwenden.
PS: Komischerweise akzeptiert mein Access den direkten Eintrag im Code für Form_Current() nicht - ich muß bei diesem Ereignis immer über "Formular-Eigenschaften-Ereignisse" gehen :-(
[gau]
als ich meinen eigenen Vorschlag (mit dem Änderungsdatum eines Feldes im TipText) nochmal überdacht habe, fiel mir ein entscheidender Fehler auf!
Dummerweise aktualisiere ich oben den TipText nur beim Laden des Formulars (Private Sub Form_Load()). Damit erscheint im TipText immer nur das Änderungsdatum des betreffenden Feldes aus dem ERSTEN Datensatz!
Es muß jedoch immer beim Wechsel zu einem neuen Datensatz aktualisiert werden! (Ereignis: "Beim Anzeigen")
Daher statt Form_Load() unbedingt Form_Current() verwenden.
PS: Komischerweise akzeptiert mein Access den direkten Eintrag im Code für Form_Current() nicht - ich muß bei diesem Ereignis immer über "Formular-Eigenschaften-Ereignisse" gehen :-(
[gau]
Antwort 9 von Marie
Wenn das nur ein Wert ist kannst Du den auch als Datenbankeigenschaft abspeichern. Schau mal in der OH unter properties.
mit
SetCurrentDBProperty(bla bla) kannst Du dann den Wert setzen und mit
GetCurrentDBProperty(bla bla) kannst Du ihn wieder auslesen.
Anbei die beiden Funktionen, die mir mal ein guter Bekannter vermacht hat. :-)))
Public Function SetCurrentDBProperty(vPrpName As String, _
vPrpValue As Variant) As Boolean
On Error GoTo Err_SetCurrentDBProperty
Dim vPrp As Property
Dim errLoop As Error
Dim vCurDB As DAO.Database
Dim vPrpType As Integer
SetCurrentDBProperty = False
If IsNull(vPrpValue) Then
GoTo Exit_SetCurrentDBProperty
End If
Set vCurDB = CurrentDb()
' Versuchen, die angegebene Eigenschaft festzulegen.
Set vPrp = vCurDB.Properties(vPrpName)
vPrpType = vPrp.Type
Select Case vPrpType
Case dbBoolean 'Boolean
vPrp.Value = CBool(vPrpValue)
Case dbByte 'Byte
vPrp.Value = CByte(vPrpValue)
Case dbCurrency 'Currency
vPrp.Value = CCur(vPrpValue)
Case dbDate 'Datum / Zeit
vPrp.Value = CDate(vPrpValue)
Case dbDouble 'Double
vPrp.Value = CDbl(vPrpValue)
Case dbInteger 'Integer
vPrp.Value = CInt(vPrpValue)
Case dbLong 'Long
vPrp.Value = CLng(vPrpValue)
Case dbSingle 'Single
vPrp.Value = CSng(vPrpValue)
Case dbText 'Text
vPrp.Value = CStr(vPrpValue)
Case Else
msgbox "Prozedur 'SetCurrentDBProperty', Fehler: Nicht unterstützter Datentyp", _
vbCritical + vbOKOnly, "Modul 'm_DBEigenschaften' - Fehler"
End Select
SetCurrentDBProperty = True
Exit_SetCurrentDBProperty:
Set vPrp = Nothing
If Not (vCurDB Is Nothing) Then
vCurDB.Close
Set vCurDB = Nothing
End If
Exit Function
Err_SetCurrentDBProperty:
' Fehler 3270 bedeutet, daß die Eigenschaft nicht gefunden wurde.
If DBEngine.Errors(0).Number = 3270 Then
' Eigenschaft erstellen, deren Wert festlegen
' und der Properties-Auflistung anfügen.
err.Clear
On Error GoTo Err_SetCurrentDBProperty
vPrpType = VarType(vPrpValue)
Select Case vPrpType
Case vbInteger '2 Ganzzahl (Integer)
vPrpType = dbInteger
Case vbLong '3 Ganzzahl (Long)
vPrpType = dbLong
Case vbSingle '4 Fließkommazahl einfacher Genauigkeit
vPrpType = dbSingle
Case vbDouble '5 Fließkommazahl doppelter Genauigkeit
vPrpType = dbDouble
Case vbCurrency '6 Währungsbetrag (Currency)
vPrpType = dbCurrency
Case vbDate '7 Datumswert (Date)
vPrpType = dbDate
Case vbString '8 Zeichenfolge (String)
vPrpType = dbText
If Len(vPrpValue) > 255 Then
vPrpValue = Left$(vPrpValue, 255)
msgbox "Zeichenfolge zu lang; auf 255 Zeichen gekürzt"
End If
Case vbBoolean '11 Boolescher Wert (Boolean)
vPrpType = dbBoolean
Case vbByte '17 Byte-Wert
vPrpType = dbByte
Case Else
msgbox "Prozedur 'SetCurrentDBProperty', Fehler: Nicht unterstützter Datentyp", _
vbCritical + vbOKOnly, "Modul 'm_DBEigenschaften' - Fehler"
End Select
Set vPrp = vCurDB.CreateProperty(vPrpName, _
vPrpType, vPrpValue)
vCurDB.Properties.Append vPrp
vCurDB.Properties.Refresh
Set vPrp = vCurDB.Properties(vPrpName)
Resume Next
Else
' Wenn ein anderer Fehler auftritt, Meldung ausgeben.
For Each errLoop In DBEngine.Errors
msgbox "Prozedur 'SetCurrentDBProperty', Fehlernummer: " _
& errLoop.Number & ": " & errLoop.Description, _
vbCritical + vbOKOnly, _
"Modul 'm_DBEigenschaften' - Fehler"
Next errLoop
Resume Exit_SetCurrentDBProperty
End If
End Function
Public Function GetCurrentDBProperty(vPrpName As String) As Variant
On Error GoTo Err_GetCurrentDBProperty
GetCurrentDBProperty = CurrentDb().Properties(vPrpName).Value
Exit_GetCurrentDBProperty:
Exit Function
Err_GetCurrentDBProperty:
If err.Number <> 3270 Then
msgbox "Prozedur 'GetCurrentDBProperty', Fehlernummer: " _
& err.Number & ": " & err.Description, _
vbCritical + vbOKOnly, _
"Modul 'm_DBEigenschaften' - Fehler"
End If
GetCurrentDBProperty = Null
Resume Exit_GetCurrentDBProperty
End Function
Musst aber jetzt keine Passwörter in den Properties verstecken wollen, es gibt ganz einfache Möglichkeiten die Properties auszulesen.
Gruß Marie
mit
SetCurrentDBProperty(bla bla) kannst Du dann den Wert setzen und mit
GetCurrentDBProperty(bla bla) kannst Du ihn wieder auslesen.
Anbei die beiden Funktionen, die mir mal ein guter Bekannter vermacht hat. :-)))
Public Function SetCurrentDBProperty(vPrpName As String, _
vPrpValue As Variant) As Boolean
On Error GoTo Err_SetCurrentDBProperty
Dim vPrp As Property
Dim errLoop As Error
Dim vCurDB As DAO.Database
Dim vPrpType As Integer
SetCurrentDBProperty = False
If IsNull(vPrpValue) Then
GoTo Exit_SetCurrentDBProperty
End If
Set vCurDB = CurrentDb()
' Versuchen, die angegebene Eigenschaft festzulegen.
Set vPrp = vCurDB.Properties(vPrpName)
vPrpType = vPrp.Type
Select Case vPrpType
Case dbBoolean 'Boolean
vPrp.Value = CBool(vPrpValue)
Case dbByte 'Byte
vPrp.Value = CByte(vPrpValue)
Case dbCurrency 'Currency
vPrp.Value = CCur(vPrpValue)
Case dbDate 'Datum / Zeit
vPrp.Value = CDate(vPrpValue)
Case dbDouble 'Double
vPrp.Value = CDbl(vPrpValue)
Case dbInteger 'Integer
vPrp.Value = CInt(vPrpValue)
Case dbLong 'Long
vPrp.Value = CLng(vPrpValue)
Case dbSingle 'Single
vPrp.Value = CSng(vPrpValue)
Case dbText 'Text
vPrp.Value = CStr(vPrpValue)
Case Else
msgbox "Prozedur 'SetCurrentDBProperty', Fehler: Nicht unterstützter Datentyp", _
vbCritical + vbOKOnly, "Modul 'm_DBEigenschaften' - Fehler"
End Select
SetCurrentDBProperty = True
Exit_SetCurrentDBProperty:
Set vPrp = Nothing
If Not (vCurDB Is Nothing) Then
vCurDB.Close
Set vCurDB = Nothing
End If
Exit Function
Err_SetCurrentDBProperty:
' Fehler 3270 bedeutet, daß die Eigenschaft nicht gefunden wurde.
If DBEngine.Errors(0).Number = 3270 Then
' Eigenschaft erstellen, deren Wert festlegen
' und der Properties-Auflistung anfügen.
err.Clear
On Error GoTo Err_SetCurrentDBProperty
vPrpType = VarType(vPrpValue)
Select Case vPrpType
Case vbInteger '2 Ganzzahl (Integer)
vPrpType = dbInteger
Case vbLong '3 Ganzzahl (Long)
vPrpType = dbLong
Case vbSingle '4 Fließkommazahl einfacher Genauigkeit
vPrpType = dbSingle
Case vbDouble '5 Fließkommazahl doppelter Genauigkeit
vPrpType = dbDouble
Case vbCurrency '6 Währungsbetrag (Currency)
vPrpType = dbCurrency
Case vbDate '7 Datumswert (Date)
vPrpType = dbDate
Case vbString '8 Zeichenfolge (String)
vPrpType = dbText
If Len(vPrpValue) > 255 Then
vPrpValue = Left$(vPrpValue, 255)
msgbox "Zeichenfolge zu lang; auf 255 Zeichen gekürzt"
End If
Case vbBoolean '11 Boolescher Wert (Boolean)
vPrpType = dbBoolean
Case vbByte '17 Byte-Wert
vPrpType = dbByte
Case Else
msgbox "Prozedur 'SetCurrentDBProperty', Fehler: Nicht unterstützter Datentyp", _
vbCritical + vbOKOnly, "Modul 'm_DBEigenschaften' - Fehler"
End Select
Set vPrp = vCurDB.CreateProperty(vPrpName, _
vPrpType, vPrpValue)
vCurDB.Properties.Append vPrp
vCurDB.Properties.Refresh
Set vPrp = vCurDB.Properties(vPrpName)
Resume Next
Else
' Wenn ein anderer Fehler auftritt, Meldung ausgeben.
For Each errLoop In DBEngine.Errors
msgbox "Prozedur 'SetCurrentDBProperty', Fehlernummer: " _
& errLoop.Number & ": " & errLoop.Description, _
vbCritical + vbOKOnly, _
"Modul 'm_DBEigenschaften' - Fehler"
Next errLoop
Resume Exit_SetCurrentDBProperty
End If
End Function
Public Function GetCurrentDBProperty(vPrpName As String) As Variant
On Error GoTo Err_GetCurrentDBProperty
GetCurrentDBProperty = CurrentDb().Properties(vPrpName).Value
Exit_GetCurrentDBProperty:
Exit Function
Err_GetCurrentDBProperty:
If err.Number <> 3270 Then
msgbox "Prozedur 'GetCurrentDBProperty', Fehlernummer: " _
& err.Number & ": " & err.Description, _
vbCritical + vbOKOnly, _
"Modul 'm_DBEigenschaften' - Fehler"
End If
GetCurrentDBProperty = Null
Resume Exit_GetCurrentDBProperty
End Function
Musst aber jetzt keine Passwörter in den Properties verstecken wollen, es gibt ganz einfache Möglichkeiten die Properties auszulesen.
Gruß Marie
Antwort 10 von karli
@ gau: klaro, 's muss natürlich Form_Current() heißen, hatte ich aber gleich korrigiert. Nochmal danke für den scharfen Tip. @ Marie: dein Code macht mir mächtig Eindruck, aber das geht über meine Fähigkeiten. Was ist denn die OH in der ich nachlesen könnte? Auf jeden Fall sieht's schon ganz schick aus: In der Menüleiste habe ich jetzt die Möglichkeit zwei Arten ControlTipTexte auszuwählen, oder sie auszublenden. Was will ich mehr!?
Ciao Karli
Ciao Karli
Antwort 11 von Marie
Die OH is die Hilfe :-) F1 drücken, properties eingeben.
Na ja, der Code geht auch über meine Fähigkeiten, da wär ich auch nicht selbst drauf gekommen, aber solche Codeschnipsel mal übernehmen und einbauen und dich damit befassen, dadurch lernstes.
Gruß und viel Spaß
Marie
Na ja, der Code geht auch über meine Fähigkeiten, da wär ich auch nicht selbst drauf gekommen, aber solche Codeschnipsel mal übernehmen und einbauen und dich damit befassen, dadurch lernstes.
Gruß und viel Spaß
Marie

