Supportnet Computer
Planet of Tech

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

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:


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

Antwort 4 von _gau_

@karli
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


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


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

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]

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


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


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