Hi,
Use a local Boolean flag variable, that it will be initialized as true, before you start changing the fields you want, in a Try/Finally block, and set it ALWAYS back to false, on the finally part.
Before that you check if the flag variable and if it is true, you skip recalculations….
Something like that :
var calculating = false;
function ON_ITEM_PRICEW () {
if (calculating)
return;
calculating = true;
try {
// DO SOME CALCULATIONS
} finally {
calculating = false;
}
}
function ON_ITEM_PRICEW_VALIDATE () {
if (calculating)
return;
calculating = true;
try {
// DO SOME CALCULATIONS
} finally {
calculating = false;
}
}
Best Regards,

Nikos Trampoulis
Information Technology Services
Software Development
Doiranis 130-132, Kallithea – Athens Greece
Tel.. +302110122439
mob.. +306948263480
--
Softone Developers Network group.
To post to this group, send email to so...@googlegroups.com
---
Λάβατε αυτό το μήνυμα επειδή έχετε εγγραφεί στην ομάδα "Softone Developers Network" των Ομάδων Google.
Για να απεγγραφείτε απ' αυτή την ομάδα και να σταματήσετε να λαμβάνετε μηνύματα ηλεκτρονικού ταχυδρομείου απ' αυτή, στείλτε ένα μήνυμα ηλεκτρονικού ταχυδρομείου στη διεύθυνση soft1+un...@googlegroups.com.
Για να κάνετε προβολή αυτής της συζήτησης στον ιστό, επισκεφτείτε τη διεύθυνση https://groups.google.com/d/msgid/soft1/003f48fd-fe52-466e-9ead-24d19a509aa5n%40googlegroups.com.
Pe 30 oct. 2021, la 17:41, Pericles Argyriades <peri...@gmail.com> a scris:
Hi,
--
Καλημέρα,
Προφανώς και μιλάμε για events που το ένα θα προκαλέσει το άλλο και ΑΥΤΟ ΑΚΡΙΒΩΣ θέλουμε να αποφύγουμε, με τον κώδικα που πρότεινα. Αν παρατηρήσεις τον κώδικα που παραθέτεις, θα καταλάβεις βέβαια ότι εκτός από το ότι, άπαξ και η μεταβλητή έχει τιμή 1, δεν θα γίνει ΠΟΤΕ 2,3,4 κλπ κλπ, δεν το θέλεις κιόλας γιατί απλά θα προκαλέσεις ατέρμονο loop, άρα το true/false είναι όχι μόνο αρκετό, αλλά και επιβεβλημένο (κατά την άποψή μου), γιατί διαφορετικά προσθέτεις μία πολυπλοκότητα στον κώδικά σου και κάποιος τρίτος που θα το δει (ή και εσύ ο ίδιος μετά από καιρό), θα αναρωτιέται τι θέλει να κάνει τελικά…
Εννοείται ότι το block try/finally είναι υποχρεωτικό, στον τρόπο προσέγγισης και γι’ αυτό περιλαμβάνεται στο κώδικα που παρέθεσα…
Αν θέλει τώρα στο ίδιο event να προκαλέσεις εσκεμμένα κάποιο άλλο, τότε απλά το καλείς μετά το try/finally. Δηλαδή θα ήταν κάπως έτσι :
Var events_disabled = false;
function ON_ITELINES_CCCQTY()
{
//if (events_disabled > 0) return;
if (events_disabled) return;
//events_disabled++;
events_disabled =true;
try {
ITELINES.QTY1 = someCustomCalc()
//events_disabled--;
} finally {
events_disabled =false;
}
// ... other processing..
ON_ITELINES_QTY1(); // call it on demand
}
function ON_ITELINES_QTY1()
{
//if (events_disabled > 0) return;
if (events_disabled) return;
//events_disabled++;
events_disabled =true;
try {
ITELINES. CCCQTY = someCustomCalc2()
//events_disabled--;
} finally {
events_disabled =false;
}
}
Με εκτίμηση,

Τραμπούλης Θ. Νικόλαος
Υπηρεσίες Πληροφορικής
Σχεδίαση & Ανάπτυξη Λογισμικού
Δοϊράνης 130-132, Καλλιθέα - Αθήνα, Τ.Κ. 17673
Τηλ. +302112165936
Κιν. +306948263480
From: so...@googlegroups.com <so...@googlegroups.com> On Behalf Of MakisCE
Sent: Wednesday, November 3, 2021 10:25 AM
To: Softone Developers Network <so...@googlegroups.com>
Για να κάνετε προβολή αυτής της συζήτησης στον ιστό, επισκεφτείτε τη διεύθυνση https://groups.google.com/d/msgid/soft1/a3decbc4-9176-4356-8bcb-304783ba0631n%40googlegroups.com.
Φίλε Μάκη,
ο βασικός και υποχρεωτικός κανόνας, στην προσέγγιση που προτείνω, είναι ο εξής :
Είτε λοιπόν ΔΙΑΣΦΑΛΙΖΕΙΣ, ότι ΜΟΝΟ το method που κάνει true το flag το κάνει ΚΑΙ false, είτε θα πέσεις σε ατέρμονο loop… δεν υπάρχει άλλη περίπτωση!
Άρα στο παράδειγμα σου εδώ είναι το λάθος σου. Είτε θα θέτεις τιμές στο flag μέσα στο «someCoolProcedure», είτε σε κάθε event ξεχωριστά. Σε καμία περίπτωση και στα δύο…
Να επισημάνω βέβαια εδώ, ότι σε κάποιες περιπτώσεις υπάρχει περίπτωση να απαιτούνται περισσότερα από ένα flag (αν υπάρχουν διαφορετικές «γραμμές» υπολογισμών) και ο έλεγχος για εκτέλεση σε κάποια events που επηρεάζονται από διαφορετικούς υπολογισμούς, να είναι της μορφής :
If (calculating1 || calculating2 || …..)
return;
Επίσης προφανώς και θα επιμείνω στην λογική ότι η χρήση μετρητή είναι λάθος, για το πρόβλημα που ανέφερε ο συνάδελφος, καθώς σε ΚΑΜΙΑ περίπτωση δεν θα πρέπει να επιτραπεί block εκτέλεση κώδικα, πάνω από μία φορά…
Πιθανότατα να σε μπερδεύει η περίπτωση εκτέλεσης recursive loop (ελεγχόμενου αναδρομικού και όχι εσφαλμένα ατέρμονου), όπου με χρήση του μετρητή μπορούμε να εκτελέσουμε κάποιες ενέργειες μόνο σε συγκεκριμένο επίπεδο επανάληψης (συνήθως το πρώτο).
π.χ. :
var counter = 0;
function doSomeJob() {
counter++; // Αύξηση του counter
try {
… ΚΩΔΙΚΑΣ …
If (ΚΑΠΟΙΟΣ_ΕΛΕΓΧΟΣ) {
doSomeJob(); // Κλήση του εαυτού του (ελεγχόμενο recursive)…
}
… ΚΩΔΙΚΑΣ …
} finally {
counter--; // Επαναφορά του counter
}
If (counter == 0) {
… ΤΕΛΙΚΟΣ ΚΩΔΙΚΑΣ που θα εκτελεστεί ΜΟΝΟ στο πρώτο επίπεδο, και εφόσον έχουν εκτελεστεί ΟΛΑ τα άλλα…
}
}
Επειδή όμως δεν έχει νόημα να κάνω διορθώσεις στο παράδειγμά σου, καθώς είναι «θεωρητικό», χάριν παραδείγματος και δεν έχει κάποιο συγκεκριμένο logic, θα το θέσω σε πολύ συγκεκριμένο case που σίγουρα κάποιος συνάδελφος (μάλλον junior) μπορεί να αντιμετωπίσει στο Softone :
Έστω λοιπόν, ότι θέλω να υλοποιήσω με custom τρόπο, την συμπεριφορά που έχει το softone, στο πως ορίζεται η τελική αξία της γραμμής του παραστατικού, με βάση τα εξής πεδία ΠΟΣΟΤΗΤΑ, ΤΙΜΗ, ΕΚΠΤΩΣΗ, ΤΕΛΙΚΗ ΑΞΙΑ και ανάλογα με το πως τα ορίζει ο χρήστης (δηλ. αν θα βάλει έκπτωση με το χέρι ή την τελική αξία, ώστε να διαμορφωθεί η έκπτωση αυτόματα). Οι αλλαγές στα πεδία ΠΟΣΟΤΗΤΑ και ΤΙΜΗ, θα ενεργοποιούν τον υπολογισμό της ΤΕΛΙΚΗΣ ΑΞΙΑΣ, με όποια έκπτωση υπάρχει, ενώ όταν αλλάζει ο χρήστης την ΈΚΠΤΩΣΗ, θα πρέπει να υπολογίζεται, εκ νέου η ΤΕΛΙΚΗ ΑΞΙΑ, ενώ όταν ο χρήστης αλλάζει κατευθείαν την ΤΕΛΙΚΗ ΑΞΙΑ, θα διαμορφώνεται ανάλογα το πεδίο της ΕΚΠΤΩΣΗΣ. Επίσης θέλουμε στην αλλαγή του είδους να μηδενίζει όλα τα παραπάνω πεδία…
Ο αλγόριθμος θα είναι κάπως έτσι (οι υπολογισμοί βέβαια είναι «μπακάλικοι») :
// ------------------------------------------------------------------------------------------------------------------------------------------
Var calculating = false;
function recalcFINAL_VALUE() { // εδώ θα γίνεται ο υπολογισμό, μετά από αλλαγή ΕΝΟΣ από τα πεδία ΠΟΣΟΤΗΤΑ, ΤΙΜΗ, ΕΚΠΤΩΣΗ
// Εδώ, εφόσον γίνεται διαχείριση του flag κάνω ελέγχους και ανάθεση για να επιβάλω μοναδικότητα εκτέλεσης του κώδικα
if (calculating)
return;
calculating = true; // το flag γίνεται true και ΔΕΝ ΠΡΟΚΕΙΤΑΙ να γίνει false πουθενά αλλού, παρά μόνο στο finally του συγκεκριμένου method
try {
ΤΕΛΙΚΗ_ΑΞΙΑ = (ΠΟΣΟΤΗΤΑ * ΤΙΜΗ) – ΕΚΠΤΩΣΗ
} finally {
calculating = false; // το flag γίνεται τελικά false, οπότε «απελευθερώνει» τα υπόλοιπα πεδία να καλέσουν το ίδιο method
}
}
function ON_ΕΙΔΟΣ() {
// Εδώ, εφόσον γίνεται διαχείριση του flag κάνω ελέγχους και ανάθεση για να επιβάλω μοναδικότητα εκτέλεσης του κώδικα
if (calculating)
return;
calculating = true; // το flag γίνεται true και ΔΕΝ ΠΡΟΚΕΙΤΑΙ να γίνει false πουθενά αλλού, παρά μόνο στο finally του συγκεκριμένου method
try {
ΠΟΣΟΤΗΑ = 0;
ΤΙΜΗ = 0;
ΕΚΠΤΩΣΗ = 0;
ΤΕΛΙΚΗ_ΑΞΙΑ = 0;
} finally {
calculating = false; // το flag γίνεται τελικά false, οπότε «απελευθερώνει» τα υπόλοιπα πεδία να καλέσουν το ίδιο method
}
}
function ON_ΠΟΣΟΤΗΤΑ() {
…. ΛΟΙΠΟΙ ΥΠΟΛΟΓΙΣΜΟΙ ΠΟΥ ΔΕΝ ΕΠΕΙΡΕΑΖΟΥΝ ΟΜΩΣ ΤΑ ΠΑΡΑΠΑΝΩ ΠΕΔΙΑ …
recalcFINAL_VALUE(); // Εφόσον η ανάθεση και ο έλεγχος του flag θα γίνει ΜΕΣΑ στο method υπολογισμού, ΔΕΝ ασχολούμαι με το flag εδώ…
…. ΛΟΙΠΟΙ ΥΠΟΛΟΓΙΣΜΟΙ ΠΟΥ ΔΕΝ ΕΠΕΙΡΕΑΖΟΥΝ ΟΜΩΣ ΤΑ ΠΑΡΑΠΑΝΩ ΠΕΔΙΑ …
}
function ON_ΤΙΜΗ() {
…. ΛΟΙΠΟΙ ΥΠΟΛΟΓΙΣΜΟΙ ΠΟΥ ΔΕΝ ΕΠΕΙΡΕΑΖΟΥΝ ΟΜΩΣ ΤΑ ΠΑΡΑΠΑΝΩ ΠΕΔΙΑ …
recalcFINAL_VALUE(); // Εφόσον η ανάθεση και ο έλεγχος του flag θα γίνει ΜΕΣΑ στο method υπολογισμού, ΔΕΝ ασχολούμαι με το flag εδώ…
…. ΛΟΙΠΟΙ ΥΠΟΛΟΓΙΣΜΟΙ ΠΟΥ ΔΕΝ ΕΠΕΙΡΕΑΖΟΥΝ ΟΜΩΣ ΤΑ ΠΑΡΑΠΑΝΩ ΠΕΔΙΑ …
}
function ON_ΕΚΠΤΩΣΗ() {
…. ΛΟΙΠΟΙ ΥΠΟΛΟΓΙΣΜΟΙ ΠΟΥ ΔΕΝ ΕΠΕΙΡΕΑΖΟΥΝ ΟΜΩΣ ΤΑ ΠΑΡΑΠΑΝΩ ΠΕΔΙΑ …
recalcFINAL_VALUE(); // Εφόσον η ανάθεση και ο έλεγχος του flag θα γίνει ΜΕΣΑ στο method υπολογισμού, ΔΕΝ ασχολούμαι με το flag εδώ…
…. ΛΟΙΠΟΙ ΥΠΟΛΟΓΙΣΜΟΙ ΠΟΥ ΔΕΝ ΕΠΕΙΡΕΑΖΟΥΝ ΟΜΩΣ ΤΑ ΠΑΡΑΠΑΝΩ ΠΕΔΙΑ …
}
function ON_ΤΕΛΙΚΗ_ΑΞΙΑ() { // Εδώ υπολογίζεται ΜΟΝΟ η περίπτωση που ο χρήστης επιβάλει με το χέρι την ΤΕΛΙΚΗ ΑΞΙΑ και δεν έχουμε έρθει εδώ από κάποιο άλλο event
…. ΛΟΙΠΟΙ ΥΠΟΛΟΓΙΣΜΟΙ ΠΟΥ ΔΕΝ ΕΠΕΙΡΕΑΖΟΥΝ ΟΜΩΣ ΤΑ ΠΑΡΑΠΑΝΩ ΠΕΔΙΑ …
// Εδώ, εφόσον γίνεται διαχείριση του flag κάνω ελέγχους και ανάθεση για να επιβάλω μοναδικότητα εκτέλεσης του κώδικα
if (calculating)
return;
calculating = true; // το flag γίνεται true και ΔΕΝ ΠΡΟΚΕΙΤΑΙ να γίνει false πουθενά αλλού, παρά μόνο στο finally του συγκεκριμένου method
try {
ΕΚΠΤΩΣΗ = ΤΕΛΙΚΗ_ΑΞΙΑ - (ΠΟΣΟΤΗΤΑ * ΤΙΜΗ)
} finally {
calculating = false; // το flag γίνεται τελικά false, οπότε «απελευθερώνει» τα υπόλοιπα πεδία να καλέσουν το ίδιο method
}
…. ΛΟΙΠΟΙ ΥΠΟΛΟΓΙΣΜΟΙ ΠΟΥ ΔΕΝ ΕΠΕΙΡΕΑΖΟΥΝ ΟΜΩΣ ΤΑ ΠΑΡΑΠΑΝΩ ΠΕΔΙΑ …
}
// ------------------------------------------------------------------------------------------------------------------------------------------
Θα παρατηρήσεις λοιπόν, ότι το block που διασφαλίζει την αποφυγή ατέρμονου loop, θα πρέπει να έχει ΑΥΣΤΗΡΑ την παρακάτω δομή :
{
if (calculating)
return;
calculating = true; // το flag γίνεται true και ΔΕΝ ΠΡΟΚΕΙΤΑΙ να γίνει false πουθενά αλλού, παρά μόνο στο finally του συγκεκριμένου method
try {
….ΚΩΔΙΚΑΣ ΠΟΥ ΔΕΝ ΜΕΤΑΒΑΛΕΙ ΠΟΥΘΕΝΑ ΤΗΝ ΤΙΜΗ ΤΟΥ FLAG….
} finally {
calculating = false; // το flag γίνεται τελικά false, οπότε «απελευθερώνει» τα υπόλοιπα πεδία να καλέσουν το ίδιο method
}
}
Ελπίζω να μην σας κούρασα (πολύ 😊)….
Για να κάνετε προβολή αυτής της συζήτησης στον ιστό, επισκεφτείτε τη διεύθυνση https://groups.google.com/d/msgid/soft1/5d5182b9-00e2-4eed-a7cb-09f792912164n%40googlegroups.com.