Zugriff auf Controls

Hallo zusammen!

Ich würde gerne im Rahmen einer ChangeLog alle Felder in meinem Formular mit „;“ getrennt in eine Tabelle schreiben.
Wenn ich also bei Formular XYZ etwas ändere, soll er alle Felder an einen String hängen.
Da das mehrere Formulare sind wird der Name immer als String übergeben im Funktionsaufruf.

Ich habe mir sowas gedacht:

For i = 0 To Forms(form).Count - 1
strMemo = strMemo & Forms(form).Controls(i) & "; "
Next i

Ich habe in der Accesshilfe den Code gefunden:

_Außerdem können Sie auf ein Steuerelement durch dessen Index in der Auflistung verweisen. Die Controls-Auflistung wird beginnend mit Null indiziert.

Me(0) ’ Refer to first item in collection.

Me.Controls(0)_

Aber das Problem ist, dass ich so nicht auf die Felder zugreifen kann, es kommt ein Fehler: „Typen unverträglich“

Hat wer eine Lösung?

Hallo,

einfach quick & dirty:

On Error Resume Next
For i = 0 To Forms(form).Count - 1
strMemo = strMemo & Forms(form).Controls(i) & "; "
Next i

oder besser:
Public Function fktCollectValues (strForm As String)
Dim ctl as Control, strMemo as String
For each ctl in Forms(strForm).Controls
If ctl.Controltype =acTextbox Then ’ evtl. für weitere Typen erweitern
strMemo = strMemo & ctl.Name & ": " & ctl.Value & vbCrLf
End If
Next
End Function

Viele Grüße vom Bodensee
Franz , DF6GL

PS: Feedback erwünscht!

Hallo!

Vielen Dank für die Antwort schonmal, das erste habe ich so inetwa ausprobiert, das zweite wirft die gleiche Exception:
„Datentypen unverträglich“

— :[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

Ich würde gerne im Rahmen einer ChangeLog alle Felder in meinem :Formular mit „;“ getrennt in eine Tabelle schreiben.

Wenn du doch einen Changelog willst, warum schreibst du den nicht nur die Aenderungen weg?
Denn je anch dem wieviele Aenderungen auflaufen kann das schon ne recht ueppige Datenmenge werden.
Ich habe sowas mal in eine Anwendung eingebaut, und da sind innerhalb von 2 Jahren fast 200.000 Datensaetze aufgelaufen.
Auserdem finde ich die Variante mit ein String nicht so gluecklich, da eine spaetre Analyse der Daten, bzw. ein Protokoll der Aenderungen nicht einfach zu erstellen sein wird.

Tschau
Peter

Naja ich muß aber die Änderung protokollieren. Wenn ich die alten Werte nicht habe, weiß ich doch nicht was geändert wurde. Also natürlich nur beim ersten Mal, danach kann man sich ja auf die letzte Änderung berufen.
Allerdings müssen alle Änderungen (Was, wer, wann) mitgeschrieben werden.
Der String ist natürlich mit Semikolon getrennt, ich kann beliebig splitten und auswerten.

Allerdings lasse ich mich natürlich gerne eines besseren belehren. Wie soll ich das denn machen?

Grüße

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

nur 2 kleine Tipps:

  1. Fuer das Formular gibt es die .IsDirty Eigenschaft. Ist das Flag FALSE, wurde nichts geaendert und man brauchr auch nichts zu protokollieren.

  2. die Controls haben die .oldValue Eigenschaft, wo der Wert vor der Aenderung abgestellt wird, bis der Datensatz explizit gespeichert wird. Damit kann man im „VorAktualisierung“ Event vom Formular arbeiten.
    btw. auf .oldValue greifen auch die „Rueckgaengig“ Methoden zu.

Tschau
Peter

Hallo Peter,

vielen Dank schonmal, das wußte ich z.B. nicht.

Allerdings habe ich doch noch ein paar Probleme mit der Implementierung wenn ich das über ein Flag mache.

Nehmen wir mal an ich habe Datensätze mit Haustieren und den Satz:

**|ID |Tier |Farbe |Preis |Aufwand

|4 |Katze |grün |10 |gering
---------------------------------------------**
und mir fällt jetzt auf, hoppla, meine Katze ist ja eigentlich blau.
Dann ändere ich die Farbe in der Maske auf blau.

Jetzt brauche ich aber eine Art Übersicht, in der alle (neueren) Änderungen vorhaben sind und der User sich dann durchscrollen kann bis ihn eine interessiert und er den Datensatz anklick.

Aber wenn jetzt da nur steht: Änderung von Datensatz 4 grün -> blau, dann muß er ja alle anklicken um zu sehen welches interessant ist.

Bisher habe ich das so gemacht:

**|ID |AlteWerte |NeueWerte |User |Zeit

| 1 |4;Katze;grün;10;gering|4;Katze;blau;10;gering|ich |10:30**

Dann siehst du halt gleich: Aha, da hat wer die Katze auf blau gesetzt, das schau ich mir mal an (Gibt natürlich dann noch genauere Daten zur Katze)

Also ich weiß, dass das nicht sehr übersichtlich ist, aber ich weiß wirklich keinen anderen Weg, vielleicht ist das Problem jetzt ein bißchen klarer. Ich kann nicht nur die geänderten Felder speichern, weil das sonst irgendwie undurchsichtig ist.

Grüße

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

na ja ne sauber und uebersichtliche Implenemtierung sieht anders aus.

Ich wuerde folgendermassen vorgehen:

  1. Ein Tabelle in der nur die SatzID, das Datum und der Anwender der die Aenderung duchgefuehrt hat enthalten ist.
    Als mit den Feldern
    ID (Tabellen ID, Autowert)
    ID_Main_Record (Die ID des geaenderten Satzes)
    Date_Changed
    User_Changed

  2. Zweite Tabelle mit den Aenderungen
    ID
    ID_CHANGE (ID von Tabelle 1)
    FIELDNAME (das geaendete Datenfeld)
    OLD_VALUE
    NEW_VALUE

Die Verknuepfung wird ueber die Feld ID ID_CHANGE hergestellt.

Damit vermeidet man es auch redundante Informationen zu speichern, denn wenn nicht geaendet wurde muss man auch nichts speichern.

Darauf kann man dann mittels z.B. Listviews schoen uebersichtliche Interfaces bauen in denen der Anwender schnell und komfortabel navigieren und suchen kann. Auch lassen sich dann Berichte leichter und uebersichlicher mit gefilterten Daten ertstellen (z.B. Datum von/bis, spezielles Feld etc. etc.)

btw. wie willst du bei deinem Ansatz solche Auswertungen machen wie:
Wie oft wurde im Januar 2009 das Datenfeld „Farbe“ geaendert?
Wer hat wann bei Katze xyz die Augenfarbe geaenert?

Ich habe diesen Ansatz in einer Anwendung realisiert, was sich sehr bewaehrt hat, allerdings wurden darin alle Aenderungen protokolliert und da waren mehr als 10 Formulare und genauso viele Tabellen mit weit ueber 200 Datenfelden betroffen.

Tschau
Peter