Announcement

Collapse
No announcement yet.

In Endlosliste/-formular VBA für jede DS-Zeile neu ausführen, Element verändern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • In Endlosliste/-formular VBA für jede DS-Zeile neu ausführen, Element verändern

    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):
    Code:
    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

  • #2
    Hallo,

    also pro Datensatz / Zeile quasi einen Statusindikator?

    Das geht nicht - bzw. habe ich das auch noch nie hinbekommen.

    Ich helfe mir immer so, das ich ein normales (ungebundenes) Eingabefeld plaziere, in dem dann z.B. <OK> oder <FAIL> steht.
    Das sieht natürlich nicht so schick wie eine Grafik aus, erfüllt aber meistens seinen Zweck.

    Damit die Aktion für jeden Datensatz ausgeführt wird, setze ich die Datenquelle des Eingabefeldes auf " = TuEtwas() " - also auf einen Funktionsaufruf:

    [highlight=VB]
    Private Function TuEtwas() As String

    If [erfolgreich] Then
    TuEtwas = "<OK>"
    Else
    TuEtwas = "<Fail>"
    End If

    End Function
    [/highlight]


    So wird TuEtwas() wirklich für jeden Satz der angezeigt wird, aufgerufen.
    Mit den Formularereignissen (Load, Current ...) schafft man das in einem Endlosformular nicht sicher.

    Viel Erfolg
    Tino

    Edit: Das das mit der Grafik nicht geht hängt wohl irgendwie mit der Art und Weise von Access zusammen, wie Endlosformulare dargestellt werden. Access verwendet das Design sozusagen als eine Art "Datenschablone".
    Da man die Steuerelemente einer solchen Zeile nicht direkt ansprechen kann - so in der Art Textfeld1[3] o.ä., klappt wohl auch die unterschiedliche Darstellung pro Zeile nicht. Nur die Daten sind variabel, nicht das Layout.

    Edit2:
    Vielleicht geht da auch was indem man die Funktion statt dem Text ein Bitmapobjekt zurückgeben läßt. Hab' ich aber noch nicht probiert.
    Zuletzt editiert von tinof; 15.08.2010, 14:09.
    Ich habs gleich!
    ... sagte der Programmierer.

    Comment


    • #3
      Das war genau das, was ich gesucht habe! Super danke!!

      Hier meine Lösung:

      - Zuerst habe ich eine eigene Function aus meiner Sub gemacht (wie tinof vorgeschlagen hatte):

      Code:
      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

      Comment


      • #4
        Für die Färbung kam dann noch die Bedingte Formatierung zum Tragen.
        Mann, dass ist ja DIE Idee! Darauf bin ich noch nicht gekommen, genial.

        So macht Forum Spaß - Vielen,vielen Dank ebenso!

        tinof
        Ich habs gleich!
        ... sagte der Programmierer.

        Comment

        Working...
        X