August 11, 2022, 04:19:45

Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!


Inhalt eines ungebundenen Textfeldes speichern

Begonnen von Ratoncito, April 05, 2022, 08:07:52

⏪ vorheriges - nächstes ⏩

Ratoncito

Hallo,

auf einem Formular habe ich ein ungebundenes Textfeld. In diesem Feld möchte ich ein Datum im Format Tag/Monat abspeichern. Dieser Wert soll nach dem Schließen und erneutem Öffnen der DB wieder angezeigt werden.

Muss ich für diesen Wert extra eine Tabelle anlegen, oder gibt es eine andere Möglichkeit einen einzelnen Wert zu speichern?

Für Eure Hilfe im Voraus besten Dank - Wolfgang


ebs17

Mit freundlichem Glück Auf!

Eberhard

Ratoncito

Hallo,
Zitat von: ebs17 am April 05, 2022, 08:25:44Verwende einen Standardwert.
Der ist dann fest.
Ich möchte diesen Wert eingeben/ändern und beim nächsten Öffnen der DB wieder anzeigen.

Gruß - Wolfgang

ebs17

Dann bleibt nur der Weg eines Tabellenfeldes, das einen Wert SPEICHERN kann. Du musst dann für einen gewollten Austausch mit dem Formularfeld sorgen.

Tabellenfeld wäre jetzt das naheliegende. Selbstredend könnte man auch eine Textdatei irgendwo auf der Festplatte, die Registry oder irgendetwas anderes verwenden.
Mit freundlichem Glück Auf!

Eberhard

Ratoncito

Hallo,

ich habe nun für den Wert des Textfeldes txtOKbis eine Tabelle erstellt.

Tabelle: tblOKbis
Feld: OKbis
Format: tt.mm.

Zum Probieren habe ich dort einen Wert (05.12.) gespeichert. Dieses Datum wird auch korrekt angezeigt. Geholt wird es über:

Me.txtOKbis = DLast("OKbis", "tblOKbis", "ID=1")
Nun meine Probleme:

Anzeigen und Eingeben möchte ich im Format tt.mm.
Dieses Format habe ich sowohl in der Tabelle, wie auch im Textfeld vorgegeben. Allerdings gibt es bei der Eingabe immer eine Fehlermeldung "Falsches Format"
Access besteht auf die komplette Eingabe mit Jahr.

Was muss ich wo ändern, damit eine Eingabe tt.mm. (das Jahr wird nicht benötigt) akzeptiert wird?
Wie ändere bzw. aktualisiere ich den dieses Datum im Feld OKbis in der tblOKbis über VBA?

Vielen Dank für Eure Hilfe - Wolfgang

Beaker s.a.

Hallo Wolfgang,
Zitateinen Wert (05.12.) gespeichert. Dieses Datum
Das ist kein Datum. Ein Feld mit dem Datentyp "DateTime" verlangt
immer auch eine Jahreszahl. Wie du dieses komplette Datum dann
anzeigst steht auf einem anderen Blatt, will sagen, das bleibt dir
überlassen.

gruss ekkehard
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

DF6GL

Hallo,

da ist wohl einiges durcheinander...


Du sprichst von "Datum",  "05.12." ist aber kein Datum, sondern eine Zeichenfolge, sprich String (Text).  Bei einer Tabelle kommt es auch nicht auf das "Format" an, wichtig ist der Datentyp (sollte eigentlich zwischenzeitlich bekannt sein).

Du solltest Dir überlegen, ob mit einem "richtigen" Datum  (Datentyp Datum/Uhrzeit) oder mit lediglich einem Text ( Datentyp Kurzer Text)  gearbeitet werden soll/muss.

Beim Beispiel (Text) ist wegen Vermeidung von Tippfehlern anzuraten, den Tag und den Monat mit Hilfe zweier Kombis auszuwählen und zu einem passenden String zusammenzusetzen:

(prinzipiell)
Dim strBis As String
strBis = Me!KombiTage & "." & Me!KombiMonate & "."

und diesen String abzuspeichern.



Als noch nicht erwähnte Methode könnte für den dauerhaft zu speichernden Wert auch eine Anwender-definierte Eigenschaft (user defined property) herangezogen werden.

Zum Code

Me.txtOKbis = DLast("OKbis", "tblOKbis", "ID=1")
Was bezweckst Du mit "DLast"? 

Von einem ID-Feld in der Tabelle hast Du nicht gesprochen. Wenn es nur einen DS in der Tabelle gibt, ist der Where-Condition-Parameter ("ID=1") überflüssig.  Zudem wäre Dlookup die "passendere" Funktion.

ebs17

Denkfrage:
Zitatdas Jahr wird nicht benötigt
Deine Anwendung ist eine zum baldigen Wegwerfen?
Denn bei etwas längerfristigem Gebrauch kommt ein Datum jedes Jahr wieder, und da ist so eine bessere Qualifizierung so unangenehm nicht.

Nebenbei ergeben Sortieren und ein Max bei einem Datum erwartete Ergebnisse. Wenn dein Format tt.mm als Text geführt wird, gibt es da abweichend "Überraschungen".
Mit freundlichem Glück Auf!

Eberhard

Ratoncito

Hallo,

vielen Dank für die Antworten.

Zitat von: ebs17 am April 11, 2022, 20:00:54Deine Anwendung ist eine zum baldigen Wegwerfen?
Denn bei etwas längerfristigem Gebrauch kommt ein Datum jedes Jahr wieder, und da ist so eine bessere Qualifizierung so unangenehm nicht.

Warum etwas direkt als Müll bezeichnen? Es gibt auch Dinge, die jedes Jahr zum gleichen Termin stattfinden. Da spielt die Jahreszahl keine Rolle und kann bis in alle Ewigkeit gültig sein.

Ich werde den Wert als Text verarbeiten.

Danke für den Hinweis auf DLookup. ID ist später hinzugekommen um den Datensatz beim Speichern zu definieren. Sorry, bin leider nicht so sicher bei dem was nötig ist, und was nicht.

Zitat von: DF6GL am April 11, 2022, 13:52:44Als noch nicht erwähnte Methode könnte für den dauerhaft zu speichernden Wert auch eine Anwender-definierte Eigenschaft (user defined property) herangezogen werden.

Das wäre wohl das, nach dem ich zu Beginn gefragt habe. Es sah aber so aus, dass es nur über eine Tabelle möglich ist.

Zitat von: ebs17 am April 05, 2022, 09:10:33Dann bleibt nur der Weg eines Tabellenfeldes, das einen Wert SPEICHERN kann. Du musst dann für einen gewollten Austausch mit dem Formularfeld sorgen.

Zu "Anwender-definierte Eigenschaft" finde ich leider nur recht umfangreiche Beschreibungen, die ich nicht umsetzen kann.
Wie lautet der Code, wenn ich nach einer Änderung des Textfeldes txtOKbis den Inhalt als Eigenschaft zum nächsten Öffnen der DB verwenden möchte?

Vielen Dank für Eure Hilfe - Wolfgang

ebs17

ZitatEs gibt auch Dinge, die jedes Jahr zum gleichen Termin stattfinden.
In der Realität der eigene Geburtstag, Neujahr und Weihnachten und ein paar weitere Gedenk- und Feiertage.

Die meisten gängigen eigenen Termine sind aber wochen- und feiertagsbeeinflusst und damit eher weniger konstant.
Mit freundlichem Glück Auf!

Eberhard

DF6GL

Hallo,


Thema Property:


Kopiere den folgenden Code in ein Standardmodul:


Option Compare Database
Option Explicit



Function SetProperty(ByVal Name As String, ByVal Value As String)
 
'Erzeugen einer Text-Property (Name) und speichern des Strings (Value) in der Property

Dim DB As DAO.Database
  Dim prpProp As DAO.Property

  Set DB = CurrentDb
  On Error GoTo SetProperty_Error
  Set prpProp = DB.CreateProperty(Name, dbText, Value)
  DB.Properties.Append prpProp

SetProperty_Exit:
Set DB = Nothing
  Exit Function

SetProperty_Error:
  If Err.Number = 3367 Then
    DB.Properties(Name) = Value
  Else
    MsgBox "SetProperty: " & _
           Err.Number & ": " & Err.Description, vbCritical, "Property Error"
  End If
  Resume SetProperty_Exit:
End Function





Function GetProperty(ByVal Name As String)

' Auslesen des Wertes aus einer Property (Name)

  Dim DB As DAO.Database
If Len(Name) = 0 Then Exit Function
  Set DB = CurrentDb
  On Error Resume Next
  GetProperty = DB.Properties(Name)
End Function


Die Anwendung (Aufruf) der beiden Funktionen solltest Du aber alleine hinbekommen.



Ratoncito

Hallo,

Zitat von: DF6GL am April 12, 2022, 09:52:19Die Anwendung (Aufruf) der beiden Funktionen solltest Du aber alleine hinbekommen.

Nein, den Aufruf bekomme ich nicht hin.

Ich habe ein Modul modOKbis erstellt, den Code dort hineinkopiert und an meinen Zweck angepasst. Alle meine Versuche scheitern, da ich den Ablauf nicht verstehe.
Als erstes wollte ich lediglich den String "03.05" an das Textfeld übergeben. Selbst das bekomme ich nicht hin.

txtOKbis ist das Textfeld auf dem Formular und
okBis soll die Text-Property sein.

'Function SetProperty(ByVal Name As String, ByVal Value As String)
Function SetProperty(ByVal OKbis As String, ByVal Value As String)
'Erzeugen einer Text-Property (Name) und speichern des Strings (Value) in der Property

Dim DB As DAO.Database
Dim prpProp As DAO.Property

  Set DB = CurrentDb
  On Error GoTo SetProperty_Error
'  Set prpProp = DB.CreateProperty(Name, dbText, Value)
  Set prpProp = DB.CreateProperty(OKbis, dbText, "03.05.")
  DB.Properties.Append prpProp

SetProperty_Exit:
Set DB = Nothing
  Exit Function

SetProperty_Error:
  If Err.Number = 3367 Then
'    DB.Properties(Name) = Value
    DB.Properties(OKbis) = "03.05."
  Else
    MsgBox "SetProperty: " & _
           Err.Number & ": " & Err.Description, vbCritical, "Property Error"
  End If
  Resume SetProperty_Exit:
End Function

'Function GetProperty(ByVal Name As String)
Function GetProperty(ByVal OKbis As String)
' Auslesen des Wertes aus einer Property (Name)

  Dim DB As DAO.Database
'If Len(Name) = 0 Then Exit Function
If Len(OKbis) = 0 Then Exit Function
  Set DB = CurrentDb
  On Error Resume Next
'  GetProperty = DB.Properties(Name)
  GetProperty = DB.Properties(OKbis)
End Function

An den angepassten Stellen habe ich die Originalzeile auskommentiert und darunter die von mir abgeänderte Zeile gesetzt.

Für Eure Hilfe im Voraus besten Dank - Wolfgang

DF6GL

Hallo,


"aufrufen einer Funktion heißt doch nicht, einfach die Namen irgendwelcher Variablen zu ändern...


(Auch wenn es trotzdem funktionieren sollte, wenn alle entspr. Codestellen  geändert würden)


Wirf erst mal die Änderungen weg und kopiere die Funktionen aus meinem letzten Beitrag wie dort beschrieben.



Dann rufe die Funktionen so auf:
(und das macht man dort, wo man sie braucht..)

Schreiben eines Textes in die Property:

Sub OKbis_Afterupdate()
  SetProperty "OKbis", Me!OkBis
End Sub


und auslesen:

Sub btnLeseProp_Click()
MsgBox GetProperty ("OkBis")
End Sub

Ratoncito

April 15, 2022, 12:11:20 #13 Letzte Bearbeitung: April 15, 2022, 12:38:00 von Ratoncito
Hallo,

@franz

Vielen Dank für das vorgezogene Osterei :-)

Den Code habe ich noch ein wenig an meine Wünsche angepasst, denn ich benötige keine MsgBox, sondern der Wert wird über ein Textfeld angezeigt und geändert. Alles funktioniert nun so, wie ich mir das gewünscht habe - Danke.

Noch ein paar Anmerkungen:
Viele Dinge, die für Euch ganz geläufig sind bedeuten für mich absolutes Neuland. Property habe ich noch nie verwendet.
Daher bin ich bei dem Code davon ausgegangen, dass er noch an den richtigen Stellen an meine DB angepasst werden muss. Bei "Name" bin ich z.Bsp. davon ausgegangen, dass ich hier den von mir gewünschten Namen eintragen muss...

Tja und bei Datum - das ist ein ganz besonderes Ding und hier hat Access eine ganze Reihe Überraschungen bereit. Immer eine gute Gelegenheit, um ins Fettnäpfchen zu treten.

Bei mir handelt es sich im speziellen Fall um Zinstermine für Wertpapiere. Je nach Wertpapier gibt es davon eine unterschiedliche Anzahl pro Jahr und zu immer wiederkehrenden Terminen im Jahr. Das hat mir schon an anderen Stellen genug Kopfzerbrechen bereitet. Der von mir benutzte Wert soll eigentlich nur eine Info für mich sein, bis zu welchem Tag ich die Termine schon kontrolliert habe. Ein String reicht dafür volkommen aus, aber ich habe da noch ein paar Ideen im Hinterkopf, für die der Wert als Datum besser geeignet wäre. Daher hatte ich dieses Format gewählt.
In der Tabelle mit den Daten der Wertpapiere habe lediglich die Anzahl und den ersten Zinstermin gespeichert. Der Rest wird wenn benötigt berechnet. Und diese Termine sind in der Vergangenheit und Zukunft immer an den gleichen Terminen im Jahr. Die Jahreszahl ist da eher hinderlich.
Auch wenn es nicht direkt ersichtlich ist, habe ich schon einige Überlegungen dazu angestellt.

Nochmals vielen Dank und allen ein schönes, und vor allen Dingen friedliches Osterfest - Wolfgang

PS
Wo ist eigentlich der "sag Danke Knopf"?
Und "Thema gelöst" sehe ich auch nicht!?!
Die Brille habe ich aber auf :-)

Beaker s.a.

ZitatDie Jahreszahl ist da eher hinderlich.
Nein, nein, nein, ein Datum ist ein Datum, ist ein Datum, ist ein Datum.

Auch wenn die Termine (Tag+Monat) immer gleich sind, so verändert
sich doch die Ausschüttung, - die erfasst du doch? Wie willst du aber
ohne Jahreszahl jemals eine Entwicklung ableiten (Jahres-, 5Jahres-
Vergleiche u.ä.)?
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.