Hallo zusammen,
heute habe ich mal ein optisches Problem, dem ich nicht gewachsen bin.
Ein Formular habe ich in Listenansicht erstellt und ein Optionsfeld eingefügt. Die VBA Programmierung dahinter klappt im Moment gut, nur ist der Fehler, dass in allen dargestellten Zeilen gleichzeitig der Haken gewählt oder abgewählt wird, obwohl der VBA Befehl nur auf die jeweilige Zeile wirkt.
Was habe ich falsch gemacht?
LG Dolpho
Hallo,
Zitatobwohl der VBA Befehl nur auf die jeweilige Zeile wirkt.
Nein, der VBA Code wirkt auf alle Optionsfelder. Das Optionsfeld muss an ein Datenfeld gebunden sein, sonst geht das nicht.
Hallo,
da ist nichts falsch, dies ist normal. Das Optionsfeld ist nicht an ein Tabellenfeld gebunden und existiert demzufolge nur ein Mal, auch wenn es bei jedem Datensatz angezeigt wird.
?? Binde ich es aber an ein Datenfeld, kann ich es nicht mehr auswählen! ??
Im Hintergrund möchte ich für den angeklickten Datensatz den Status von "2" auf "3" ändern.
Hallo,
dann ist die Abfrage nicht aktualisierbar.
Zeige die Abfrage des Formulars.
SELECT tblExlager.ExlagerID, tblExlager.ExLagerStatus, tblExlager.PackmittelID_f, tblExlager.MatID_f, tblMaterial.mat_Nr, tblMaterial.mat_Name, tblExlager.ErstDatumWE, tblExlager.ExlagerMenge, tblExlager.Lief_id_f, tblExlager.ExLagerDatOut, tblExlager.ExlagerDatIn, tblExlager.ExlagerGewicht, tblExlager.Gase_id_f, tblFlaschGase.Gase_UN, tblPackmittel.PackmittelID, tblPackmittel.PackmittelName, tblPackmittel.Packmittelkurz, tblExlager.ExLagerBemerkung, tblExlager.LagerID_f, tblLager.LagerFa, tblLager.LagerAdresse, tblLager.LagerPLZ, tblLager.LagerOrt
FROM tblPackmittel RIGHT JOIN (tblMaterial INNER JOIN (tblLager INNER JOIN (tblFlaschGase RIGHT JOIN tblExlager ON tblFlaschGase.Gase_id = tblExlager.Gase_id_f) ON tblLager.LagerID = tblExlager.LagerID_f) ON tblMaterial.mat_id = tblExlager.MatID_f) ON tblPackmittel.PackmittelID = tblExlager.PackmittelID_f
WHERE (((tblExlager.ExLagerStatus)=1));
Kannst du so damit etwas anfangen?
Hallo,
in der Abfrage dürfte es nicht möglich sein Daten zu ändern.
Öffne mal die Abfarge direkt und versuche Daten zu ändern.
Die Abfrage sollte nur die Tabellen enthalten die im Unterformular auch benötigt werden.
Hallo Klaus,
eine Abfrage nur mit den benötigten Daten führt auch nicht zum Erfolg :(
Sobald ich das optFELD von der Abfrage entoppele habe ich das richtige Ergebnis, von VBA produziert wobei die Änderungen immer in der richtige Zeile stattfinde aber die Haken in allen Zeilen an- und ausgehen.
Ich weiß also immernoch nicht, wie ich dem begegnen könnte
Nachtrag Klaus,
in der Abfrage kann man die Daten ändern!
Hallo,
zeige den VBA Code.
Private Sub optJaNein_AfterUpdate()
If optJaNein.Value = True Then
ExLagerStatus = 2
Else
ExLagerStatus = 1
End If
End Sub
Hallo,
der gezeigte Code kann nicht zu einer Änderung führen, wenn die Optionsgruppe nicht gebunden ist.
Du machst hier irgendwo grundsätzliche Fehler.
Erstelle ein Minimalbeispiel, das den Fehler zeigt und lade das Beispeil hier hoch.
sorry, stehe grad auf dem Schlauch
wie kann man eine DB hochladen?
Hallo dolpho,
gestatte mir folgende Hinweise.
Statt den Status über ein J/N-Feld zu setzen, könntest du ihn auch direkt als Optionsfeld-Gruppe gestalten, denn du kannst jedem einzelnen Optionsfeld der Optionsgruppe einen eigenen Wert (z. B. 2, 3, 4) zuweisen und die Optionsgruppe an das betreffende Tabellenfeld binden.
Auch könntest du das Statusfeld per Combobox mit Werteliste gestalten. Optionsbuttons sind aber wohl eher einleuchtend und sparen einen Klick auf die Combobox, wenn sie auch mehr Platz benötigen.
Es ist bekannt, dass sich Zuweisungen per VBA bei Endlosformularen meist auf alle (angezeigten) Datensätze auswirken, was m. E. ein dicker Bug in Access ist, weil hier der DS-Bezug nicht berücksichtigt wird. Deshalb sollte man in Endlosformularen möglichst auf VBA-Zuweisungen und -Berechnungen verzichten... (Oh je - ich fürchte, dass diese Aussage auf Kritik stoßen wird.)
Gruß,
crystal
hallo chrystal,
das Handicap ist ja, dass der VBA-Befehl einwandfrei funktioniert nur der Haken des Optionsfeldes stimmt ja nicht.:
Ich klicke z.B.Zeile 3 und der Staus ändert sich nur in Zeile drei jedoch zeigt es den Haken in allen Zeilen an und das ist alles andere als benutzerfreundlich :-(
Gruß dolpho
Hallo,
Zitat von: undefined(Oh je - ich fürchte, dass diese Aussage auf Kritik stoßen wird.)
natürlich stößt diese Aussage auf Kritik. Mir jedenfalls ist ein solcher Bug nicht bekannt.
Wenn der VBA Code in einem Endlosformular das richtige Feld referenziert und im VBA Code auch auf den richtigen Datensatz verwiesen wird, wird auch nur der richtige Datensatz geändert. Es gibt nicht den geringsten Grund in Endlosformularen auf VBA Zuweisungen und Berechnungen zu verzichten.
@dolpho Das Feld muss zwingend gebunden sein, sonst funktioniert das nicht.
Es wäre also erst mal zu prüfen, warum sich der Haken nicht setzen lässt, wenn das Feld gebunden wird.
Eine Datenbank kannst Du über den Button "Attachments and other options" ganz unten hochladen.
Die Datenbank sollte vorher komprimiert/repariert (Access Dienstprogramm) werden und dann muss diese noch gezippt werden.
DBopt.zip
Hallo dolpho,
genau das ist ja das Problem.
der Status wird zwar für den einen DS geändert (weil der Status gebunden ist), aber die ungebundenen Optionsfelder ändern sich "überall", weil sie eben nicht gebunden sind.
Quasi nach dem Schema
- wenn gebunden: mach was im aktuellen Datensatz
- wenn nicht gebunden: mach was in allen Instanzen des Formulars (also eigentlich nur optisch).
Bitte probiere, den Status im Endlos-Formular bzw. in der Listen-Darstellung direkt zu binden (s. vorige Antwort) und auf eine "Berechnung" bzw. Zuweisung per VBA zu verzichten.
Ich habe dieses Problem selbst schon oft gehabt und bin manchmal schier verzweifelt. Ich hatte nie vernünftigen Erfolg, es sei denn, ich habe die zu "berechnenden" Felder gebunden und eine möglicht einfache/direkte Darstellung gewählt.
Gruß nochmal,
crystal
Hallo,
-- das Kontrollkästchen im Formular muss an das Tabellenfeld "Teststaus" gebunden werden. (Leider wiederholt ignoriert)
-- Der Datentyp des Tabellenfeldes "Teststatus" muss in "Ja/Nein" geändert werden. (KKs sind nun mal vom Datentyp "Boolean")
-- Die filternde Datenherkunft des Formulars ist kontraproduktiv. Datenherkunft auf Tabellenamen einstellen.
Wenn
ZitatIm Hintergrund möchte ich für den angeklickten Datensatz den Status von "2" auf "3" ändern.
der Status mehr als zwei Zustände hat, so ist dies mit einer zusätzlichen "Nachschlage"-Tabelle (tbl_Status) und einem (gebundenen) Kombifeld in Formular zu realisieren, das seine Listenfeld-Daten aus der tbl_Status bezieht.
Alternativ kann auch eine Optionsgruppe mit entspr. vielen Optionsfeldern (hier 4 , 0 bis 3) eingesetzt werden, wobei auch die Optionsgruppe an das Statusfeld (in diesem Fall Datentyp Long) gebunden und die einzelnen Optionsfelder auf den Statuswert gesetzt werden müssen.
Und was heißt "Im Hintergrund"?
Hallo,
Dein Vorhaben ist in dieser Form schlichtweg unmöglich. Mit dem Klick in das Ja/Nein Feld setzt Du ja direkt das Feld "Teststatus" des Datensatzes der den Fokus hat.
Das Ja/Nein Feld gibt es aber nicht in der Tabelle also muss es ungebunden bleiben, was dann in allen Datensätzen angezeigt wird.
Du musst Dir eine andere Vorgehensweise überlegen, so geht es definitiv nicht.
Du kannst eine Optiongruppe verwenden wie von crystal vorgeschlagen oder Du verwendest ein Kombinationsfeld für den Status. Mit dem Ja/Nein Feld geht es jedenfall nicht.
Ich habe Dein Beispiel mal mit der Optionsgruppe erweitert und angehängt.
Ist der Status eigenlich nur die Zahl, oder gibt es auch einen Text zum Status ?
@MzKlMu Ja genau: WENN
das Feld gebunden ist...
Ungebundene Felder werden in Access leider (nach Änderung) in allen DS des Endlos- oder Listen-Formulars dargestellt.
Das betrachte ich weiterhin als Bug in Access (oder zumindest als nicht durchdachte/inkonsequente Implementierung), zumal es keine Möglichkeit gibt, explizit nur den einen (von mehreren) dargestellten Datensätzen zu referenzieren (z. B. durch Me oder ActualRecord oder sowas. Access trennt hier m. E. nicht sauber und wendet Änderungen, die in einer einzelnen Instanz eines Endlos-Formulars gemacht werden, ungewollt und unerwartet auf alle Instanzen an. Wenn das kein Bug ist...
Gruß,
crystal
Gruß,
crystal
Hallo,
@crystal In einem Endlosformular gibt es die Steuerelelement nur 1x, die werden nur entsprechend der Datensatzzahl mehrfach dargestellt. Wenn nun ein ungebundenes Feld eingefügt wird, so hat das ja keinen Bezug zu einem Datensatz und muss demzufolge in allen Zeilen den gleichen Inhalt zeige. Das ist völlig logisch und ist mit Sicherheit kein Bug.
Wenn Du in einem ungebunden Feld Änderungen machts, werden diese niemals auf Datensätze angewendet, das ist einfach unmöglich.
dolpho setzt ja mit dem ungebunden Hakenfeld ein ganz anderes gebundenes Feld des Datensatzes der den Fokus hat, also dort wo der Haken geklickt wird. Das Verhalten des Ja/Nein Feldes ist völlig logisch und richtig und kein Bug. Der vorgesehene Ablauf ist falsch und muss angepasst werden.
Du hast ja mit dem Hinweis auf die Optionsgruppe schon einen Weg aufgezeigt.
Hallo,
ich will nicht auch noch ellenlange Blogs hier animieren, aber:
Zitat von: undefinedUngebundene Felder werden in Access leider (nach Änderung) in allen DS des Endlos- oder Listen-Formulars dargestellt.
Ungebundene Steuerelemente zeigen das an, mit dem sie initialisiert werden/wurden. Anzeige-Änderungen können nicht passieren, weil niemand "da" ist, der die Anzeigewerte beeinflusst. Und das ist kein Fehler, sondern logische Konsequenz des Entwicklungskonzepts. Wenn in einem Endlosform ein ungebundenes Steuerelement im Detailbereich (!) steht, dann existiert dieses Steuerelement insgesamt nur einmal, obwohl es bei/mit jedem DS angezeigt wird, also lediglich Klone seiner selbst darstellt.
Zitat von: undefinedDas betrachte ich weiterhin als Bug in Access
Das kannst Du schon so betrachten, ist aber eher die Ignoranz der Access-Funktionalität, bzw. Spezifikationen.
Zitat von: undefinedAccess trennt hier m. E. nicht sauber und wendet Änderungen, die in einer einzelnen Instanz eines Endlos-Formulars gemacht werden, ungewollt und unerwartet auf alle Instanzen an
Quatsch.
Zitat von: undefinedDatensätzen zu referenzieren
Derjenige Datensatz ist referenziert, der den Fokus besitzt. Wenn ein anderer DS im Formular angesprochen werden soll, muss der Focus auf den entspr. gesetzt werden oder man bemüht das Form-Recodset(clone), um Datenänderungen an bestimmter Stelle zu erreichen.
Das soll jetzt aber jetzt reichen..
Ich empfehle eh, solche Grundsatzdiskussionen in Zukunft in der Rubrik "Smalltalk" zu führen...
Guten Morgen zusammen,
vielen Dank für die eifrige Diskussion, die ich hier entfacht habe.
Das Steuerelement Optionsgruppe war mir bisher nicht geläufig, dazu arbeite ich einfach zu wenig an der Erstellung von Datenbanken.
Dieses genügt aber meinen Ansprüchen und ich werde das Beispiel von Klaus (Vielen Dank dafür!) für meine Zwecke einsetzen.
Viele Grüße aus Mittelfranken
Dolpho