Access: berechnentes Feld (beim Formular) generieren oder vorschlagen

Hallo!

Ausgang: 2 Verknüpfte Tabellen, Auftrags-Tabelle mit Kunden Kürzel, Positions-Tabelle mit AuftragsId (für die Verknüpfung).

Ich versuche ein Code-Feld in die Positions-Tabelle zu bringen, welcher so ausehen soll: „FF.01.345“, wobei FF ein Kürzel für Kunde, 01 eine Laufnummer vom Auftrag dieses Kunden und 345 die Position im Auftrag sind.

Nach mehreren Versuchen musste ich aufgeben: bei einer Tabelle kann man kein von frenden Feldern abhängigen Feldinhalt generieren/berechnen oder irre ich mich?
Hingegen gelang es mir sowohl bei Abfragen wie bei Berichten das Feld wunschgemäss zu erzeugen.

Nun kam ich auf die Idee, bei einem neuen Positions-Satz (also im Unterformular)
den Code zu erzeugen oder wenigstens als Vorshlag anzuzeigen. Und da komme ich nicht weiter!
Ich habe testhalber »=Wenn(IstNull([Der Code]);"TX.99.888")« bei folgenden Feldereignissen eingetragen: Beim klicken, bei Fokuserhalt, beim doppelklick, beim Hingehen. Es passiert nichts.

Was mache ich falsch? Danke fürs Mitdenken.

Hallo,

welche Idee wird mit dem Speichern eines berechneten Wertes verfolgt?

Es ist nicht empfehlenswert, aus anderen vorhandenen Daten berechnete Ergebnisse abzuspeichern.

Die Ergebnisse sind, eben weil berechenbar, an jeder Stelle dann zu berechnen, wo und wann sie gebraucht werden.
Das verhindert Redundanzen und Mehrdeutigkeiten.

=Wenn(IstNull([Der Code]);„TX.99.888“)

Was bedeutet hier „Der Code“?

Und warum sollte etwas passieren, wenn der Ausdruck in einer Ereignis-Eigenschaft eingetragen wird? Es passiert lediglich die „Abarbeitung“ der Wenn-Bedingung ohne weitere Auswirkungen.

Wenn denn unbedingt ein berechneter Wert gespeichert werden soll, dann:

erstelle eine Public-Funktion (" fktCalcCode(…)" mit Übergabe-Argumenten der Ausgangsdaten) in einem Standard-Modul, die die Berechnung ausführt.

Je nachdem, wann und wo die Berechnung nun erforderlich ist (ausgeführt werden soll) wäre dies denkbar:

In einem Formular im Form-Ereignis „Vor Aktualisierung“:

Sub Form_BeforeUpdate(Cancel As Integer)
Me!CalcCode = fktCalcCode(…)
End Sub

Alternative wäre eine Aktualisierungsabfrage, die den betreffenden Datensatz aktualisiert.

Hallo df6gl,

danke für deine Antwort. Meine Replik in deinem Text:

und ja: wie beziehe ich mich in der Funktion auf die DB oder die Tabellen?
Ist es richtig, in der DB stehe ich, also muss ich sie nicht angeben?
auf den Kürzel mit [Aufträge].[Kunde]?
kann ich sql in der Funktion benutzen?

Danke nochmals für deine ausführliche Antwort.

Oder kannst du mir eine Adresse für ein gutes Online-Tutorial für VBA in Access angeben? Das Exzellente teialehrbuch.de ist ja leider, leider nicht mehr erreichbar!

Hallo,

mhmm, ich versteh Deine ganze Ansicht der Access-Funktionalität nicht…

Der Code ist quasi „heilig“, er darf nie mehr verändert werden, was auch immer passiert, also z.B. Löschen eines älteren Auftrages, Kompression oder Reparatur der Db, etc. Verstehst du?

Nein… (Code == Kurzbezeichnung) Wenn ein Auftrag (Datensatz) gelöscht wird, ist auch keine Kontrolle mehr über die von diesem DS abhängiger Kurzbezeichnung mehr möglich.

Das verhindert Redundanzen und Mehrdeutigkeiten.
-> dito, s.o.

Gerade durch die Speicherung ( in gleicher Tabelle oder einer anderen) wird o. g. Forderung („er darf nie mehr verändert werden“) hintergangen.

wie beziehe ich mich in der Funktion auf die DB oder die Tabellen?

Eine Funktion hat, wie angedeutet, Übergabe-Parameter (Argumente), die die Werte aus Formularfelder oder sonstigen Variablen in/an die Funktion weitergeben.

Ist es richtig, in der DB stehe ich, also muss ich sie nicht angeben?

Klar, wo soll sonst die Funktion stehen? „Außerhalb“ Access (bzw. der Anwendung) geht nicht…

auf den Kürzel mit [Aufträge].[Kunde]?
kann ich sql in der Funktion benutzen?

Mhmm, ein bischen durcheinander…

Access besteht aus 3 Teilen:

-Die GUI, also die User-Oberfläche, auf der die einzelnen Objekte (Tabellen, Forms, Reports) mit der Maus oder sonstwie erstellt und „zusammengeklickt“ werden können.

-Die Jet-Engine, das eigentliche DB-System, das Tabellen und Tabelleninhalte beherbergt. Die „Kommunikationssprache“ mit dieser Jet-Engine ist SQL (Access-Dialekt). SQL wird z. B. in Abfragen manifestiert (Abfrageentwurf/SQL Ansicht) .

-Dem VBA-IDE in Gestalt des VBA-Editors, das es ermöglicht, nahezu alle Abläufe programmtechnisch (Visual Basic for Applications) zu kontrollieren. In VBA gibt es eingebaute Funktionen, die SQL-Strings („Select * from tblTabelle“) verarbeiten können, soll heißen, solche Funktionen können aus der Jet-Engine (Tabellen) Daten auslesen oder auch einlesen, bzw. manipulieren.

In/mit diesem VBA-Editor können nun auch Prozeduren geschrieben werden, die eben bestimme Aufgaben ausführen. Zum Einen sind es Ereignisprozeduren, die aufgerufen werden, wenn das dazu gehörende Ereignis auftritt ( z. B. Klick auf einen Button), zum Anderen können es „globale“ (Public) Prozeduren (Funktion oder Sub) sein, die von überall her (–> müssen dann in einem Standard-Modul stehen) aus der Access-Anwendung aufgerufen werden können, also auch von innerhalb eines SQL-Statements.

Links für Tutorial finden sich genügend im IN. —> gockeln.

Ansonsten wären z. B. donkarl.com und dbwiki.net als Tipplieferant (FAQ) zu empfehlen.

Vielen Dank für deine ausführliche Antwort.
Muss alles noch Verdauen = verstehen.
Danke nochmals.

So, geschaft!
Ich habe den berechneten Code im Formular als Standard-Wert vom Feld festgelegt. Das funktioniert genau wie ich es mir gewünscht hatte.
Danke an alle die sich über mein Problem den Kopf zerbrochen haben … und auch an allen anderen.