Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: peter4400 am Januar 16, 2025, 08:58:58

Titel: per VBA berechnetes Tabellenfeld erstellen - aus Komma wird Semikolon
Beitrag von: peter4400 am Januar 16, 2025, 08:58:58
Hi,
ich habe eine Prozedur, die mir zu Tabellen berechnete Felder hinzufügt. Klappt soweit ganz gut, außer der Formelausdruck enthält ein Komma, weil z.B. das erstellte Feld den Wert eines anderen Feldes mit 0,3 multiplizieren soll. Dann steht im Formelausdruck nicht 0,3*Summe sondern 0;3*Summe
Woran kann das liegen?
Sub BerechnetesFeldHinzufuegen(TabellenName As String, FeldName As String, Datentyp As DAO.DataTypeEnum, Berechnungsformel As String)

    Dim db As DAO.Database
    Dim tdf As DAO.TableDef
    Dim fld As DAO.Field

    Set db = CurrentDb
    Set tdf = db.TableDefs(TabellenName)
    Set fld = tdf.CreateField(FeldName, Datentyp)
    [color=red]fld.Expression = Berechnungsformel[/color]

    tdf.Fields.Append fld

    db.TableDefs.Refresh

    Set fld = Nothing
    Set tdf = Nothing
    Set db = Nothing

    MsgBox "Das berechnete Feld '" & FeldName & "' wurde erfolgreich hinzugefügt."
End Sub
Titel: Re: per VBA berechnetes Tabellenfeld erstellen - aus Komma wird Semikolon
Beitrag von: MzKlMu am Januar 16, 2025, 09:09:16
Hallo,
das Wichtigste, die eigentliche Berechnung zeigst du nicht.
In VBA muß zwingend als Dezimaltrenner der Punkt verwendet werden.

Aber, das Vorhaben ist überflüssig, denn in einer Datenbank werden berechnete Werte nicht gespeichert, sondern in einer Abfrage nur bei Bedarf berechnet.
Titel: Re: per VBA berechnetes Tabellenfeld erstellen - aus Komma wird Semikolon
Beitrag von: werner budde am Januar 16, 2025, 11:19:26
Verrückterweise bietet MS ja seit einigen Versionen an, dass man in einem Tabellenentwurf zu einem Feld den Datentyp ,,Berechnet" festlegen kann,
was aber, so denke ich, vom regulären DB-Standard abweicht und für die meisten von uns ,,Bää" ist. Auch habe ich festgestellt, dass hier nicht alles geht (weiß nicht mehr genau, was geht und was nicht, in meiner Erinnerung verwehrt Access zu recht komplexen Formeln den Dienst).

Aber viele Neueinsteiger, die ggf. aus der Excel-Welt kommen, fahren offenbar darauf ab.
Wie Klaus schon andeutete, sind Berechnungen eigentlich immer in Berechneten Feldern in Abfragen umzusetzen.
Peter, Du solltest es so machen wie Klaus vorschlug.
Titel: Re: per VBA berechnetes Tabellenfeld erstellen - aus Komma wird Semikolon
Beitrag von: peter4400 am Januar 16, 2025, 11:28:06
Es sind viele verschiedene Berechnungen, deshalb hab ich mir ja diese Prozedur zugelegt...

Es gibt doch in Access 2016 den Datentyp "berechnetes Feld", spricht irgendwas dagegen, ihn zu verwenden? Vermutlich wird er intern gar nicht groß anders als eine Berechnung in einer Abfrage gehandelt, oder? Also kann man doch, statt für eine Tabelle, zur der man ein berechnetes Feld braucht, eine zusätzliche Abfrage zu erstellen, genauso gut dieses berechnete Tabellenfeld erstellen?
Titel: Re: per VBA berechnetes Tabellenfeld erstellen - aus Komma wird Semikolon
Beitrag von: MzKlMu am Januar 16, 2025, 11:33:07
Hallo,
ZitatEs sind viele verschiedene Berechnungen, deshalb hab ich mir ja diese Prozedur zugelegt...
Die Prozedur kann auch in Abfragen verwendet werden.
Zitatgenauso gut dieses berechnete Tabellenfeld erstellen?
Nein, die berechneten Tabellenfelder haben Einschränkungen, so können z.B. nur Felder verwendet werden die in der Tabelle selbst vorkommen, auch funktionieren nicht alle Berechnungsfunktionen. So kann z.B. Dllokup nicht verwendet werden. Auch die Aggregatfunktionen (Summieren, Zählen, Mittelwert usw.). Und, berechnete Felder werden immer berechnet, egal, ob das gerade benötigt wird oder nicht. Was ggf. die ePerformance einschränkt.
Daher ist die Berechnung in Abfragen immer zu bevorzugen.
Titel: Re: per VBA berechnetes Tabellenfeld erstellen - aus Komma wird Semikolon
Beitrag von: Bitsqueezer am Januar 16, 2025, 12:56:04
Hallo,

um mal wieder die Lanze zu brechen FÜR berechnete Felder:

Dies ist auch in professionellen Datenbanken wie SQL Server gang und gäbe, auch wenn man dort einiges mehr damit machen kann (wie persistente Speicherung und Indizierung etwa).

Es ist absolut sinnvoll, berechnete Felder zu verwenden, wenn man Dinge aus anderen Feldern zusammenfassen will.

Also: Kommt mal weg von dem Gedanken, daß berechnete Felder in Tabellen etwas Schlechtes sind, sind sie nicht und wird auch in professionellen Datenbanken eingesetzt. Wer als Backend von Access mal wegkommt und SQL Server o.Ä. einsetzt, wird sich insbesondere über die Persistenz- und Indexmöglichkeit freuen, mit denen man noch eine ganze Menge mehr aus den Datenbanken herausholen kann.

Ich betone allerdings, daß ich nicht die Datenmakros in Access meine. Makros sind ja so schon die Seuche, aber auf Tabellenebene - geht gar nicht.

Gruß

Christian
Titel: Re: per VBA berechnetes Tabellenfeld erstellen - aus Komma wird Semikolon
Beitrag von: peter4400 am Januar 16, 2025, 12:57:15
Zitat von: MzKlMu am Januar 16, 2025, 11:33:07Und, berechnete Felder werden immer berechnet, egal, ob das gerade benötigt wird oder nicht. Was ggf. die ePerformance einschränkt.
Daher ist die Berechnung in Abfragen immer zu bevorzugen.
Bei einer Abfrage werden doch auch die Berechnungen für alle berechneten Felder durchgeführt? Kann da keinen Unterschied erkennen.

Für mich macht es die Sache übersichtlicher. Die Tabelle mit einem berechneten Feld ist letztlich sowas wie eine Abfrage auf diese Tabelle, bloß dass ich kein zusätzliches Objekt in der Datenbank brauche
Titel: Re: per VBA berechnetes Tabellenfeld erstellen - aus Komma wird Semikolon
Beitrag von: MzKlMu am Januar 16, 2025, 15:37:31
Hallo,
ich beziehe ja einen Großteil von dem was ich empfehle oder propagiere aus dem was ich im Laufe der Jahrzehnte aus den Foren und sonstigen Quellen zu Access gelesen habe. Das was ich bisher zu diesen berechneten Feldern gelesen habe, habe ich oben wiedergegeben. Das bedeutet aber auch, dass man aus weiteren Beiträgen immer weiter lernt. Offensichtlich muss ich nun meine Meinung über dies Felder nach dem Vortrag von Christian ändern (seufz).  :)
Titel: Re: per VBA berechnetes Tabellenfeld erstellen - aus Komma wird Semikolon
Beitrag von: werner budde am Januar 16, 2025, 16:17:36
Zitat von: MzKlMu am Januar 16, 2025, 15:37:31Offensichtlich muss ich nun meine Meinung über dies Felder nach dem Vortrag von Christian ändern (seufz).  :)
Ich schließe mich dann mal dem Seufz vom Klaus an und ziehe meine Aussage in #2 zurück.
Titel: Re: per VBA berechnetes Tabellenfeld erstellen - aus Komma wird Semikolon
Beitrag von: Josef P. am Januar 16, 2025, 18:18:01
[OT]

Hallo!

ZitatIch betone allerdings, daß ich nicht die Datenmakros in Access meine. Makros sind ja so schon die Seuche, aber auf Tabellenebene - geht gar nicht.
.. außer man betrachtet diese Datenmarkos wie Trigger, dann könnten sie schon etwas bringen, wenn man unbedingt ein File-Backend wie Access einsetzen will/muss. (Ich muss zum Glück nicht. ;))
Z. B. zum Protokollieren von Änderungen in eine "Änderungsprotokoll"-Tabelle.
Anm.: das Schreiben von diesen "Triggern" ist aber gewöhnungsbedürftig (um es freundlich auszudrücken) ;)

ZitatBitte nicht eine Abfrage erstellen, die die Berechnung enthält, und diese dann als Basis für andere zu verwenden, um die Berechnung einheitlich zu haben. Ist die Berechnung in der Tabelle selbst als berechnetes Feld, kann jede Abfrage alle Indizes der Tabelle, die existieren, verwenden. Eine Abfrage auf eine Abfrage kann dazu führen, daß diese nicht mehr verwendet werden und entsprechend langsamer ist.
Unter welchen Umständen (außer bei der Verwendung von distinct und eventuell group by) kommt das vor, dass der Index nicht genutzt wird, solange die Abfrage grundsätzlich index-freundlich gestaltet ist?
Hab mittlerweile zu wenig Praxix mit Jet/ACE.
Der SQL-Server würde
select
   a, b, c
from (
   select
      a, b, a+b as c
   from
      Tabelle
   where
      b = 1
   ) as X
where
   a = 5
auflösen und als ein einziges select-Statement interpretieren und einen verfügbaren 2-Felder-Index über a + b nutzen.

LG
Josef
Titel: Re: per VBA berechnetes Tabellenfeld erstellen - aus Komma wird Semikolon
Beitrag von: Bitsqueezer am Januar 16, 2025, 21:53:04
Hallo Josef,

habe gerade ein paar Tests auf dem SQL Server mit meiner MNIST-Variante gemacht, die rd. 1,6Mio Datensätze hat (bei zu wenig Datensätzen verwendet SQL Server einfach einen Tablescan) - Du hast recht.
Der Optimizer von SQL Server setzt die Abfragen vor der Ausführung zusammen und optimiert dann, was man alles zusammenfassen kann und wo welcher Index am besten genutzt werden kann.
Dabei spielt es auch keine Rolle, ob es eine Unterabfrage, eine CTE oder eine gespeicherte View (der Unterabfrage) ist.
Der Optimizer von SQL Server ist allerdings auch extrem gut, ob das in gleichem Maß für eine Access-Abfrage gilt, müßte man überprüfen (aber man kommt nur schwer an die internen Daten bei einer Abfrage, was mir persönlich immer zu umständlich ist).

Also da wir alle gerade beim Zurücknehmen sind, nehme ich den Punkt mit der Abfrage auf die Abfrage zurück. Dennoch würde ich eher ein berechnetes Feld als eine Abfrage dafür verwenden, die ja immer zusätzlich zur Tabelle abgefragt werden muß, wohingehend bei einem berechneten Feld ich nur mit der einen Tabelle arbeiten kann.

Gruß

Christian