XLINE E.R.P. CUSTOMIZATION TOOLS Παράδειγµα Το παρακάτω κείµενο αποτελεί παράδειγµα παραµετροποίησης του xline E.R.P. Για την καλύτερη κατανόηση και υλοποίηση του παραδείγµατος θα πρέπει πρώτα να διαβάσετε προσεκτικά το αναλυτικό κείµενο που συνοδεύει το module. Το σενάριο που θα υλοποιηθεί είναι το ακόλουθο: Συγκεκριµένοι πελάτες θα χαρακτηρίζονται ως πελάτες µε δικαίωµα ειδικής έκπτωσης. Η έκπτωση αυτή θα ισχύει έως συγκεκριµένη ηµεροµηνία που θα καθορίζεται κατά πελάτη. Θα πρέπει επίσης να περιγράφεται και η αιτιολογία που δικαιολογεί το καθεστώς ειδικών εκπτώσεων κατά πελάτη. Οι εκπτώσεις που δίδονται θα είναι κατηγοριοποιηµένες σε ειδικό πίνακα εκπτώσεων. Κατά την διαδικασία πώλησης θα εµφανίζεται το ειδικό καθεστώς που διέπει τον κάθε πελάτη, και η δοθείσα επιπλέον έκπτωση θα ενηµερώνει ειδικό πίνακα (στατιστική ειδικών εκπτώσεων). Τέλος, θα πρέπει να δοθεί δυνατότητα αναζήτησης πελατών και µε ένα επί πλέον κριτήριο Σχετικός κωδικός αναζήτησης. Σηµείωση: Στην ονοµατολογία που έχει χρησιµοποιηθεί θα παρατηρήσετε ότι όλοι οι νέοι πίνακες/πεδία αρχίζουν από τα γράµµατα CS_ ώστε να ξεχωρίζουν εύκολα τα στοιχεία που αφορούν τη συγκεκριµένη παραµετροποίηση. Αυτό είναι προτεινόµενη τακτική και όχι υποχρεωτική. Ακολουθεί η πλήρης ανάλυση της παραµετροποίησης χωρισµένη στις αντίστοιχες ενότητες µε αυτές του module Customization Tools. : Πίνακες Στον πίνακα πελατών προσθέτονται τα απαραίτητα νέα πεδία. Πελάτες (Customer) CS_RelCode: Σχετικός κωδικός πελάτη, επιπλέον πεδίο αναζήτησης. CS_HasSpecDis: 0 = Απενεργοποίηση 1 = Ενεργοποίηση ειδικού καθεστώτος έκπτωσης. CS_SpecDisEnd: Ηµεροµηνία λήξης ειδικού καθεστώτος CS_DisJust - Αιτιολογία έκπτωσης CS_CSDID Κατηγορία ειδικής έκπτωσης, σύνδεση µε τον νέο πίνακα CS_CustSpecDisc που περιέχει τις κατηγορίες ειδικού καθεστώτος έκπτωσης. Νέοι Πίνακες ηµιουργείτε δύο νέους πίνακες. Ο πρώτος θα περιέχει τα % εκπτώσεων και ο δεύτερος θα ενηµερώνεται από τις πωλήσεις και θα κρατά την στατιστική των ειδικών εκπτώσεων. Ο πρώτος πίνακας θα έχει και ειδική φόρµα καταχώρησης / αλλαγής %, παρ όλο που όπως θα δείτε παρακάτω, οι αρχικές εγγραφές θα δηµιουργούνται κατά την πρώτη εκτέλεση του customization. CS_CustSpecDisc Ειδικές εκπτώσεις πελατών, πίνακας που περιέχει περιγραφές και ποσοστά ειδικών καθεστώτων έκπτωσης. DESCR: Περιγραφή έκπτωσης PERCENTAGE: Ποσοστό έκπτωσης CS_CustSpecDisLog Πίνακας στον οποίο καταγράφουµε στατιστικά πωλήσεων για τους πελάτες µε ειδικό καθεστώς εκπτώσεων DisDate: Ηµεροµηνία παραστατικού CusID: Κωδικός πελάτη TrdID: Κωδικός παραστατικού Justification: Αιτιολογία έκπτωσης (από τον πελάτη) DisPerc Float Ποσοστό έκπτωσης 1
Selectors Τροποποιείτε τον selector πελατών προσθέτοντάς του την δυνατότητα αναζήτησης πελατών και µε το νέο κριτήριο του Σχετικού Κωδικού Αναζήτησης. Customer Προσθήκη του σχετικού κωδικού (CS_RelCode) στα πεδία αναζήτησης. Stored Procedure ηµιουργείτε µία stored procedure στη βάση, η οποία όταν καλείται θα επιστρέφει τα στοιχεία µε τα οποία θα ενηµερώνεται ο ειδικός πίνακας στατιστικής εκπτώσεων. GetSTLDiscAVG Η Stored procedure GetSTLDiscAVG δέχεται σαν παράµετρο τον κωδικού παραστατικού και επιστρέφει τη συνολική αξία και έκπτωση για όλες τις γραµµές του παραστατικού. CREATE PROCEDURE CS_GetSTLDiscAVG @_FTRID INT, @DISCV FLOAT OUTPUT, @AMOUNT FLOAT OUTPUT AS SELECT @DISCV = SUM(ISNULL(VALDISC1,0)) FROM STORETRADELINES WHERE FTRID = @_FTRID HAVING COUNT(*)>0 SELECT @AMOUNT = SUM(ISNULL(LINEVALUE,0)) FROM STORETRADELINES WHERE FTRID = @_FTRID HAVING COUNT(*)>0 Σηµείωση: Η σύνταξη της συγκεκριµένης Stored Procedure είναι συµβατή µόνο µε SQL Server. Οι χρήστες άλλης βάσης (Oracle) θα πρέπει να κάνουν τις αντίστοιχες αλλαγές πριν τη χρησιµοποιήσουν. Παραµετροποίηση φορµών Στις φόρµες ιαχείριση σταθερών στοιχείων πελατών και Πωλήσεις, και ειδικότερα στο νέο Tab λοιπών πεδίων προσθέτουµε τα απαραίτητα παιδία για την υλοποίηση του σεναρίου. ιαχείριση πελατών - Προσθήκη control TRDBEdit, σύνδεση µε το πεδίο CS_RelCode (Σχετικός κωδικός πελάτη). - Προσθήκη control TRDBCheckBox, σύνδεση µε το πεδίο CS_HasSpecDis (Ενεργοποίηση / Απενεργοποίηση ειδικού καθεστώτος έκπτωσης), ορισµός ιδιοτήτων ValueChecked = 1, ValueUnchecked = 0 - Προσθήκη control TRDBEditLookUpComboBox, σύνδεση µε το πεδίο CS_CSDID (κατηγορία ειδικής έκπτωσης), ορισµός ιδιοτήτων ListTableName = CS_CUSTSPECDISC, ListField = DESCR, KeyField = ID. - Προσθήκη control TRDBEditCalendar, σύνδεση µε το πεδίο CS_SpecDisEnd (Ηµεροµηνία λήξης ειδικού καθεστώτος). - Προσθήκη control TRDBEdit, σύνδεση µε το πεδίο CS_DisJust (Αιτιολογία έκπτωσης). - Προσθήκη 5 TRLabel µε αντίστοιχες περιγραφές (caption) για κάθε control. Παραστατικά πωλήσεων - Προσθήκη TRLabel (XCLLabel1) ορισµός caption = Ειδικό καθεστώς έκπτωσης. - Προσθήκη TRLabel (XCLLabel2) δεξιά του XCLLabel1, ορισµός caption = []. - Προσθήκη TRLabel (XCLLabel3) ορισµός caption = Ποσοστό έκπτωσης - Προσθήκη TRLabel (XCLLabel4) δεξιά του XCLLabel3, ορισµός caption = []. - Προσθήκη TRLabel (XCLLabel5) ορισµός caption = Αιτιολογία έκπτωσης - Προσθήκη TRLabel (XCLLabel6) δεξιά του XCLLabel5, ορισµός caption = []. Σηµείωση: θα πρέπει να δοθεί ιδιαίτερη προσοχή στη δηµιουργία των TRLabel ώστε τα ονόµατα να συµπίπτουν µε αυτά που βλέπουµε παραπάνω. Ο λόγος είναι ότι σε αυτά γίνεται αναφορά από το Scripting και τυχόν λάθη θα δηµιουργούσαν λανθασµένα οπτικά αποτελέσµατα. 2
Scripting Ακολουθεί το αναλυτικό Scripting που θα πρέπει να προστεθεί στη φόρµα των πωλήσεων. Στην αρχή του κάθε τµήµατος του Script αναφέρεται η κατηγορία, το πεδίο και το γεγονός. Το παράδειγµα που ακολουθεί είναι εµπλουτισµένο µε σχόλια που περιγράφουν επιγραµµατικά το τµήµα του κώδικα που ακολουθεί. Fields Scriptings.FINTRADE.CUSID.ONCHANGE Data module Scripting AFTERLOCATE Ο παρακάτω κώδικας είναι κοινός και για τα δύο γεγονότα. Με την εκτέλεση του ανακτώνται οι πληροφορίες ειδικού καθεστώτος έκπτωσης του εκάστοτε πελάτη και ενηµερώνονται αντίστοιχα τα TRLabel που προστέθηκαν παραπάνω. Tmp, CusID, CusHasSpecDis, CusSpecDisEnd, CusDisJust, CusCSDID, HasSpecDis, SpecDisPercent; // Αρχικοποίηση τιµών HasSpecDis = 0; CusDisJust = '[]'; SpecDisPercent = 0; // Ανάκτηση τιµής του πεδίου FINTRADE.CUSID (κωδικός πελάτη) CusID = FldGetValue('FINTRADE.CUSID'); If not IsNull(CusID) then // Αν υπάρχει πελάτης ανακτούµε τα πεδία ειδικής έκπτωσης Tmp = SELECT CS_HasSpecDis, CS_SpecDisEnd, CS_DisJust, CS_CSDID FROM CUSTOMER WHERE ID=:CusID; // Η χρήση της µεταβλητής Tmp δεν είναι απαραίτητη, έγινε για λόγους παρουσίασης // και καλύτερης εµφάνισης κώδικα [CusHasSpecDis, CusSpecDisEnd, CusDisJust, CusCSDID] = Tmp; // Ελέγχουµε αν υπάρχει ειδικό καθεστώς έκπτωσης καθώς και την ηµεροµηνία λήξης αυτής if (CusHasSpecDis == 1) and (not IsNull(CusCSDID)) and (not IsNull(CusSpecDisEnd)) and (CusSpecDisEnd>=Today) then // Ενηµερώνουµε τη µεταβλητή HasSpecDis και ανακτούµε το ποσοστό έκπτωσης HasSpecDis = 1; SpecDisPercent = SELECT PERCENTAGE FROM CS_CUSTSPECDISC WHERE ID=:CusCSDID; // Ενηµέρωση των TRLabel µε τα στοιχεία έκπτωσης του συγκεκριµένου πελάτη. if IsNull(CusDisJust) then CusDisJust = ''; if HasSpecDis == 1 then XCLLabel2.caption = 'NAI'; 3
XCLLabel2.caption = 'OXI'; XCLLabel4.caption = SpecDisPercent; XCLLabel6.caption = CusDisJust; Field Scripting ITEID.ONCHANGE Ενεργοποίηση ειδικού καθεστώτος έκπτωσης στην επιλογή του είδους: SpecDisPerc; // Έλεγχος ύπαρξης ειδικού καθεστώτος έκπτωσης if XCLLabel2.caption =='NAI' then SpecDisPerc = XCLLabel4.caption; // Ενεργοποίηση έκπτωσης FldSetValue('STORETRADELINES.PRCDISC1',SpecDisPerc); DataModule Scripting AFTERPOST Σε αυτό το γεγονός χρησιµοποιείται η GetSTLDiscAVG που επιστρέφει τον µέσο όρο έκπτωσης των γραµµών του συγκεκριµένου παραστατικού. Αν ο πελάτης έχει ενεργοποιηµένο ειδικό καθεστώς εκπτώσεων ενηµερώνετε τον πίνακα CS_CustSpecDisLog µε τα αντίστοιχα δεδοµένα. LogRecID, MyFtrID, MyCusID, MyDate, MyDisPerc, MyTotDiscV, MyTotLAmount, MyJust; // Έλεγχος αν υπάρχει ειδικό καθεστώς εκπτώσεων if XCLLabel2.caption == 'NAI' then MyFtrID = FldGetValue('FINTRADE.ID'); MyCusID = FldGetValue('FINTRADE.CusID'); MyDate = FldGetValue('FINTRADE.FtrDate'); MyJust = XCLLabel6.caption; // Εκτέλεση Stored Procedure [MyTotDiscV, MyTotLAmount] = ExecuteDBProc('CS_GetSTLDiscAVG', '_FTRID', 'DISCV F;AMOUNT F', MyftrID); // Αν είναι µηδενικές οι αξίες τότε θέτουµε το ποσοστό έκπτωσης = 0 if (MyTotDiscV + MyTotLAmount) == 0 then MyDisPerc = 0; MyDisPerc = (MyTotDiscV/ (MyTotLAmount+MyTotDiscV) ) * 100; // Έλεγχος αν υπάρχει ήδη εγγραφή για το συγκεκριµένο παραστατικό LogRecID = SELECT ID FROM CS_CustSpecDisLog WHERE TrdID =:MyFtrID; // Αν δεν υπάρχει εγγραφή, προσθέτουµε νέα εγγραφή στον CS_CustSpecDisLog // σε αντίθετη περίπτωση ενηµερώνουµε τη παλιά if IsNull(LogRecID) then 4
INSERT INTO CS_CustSpecDisLog (DisDate, CusId, TrdId, DisPerc, Justification) VALUES (:MyDate, :MyCusId, :MyFtrID, :MyDisPerc, ':MyJust'); UPDATE CS_CustSpecDisLog SET DisDate=:MyDate, CusId=:MyCusId, TrdId=:MyFtrID, DisPerc=:MyDisPerc, Justification=':MyJust' WHERE ID=:LogRecID; DataModule Scripting BEFOREDELETE Αποθηκεύεται ο κωδικός του τρέχοντος παραστατικού ώστε να µπορείτε να το ανακτήσετε στο γεγονός AfterDelete TradeID; // Ανάκτηση κωδικού παραστατικού TradeID = FldGetValue('FINTRADE.ID'); // Αποθήκευση στο XCLLabel6.tag XCLLabel6.tag = TradeID; DataModule Scripting AFTERDELETE ουλεύει σε συνδυασµό µε το BeforeDelete. Ανακτάται ο κωδικός του - διαγραµµένου πια - παραστατικού και διαγράφετε την αντίστοιχη εγγραφή από τον πίνακα CS_CustSpecDisLog. TradeID, LogID; // Ανάκτηση διεγραµµένου κωδικού παραστατικού TradeID = XCLLabel6.tag; // Εύρεση αντίστοιχης εγγραφής από τον CS_CustSpecDisLog LogID = SELECT ID FROM CS_CustSpecDisLog WHERE TrdID=:TradeID; // Αν υπάρχει αντίστοιχη εγγραφή τη διαγράφουµε if not IsNull(LogID) then DELETE FROM CS_CustSpecDisLog WHERE ID=:LogID; Scripting Εγκατάστασης Σε αυτό το τµήµα που ενεργοποιείται όταν εγκατασταθεί η παραµετροποίηση, ενηµερώνετε τον πίνακα ειδικών εκπτώσεων (CS_CustSpecDisc) µε 4 προεπιλεγµένες εγγραφές (καθεστώτα εκπτώσεων). RecCount; // Έλεγχος εγγραφών στον πίνακα CS_CustSpecDisc RecCount = SELECT count(*) FROM CS_CustSpecDisc; // Αν δεν υπάρχουν εγγραφές, ενηµέρωση µε τα προεπιλεγµένα καθεστώτα εκπτώσεων. IF RecCount == 0 then $INSERT INTO CS_CustSpecDisc (PERCENTAGE, DESCR) VALUES (0, 'Χωρίς έκπτωση'); $INSERT INTO CS_CustSpecDisc (PERCENTAGE, DESCR) VALUES (5, 'Χαµηλή έκπτωση'); $INSERT INTO CS_CustSpecDisc (PERCENTAGE, DESCR) VALUES (10, 'Μεσαία έκπτωση'); $INSERT INTO CS_CustSpecDisc (PERCENTAGE, DESCR) VALUES (20, 'Υψηλή έκπτωση'); 5