PDA

Vollständige Version anzeigen : Alle Kontrollkästchen im Endlosformular auswählen


Helchi
23.03.2004, 15:05
Hallo zusammen,

brauche mal wieder eure kompetente Hilfe:

In einem Endlosform befinden sich Kontrollkästchen. Nun möchte ich im Formkopf ein Kontrollkästchen anlegen, das beim Aktivieren alle Kontrollkästchen des Endlosforms aktiviert und beim Deaktivieren entsprechend deaktiviert, sprich irgendwie muss ich die Kästchen des Detailbereichs durchlaufen, hab aber keine Ahnung wie das geht. Hat jemand eine Idee?

Danke!

StehtimSchilf
23.03.2004, 15:07
Hi

Sowas hatten wir schon mal.... Frage, sinds gebundene oder ungebundene Kontrollkästchen im Endlosformular?

Gruz
siS

Helchi
23.03.2004, 15:12
Hi!

Hab gesucht aber leider nix gefunden - hilf mir mal auf die Sprünge was bedeutet schnell wieder gebunden?

Helchi

StehtimSchilf
23.03.2004, 15:16
Hi Helchi,

gebundene Checkboxen haben bei der Eigeschaft "Steuerelementinhalt" entweder Daten aus einer Datenherkunft oder eine Funktion

ungebundene Checkboxen (oder allgemeine Steuerelemente) haben keinen Wert bei der Eigenschaft "Steuerelementinhalt"!

Falls die Checkboxen auf einem Datenfeld "Feld1" aus einer Datenherkunft "Tabelle1" stammen, kannst du simpel mit einer SQL-Akatualisierungsabfrage die Checkboxen markieren:

update tabelle1 set feld1 = true;

Bei ungebundenen checkboxen wirst Du Probleme haben!

Gruss
SiS

Helchi
23.03.2004, 15:25
Hi!

Also sie sind gebunden an eine Abfrage und bei den Kontrollkästchen des Endlosforms steht folgender Code (nicht von mir) der funktioniert:


Private Sub ControlBox_InVariation_Click()

Dim MakeSQL As String

DoCmd.SetWarnings False

If Me.ControlBox_InVariation.Value = True Then
MakeSQL = "DELETE Table_Parts_For_Variations.*, Table_Parts_For_Variations.Parts_For_Variation_ID " & _
"FROM Table_Parts_For_Variations WHERE (((Table_Parts_For_Variations.Parts_For_Variation_ID)=" _
& Me.EntryInVariationPartList.Value & "))"

DoCmd.RunSQL MakeSQL

Else
MakeSQL = "INSERT INTO Table_Parts_For_Variations ( Ref_Variation_ID, Ref_Parts_For_Functional_Subgroup_ID, " & _
"Amount_For_Variations ) " & _
"SELECT " & Me.Variation_ID & " AS Ref_Variation_ID, " & _
Me.PartForSubgroup_ID & " AS Ref_Parts_For_Functional_Subgroup_ID, " & _
"1 AS Amount_For_Variations"

DoCmd.RunSQL MakeSQL

End If

DoCmd.SetWarnings True
Me.Requery
End Sub


Hilft dir das?

Paul.Ostermeier
23.03.2004, 15:31
oder so

Function SetCheckboxValue(frm As Form, cWert As Boolean)
For Each Control In frm
If Control.ControlType = acCheckBox Then
Control.Value = cWert
MsgBox "Kontrollkästchen gesetzt"
End If
Next Control

End Function

StehtimSchilf
23.03.2004, 15:35
Hi Helchi,

ja dann is es ja nich so wild!

Wie heisst das Feld auf das sich die chk auf die Abfrage bezieht?
InVariation? Oder anders. Wie lautet der Steuerelementinhalt deiner gebundnen Checkbox?

Wie lautet Deine Abfrage? (Datenherkunft Deines Hauptformulars) zB. Qry_DeineAbfrage

Nun erstellst Du bei deiner Checkbox im Formularkopf ein Ereignis "After_Update"

und als code gibtst Du folgendes ein:

Private Sub chk_DeineCheckboxImFormularkopf_AfterUpdate()
currentdb.execute "UPDATE qry_DeineAbfrage set invariation = " & me.chk_DeineCheckboxImFormularkopf.Value
End Sub
(ungetestet)

Gruz
SiS

Helchi
23.03.2004, 15:47
Hi,

also der Steuerelementinhalt ist: =[POV]

die Abfrage: InputPartsForVariations

Aber das ist ja eine stinknormale Abfrage, da ändert sich dann ja nix an den Daten in den Quelltabellen oder?
Irgendwie check ich dein Vorgehen nicht - muss ich nicht irgendwie alle Kontrollkästchen durchlaufen oder so?

Steh total am Schlauch... :(

StehtimSchilf
23.03.2004, 16:23
Hi Helchi....

=POV??? und was ist POV für ein Feld?

hmmmm.... dann versuch folgendes im Ereignis AfterUpdate bei Deiner checkbox:

me.pov = me.chk_DeineCheckboxImFormularkopf.Value
me.requery


Versuch auch mal den Ansatz von Paul.... daran hab ich nicht gedacht!

Gruz
siS

Helchi
23.03.2004, 21:08
N'Abend zusammen,

also ich hab das jetzt 1 Stunde lang probiert, aber ich komm nicht drauf... :(

Da der Code hinter den Kontrollkästchen des Endlosforms stimmt, reicht es dann bei Click auf das Kästchen zum aktivieren / deaktivieren im Formkopf alle Kästchen zu durchlaufen und zu aktivieren / deaktivieren?

Wäre wirklich nett, wenn ihr euch das nochmal anschauen würdet, steht total am Schlauch sorry.

StehtimSchilf
23.03.2004, 22:45
Hmmm...
also so kommen wir nicht weiter..... ;)

kannst Du die DB mal zippn und afügen? Bitte nur folgendes:
- Das betroffene Formular (inkl. alle Unterformulare, falls vorhanden)
- die Datenherkunft (InputPartsForVariations) inkl. Alle Tabellen auf die sich diese Abfrage bezieht (es reichen 10 Datensätze)

Dann gehts viel flotter!

Gruz
SiS

kaosqlco
23.03.2004, 23:06
Hallo,

die Lösung von Paul funktioniert m.E. nur bei ungebundenen Checkboxen.

Ich habe deshalb mal folgendes probiert (Acc97):


Dim anz As Integer
anz = DCount("EinFeldDeinerAbfrage", "Deine Abfrage")

DoCmd.GoToRecord , , acFirst
For i = 1 To anz
me.chk_DeineCheckboxImEndlosformular.Value = me.chk_DeineCheckboxImFormularkopf.Value
DoCmd.GoToRecord , , acNext
Next

Sieht nach einer fürchterlichen Krücke aus - funktioniert aber, zumindest bei den ersten Versuchen.

Gruß Jan

Helchi
24.03.2004, 09:43
Hallo ihr beiden,

tappe leider immer noch im Dunkeln! :(

Wollte die DB anhängen, aber sie ist mit 161kB gezipped und mit Minimaldaten zu gross für das Forum.

Welchen Code müsste ich denn in VB bei dem Gesamtkontrollkästchen zum Aktivieren / Deaktivieren aller hinschreiben?
Langt da eine Schleife und alle aktivieren / deaktivieren ?

Wäre super wenn ihr euch das nochmal anschauen könntet! Danke.

Anne Berg
24.03.2004, 10:33
Hast du die mdb vorher komprimiert??

Helchi
24.03.2004, 10:43
Ja hab ich. Hat auch nach dem Zippen noch 161kb obwohl nur Musterdaten drin sind, keine Ahnung warum.

Helchi
24.03.2004, 12:26
Also ich hab jetzt alle hier geposteten Versuche von Paul & Jan ausführlich getestet - leider ohne Erfolg! :bawling:

Hat noch jemand eine Idee?

Anne Berg
24.03.2004, 12:37
Hast du die mdb vorher komprimiert??

Zippen ist nicht Komprimieren! Das findest du unter Extras, Datenbankdienstprogramme...

Helchi
24.03.2004, 12:43
Jo ist klar - hat aber trotzdem 161kb :(

Paul.Ostermeier
24.03.2004, 12:47
"ohne Erfolg getestet" ist eine Fehlermeldung die dem geneigten Hilfesteller das Leben ziemlich schwer macht

da kann ich nur präzise zurückantworten , bei mit tut's - das was es soll , -alle Checkboxen in einem Formular setzen

Nouba
24.03.2004, 12:51
Wenn was nicht klappt, zeige doch bitte was Du versuchst hast und weise aud die Stelle hin, wo was nicht klappt. Wie soll es denn sonst hier weitergehen?

Ausserdem bin ich der Meinung, dass SiS den richtigen Weg mit der Aktualisierungsabfrage gezeigt hat.

Helchi
24.03.2004, 12:52
Ok ich hab folgenden Code von dir getestet:


Private Sub ControlBox_SelectAll_Click()

For Each Control In frmVariationPartListEdit

If Control.ControlType = acCheckBox Then
Control.Value = True
MsgBox "Kontrollkästchen gesetzt"
End If

Me.Requery

Next Control

End Sub


Beim Hakensetzen --> Fehlermeldung: Laufzeitfehler 13 - Typen unverträglich

(Debugger meckert bei roter Markierung)

Hope that helps.

Nouba
24.03.2004, 12:55
Was ist frmVariationPartListEdit und wo ist es deklariert und initialisert? Und Control is auch nicht deklariert.

Helchi
24.03.2004, 12:56
Das ist der Name des (Unter-) Formulars, das das besagte Endlosform mit den Kontrollkästchen enthält.

Anne Berg
24.03.2004, 12:57
For Each Control In frmVariationPartListEdit.Controls

Helchi
24.03.2004, 13:00
Jetzt kommt die Fehlermeldung 424: Objekt erforderlich und wieder For Each... markiert im Debugger :(

Nouba
24.03.2004, 13:01
Wir sollten uns mehr auf die Daten konzentrieren, die in der Tabelle zu ändern sind. Also brauchen wir das Kriterium, das die Datensätze im UFo filtert, den Tabellenname und den Namen des zu aktualisierenden Felds. Ich bleibe dabei, SiS hat eine praktikable Variante vorgeschlagen.

Die Aufzählung sollte mit For Each Control In Me!frmVariationPartListEdit.Form gelingen. Wobei man Control idealerweise als Variable deklariert.

Anne Berg
24.03.2004, 13:06
Sorry, so geht das natürlich nicht: du musst das UFO vollständig ansprechen mit Formulare!frmName!ufo.Form - aber damit erhältst du nur Zugriff auf die Formularfelder, nicht auf die Datenfelder!

Zeig mal lieber den Code, wie du die vorangegangenen Versuche umgesetzt hast und dazu die Fehlermeldung.

... von wegen "klappt nicht"!!

Helchi
24.03.2004, 13:16
Also mit dem Forms!... vorndran springt er zumindest jetzt mal in die Schleife, allerdings kommt bei roter Markierung folgender Fehler:
2448 - Sie können diesem Objekt keinen Wert zuweisen


Private Sub ControlBox_SelectAll_Click()

For Each Control In Forms!frmEditD!sfrEditD!sfrEditDG!sfrEditDGS!frmVariationPartListEdit.Controls

If Control.ControlType = acCheckBox Then
Control.Value = True
MsgBox "Kontrollkästchen gesetzt"
End If

Me.Requery

Next Control

End Sub


@ Nouba: Das mit den Daten ist auch ein guter Ansatz, allerdings ist das schwer zu beschreiben...soll ich dir die DB mal per Mail schicken?

Nouba
24.03.2004, 13:35
Dieses Problem sollte auch hier lösbar sein.

Hier hast Du mal ein Gerüst zum experimentieren.
Private Sub ControlBox_SelectAll_Click()

Dim ssql As String
Const CTABELLENNAME = "HierTabellennameEintragen"

ssql = "UPDATE " & CTABELLENNAME _
& " SET " & Me!frmVariationPartListEdit.Form!ControlBox_InVariation.ControlSource _
& " = " & Me!ControlBox_SelectAll _
& " WHERE Fremdschluesseldname = " & Me!Schluesselfeld

CurrentDb().Execute ssql, dbFailOnError

Me.Requery

End Sub

zukki
24.03.2004, 14:51
Hi vieleicht ein tip zum Probieren
Habs mit einer Schaltfläche gemacht
Rezepte ist Tabellenname vieleicht gehts auch mit Abfragename
Habs nicht probiert - einfach von meiner Datenbank ausgeschnitten.
musst nur False durch true ersetzen.

Private Sub Befehl24_Click()
Dim SQL As String

SQL = "UPDATE Rezepte Set Anzeigen = False"
DoCmd.SetWarnings False
DoCmd.RunSQL SQL
DoCmd.Requery

End Sub

Helchi
24.03.2004, 15:14
Hallo zusammen,

nach fast 2 Stunden hab ichs jetzt alleine geschafft. Danke nochmal für eure Tipps!

Hier der Code:


Private Sub ControlBox_SelectAll_Click()

Dim MakeSQL As String

DoCmd.SetWarnings False

If Me.ControlBox_SelectAll.Value = False Then

MakeSQL = "DELETE Table_Parts_For_Variations.*, Table_Parts_For_Variations.Parts_For_Variation_ID " & _
"FROM Table_Parts_For_Functional_Subgroups INNER JOIN Table_Parts_For_Variations ON " & _
"Table_Parts_For_Functional_Subgroups.Parts_For_Functional_Subgroup_ID = Table_Parts_For_Variations.Ref_Parts_For_Functional_Subgroup_ID " & _
"WHERE (((Table_Parts_For_Functional_Subgroups.Ref_Functional_Subgroup_ID)=" & Me.Ref_Functional_Subgroup_ID & "))"

DoCmd.RunSQL MakeSQL

Else

MakeSQL = "INSERT INTO Table_Parts_For_Variations ( Ref_Variation_ID, Ref_Parts_For_Functional_Subgroup_ID, Amount_For_Variations ) " & _
"SELECT " & Me.Variation_ID & " AS Ref_Variation_ID, " & _
"Table_Parts_For_Functional_Subgroups.Parts_For_Functional_Subgroup_ID, " & _
"1 AS Amount_For_Variations " & _
"FROM Table_Parts_For_Functional_Subgroups LEFT JOIN Table_Parts_For_Variations ON " & _
"Table_Parts_For_Functional_Subgroups.Parts_For_Functional_Subgroup_ID = Table_Parts_For_Variations.Ref_Parts_For_Functional_Subgroup_ID " & _
"WHERE (( Table_Parts_For_Functional_Subgroups.Ref_Functional_Subgroup_ID =" & Me.Ref_Functional_Subgroup_ID & ") AND ( Table_Parts_For_Variations.Ref_Variation_ID Is Null ))"

DoCmd.RunSQL MakeSQL

End If

DoCmd.SetWarnings True
Me.Requery

End Sub


Liebe Grüße, Helchi

StehtimSchilf
24.03.2004, 20:00
????
Steh nur ich im Schilf?

;)

aber schön funktionierts!

Gruz
SiS

Nouba
24.03.2004, 20:14
@SiS,

Willkommen im Klub - Ich habe auch nicht mehr verstanden.

Johnny Loser
24.03.2004, 20:17
brauche mal wieder eure kompetente Hilfe:

In einem Endlosform befinden sich Kontrollkästchen. Nun möchte ich im Formkopf ein Kontrollkästchen anlegen, das beim Aktivieren alle Kontrollkästchen des Endlosforms aktiviert und beim Deaktivieren entsprechend deaktiviert, sprich irgendwie muss ich die Kästchen des Detailbereichs durchlaufen, hab aber keine Ahnung wie das geht. Hat jemand eine Idee?

nach fast 2 Stunden hab ichs jetzt alleine geschafft. Danke nochmal für eure Tipps!

If Me.ControlBox_SelectAll.Value = False Then

MakeSQL = "DELETE ....."

Else

MakeSQL = "INSERT INTO ......."

End If

Daß da auch niemand drauf gekommen ist ?!?

Helchi
24.03.2004, 22:42
@ SiS, Nouba und Johnny:

Im Prinzip kann man die Sache wie aus euren Vorschlägen auch zu entnehmen war auf 2 Arten angehen: entweder man markiert alle Checkboxes nacheinander mit einer Schleife (hat bei mir leider nicht funktioniert) oder aber man berücksichtigt die Tipps von SiS & Nouba und greift direkt auf die Datenquelle des Endlosforms zu (wie meine Lösung oben).

Hätte gern meine DB dazu gepostet, dann wär es wahrscheinlich verständlicher gewesen ging aber leider nicht. Vielleicht hätt ich noch den ein oder anderen Screenshot posten sollen zum Verständnis.

Auf jeden Fall klappt es jetzt einwandfrei und ich möchte mich nochmal für die schnelle und v.a. kompetente Hilfe hier von euch bedanken! War wirklich Gold wert.

Gruß Helchi