Guten morgen geschätzte Access-o-Mania Community,
trotz elend langer Suche im Netz bin ich noch auf keine zufriedenstellende Lösung für mein Problem gestoßen. Im Endeffekt wird es vermutlich ein einfach zu lösendes Problem sein, aber ich steh grade mit beiden Beinen auf dem Schlauch^^
Zustand :
Access 2013
Es existiert ein Formular in dem ein Unterformular angelegt wurde. Das UFo ist als Endlosformular ausgeprägt. Die für diesen Fall relevanten Felder sind 2 Textfelder. Textfeld1 enthält ähnlich dem Autowert eine Zahl. Diese startet bei 1 und wird fortlaufend um 1 pro Datensatz erhöht. Das 2 Textfeld soll zur einfachen Darstellung eines Wortes genutzt werden.
Wenn im Textfeld1 die Zahl 1 steht soll im Textfeld2 der Text "HZ" zu sehen sein, in allen anderen Fällen >1 soll "NZ" zu lesen sein.
Problem :
Da es sich um ein Endlosformular handelt wir sämtlicher Code auf Formularebene für alle Datensätze ausgeführt. Ich habe schon eine Sub in eine Funktion umgewandelt um die als Datensatzherkunft des Textfeldes1 zu nutzen. Das hat nicht funktioniert, da ich durch die Angabe der Funktion als Datensatzherkunft das Feld gebunden habe, ergo ließ mich die VBA dort keinen Wert ändern.
Also habe ich die Funktion als Datensatzherkunft eines unsichbaren Feldes genommen - siehe da es geht, aber wieder mal werden alle Datensätze gleich gekennzeichnet. Egal ob in Textfeld1 eine 1 steht oder nicht.
Bisher eingesetzte Funktion :
Public Function hz_nz(x As Long) As String
If x = 1 Then
'als x wird beim einsetzen in die Datensatzherkunft Textfeld1 angegeben
Forms!Zaehler!Zaehlwerk_U.Form!txt_hz_nz = "HZ"
Else
Forms!Zaehler!Zaehlwerk_U.Form!txt_hz_nz = "NZ"
Forms!Zaehler!Zaehlwerk_U.Form!txt_zahl.Visible = True
End If
End Function
Die ideale Lösung wäre für mich eine Methode Access dazu zu bewegen die VBA für jeden Datensatz einzeln durchzuführen und das auch seperat anzuzeigen.
Die Function ist getestet und wird bei mehren Datensätzen auch mehrfach durchlaufen. Aber das Ergebniss "HZ" oder "NZ" des letzten abgearbeiteten Datensatzes ist dann so dominant das es in allen Textfeldern steht.
Ich hoffe ich konnt emein Problem vernünftig erklären und möchte mich schonmal in voraus für eure Mühe bedanken!
Beste Grüße
Fabian
Hallo,
das Vorhaben ist in der Form komplett überflüssig. Es braucht auch kein Textfeld2 in der Tabelle, das kannst Du dort ersatzlos löschen.
Erstelle ein berechnetes Feld in einer Abfrage.
Feldname: Wenn(Zahlenfeld =1;"HZ";"NZ")Als Eintrag in der 1.Zeile einer leeren Spalte der Abfrage.
Als Feldname kannst Du einen frei gewählten Text verwenden. Das Formularfeld wird dann an dieses Abfragefeld gebunden.
Das Zahlenfeld ist das Feld das die Zahl enthält.
ZitatDa es sich um ein Endlosformular handelt wir sämtlicher Code auf Formularebene für alle Datensätze ausgeführt.
Das ist ein Irrtum, da das Feld an kein Tabellen/Abfragefeld gebunden ist, wird die Funktion für
keinen Datensatz ausgeführt. Das wird nur so oft angezeigt wie Datensätze im Endlosufo sind.
Sichtbar bzw. unsichtbar ist aber in einem Endlosformular generell nicht möglich. egal mit welcher Methode.
Hallo Klaus,
vielen Dank für die schnelle und hilfreiche Antwort!
Die Abfrage steht und liefert auch die entsprechenden Werte zurück.
Allerdings nach Verknüpfung mit dem Textfeld erscheint #Name?
=DomWert([Zaehlerart];[qry_art])
'=DomWert ([Spaltenname der Abfrage];[Name der Abfrage])
Würdest du mir bitte noch über diese Schwelle helfen?
Grüße
Fabian
Hallo,
wo habe ich in meinem Vorschlag etwas von Domwert gezeigt ? ::)
Das ist ersatzlos überflüssig. Binde das Formularfeld an das Abfragefeld (Steuerelementinhalt) "Zaehlerart", fertig.
Danke,
ich habs jetzt!
Aber wo ein Problem ist, sind natürlich noch mehr.. :-\
Ist es möglich den Speicherort zu wechsel? Ich möchte das der Inhalt des Textfeldes3 in ein anderes Feld in der Tabelle geschrieben wird, sobald die Zahl in Textfeld1 größer ist als 1.
Grüße
Fabian
Hallo,
wie bereits gesagt, ist ein Tabellenfeld überflüssig. Das kannst Du alles in der Abfrage machen. Wozu soll das in eine Tabelle ?
Daten die sich aus Zusammenhängen ergeben, werden nicht in einer Tabelle gespeichert, sondern im Regelfall in einer Abfrage ermittelt.
Mir scheint, da ist eher das Datenmodell zu überprüfen.
Kannst Du mal was zum tieferen Sinn des Vorhabens verraten ?
Hallo,
naja ich kanns probieren. Das Datenmodell scheint soweit eigentlich in Ordnung.
Es handelt sich um eine (Wasser)Zählerverwaltung. Dabei hat jeder Zähler eine ein eindeutige Nummer zur Identifikation. Diese Zähler wiederrum haben bis zu 2 Tochterdatensätze.
Da hierbei der 1. entscheidend ist wird er über eine Abfrage auch der Muttertabelle gezogen. Der 2. Datensatz hat nur informativen Charakter. Deshalb soll seine Nummer in einem Feld in der Tochtertabelle abgelegt werden.
Da das mitzählende Feld ja im gleichen Formular ist dachte ich an etwas wie ..
Wenn Zahlenfeld =1 speichere in Spalte X
Wenn Zahlenfeld >1 speichere in Spalte Y
Grüße
Fabian
Hallo,
ich habe es nicht ganz verstanden.
Zeige bitte mal ein Bild des Beziehungsfensters.
Ich habs gelöst bekommen! Über eine Wenn anweisung im Steuerelementinhalt. Die Beziehung kann und darf ich nicht veröffentlichen.
Vielen Dank für die Hilfe :)
EDIT:
Ich habe in den Steuerelementinhalt =WENN(Zahlenfeld=1;Zaehlernummer;NZ_NR) eingegeben und dabei nicht bedacht dass access mir dadurch die Eingabe verweigert.
EDIT2:
Es gibt mir im Moment zwar die gewünschten Daten aus der Tabelle aus, lässt aber nicht zu das ich neue Daten einspeise. Kennst du da eine Möglichkeit?
Hallo,
ZitatDie Beziehung kann und darf ich nicht veröffentlichen.
Suboptimal, wie das Datenmodell zu sein scheint, dürfte sich schwer
jemand finden, der das kopieren möchte.
ZitatKennst du da eine Möglichkeit?
Ohne Kenntnis des DM wird auch kaum jemand etwas dazu sagen
können.
gruss ekkehard
HZallo,
wenn sich aus einem Beziehungsbild Firmeninternas ableiten lassen hat man ohnehin was falsch gemacht. Aus Feldnamen sollte man keinen Inhalt erkennen können. Aus einem Feld mit dem Namen "Postleitzahl" z.B. kannst Du ja nicht auf die eigentliche PLZ schließen.
Da ich das Ganze nicht wirklich verstanden habe muss die Tabellenstruktur erklärt werden. Und da ist halt das Bild der Beziehungen am geeignetsten.
Guten Morgen,
entschuldigt die verspätete Antwort, ich bin nicht die ganze Woche im Büro.
Im Anhang die Beziehungen.
Vielen Dank schonmal im vorhinein für die Hilfe.
Viele Grüße
Fabian
Hallo,
ZitatDa hierbei der 1. entscheidend ist wird er über eine Abfrage auch der Muttertabelle gezogen. Der 2. Datensatz hat nur informativen Charakter. Deshalb soll seine Nummer in einem Feld in der Tochtertabelle abgelegt werden.
Das ist nach wie vor unverständlich. Erkläre bitte genauer und anhand der realen Feldnamen, was hier eigentlich passieren soll und wofür das gut sein soll.
In der Tabelle "Zaehlerstand" sind historisch die Zählerstande eines Zählwerks abgelegt. Alle diese Einträge sind gleichberechtigt.
Auf was genau ist die Bedeutung des Feldes "Status" bezogen?
Wenn keine Zählerstand-Historie erforderlich ist, ist die Tabelle "Zaehlerstand" überflüssig. Die Felder können (müssen) dann in Tabelle "Zaehlwerk" verschoben werden. Die Daten aus dem "Informationseintrag" finden sich in zusätzlichen Feldern in Tabelle "Zaehlwerk" wieder.
btw: Sonderzeichen unbedingt vermeiden ("Name/Firma") und die ID-Felder eindeutig (über die gesamte DB) benennen, z. B. "ZaehlerID" in Tabelle "Zaehler"
Die Zählerstandtabelle ist hierfür recht unbedeutend, im Feld Status steht jedoch eine Zahl entsprechend des momentanen aufendhaltsortes (lager,verbaut. etc)
Die Tabelle Zählerstände ist für eine spätere verwendung nötig.
Was genau jetzt passieren soll :
Ein Unterformular über die Tabelle "Zaehlwerk" wurde erstellt und zeigt die enthaltenen Felder + die ZAEHLERNUMMER.
Die Zählernummer wird im ersten Textfeld des Formulars angezeigt. Das Feld Zaehlwerksnr ist immer mit 1 oder 2 belegt.
Wenn das Feld gleich 1 ist, soll im Textfeld Zählernummer die ZAEHLERNUMMER angezeigt werden. Ist es jedoch 2 soll NZ_NR angezeigt werden.
Das Anzeigen funktioniert bis jetzt bestens. Jedoch lässt er mich nichts in die Felder eintragen, weil sie gebunden sind.
Steuerelementinhalt des Textfeldes "=WENN(Zahlenfeld=1;Zaehlernummer;NZ_NR)"
Ich hoffe ich habs jetzt etwas deutlicher erklären können.
Grüße
Fabian
Hallo,
ohne auf den Sinn/Zweck weiter einzugehen, ist es unmöglich , ein berechnetes Feld manuell zu editieren.
Soll heißen, das Konzept ist an dieser Stelle suboptimal.
Mist.
Wenn ich jetzt aber 2 Textfelder erstelle und die .Visible Eigenschaft ansteuere, müsste das nicht auch gehen.
Oder sieht einer von euch noch einen Weg das Vorhaben umzusetzen?
Vielen Dank schonmal im vorhinein.
Grüße
Fabian
Zitat von: Ausgefuchst am April 18, 2018, 10:45:00Wenn ich jetzt aber 2 Textfelder erstelle und die .Visible Eigenschaft ansteuere, müsste das nicht auch gehen.
Du meinst, du erstellst zwei Felder, eins berechnet zum Anzeigen und ein zweites zur Eingabe? Es wird dann immer das jeweils benötigte Feld eingeblendet?
Ja, das geht. - Aber der Wechsel zwischen den zwei Felder, je nach Benutzerinteraktion ist vermutlich nicht ganz trivial umzusetzen.
Wenn ich 2 Felder nutze bräuchte ich theoretisch keine Berechnung mehr. Dann könnte ich Textfeld1 als Steuerelementinhalt die ZAEHLERNUMMER zuweisen und Textfeld2 NZ_NR als Steuerelementinhalt.
Da kommt jetzt aber der Haken:
- können diese Felder übereinander liegen?
- wie blende ich das jeweils entsprechende Feld ein, so dass nicht 1 Feld für alle DS angezeigt wird.
Dankbare Grüße
Fabian