Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Einfaches Füllen von Feldern im Endlosformular

Begonnen von xoius, Mai 04, 2020, 10:22:49

⏪ vorheriges - nächstes ⏩

xoius

Hallo mal wieder :)

Ich brauche erneut euren fachmännischen Rat.
Heute treibt mich ein (vermeindliches) VBA-Thema um:

Ausgangslage
Ich habe in der Tabelle tblProdukte u.a. die Einträge
- CONummer
- Vorvereinbarungsnummer
- Vertragsnummer
- Kontraktnummer
mit jeweils Standardwert "0" (die Zahl, nicht NULL)

Aufgabestellung
Nun lasse ich mir die Produkte in einem Endlosformular anzeigen. Dort gibt es für jeden Datensatz das ungebundene Textfeld "Text53". In dieses Textfeld möchte ich gerne eintragen, wo wir uns vertraglich befinden.

Ansatz
Ereignis beim Laden des Formulars
If Me.CONummer <> 0 Then Me.Text53 = "CO"
If Me.Vorvereinbarungsnummer <> 0 Then Me.Text53 = "VV"
If Me.Vertragsnummer <> 0 Then Me.Text53 = "V"
If Me. Kontraktnummer <> 0 Then Me.Text53 "W"

Es ist tatsächlich so gedacht, dass die Werte von den darunterliegenden Ifs überschrieben werden, falls auch Nummern zB für Vertrag oder Kontrakt vorliegen. Das ist also kein Fehler, sondern ein Feature :)

Problem
Die Ereignisprozedur beim Laden schaut sich natürlich nur an wie es beim ersten Datensatz des Endlosformulars steht. So steht bei allen Produkten im Textfeld Text 53 "V", weil für den ersten Datensatz eine Vertragsnummer existiert. Dies gilt aber nicht zwingend für den Rest der Datensätze. Wie kann ich also das Textfeld Text53 für jeden Datensatz im Endlosformular korrekt füllen? Ist das eine Frage wo die Ereignisprozedur ausgeführt wird oder ist mein Ansatz falsch?

Gerne her mit den Tipps! :)

DF6GL

Hallo,

der Ansatz ist falsch.


erzeuge eine Public-Function (in einem Standardmodul), rufe diese Funktion in einer leeren Spalte im Abfrageentwurf (Evtl. Abfrage erstellen für die Datenherkunft des Endlos-Forms) auf  und binde das Textfeld an diese berechnete Spalte ("Befund").


Feld:  Befund: fktGetBefund([CONummer];[Vorvereinbarungsnummer];[Vertragsnummer];[Kontraktnummer])


ZitatPublic Function fktGetBefund(CONummer,Vorvereinbarungsnummer,Vertragsnummer,Kontraktnummer)
If nz(CONummer,0) <> 0 Then fktGetBefund = "CO"
If nz(Vorvereinbarungsnummer,0) <> 0 Then fktGetBefund = "VV"
If nz(Vertragsnummer,0) <> 0 Then fktGetBefund = "V"
If nz(Kontraktnummer,0) <> 0 Then fktGetBefund = "W"
End Function

Ob dies aber insgesamt so richtig zielführend ist, wage ich erst mal zu bezweifeln.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

xoius

Vielen Dank! Das hat wunderbar funktioniert und ohne Deine Hilfe wäre ich nie darauf gekommen.

ebs17

If Me. Kontraktnummer <> 0 Then ...
Ihr vergebt auch negative Nummern?
Zitat
... oder ist mein Ansatz falsch?
Ja, sehr.

Deine Nummern gehören in eine eigene abhängige Tabelle, und zwar als Datensatz pro Nummer und Vorgang. so könnte man den datensatz schon um einen Zeitstempel ergänzen und so zu einer zusätzlichen qualifizierten Information kommen.

Die gewünschte Information erhielte man aus dem Datensatz mit dem maximalen Zeitstempel für den Vorgang (Tabelle verknüpfen über Abfrage).
Mit freundlichem Glück Auf!

Eberhard