PDA

Vollständige Version anzeigen : Gespeicherte Formel aus Tabelle berechnen


cpetit
17.03.2003, 15:57
Hallo,
folgendes Problem habe ich.

Habe eine Tabelle Produkt, Produktabmessung und Formel die miteinander verbunden sind.
Ein Produkt hat mehrere Abmessungen und eine Formel

In der Tabelle "Formel" gibt es verschiedene Mathematische-Formel zur berechnung des Gewichts von Stahlplatten. Die Formel möchte ich z.B. in einer Abfrage nutzen wenn ich alle Produkte mit ihren Abmessungen anzeigen will damit ich auch das Gewicht der Tafelplatten errechnen kann.


Beispiel von einer Formel
Die Abmessungen Dicke, Breite, Länge bekomme ich aus einer Tabelle die Text gespeichert ist.
([Dicke]*[Breite]*[Länge])/1000/1000*8)-(([Breite]*[Länge])/1000/1000*3)

Wie kann ich jetzt die Formel so in der Abfrage nutzen das auch das Gewicht berechnet wird.

hat jemand eine Idee?
Gibt es eine Function der diesen Ausdruck berechnet oder muss ich selber eine Function schreiben.

Bin für jeden Tipp dankbar

Alexander Jan Peters
17.03.2003, 17:06
<p>Hallo,

vielleicht hilft Dir <strong>Eval</strong> (s.OH) weiter, damit kann man einen Ausdruck berechnen. Ich weiß jetzt nicht, ob das auch in Abfragen geht, aber das könnte man auch durch Kapselung in einer Funktion umgehen.

Gruß

Alex</p>

Nouba
17.03.2003, 17:47
Feedback wird's wohl kaum geben, da die Frage anscheinend erfolgreich in de.comp.datenbanken.ms-access beantwortet wurde.

Alexander Jan Peters
17.03.2003, 17:57
<p>@ Nouba, entspricht aber inhaltlich meiner Anwort, also haben alle die das hier lesen ihre Antwort:</p>
<blockquote>
de.comp.datenbanken.ms-access
Re: Gespeicherte Formel aus Tabelle berechnen
Anwort von Josef Poetzl:

Eval + Eigene Funktion

z.B:
Function FormelErgebnis(Formel As String, _
ParamArray vWerte() As Variant) As Double
Dim strFormel As String
Dim i As Integer
strFormel = Formel
For i = 0 To UBound(vWerte)
strFormel = Replace(strFormel, "P" & (i + 1), vWerte(i))
Next i
FormelErgebnis = Eval(strFormel)
End Function

Aufruf mittels
=FormelErgebnis ("P1*P2*P3", 20, 500,1000)
P1...1. Parameterwert, P2..zweiter usw.

oder Dein Beispiel (kein Zeilenumbruch):
=FormelErgebnis("([P3]*[P1]*[P2])/1000/1000*8)-(([P1]*[P2])/1000/1000*3)",
[Breite],[Länge],[Dicke])

mfg
Josef</blockquote>
<p>Gruß Alex</p>

Sascha Trowitzsch
17.03.2003, 19:12
Danke Alex und Nouba.
@ cpetit: Doppelpostings mögen wir gar nicht. Zu Begründung siehe u.a. diesen Thread:

http://www.ms-office-forum.net/forum/showthread.php?s=&threadid=88051

cpetit
17.03.2003, 21:03
Werde mich bessern und keine doppelpostings mehr durchführen.
Ich hoffe ihr helft mir trotzdem weiter.

Leider funzt die Function nicht.
Bekomme immer Laufzeitfehler "2482"
Access kann den eigegebenen Namen [2] nicht finden.

Die Zahl zwei steht für den Wert der für P1 steht wenn P1 als erstes kommt.

Komme nicht zu einer Lösung.

Alexander Jan Peters
17.03.2003, 21:19
<p>Hallo,

lass mal die eckigen Klammern bei den P's in der Formel weg.
<strong>=FormelErgebnis("(P3*P1*P2)/1000/1000*8)-((P1*P2)/1000/1000*3)", [Breite],[Länge],[Dicke])</strong>
<p>
Gruß Alex</p>

cpetit
17.03.2003, 22:36
Danke das war es.

Hast du eine Idee warum er die Klammer nicht wollte?

Würde mich mal Intressieren weil er diese ja bei der Fehlermeldung nicht bemängelt hatte.

Danke

Alexander Jan Peters
17.03.2003, 22:57
<p>Hallo,

Josef arbeitet in seiner Funktion mit Platzhaltern (Px), die durch die Werte aus dem ParramArray ersetzt werden:
strFormel = Replace(strFormel, "P" & (<strong style="color:red;">i + 1</strong>), vWerte(<strong style="color:red;">i</strong>))
Was kommt also raus, wenn man [P1] durch den ersten Wert des Arrays ersetzt ? Eine eingeklammerte Zahl, die Eval wiederum als Feld der Abfrage interpretiert, das es ja nicht geben kann.
Das er das nicht im Debugger bemängelt hat, ist klar, da mit Replace eine Text-/Stringersetzung durchgeführt wird, der Ausdruck ist ein String, solange bis er Eval übergeben wird und Strings sind halt Texte, da gibt es Nichts zu debuggen.

Gruß

Alex

P.S. Wäre ganz gut, wenn Du es der Newsgroup auch mitteilst, dass das Problem erledigt ist und wo Josef einen Tippfehler, den mehr war das nicht, gemacht hat.</p>

cpetit
18.03.2003, 23:41
Danke