Access-o-Mania

Access-Forum (Deutsch/German) => Formular => Thema gestartet von: AaronBFP am Mai 11, 2025, 19:46:51

Titel: In Formular Wert auf Klick übernehmen
Beitrag von: AaronBFP am Mai 11, 2025, 19:46:51
Guten Tag

Ich bräuchte euer Schwarmwissen.
In meiner DB habe ich das Formular "Form_U_Teilnehmer_Starting". Diese Formular ist mit Feldern von diversen Tabellen gespickt und einer Abfrage. Nun will ich auf Button-Klick, dass es den Wert aus "Starting_Farbe"(Abfrage) in das Feld "Starting_f" übernimmt. Das soll nur passieren, wenn ich klicke und sonst natürlich nicht. Der bestehende Inhalt in Starting_f soll überschrieben werden.

Ich erörtere noch genauer wieso. Dies hilft vieleicht für das Verständnis.
Es eine DB für Junioren Sportanlässe. Für den Start gibt es da ein spezielles Reglement, was die Startfarbe regelt. Das beinhaltet die Spielstärke, Geschlecht und auch das Alter. In ein paar Fällen sagt das Reglement, dass der Teilnehmer selbst entscheiden darf, dies aber vorab mitteilen muss. Da dies aber nur ca 5% der Teilnehmer betrifft will ich das bisschen Automatisieren. Die Abfrage wertet das Alter, Geschlecht und Spielstärke aus und gibt mir die Farbe aus. Mit dem Button will ich diese nun kopieren, so, dass ich nur noch die "Spezialfälle" von Hand abändern muss.

Ich hoffe mir kann jemand helfen. Würde mich auch sehr darüber freuen, wenn wir uns z.b. über Discord austauschen könnten.

Liebe Grüsse aus der Schweiz
Aaron

Titel: Re: In Formular Wert auf Klick übernehmen
Beitrag von: Bitsqueezer am Mai 11, 2025, 20:09:22
Hallo,

wenn es sich nur um einen Wert handelt, nimm einfach DLookup, das Du im Click-Event des Buttons verwendest, um dem Feld den Ergebniswert aus DLookup zuweist.

https://support.microsoft.com/de-de/topic/dlookup-funktion-8896cb03-e31f-45d1-86db-bed10dca5937

Gruß

Christian
Titel: Re: In Formular Wert auf Klick übernehmen
Beitrag von: AaronBFP am Mai 11, 2025, 20:23:21
Zitat von: Bitsqueezer am Mai 11, 2025, 20:09:22...DLookup, das Du im Click-Event des Buttons verwendest, um dem Feld den Ergebniswert aus DLookup zuweist.

Danke für deine Antwort

Da ich mir alles selbst beigebracht habe, fehlt mir wichtiges Wissen. Daher verstehe ich nur Bahnhof wenn ich den Text von Support.microsoft durchlese.

Es geht um ein Feld, im Endlosformular mit Filterfunktion, was in ein anderes Feld Kopiert werden soll. Es soll dies aber bei allen Datensätzen machen, die im Endlosformular aktuell angezeigt werden.

Ich suche eine VBA die sagt: Beim Klick auf Button kopiere den Inhalt vom Feld Starting_Farbe in diesem Formular in das Feld Starting_f in diesem Formular. Und das machsst du mit allen angezeigent Datensätze in diesem Formular. Falls das Feld Starting_f ausgefüllt ist, dann überschreibe den Wert.

Liebe Grüsse
Aaron

P.s. wie kann ich hier ein Printscrean anfügen? Würde das Verständnis sicher erleichtern.
Titel: Re: In Formular Wert auf Klick übernehmen
Beitrag von: Bitsqueezer am Mai 11, 2025, 21:40:56
Hallo,

im Zweifelsfall einfach F1 drücken auf dem Wort "DLookup", wenn Du das in VBA eingegeben hast.
Die Syntax ist aber doch wirklich nicht schwer. Es ruft EINEN Feldwert ab (erster Parameter) von Tabelle oder Abfragename im zweiten Parameter und Kriterium im dritten.

Daß Du nun ALLE Datensätze in einem Endlosformular aktualisieren willst, hast Du nicht gesagt. Oben war es noch EIN Feldwert.

Geht aber natürlich auch, dazu nimmt man einfach eine Aktualisierungsabfrage. Die Filter sind ja bekannt, also kannst Du diese auf die gleiche Abfrage setzen, die Dein Formular befüllt, also als WHERE-Parameter für Dein UPDATE. Die Abfrage selbst muß natürlich aktualisierbar sein. Wenn es nur eine Anzeige-Abfrage ist, die nicht aktualisierbar ist, mußt Du die Tabelle identifizieren, in der der gewünschte Wert steht und dort die Filter in einer neuen Abfrage anwenden. Was an Datensätzen übrigbleibt, sollte dann dem Inhalt des Formulares entsprechen (ohne die Zusatzfelder, die Du zum UPDATE aber auch nicht brauchst). Also am besten zuerst eine SELECT-Abfrage bauen, bis das Ergebnis paßt, und das dann in eine UPDATE-Abfrage umbauen. Als Wert für das Feld nimmst Du dann besagte DLookup-Abfrage.

Je nach Komplexität Deiner Filter kannst Du eine Abfrage mit Parametern erstellen, die in VBA mit QueryDef aufgerufen und deren Parameter dann gefüllt werden. Oder Du setzt einen SQL-String in VBA passend zusammen anhand Deiner Kriterien und führst diesen dann beim Klick aus.

Wenn man programmieren möchte, muß man schon zuerst lernen, da führt kein Weg dran vorbei.
Ansonsten empfehle ich, die Abfrage und den Code z.B. durch Copilot oder Gemini erstellen zu lassen. Aber man sollte halt auch verstehen können, was dabei rauskommt.

Gruß

Christian
Titel: Re: In Formular Wert auf Klick übernehmen
Beitrag von: AaronBFP am Mai 11, 2025, 22:19:29
Hallo Christian

Ich schätze es sehr, dass du so viel geschrieben hast. Ich dachte mit der genaueren Erörterung im ersten Post wäre es klar gewesen, dass alle Datensätze die Angezeigt werden, bearbeitet werden sollen.

Ich weiss, dass ich einige Lücken habe im Wissen. Wie bereits geschrieben, ich habe mich immer wieder mit probieren und Videos weitergebildet. Leider muss ich sagen, dass ich vieles nicht verstehe was du meinst. Ich weiss was eine Abfrage ist, aber ich kenne die Aktualisierungsabfrage nicht. Ich kann in einer Abfrage ein Feld erstellen, was Dinge zusammenfasst, oder Werte ausgiebt wenn gewisse kriterien erfüllt sind.
z.B.:
Starting_Zahl: wenn([Anrede]="Frau"und[HCP_Zahl]>11.0;"2";Wenn([Anrede]="Herr"und[Alter]<12und[HCP_Zahl]>45und[tbl_Staerke.Stärke]="Fortgeschrittene";"2";Wenn([Anrede]="Herr"und[HCP_Zahl]<11.1;"5";Wenn([Anrede]="Frau"und[HCP_Zahl]<11.1;"3";"4"))))
Ich habe vor kurzem gemerkt, dass ich nicht direkt die Farbe eingeben lassen kann. Was eigendlich logisch ist.
unterdessen funktioniert der Button. Aber er übergibt nur den wert vom aktuellen Datensatz.

Private Sub Befehl24_Click()
Me!Starting_f.Value = Me!Starting_Zahl
End Sub

Wieso ich immer vom Filter noch rede?
HF ist die Turnierwoche
UF ist das Formular "Form_UF_Teilnehmer_Starting"
verknüpft über ID->Woche_Jahr_f

es soll natürlich nur die Daten von der aktuellen Turnierwoche bearbeiten. So ist sie das UF aktuell gefilter mit dem Wert "10". Dies ändert sich natürlich für die Turnierwoche eine Woche später.

Liebe Grüsse
Aaron
Titel: Re: In Formular Wert auf Klick übernehmen
Beitrag von: Knobbi38 am Mai 11, 2025, 22:28:08
Hallo Aaron,

um dir besser helfen zu können, solltest du eine Beispiel-DB mit ein paar Testdaten hier hochladen - Bilder sagen wenig aus und sind nur bedingt geeignet.

Gruß Knobbi38
Titel: Re: In Formular Wert auf Klick übernehmen
Beitrag von: AaronBFP am Mai 11, 2025, 22:54:00
Zitat von: knobbi38 am Mai 11, 2025, 22:28:08um dir besser helfen zu können, solltest du eine Beispiel-DB mit ein paar Testdaten hier hochladen - Bilder sagen wenig aus und sind nur bedingt geeignet.


Kann ich gerne machen. Habe sie nun Anonymisiert. Hier kann man sie runterladen:
https://drive.google.com/file/d/1Ic1H6NlA8EMA71DzGiBJARfzXTtYlMzv/view?usp=sharing


Liebe grüsse
Aaron
Titel: Re: In Formular Wert auf Klick übernehmen
Beitrag von: Knobbi38 am Mai 12, 2025, 01:36:10
Hallo Aaron,

bitte die Datei hier im Forum hochladen.

Gruß Knobbi38
Titel: Re: In Formular Wert auf Klick übernehmen
Beitrag von: AaronBFP am Mai 12, 2025, 02:32:32
Zitat von: knobbi38 am Mai 12, 2025, 01:36:10bitte die Datei hier im Forum hochladen.

Mach ich doch gerne ;D ,

Campdaten_Forum.zip

Liebe Grüsse und Danke
Titel: Re: In Formular Wert auf Klick übernehmen
Beitrag von: Knobbi38 am Mai 12, 2025, 12:36:06
Hallo Aaron,

hier mal der Code, mit dem du die Kopieraktion machen kannst:
' Form_UF_Teilnehmer_Starting:

Private Sub Befehl24_Click()
  Dim vntBM As Variant

  vntBM = Me.Bookmark
  CopyStartColor
  Me.Bookmark = vntBM
End Sub

Private Sub CopyStartColor()
  Dim rst As DAO.Recordset

  Set rst = Me.RecordsetClone
  With rst
    If Not (.EOF And .BOF) Then
      .MoveFirst

      Do Until rst.EOF
        .Edit
        .Fields("Starting_f") = .Fields("Starting_Zahl")
        .Update
        .MoveNext
      Loop
    End If
  End With
End Sub

Du solltest aber mal über den Workflow intensiv nachdenken, denn wenn jemand diesen Button klickt, gehen alle vorher manuell getroffenen Zuordnungen verloren.

Im Übrigen solltest du dich bei den Bezeichnern unbedingt an Namenskonventionen halten. Ein SubForm-Steuerelement sollte immer anders bezeichnet werden, als das darin geladene Formular, damit dieses unterschieden werden kann. Das gleich gilt für Feldbezeichner in Tabellen und den Steuerelementen, welche diese Felder anzeigen sollen. Z.B. ein Steuerelement mit dem Namen "Starting_f" ist extrem verwirrend, richtiger wäre z.B. cboStartfarbe oder so. Es ist auch keine gute Idee, für Felder Bezeichnungen wie "Datum" zu verwenden. Erstens fehlt die Information, was für ein Datum hier gemeint ist und zweitens wird dieses in der dt. Version auch als Ausdruck für die Funktion Date()verwendet.

Das sind nur ein paar Beispiele, die mit direkt aufgefallen sind.

Des weiteren kann die Abfrage für "Form_UF_Teilnehmer_Starting" deutlich vereinfacht werden. Werte, welche nicht benötigt werden kannst du gleich weglassen und verschachtelte IIFs in einem SQL-Statement stammen eher aus der Excel Ecke. So etwas deutet meistens auf ein unzureichendes Datenmodell hin. Wenn die Farbe nach bestimmten Regeln zugeordnet wird, dann solltest du besser dafür eine Funktion schreiben - so etwas gehört einfach nicht in die Abfrage und die Farbe wird dann schon direkt beim Anlegen des Datensatzes vorgegeben.

Gruß Knobbi38
Titel: Re: In Formular Wert auf Klick übernehmen
Beitrag von: Bitsqueezer am Mai 12, 2025, 12:48:56
Hallo,

ein ziemliches Durcheinander in der Datenbank - tut mir leid, das sagen zu müssen. Es gibt nicht einmal Beziehungen zwischen den Tabellen, referentielle Integrität, Eindeutigkeit durch Indizes uvm. "Mutiert"? Also eine Mutantendatenbank hatte ich auch noch nicht...

Aber das aufzudröseln, würde Tage brauchen. Du kannst Dein Problem auch mit Recordsets lösen, auch wenn es nicht die "typische" Datenbanklösung ist.

Du kannst in VBA im Button-Code mit einer Do/Loop-Schleife durch das Recordset des Formulares gehen, unter Verwendung von MoveNext und Abfragen von EOF, und dann je Datensatz den Wert des einen Feldes auf das Zielfeld übertragen. Schleife über Recordset mit "Edit" und "Update" darfst Du gerne selbst nachschlagen, dazu gibt es tausende Beispiele.
(OK, Ulrich war schneller.. :) )

Mit der Methode sollte es Dir leicht fallen, ohne DLookup und ohne UPDATE zu verwenden.
Wie man in einer Datenbank noch nie von Aktualisierungsabfragen gehört haben kann, ist mir ein Rätsel. Vermutlich sagt Dir dann auch DELETE/INSERT nichts. Dabei stehen alle diese Typen im Ribbon des Abfragedesigners (und mehr).

Gruß

Christian