Jump to content
  • 0

Hoe een sum bij te werken bij wijzigen van een waarde


marspan

Question

Wij hebben o.a. één database met begrotingsregels. Het is mogelijk per begroting begrotingsregels, subtotaalregels en totaalregels te maken.

 

De regels weten wat ze zijn door een statusveld, dat de waarde 'b', 's' of 't' kan hebben. De 's'ubtotaalregels weten welke begrotingsregels ze onder zich hebben, via de interne relatie 'totalen'.

 

De berekening van het subtotaalbedrag is grofweg:

sum( totalen::bedrag ).

 

Wanneer je nu het bedrag op een begrotingsregel wijzigt, zou het mooi zijn als het subtotaal wordt bijgewerkt. In FMP 6 werkte dat, in 9 niet.

Een refresh screen is voldoende om de berekeningen te updaten, maar dat vereist een aparte handeling.

 

Het binnengaan van een bedragveld op een begrotingsregel loopt via een script. In dat script heb ik geprobeerd om op de subtotaalregel een trigger te zetten en de calc van het subtotaal aangepast in:

case( trigger ; 0 ) + sum( totalen::bedrag ). Dat helpt niet.

 

Wie heeft er een hint?

Link to comment

12 answers to this question

Recommended Posts

  • 0

Het script gaat alleen het veld in, niet er uit, dus op dat moment is er nog geen getal gewijzigd en helpt een flush of refresh niet.

 

Als het script een dialoog zou tonen om het getal te wijzigen is er natuurlijk geen probleem, dan handel je het hele proces af in dat script en kun je eindigen met een refresh screen of flush cache to disk.

 

Maar wij proberen dat zo lang mogelijk te vermijden.

Link to comment
  • 0

Als de Refresh Window met Flush cached join Results niet helpt is dat een teken dat er iets fout zit met de manier waarop de relatie gemaakt is of TO waar je berekeningsveld op steunt.

 

Ik denk niet dat het probleem dat er op dit gebied was in versie 7 nog aanwezig is in versie 9. De gebruikte workaround kunnen we dus vergeten hier.

Link to comment
  • 0

Als je aan het eind van het script het veld uit zou gaan, heeft de gebruiker nog niets kunnen invoeren, en daar was het nu juist om te doen. Bovendien zou het niet helpen.

En met de interne relatie is ook niets mis, die werkt, maar pas na een refresh screen o.i.d.

 

Om aan de onduidelijkheid van het probleem (hopelijk) een eind te maken, voeg ik een zo eenvoudig mogelijk voorbeeldbestand bij.

 

Uitleg

Het gaat om een begroting. Die bestaat uit een lijst met begrotingsregels en subtotaalregels. De subtotaalregels moeten de begrotingsregels die ze onder zich hebben optellen.

Elke regel heeft een 'item'-kenmerk dat de begroting ordent.

Een subtotaalregel heeft bijvoorbeeld item '1' en dan vallen automatisch de b-regels met item 1.1, 1.2, 1.3 etc. onder dat subtotaal. Het gaat om die punt in het item.

Het voorbeeldbestand heeft ingevulde regels, dat maakt het duidelijk.

 

- Elke regel moet een regeltype hebben, 's' of 'b'.

- Op elke regel moet 'item' zijn ingevuld. Bij de 's'-regels moet dat een los getal zijn (1, 2 etc.) , bij de 'b'-regels die onder een 's'-regel vallen moet er een punt in staan.

- De 's'-regels sommeren de 'b'-regels die er onder vallen.

- Je kunt alleen aantal en tarief invoeren; bedrag = aantal x tarief.

Sumtest.fp7.zip

Link to comment
  • 0

Kan het gebruik van Doscript ( http://myfmbutler.com/index.lasso?p=416 ) geen oplossing zijn?

 

Als je het veld bedrag_c voorziet van de volgende wijziging samen met de toevoeging van de doscript plugin dan ververst het totaal veld automatisch:

 

Let ( queueScript = mFMb_DoScript( "refresh" ) ;

 

aantal * tarief

 

)

 

Waarbij "refresh" een simpel script is met de refresh screen scriptstap. Welke nu onder de button staat.

Link to comment
  • 0

John Mark Osborne heeft wel eens wat geschreven over triggers in veldberekeningen, maar dat lijkt niet te werken.

 

Ik hoopte dat dat niet nodig zou zijn, een plug-in hiervoor, maar als het niet anders kan, dan in ieder geval bedankt voor het meedenken.

Link to comment
  • 0

Dat over Osborne gezegd hebbende, toch de oplossing gevonden.

 

Gemaakt: mutatieTijd, global, auto-entry wijzigingstijd.

 

Veranderd: aantal_T =

Case(

regelType = "b"

; aantal

;

Case(mutatieTijd ; Sum ( regels_SUM::aantal ) )

)

 

En dat werkt als een zonnetje!

Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...