none
Endlosformular Abfrage Bedingung

    Frage

  • Hallo

    ich möchte in einem Endlosformular eine bestimmte Bedingung abfragen und den Button des jeweiligen Datensatzes sichtbar machen bzw. unsichtbar.

    Der Button ist in den Eigenschaften auf nicht sichtbar gestellt.
    Ich habe die Abfrage im Detailbereich, im Form_current und im form_load gestellt. Ich habe true, false, 1, 0 und -1 versucht. Die Bedingungen greifen immer nur auf alle Buttons.

    Private Sub Form_Load()
    If [ausgezogen] = false Then
        Me.sfdelete.visible = true
    End If
    End Sub
    Wie kann ich einen Wert im Endlosformular mit vba abfragen?

    Liebe Grüße, die Luzie!

    Sonntag, 4. November 2012 09:39

Antworten

  • Hallo Luzie

    "Luzie" schrieb im Newsbeitrag news:a6678857-e15a-4bdb-b401-3f5b05980242@communitybridge.codeplex.com...

    es ist jetzt nicht zwingend notwendig, dass der Button unsichtbar ist
    oder nicht. Ich wollte es nur einfach mal wissen, weil ich im Laufe der
    letzten Jahre immer mal wieder über dieses Problem gestolpert bin. Ich
    bin dann immer über das Click-Event des Formulars (Datensatzmarkierer)
    gegangen und habe für das, was ich ausführen wollte, die ID übertragen
    und in einer Prozedur verarbeitet.

    Das Click Ereignis in Access läuft immer im aktuellen Datensatz. Wenn Du also in einem Endlosformular auf den Button eines anderen, als den zu diesem Zeitpunkt aktuellen Datensatz klickst, dann wird Access zuerst den anderen Datensatz zum aktuellen Datensatz machen und die entsprechenden Ereignisprozeduren abfeuern. Die wichtigsten in diesem Zusammenhang sind Form_BeforeUpdate und Form_AfterUpdate des zu diesem Zeitpunkt aktiven Datensatzes, sowie die Form_Current() Ereignisprozedur des neu aktiven Datensatzes. Erst dannach wird der Click abgearbeitet. Beim Current Ereignis kannst Du dann z.B. die Schaltfläche abhängig vom Dateninhalt aktivieren/deaktivieren und dem Benutzer "Ätsch" ausgeben, weil er ins Leere geklickt hat ;-)

    Ich dachte, wenn ein Delete-Button funktioniert, dann müsste es ja mit
    anderen Buttons in Abhängigkeit von bestimmten Werten auch
    funktionieren.

    Tut er ja auch, siehe oben. Damit Du das wirklich verstehst, musst Du wissen, wie Access Endlosformulare aufgebaut sind (siehe unten).

    Aus meinen Programmierungen mit vbscript und ASP kann ich die ID oder
    auch einen Index an den Namen des Steuerelementes hängen. In vb.NET
    kann ich den Gridview rowindex ermitteln und komme so an den richtigen
    Wert. In Access konnte ich mir da bisher noch nicht helfen. Bin aber
    auf der Suche auf sehr interessante Themen gestoßen.

    Das ist ein ganz anderes Thema. Das Gridview ist primär eine HTML Tabelle mit vielen Spalten und Kolonnen. Daher kannst Du per VBScript eben auf alle Zellen dieser HTML Tabelle zugreifen und dann auch die ClientID auslesen.
    Ein Access Endlosformular ist genau genommen Einzelformular das in mehreren Instanzen über/untereinander angezeigt wird (eines je Datensatz). Das heisst: für jeden angezeigten Datensatz wird eine Instanz des Formulars auf den Bildschirm gezeichnet. Dabei kann (wie unter Windows üblich) nur immer das aktuelle Formular Userinput entegegen nehmen). Die anderen Instanzen sind einfach ausgedrückt nur Bildchen, welche gerade mal merken können, wenn diese angeklickt wurden und wo dies passiert ist. Die einzelnen Controls in diesen anderen Instanzen sind nicht ansprechbar/exposed. Das heisst, Du kannst auf diese nicht zugreifen. Das geht nur über den Umweg, diese Instanz aktiv zu setzen, indem Du den Datensatz aktiv setzt und damit den vorhergehenden Datensatz zuerst wegschreibst und dann deaktivierst. Das macht Access alles für Dich. Access erlaubt grundsätzlich nur immer einen einzelnen Datensatz aktiv in einem Formular zu bearbeiten (Schreibstift im Datensatz Markierer).

    Achso, das Endlosformular dient lediglich als Steuerung, das zu
    erklären, würde jetzt auch zu weit gehen. Ich wollte lediglich eine
    Aktion ausschalten, die in Abhängigkeit evtl. Fehler verursacht.

    In diesem Fall wäre evt. das Form_Current() Ereignis geeignet, den Fehler abzufangen.

    Gruss
    Henry

    • Als Antwort markiert Luzie Dienstag, 6. November 2012 11:53
    Dienstag, 6. November 2012 02:08

Alle Antworten

  • Am 04.11.2012 schrieb Luzie:

    ich möchte in einem Endlosformular eine bestimmte Bedingung abfragen und den Button des jeweiligen Datensatzes sichtbar machen bzw. unsichtbar.

    Der Button ist in den Eigenschaften auf nicht sichtbar gestellt. Ich habe die Abfrage im Detailbereich, im Form_current und im form_load gestellt. Ich habe true, false, 1, 0 und -1 versucht. Die Bedingungen greifen immer nur auf alle Buttons.

    Eine Möglichkeit wird hier genannt, ist zwar nicht vollständig zu
    lesen, aber man sich kostenlos anmelden und anschließend den Artikel
    lesen. http://access-im-unternehmen.de/824?nl1

    Private Sub Form_Load()
    If [ausgezogen] = false Then
            Me.sfdelete.visible = true
    End If
    End Sub

    Wie kann ich einen Wert im Endlosformular mit vba abfragen?

    Du könntest die Function aus http://www.donkarl.com?FAQ4.39 mit deiner
    kombinieren.

    Servus
    Winfried


    Connect2WSUS: http://www.grurili.de/tools/Connect2WSUS.exe
    GPO's: http://www.gruppenrichtlinien.de
    Community Forums NNTP Bridge: http://communitybridge.codeplex.com/

    Sonntag, 4. November 2012 11:05
  • Am 04.11.2012 schrieb Luzie:

    ich möchte in einem Endlosformular eine bestimmte Bedingung abfragen und den Button des jeweiligen Datensatzes sichtbar machen bzw. unsichtbar.

    Der Button ist in den Eigenschaften auf nicht sichtbar gestellt. Ich habe die Abfrage im Detailbereich, im Form_current und im form_load gestellt. Ich habe true, false, 1, 0 und -1 versucht. Die Bedingungen greifen immer nur auf alle Buttons.

    Eine Möglichkeit wird hier genannt, ist zwar nicht vollständig zu lesen, aber man sich kostenlos anmelden und anschließend den Artikel lesen. http://access-im-unternehmen.de/824?nl1

    Private Sub Form_Load()
    If [ausgezogen] = false Then
            Me.sfdelete.visible = true
    End If
    End Sub

    Wie kann ich einen Wert im Endlosformular mit vba abfragen?

    Du könntest die Function aus http://www.donkarl.com?FAQ4.39 mit deiner kombinieren.

    Servus
    Winfried


    Connect2WSUS: http://www.grurili.de/tools/Connect2WSUS.exe
    GPO's: http://www.gruppenrichtlinien.de
    Community Forums NNTP Bridge: http://communitybridge.codeplex.com/

    Sonntag, 4. November 2012 11:26
  • Hallo

    erstmal Danke für die Antwort.

    Gut, ich kann jetzt unterschiedliche Icons ausgeben, aber leider klappt es nicht beim Click-Event. Er ziegt mir in der msgbox immer nur das Icon des 1. Datensatzes, also immer den gleichen. Auch in der Beispieldatenbank von Access-im-Unternehmen funktioniert die Abfrage nicht.

    Mit der laufenden Nr., ja gut, aber die muss ich doch irgendwie in den Namen des Steuerelementes bekommen, um den richtigen Index zu bekommen.


    Liebe Grüße, die Luzie!

    Sonntag, 4. November 2012 18:45
  • Am 04.11.2012 schrieb Luzie:

    Gut, ich kann jetzt unterschiedliche Icons ausgeben, aber leider klappt es nicht beim Click-Event. Er ziegt mir in der msgbox immer nur das Icon des 1. Datensatzes, also immer den gleichen. Auch in der Beispieldatenbank von Access-im-Unternehmen funktioniert die Abfrage nicht.

    Funktioniert es auch nicht, wenn Du zuerst den richtigen Datensatz
    markierst und dann erst den Button wieder freigibst?

    Mit der laufenden Nr., ja gut, aber die muss ich doch irgendwie in den Namen des Steuerelementes bekommen, um den richtigen Index zu bekommen.

    Hmm, Du könntest den Button doch On-the-Fly erstellen lassen, dabei
    hängst Du an den Namen die Laufende Nummer dran, darüber kannst Du
    ihne dann eindeutig identifizieren.

    Für welche Anforderung brauchst Du im Endlosformular pro Datensatz
    einen Button?

    Servus
    Winfried


    Connect2WSUS: http://www.grurili.de/tools/Connect2WSUS.exe
    GPO's: http://www.gruppenrichtlinien.de
    Community Forums NNTP Bridge: http://communitybridge.codeplex.com/

    Sonntag, 4. November 2012 19:37
  • Hallo,

    Luzie wrote:

    ich möchte in einem Endlosformular eine bestimmte Bedingung abfragen und
    den Button des jeweiligen Datensatzes sichtbar machen bzw. unsichtbar.
    Der Button ist in den Eigenschaften auf nicht sichtbar gestellt.

    Private Sub Form_Load()
    If [ausgezogen] = false Then
            Me.sfdelete.visible = true
    End If
    End Sub

    Das funktioniert im Endlosformular leider nicht, es wird immer nur der
    aktuelle DS ausgewertet und der Status auf alle sichtbaren Zeilen
    uebertragen. Deshalb ist diese Vorgehensweise fuer Endlosformulare nicht
    geeignet.

    Wenn es dir reicht, den Button zwischen aktiv und inaktiv zu wechseln,
    kannst du das per bedingter Formatierung einstellen, auch im
    Endlosformular.

    Alternative Workarounds sind, den Button in den Formularkopf oder -Fuss zu
    verschieben.

    Gruss - Peter


    Mitglied im http://www.dbdev.org
    FAQ: http://www.donkarl.com

    Sonntag, 4. November 2012 21:13
    Moderator
  • Hallo Luzie

    Die Properties beziehen sich immer auf alle Zeilen in der Endlosansicht. Ausnahme ist die bedingte Formattierung. Diese gibt es aber für Schaltflächen nicht, nur für ausgewählte Kontrols (Textboxen, Comboboxen und evt. weitere).

    Was Du machen kannst, ist eine Textbox wie eine Schaltfläche aussehen lassen und diese dann über die Bedingte Formattierung so einstellen, dass diese abhängig von den Daten aktiviert (enabled) ist oder nicht. Unsichtbar machen geht dann allerdings auch nicht, aber Du kannst diese ja in diesem Fall einfach so formattieren, dass diese entweder disabled aussieht (grauer Text) oder dass halt der Text, der Rahmen und der Hintergrund die gleiche Farbe haben wie der Hintergrund des Formulars. Damit ist diese auch nicht mehr sichtbar und wenn disabled merkt der Benutzer gar nicht mehr, dass da noch was steht.

    Gruss
    Henry

    "Luzie" schrieb im Newsbeitrag news:3e3832cf-4ed1-4b40-bd48-ee112878421c@communitybridge.codeplex.com...

    ich möchte in einem Endlosformular eine bestimmte Bedingung abfragen
    und den Button des jeweiligen Datensatzes sichtbar machen bzw.
    unsichtbar.

    Montag, 5. November 2012 04:06
  • Hallo Peter

    "Peter Doering [MVP]" schrieb im Newsbeitrag news:b408eaf2-1a75-4731-96e7-db820d51738e@communitybridge.codeplex.com...

    Wenn es dir reicht, den Button zwischen aktiv und inaktiv zu wechseln,
    kannst du das per bedingter Formatierung einstellen, auch im
    Endlosformular.

    Ab welcher Version geht das? Bei mir in A2010 kann ich keine Bedingte Formattierung für eine Schaltfläche einstellen, zumindest nicht über die Oberfläche. Oder diese Funktionaltät wurde gut versteckt und befindet sich nicht dort, wo man das bei Textboxen machen kann.

    Gruss
    Henry

    Montag, 5. November 2012 04:07
  • Hallo Henry,

    Henry Habermacher wrote:

    "Peter Doering [MVP]" schrieb im Newsbeitrag news:b408eaf2-1a75-4731-96e7-db820d51738e@communitybridge.codeplex.com...

    Wenn es dir reicht, den Button zwischen aktiv und inaktiv zu wechseln,
    kannst du das per bedingter Formatierung einstellen, auch im
    Endlosformular.

    Ab welcher Version geht das?

    Bei gar keiner ;-)
    Dass es fuer Buttons keine BF gibt, hab ich beim Antworten garnicht
    bedacht. Danke fuer die Richtigstellung. BF gibt es nur fuer Text- und
    Kombifelder.

    Zur Not koennte man ein Textfeld so formatieren, dass es wie ein Button
    aussieht. Dann waere BF wieder ein Thema.

    Gruss - Peter


    Mitglied im http://www.dbdev.org
    FAQ: http://www.donkarl.com

    Montag, 5. November 2012 16:01
    Moderator
  • Hallo

    es ist jetzt nicht zwingend notwendig, dass der Button unsichtbar ist oder nicht. Ich wollte es nur einfach mal wissen, weil ich im Laufe der letzten Jahre immer mal wieder über dieses Problem gestolpert bin. Ich bin dann immer über das Click-Event des Formulars (Datensatzmarkierer) gegangen und habe für das, was ich ausführen wollte, die ID übertragen und in einer Prozedur verarbeitet.

    Ich dachte, wenn ein Delete-Button funktioniert, dann müsste es ja mit anderen Buttons in Abhängigkeit von bestimmten Werten auch funktionieren.

    Aus meinen Programmierungen mit vbscript und ASP kann ich die ID oder auch einen Index an den Namen des Steuerelementes hängen. In vb.NET kann ich den Gridview rowindex ermitteln und komme so an den richtigen Wert. In Access konnte ich mir da bisher noch nicht helfen. Bin aber auf der Suche auf sehr interessante Themen gestoßen.

    Nochmals vielen Dank für die vielen Hinweisen. Ihr habt mir sehr geholfen.

    Achso, das Endlosformular dient lediglich als Steuerung, das zu erklären, würde jetzt auch zu weit gehen. Ich wollte lediglich eine Aktion ausschalten, die in Abhängigkeit evtl. Fehler verursacht.

    Liebe Grüße, die Luzie!

    Montag, 5. November 2012 16:02
  • Hallo Luzie

    "Luzie" schrieb im Newsbeitrag news:a6678857-e15a-4bdb-b401-3f5b05980242@communitybridge.codeplex.com...

    es ist jetzt nicht zwingend notwendig, dass der Button unsichtbar ist
    oder nicht. Ich wollte es nur einfach mal wissen, weil ich im Laufe der
    letzten Jahre immer mal wieder über dieses Problem gestolpert bin. Ich
    bin dann immer über das Click-Event des Formulars (Datensatzmarkierer)
    gegangen und habe für das, was ich ausführen wollte, die ID übertragen
    und in einer Prozedur verarbeitet.

    Das Click Ereignis in Access läuft immer im aktuellen Datensatz. Wenn Du also in einem Endlosformular auf den Button eines anderen, als den zu diesem Zeitpunkt aktuellen Datensatz klickst, dann wird Access zuerst den anderen Datensatz zum aktuellen Datensatz machen und die entsprechenden Ereignisprozeduren abfeuern. Die wichtigsten in diesem Zusammenhang sind Form_BeforeUpdate und Form_AfterUpdate des zu diesem Zeitpunkt aktiven Datensatzes, sowie die Form_Current() Ereignisprozedur des neu aktiven Datensatzes. Erst dannach wird der Click abgearbeitet. Beim Current Ereignis kannst Du dann z.B. die Schaltfläche abhängig vom Dateninhalt aktivieren/deaktivieren und dem Benutzer "Ätsch" ausgeben, weil er ins Leere geklickt hat ;-)

    Ich dachte, wenn ein Delete-Button funktioniert, dann müsste es ja mit
    anderen Buttons in Abhängigkeit von bestimmten Werten auch
    funktionieren.

    Tut er ja auch, siehe oben. Damit Du das wirklich verstehst, musst Du wissen, wie Access Endlosformulare aufgebaut sind (siehe unten).

    Aus meinen Programmierungen mit vbscript und ASP kann ich die ID oder
    auch einen Index an den Namen des Steuerelementes hängen. In vb.NET
    kann ich den Gridview rowindex ermitteln und komme so an den richtigen
    Wert. In Access konnte ich mir da bisher noch nicht helfen. Bin aber
    auf der Suche auf sehr interessante Themen gestoßen.

    Das ist ein ganz anderes Thema. Das Gridview ist primär eine HTML Tabelle mit vielen Spalten und Kolonnen. Daher kannst Du per VBScript eben auf alle Zellen dieser HTML Tabelle zugreifen und dann auch die ClientID auslesen.
    Ein Access Endlosformular ist genau genommen Einzelformular das in mehreren Instanzen über/untereinander angezeigt wird (eines je Datensatz). Das heisst: für jeden angezeigten Datensatz wird eine Instanz des Formulars auf den Bildschirm gezeichnet. Dabei kann (wie unter Windows üblich) nur immer das aktuelle Formular Userinput entegegen nehmen). Die anderen Instanzen sind einfach ausgedrückt nur Bildchen, welche gerade mal merken können, wenn diese angeklickt wurden und wo dies passiert ist. Die einzelnen Controls in diesen anderen Instanzen sind nicht ansprechbar/exposed. Das heisst, Du kannst auf diese nicht zugreifen. Das geht nur über den Umweg, diese Instanz aktiv zu setzen, indem Du den Datensatz aktiv setzt und damit den vorhergehenden Datensatz zuerst wegschreibst und dann deaktivierst. Das macht Access alles für Dich. Access erlaubt grundsätzlich nur immer einen einzelnen Datensatz aktiv in einem Formular zu bearbeiten (Schreibstift im Datensatz Markierer).

    Achso, das Endlosformular dient lediglich als Steuerung, das zu
    erklären, würde jetzt auch zu weit gehen. Ich wollte lediglich eine
    Aktion ausschalten, die in Abhängigkeit evtl. Fehler verursacht.

    In diesem Fall wäre evt. das Form_Current() Ereignis geeignet, den Fehler abzufangen.

    Gruss
    Henry

    • Als Antwort markiert Luzie Dienstag, 6. November 2012 11:53
    Dienstag, 6. November 2012 02:08
  • Hallo

    den Aufbau des Endlosformulars kannte ich jetzt nicht so. Danke für die Erklärung. Ich habe mir es wirklich immer wie einen Schleifendurchlauf vorgestellt.

    Ich glaube, ich habe Mein Problem jetzt ganz gut gelöst.

    Ich habe wie im Beitrag von Access-im-Unternehmen ein Icon in der entsprechenden Systemtabelle gespeichert. Dann habe ich mir eine Bilddatei in das Endlosformular gezogen und im Steuerelementinhalt der Eigenschaften die Bedingung gesetzt = wenn([ausgezogen];'';'pfeil'). Pfeil hießt das Bildchen. Darüber habe ich dann einen transparenten Button gelegt. Über das Click_Event habe ich mit mit dCount() und ID den Wert von ausgezogen ausgelesen. Wenn 0, dann Prozedurablauf, wenn 1 dann exit. So entstehen keine Fehler, wenn doch jemand mal auf die Idee kommt, den transparenten Button ohne Bildhintergrund zu klicken.


    Liebe Grüße, die Luzie!


    • Bearbeitet Luzie Dienstag, 6. November 2012 11:55
    Dienstag, 6. November 2012 11:53