Access-o-Mania

Access-Forum (Deutsch/German) => Formular => Thema gestartet von: DaGloom am August 15, 2010, 12:05:02

Titel: In Endlosliste/-formular VBA für jede DS-Zeile neu ausführen, Element verändern
Beitrag von: DaGloom am August 15, 2010, 12:05:02
Hallo,

ihr habt mir bisher schon super weiter geholfen (SuFu sei dank), aber nun habe ich ein Problem, das es sicher schon zig fach gibt, ich aber nicht in einem guten Suchbegriff formulieren kann.

Foldende Situation:

Access 2003 DB mit Endlosformular/Endlosliste zur Darstellung der DS einer Access-Abfrage (unter Abfragen definiert).
Im Endlosformular habe ich noch am Ende des Formularrandes ein kleines Quadrat gezeichnet mit weisser Füllung.

Ich versuche beim Laden des Formulars für jeder Zeile (also für jeden einzelnen dargestellten DS) per VBA ein SQL-Statement abzusetzen. Wenn dies zutrifft, soll das Quadrat am Zeilenende z.B. blau eingefärbt werden, wenn nicht, dann wieder weiss.

Dies klappt soweit auch alles super, aber nur für den allerersten DS, der angezeigt wird: trifft also die SQL-Abfrage beim ersten DS zu, so werden alle weiteren Quadrate der anderen DS genauso gefärbt, wie beim ersten.

Es scheint, als ob meine VBA-Abfrage nur einmal ausgeführt zu werden und dann nicht mehr. Es liegt vermutlich daran, dass die SQL-Farbänderungs-Funktion im "Sub Form_Load()" nur einmalig beim Formularstart ausgeführt wird. Setzte ich jedoch die SQL-Färbe-Funktion als eigene Sub und starte sie manuell mit z.B. Klick auf das zu färbende Quadrat, so werden ebenfalls alle gleichzeitig eingefärbt. "

Ich habe leider keine Idee, wie ich die Abfrage für jeden Eintrag einzeln aufrufen kann bzw. jedes Quadrat individuell ansteuern kann, ohne dass sich die Felder des anderen DS ebenfalls ändern.

Hier mal der Code, für die eigene Sub (Indikator ist die Bezeichnung für das Quadrat):

Private Sub Indikator_faerben()

    Dim rst_indikator_1 As New ADODB.Recordset
    rst_indikator_1.Open CurrentProject.Connection.Execute( _
        "SELECT Nz(Spalte1) + Nz(Spalte2) as Erg FROM Tabelle1 _
        WHERE Kriterium1 Like '" & Date & "' AND ID Like '" & Me![ID] & "'")
   
        If rst_indikator_1.EOF Then
            Me.Indikator_1.BackColor = RGB(255, 255, 0)
        Else
            If rst_indikator_1.Fields("Erg") = 0 Then
                Me.Indikator_1.BackColor = RGB(255, 255, 0)
            Else
                Me.Indikator_1.BackColor = RGB(0, 0, 255)
            End If
        End If
               
    rst_indikator_1.Close
    Set rst_indikator_1 = Nothing
End Sub


Dank euch schonmal für eure Hilfe  :)
Titel: Re: In Endlosliste/-formular VBA für jede DS-Zeile neu ausführen, Element verändern
Beitrag von: database am August 15, 2010, 13:01:21
Hallo,

dein Problem entsteht daurch, dass dein Indikator kein Teil der Datenherkunft ist.
Dadurch, dass du das Quadrat gezeichnet hast gilt es für JEDEN Datensatz in gleichem Umfang.
Das heißt - egal wodurch und wann - du die Farbe änderst, änderst du diese in scheinbar jedem Quadrat - obwhl sie nur einmalig geändert und so in JEDER Zeile deines Endlosformulars angezeigt wird.

Du müsstest also ein Feld deiner Datenherkunft verändern um den Effekt für jeden Datensatz unterschiedlich darzustellen.
Dazu KÖNNTEST du die Hintergrundfarbe eines Dummy-Feldes in Abhängigkeit vom Ergebnis deiner VBA-Abfrage, die du da in deinem Codschnippsel verwendest, verändern.
Allerdings würde ich dir empfehlen die WHERE-Klausel nochmals zu überarbeiten (Datumswerte und ID nicht per LIKE vergleichen sondern ihrem tatsächlichen Feldwert entsprechend)
Die Datenherkunft KANNST du dann per Do While - Schleife durchlaufen und die Felder entsprechend verändern.

HTH

Peter




Titel: Re: In Endlosliste/-formular VBA für jede DS-Zeile neu ausführen, Element verändern
Beitrag von: DaGloom am August 16, 2010, 00:21:03
Also ich war fleissig am Basteln und mit einer guten Tasse Kaffee und eurer Hilfe ist mir die Lösung dann wie folgt gekommen:
- Zuerst habe ich eine eigene Function aus meiner Sub gemacht:

Private Function Indikator_faerben(ID) AS String

    Dim rst_indikator_1 As New ADODB.Recordset
    rst_indikator_1.Open CurrentProject.Connection.Execute( _
        "SELECT Nz(Spalte1) + Nz(Spalte2) as Erg FROM Tabelle1 _
        WHERE Kriterium1 Like '" & Date & "' AND ID Like '" & ID & "'")
   
        If rst_indikator_1.EOF Then
            Indikator_faerben = "nein"
        Else
            If rst_indikator_1.Fields("Erg") = 0 Then
                Indikator_faerben = "nein"
            Else
                Indikator_faerben = "ja"
            End If
        End If
               
    rst_indikator_1.Close
    Set rst_indikator_1 = Nothing
End Sub


- Dann habe ich einfach quadratische Textfelder erstellt und deren Datenherkunft mit "=Indikator_faerben(ID)" gefüllt.
- Hiermit wird jedes Mal, wenn das Indikatorfeld erstellt wird, meine Funktion gestartet und die entsprechenden Werte zurückgegeben.
- Für die Färbung kam dann noch die Bedingte Formatierung zum Tragen.

Nun läuft alles und ich bin wieder einen grossen Schritt nach vorne gekommen.

Habt vielen Dank für eure Hilfe   :D