[.NET] Opslaan en parsen van een formule

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 13-09 21:30
Ik ben bezig met een tool om opgietbereiding-specificaties in te kunnen voeren, maar dan loop ik tegen een probleempje aan.
Ik wil een databasetabel met een aantal opgietproducten, waar bij elk soort opgietproduct een bepaalde formule staat.
Nu wil ik een editor maken waarin per opgietproduct de formule ingegeven die berekent hoeveel water er aangelengd moet worden in een pot, dus puur de formule met variabelen, en een andere applicatie dan op basis van deze formule de X kan berekenen.

A = InweeghoeveelheidGarnalen
Z = Inhoudsmaatpot
X = Water (l)


Zo geldt bij bijvoorbeeld een CV opgietproduct:
G = GewichtOpgietPoederZak = 15000g
Perc = 2.0
X = G * (Perc * 0.01 * Z) * Z-A

Maar er geldt bij een standaard opgiet:
Perc = 0.18
(423,9/((Perc*0.01*Z)/(Z-A))/1000

Maar voor Inktvis is dit weer:
Perc = 0.18
(1469,3/((Perc*0.01*Z)/(Z-A))/1000

Dan zou ik een databasetabel moeten krijgen als:

IDOmschrijving Formule
1CVG*(Perc*0.01*Z)*Z-A
2Standaard (423,9/((Perc*0.01*Z)/(Z-A))/1000
3Standaard Inktvis(1469,3/((Perc*0.01*Z)/(Z-A))/1000


Nu zie je dat de variabelen niet altijd hetzelfde zijn en de formule niet altijd hetzelfde soort "format" heeft.
De vraag is dus hoe ik het beste een formule in een kolom kan krijgen. Als een varchar, en om de formule uit te rekenen de formule parsen?

Of zijn er makkelijker manieren.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je moet idd gewoon de formule parsen en een expressie boom opzetten. Die expressie kun je dan gewoon uitvoeren ( Waar je de variabelen vervangt door de juiste waardes ).

Maar wat ik zo in je voorbeeldje zie, is je formule telkens hetzelfde, alleen heb je een aantal verschillende variabelen? Is het dan niet makkelijker om je formule gewoon in je programma op te nemen en de waardes van die variabelen in je DB op te slaan?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • tonyisgaaf
  • Registratie: November 2000
  • Niet online
rwb schreef op dinsdag 02 december 2008 @ 09:12:
Maar wat ik zo in je voorbeeldje zie, is je formule telkens hetzelfde, alleen heb je een aantal verschillende variabelen? Is het dan niet makkelijker om je formule gewoon in je programma op te nemen en de waardes van die variabelen in je DB op te slaan?
Precies, de formule blijft hetzelfde, de variabelen, euh, niet. :)
Desnoods zet je de formule in een onderhoudbaar formaat ook in je DB.

NL Weerradar widget Euro Stocks widget Brandstofprijzen widget voor 's Dashboard


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
tonyisgaaf schreef op dinsdag 02 december 2008 @ 09:25:
[...]
Desnoods zet je de formule in een onderhoudbaar formaat ook in je DB.
Als je de formule in je DB zet dan zit je al snel weer aan het parsen van de formule. Als je formule vaak veranderd is dat niet zo'n probleem, maar als je nu al met 99% zekerheid kunt zeggen dat de formule niet zal wijzigen is dat natuurlijk een beetje overkill.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 13-09 21:30
De formules die ik van het laboratorium aangeleverd heb gekregen vind ik niet echt op elkaar lijken (bij de een is het vermenigvuldigen en de ander delen bijv.). Het lab heeft inderdaad aangegeven dat de formules kunnen wijzigen.

Het werkt nu allemaal met Excel, maar men wil dit geautomatiseerd hebben. Ik heb een formule-parser class op internet gevonden, alleen de vraag is of dit de verstandigste manier is...

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Mastermind schreef op dinsdag 02 december 2008 @ 10:09:
De formules die ik van het laboratorium aangeleverd heb gekregen vind ik niet echt op elkaar lijken (bij de een is het vermenigvuldigen en de ander delen bijv.). Het lab heeft inderdaad aangegeven dat de formules kunnen wijzigen.
Delen of vermenigvuldigen scheelt natuurlijk niet zoveel

delen door X is gelijk aan vermenigvuldigen met 1 / X
Het werkt nu allemaal met Excel, maar men wil dit geautomatiseerd hebben. Ik heb een formule-parser class op internet gevonden, alleen de vraag is of dit de verstandigste manier is...
Ik ken die class natuurlijk niet, maar waarom heb je er je bedenkingen bij? Gewoon de formule parsen en in een expression tree zetten, en daarna uitrekenen lijkt me gewoon de juiste manier.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 26-09 15:55

gorgi_19

Kruimeltjes zijn weer op :9

Je zou ook kunnen kijken naar CodeDom.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 13-09 21:30
Ok, bedankt voor de adviezen. Het blijkt dat de formules in feite toch niet zoveel verschillen, er moeten alleen nog enkele stamtabellen bij. Dus ik sla de variabelen gewoon op, en de formule doe ik in de code.

Acties:
  • 0 Henk 'm!

  • Lethalis
  • Registratie: April 2002
  • Niet online
Mastermind schreef op dinsdag 02 december 2008 @ 10:48:
Ok, bedankt voor de adviezen. Het blijkt dat de formules in feite toch niet zoveel verschillen, er moeten alleen nog enkele stamtabellen bij. Dus ik sla de variabelen gewoon op, en de formule doe ik in de code.
Je moet je met dit soort dingen ook altijd afvragen "hoe vaak" de formules zouden kunnen wijzigen.

Als dat namelijk niet zo vaak is, kun je ook gewoon het programma updaten wanneer dat nodig is, in plaats van hele algoritmes schrijven die formules parsen :)

Het is misschien leuk, maar de vraag is of het ook effectief is.

Ask yourself if you are happy and then you cease to be.

Pagina: 1