Καλησπέρα σας,
Αυτό που γνωρίζω εγώ και εύχομαι να συμφωνήσουν και οι υπόλοιποι είναι ότι τα ευρετήρια της εφαρμογής, δεν μπορούν να υπολογίσουν κάτι - προοδευτικά ανά γραμμή.
Αυτό το κάνει ο sql χρησιμοποιώντας μια window function και αυτό σημαίνει ότι είτε θα χρησιμοποιήσετε ελεύθερη εκτύπωση, είτε θα φτιάξετε δικό σας Object (εσείς θα αποφασίσετε).
Για να γίνει κατανοητό, θα σας γράψω τις εντολές που έδωσα σε online εργαλείο SQL που χρησιμοποιώ για testing χωρίς να χρειαστεί να συνδεθώ σε softone, μπορείτε να το χρησιμοποιήσετε και σε δική σας Test βάση
Κατασκευάζω έναν πίνακα που να μοιάζει με το findoc της softone
CREATE TABLE sql_server_test_a
(
item int,
doc int,
qty float
);
item είναι το mtrl, doc το findoc και qty η ποσότητα π.χ. qty1
παρακάτω εισαγω στον πίνακσ μερικές εγγραφές
INSERT INTO sql_server_test_a (item, doc, qty) VALUES (155, 1154123, 1);
INSERT INTO sql_server_test_a (item, doc, qty) VALUES (155, 1154234, 2);
INSERT INTO sql_server_test_a (item, doc, qty) VALUES (155, 1154345, 3);
INSERT INTO sql_server_test_a (item, doc, qty) VALUES (155, 1154456, 4);
INSERT INTO sql_server_test_a (item, doc, qty) VALUES (155, 1154567, 5);
INSERT INTO sql_server_test_a (item, doc, qty) VALUES (155, 1154678, 6);
INSERT INTO sql_server_test_a (item, doc, qty) VALUES (208, 1154123, 4);
INSERT INTO sql_server_test_a (item, doc, qty) VALUES (208, 1154234, 5);
INSERT INTO sql_server_test_a (item, doc, qty) VALUES (208, 1154345, 6);
INSERT INTO sql_server_test_a (item, doc, qty) VALUES (208, 1154456, 7);
INSERT INTO sql_server_test_a (item, doc, qty) VALUES (208, 1154567, 8);
INSERT INTO sql_server_test_a (item, doc, qty) VALUES (208, 1154678, 9);
Στο τέλος, για να λάβω το αποτέλεσμα δίνω:
SELECT item, doc, 100 as Rem,
currRes = sum(qty) over (partition by item order by doc),
progRese = 100 - sum(qty) over (partition by item order by doc) /* το πιο σωστό επειδή θα το δουν και άλλοι συνάδελφοι είναι αυτό το σημείο να μην ξαναυπολογιστεί και να ληφθεί από εξωτερικό ερώτημα εφόσον έχει ήδη υπολογιστεί, το αφήνω μόνο και μόνο για να γίνει κατανοητό το παράδειγμα */
FROM sql_server_test_a;
όπου: item είναι το mtrl, doc το findoc (όπως ανέφερα παραπάνω), Rem = 100 του έδωσα εγώ ένα υπόλοιπο για να εκτελέσει την πράξη
ΚΑΙ
currRes = sum(qty) over (partition by item order by doc), αθροίζει την ποσότητα qty ανά item (= είδος) ταξινομημένο κατά doc αύξουσα αρίθμηση, από το μικρότερο (=παλαιότερο) προς το μεγαλύτερο (=νεότερο), διότι λογικά θα θέλετε έναν FIFO υπολογισμό
ΣΤΟ ΤΕΛΟΣ
progRese = 100 - sum(qty) over (partition by item order by doc), αφαιρεί το ήδη υπολογισμένο υπόλοιπο π.χ. 100 από την προοδευτικά αθροισμένη ποσότητα του προηγούμενου βήματος
Στο δικό σας task θα το εμπλουτίσετε με ό, τι σας ζητηθεί: ημερομηνίες, τύπους, σειρές, εκκρεμότητες κτλ όπως μπορείτε και έπειτα να έχετε ένα επιπλέον φίλτρο πχ
progRese >= 0 άρα παραγγελίες που μπορούν να εκτελεστούν
ή
progRese < 0 ποιές δεν μπορούν να εκτελεστούν