Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Eval-Funktion

Begonnen von hanskuhn, Februar 08, 2012, 14:22:47

⏪ vorheriges - nächstes ⏩

hanskuhn

Hallo zusammen,

ich lasse mir von VBA verschiedene Werte via Eval(strX) errechnen. Nur an einer Stelle hakt er und ich kann mir nicht erklären, wieso...

Folgenden strX errechnet er einwandfrei:
Eval("133662"-("10143"+"8430"+"19416"+"22344"+"1341"+"6"+"33152"+"9010,8"+"23232"))

Folgendes leider nicht:
Eval("336224"-("14027,3"+"10601"+"94811"+"22506"+"20767"+"6328"+"43744"+"34235,2"+"57654,8"))

Erhalte RTE 13: Typen unverträglich!

Weiss wer warum?

Gruß,
Hans

daolix

ZitatFolgenden strX errechnet er einwandfrei:
Eval("133662"-("10143"+"8430"+"19416"+"22344"+"1341"+"6"+"33152"+"9010,8"+"23232"))

Folgendes leider nicht:
Eval("336224"-("14027,3"+"10601"+"94811"+"22506"+"20767"+"6328"+"43744"+"34235,2"+"57654,8"))

Bei mir geht weder das eine noch das andere.

Aber so funktioniert es:
Eval("336224-(14027.3+10601+94811+22506+20767+6328+43744+34235.2+57654.8)")
oder
Eval("133662-(10143+8430+19416+22344+1341+6+33152+9010.8+23232)")

Punkt statt Komma und die Formel komplett als String

hanskuhn

Moin daolix,

danke erst mal für deinen Hinweis. Also die Kommata durch Punkte ersetzen ist logisch. Aber wenn ich die Anführungszeichen wie bei einem normalen String setze und nicht um jede Zahl, dann rechnet er es nicht.

Ich habe jetzt nochmal Leerzeichen rausgelöscht, die ich vorher in dem String übersehen hatte und nun funktioniert es mit meinem ursprünglichen Beispiel. Ich habe aber das dumpfe Gefühl, dass meine Lösung nicht wirklich die optimale ist...

DF6GL

Hallo,


kurze Nachfrage:

"ich lasse mir von VBA verschiedene Werte via Eval(strX) errechnen"

warum?



Ansonsten ist eine mathematische (numerische) Berechnung mit Lateralstrings eher ein gewagtes Vergnügen.

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

hanskuhn

Hallo DF6GL,

ich habe leider keine Lösung gefunden, um das Ganze mit einer Abfrage zu berechnen.

Ich habe eine Tabelle mit Werten, die miteinander verrechnet werden können:

ID|Wert|Kürzel|Verrechnungregel
1|1234|A|A
2|2345|B|A+B
3|543|C|(A+B)-C
etc...

Ich lese also in einer Schleife die Verrechnungsregel für jeden Datensatz ein und in einer Unterschleife ersetze ich die Kürzel der Verrechnungsregel mit den jeweiligen Werten der Datensätze. Das alles schreibe ich dann in meinen strX und lasse es zum Schluss errechnen. Kann man das eleganter lösen?

Beste Grüße,
Hans

DF6GL

Hallo,

naja, etwas klarer, weiterhin nicht verständlich:


Sind die "Kürzel" identisch mit den Variablennamen in der Verrechnungsregel?

Soll also bei ID=3   ID1Wert + ID2Wert -ID3Wert   (---> (1234+ 2345) -543)  )   gerechnet werden?

Wenn so, gibt es dann für "Kürzel" keine mehrfachen Einträge?

So wie ich das sehe, soll das eine Summierung über das Feld Wert in der ganzen Tabelle ergeben, wobei der Wert 543 als negativ angenommen wird...


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

daolix

#6
Ich hab eval nie benutzt, daher weis ich nicht was du da berechnen willst, oder mein rechner spinnt:


s = "(12.3 + (4.7 - 8)) * 4 "
   Debug.Print Eval(s)
   Debug.Print Eval(("12.3" + ("4.7" - "8")) * "4")

ergibt bei mir 2 verschiedene Ergebnisse.

wenn ich deine schreibweise stück für stück zusammensetzte komme ich in zahlenbereiche bei der mein Rechner aussteigt.

edit:
so wie ich das jetzt verstehe werden bei deiner Schreibweise die werte in Klammern als Zahl zusammengesetzt.
die Operatoren sollten daher Bestandteil deines stringes sein.

hanskuhn

ZitatSind die "Kürzel" identisch mit den Variablennamen in der Verrechnungsregel?
Soll also bei ID=3   ID1Wert + ID2Wert -ID3Wert   (---> (1234+ 2345) -543)  )   gerechnet werden?

Ja, genau!

Für Kürzel gibt es nur eindeutige Einträge, also nicht bei einem Datensatz A und beim nächsten AB!

ZitatSo wie ich das sehe, soll das eine Summierung über das Feld Wert in der ganzen Tabelle ergeben, wobei der Wert 543 als negativ angenommen wird...

In diesem Beispiel ist das so. Die Verrechnungsregel kann aber vom Nutzer angegeben werden, könnte also auch z.B. 2*A-B+C sein...

DF6GL

#8
Hallo,

bei einer solchen Rechnung:


("12.3" + ("4.7" - "8")) * "4"


würde ich auch spinnen, zumindest in's Grübeln kommen...   ;D ;D ;D


PS: @HansKuhn


ok, aber warum steht dann bei JEDEM Datensatz eine extra Regel?.  Den Zusammenhang versteh ich noch nicht. M. E gehören die Rechnenregeln in eine extra Tabelle, aus den man eine bestimmte Regel auswählt und dann auf die Werte in der Werte-Tabelle anwendet.


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

hanskuhn

Zitatwürde ich auch spinnen, zumindest in's Grübeln kommen...

Naja, dass das nicht so optimal ist, steht ja nun fest....

Zitats = "(12.3 + (4.7 - 8)) * 4 "


-> Wenn s = string, dann rechnet (eval(s)) er das bei mir nicht

daolix

Zitat von: DF6GL am Februar 10, 2012, 12:01:28
Hallo,
bei einer solchen Rechnung:
("12.3" + ("4.7" - "8")) * "4"
würde ich auch spinnen, zumindest in's Grübeln kommen...   ;D ;D ;D
ja, war aber oben so ähnlich angegeben.

Zitat von: hanskuhn
-> Wenn s = string, dann rechnet (eval(s)) er das bei mir nicht
ja s ist ein string.
hmm meine access version ist mit deiner nicht kompertibel.


DF6GL

#11
HAllo,

also, ich weiß nicht, was ihr da genau macht...


Bei mir kommt hier überall das gleiche Ergebnis (36)  heraus

Dim s As String
s = "(12.3 + (4.7 - 8 )) * 4 "
   Debug.Print Eval(s)
   Debug.Print Eval(("12,3" + ("4,7" - "8" )) * "4")   ' dass das hier "geht", liegt an der "Kulanz" von MS, interne Typkonvertierungen in VBA eingebaut zu haben, die Rücksicht auf Windows-Ländereinstellungen nehmen.
   Debug.Print (12.3 + (4.7 - 8 )) * 4
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

hanskuhn

So, jetzt zeig ich euch einfach mal meinen Code, vielleicht seh ich ja den Wald vor lauter Bäumen nicht:

If rst.RecordCount > 0 Then rst.MoveFirst
Do While Not rst.EOF
   
    intID = rst.Fields(0)
   
    strBerechnung = Nz(DLookup("[SZBerechnung]", "[qryStromWertZähler]", "SWZJahrRef = " & intJahr & " AND SZID = " & intID & ""), 0)
   
    'Schleife 2 Start
    If y > 0 Then rst2.MoveFirst
    Do While Not rst2.EOF

        dblWert = Nz(DLookup("[DifferenzVJ]", "[qryStromWertZähler]", "SWZJahrRef = " & intJahr & " AND SZID = " & rst2.Fields(0) & ""), 0)
        strKürzel = Nz(DLookup("[SZKürzel]", "[tblStromZähler]", "SZID = " & rst2.Fields(0) & ""), 0)
        strBerechnung = Replace(strBerechnung, strKürzel, Str(dblWert))
   
    rst2.MoveNext
    Loop
   
    strBerechnung = Replace(strBerechnung, " ", "")
    strBerechnung = Chr(34) & strBerechnung & Chr(34)
    strBerechnung = Eval(strBerechnung)
    dblWert = CDbl(strBerechnung)
    strInfo = strInfo & Nz(DLookup("[SZBezeichnung]", "[tblStromZähler]", "SZID = " & intID & ""), 0) & ";" & dblWert & ";"
   
rst.MoveNext
Loop

ebs17

Zwischenfrage an hanskuhn: Machst Du hier Experimentalprogrammiererei (danach sieht es zur Zeit aus), oder ist Dir an effektiv ermittelten Ergebnissen gelegen?

Wie man im letzten Beitrag sehen kann, hast Du Tabellen und möchtest irgendetwas berechnen. Dazu würde man im einfachen sowie im effektiven Fall Abfragen (SQL-Anweisungen) einsetzen. Deine bisherigen Erläuterungen liefern allerdings noch keinen Ansatz für konkretere Hinweise.

Per Schleifen Tabellen durchlaufen und per DLookup Einzelwerte herauspicken ist nicht effektiv, und das Eval-Problem ist dann nur ein Folgeproblem.

Es wäre also sinnvoll, die eigentliche Ausgangssituation (Tabellen) und das eigentliche Ziel (Berechnungsergebnis) darzustellen. Schätzungsweise wird Dir dann hier ein ganz anderer Lösungsweg als Deiner vorgeschlagen.

MfGA
ebs
Mit freundlichem Glück Auf!

Eberhard

daolix

#14
Zitat von: DF6GL am Februar 10, 2012, 12:25:08
   Debug.Print Eval(("12,3" + ("4,7" - "8")) * "4")   ' dass das hier "geht", liegt an der "Kulanz" von MS, interne Typkonvertierungen in VBA eingebaut zu haben, die Rücksicht auf Windows-Ländereinstellungen nehmen.
Ahso, alles klar. Ich verstehe. Ich merk gerade das mir diese "ich mach mal alles schön im Hintergrund"-Kulanz manchmal auf'n Zeiger geht. Ich glaub ich werde Eval auch weiterhin nicht benutzen, denn wenn ich das (-) durch (+) ersetze steigt er auf meinem PC aus. ( Debug.Print Eval(("12,3" + ("4,7" + "8")) * "4") )