evagelos_21 Δημοσ. 7 Ιανουαρίου 2012 Δημοσ. 7 Ιανουαρίου 2012 Υπάρχουν 3 πίνακες με πεδία material [mtrl, code, company] Ειδος substitute [mtrl, code, company] barcodes ανα είδος. Σχέση 1 προς πολλά με το [material] remain [mtrl, qty, house] Υπόλοιπα ανα αποθήκη. Σχέση 1 προς 1 με το [material] 1ο βήμα: όταν ενημερώνω τον remain του βάζω τιμές [mtrl, το id του είδους, qty, το υπόλοιπο που θα έχει στην αποθήκη, το ID της αποθήκης που έχουμε] 2ο βήμα: όταν κάνω καταμέτρηση του είδους σε ένα αρχείο txt καταγράφω το barcode και την ποσότητα. Το barcode μπορεί να είναι είτε απο τον πίνακα [material] το πεδίο code, είτε απο τον πίνακα [substitute] το πεδίο code. 3ο βήμα: Πρέπει να βρω ποιο είδος είναι και να του αφαιρέσω απο την ποσότητα που βρήκα (αρχείο txt) την ποσότητα που του έστειλα. Οπότε θα ξέρω τι πούλησε. sql : > select m.mtrl, sum(p.remain) remain from material m left outer join substitute s on (s.mtrl=m.mtrl) and s.company=m.company left outer join remain p on m.mtrl=p.mtrl and p.mtrl=s.mtrl where m.company = 1 and ((m.code = '5031713351009') or (s.code = '5031713351009')) group by m.mtrl Στην συγκεκριμένη περίπτωση το barcode βρίσκεται στον s. το θέμα είναι ότι γυρνάει τόσες γραμμές, όσες εγγραφές έχει ο [substitute] γιατί τον linkάρω με το ID. τι μπορώ να κάνω για να το ξεπεράσω; Προσπάθησα με αυτό εδώ αλλά δεν ξέρω αν είναι σωστό: > select sum(p.remain) remain, p.whouse, p.mtrl from remain p left outer join mtrl m on m.mtrl =p.mtrl and m.code1 = '50317133510091111' and m.company=1 left outer join mtrsubstitute s on s.mtrl = p.mtrl and s.code = '503171335100911111' and s.company=1 where p.mtrl in (select mtrl from material) group by p.house, p.mtrl
defacer Δημοσ. 7 Ιανουαρίου 2012 Δημοσ. 7 Ιανουαρίου 2012 Καταρχήν θα ήταν ευκολότερο αν μας έδειχνες και κάποια result sets. Απο κει και πέρα μήπως να κάνεις απλά GROUP BY (m.mtrl, s.mtrl)? Αλλά κι αυτό το ptable1 που πετάς μέσα χωρίς πρόλογο τι είναι;
evagelos_21 Δημοσ. 7 Ιανουαρίου 2012 Μέλος Δημοσ. 7 Ιανουαρίου 2012 sorry, είναι ο πίνακας remain και διόρθωσα το αρχικό Οσον αφορά τα results, όπως είπα φέρνει τόσες γραμμές όσες το πίνακας substitute. πχ το αποτέλεσμα δείχνει κάπως έτσι: (m.mtrl, sum(p.remain) remain) 13501, 5 13501, 5 13501, 5 γιατί έχει 3 γραμμές ο substitute. αν προσθέσω στο select και το code του substitute για να δω τι φέρνει: 13501, 5, 5031713351009 13501, 5, 1243798687611 13501, 5, 9878767652940 εμένα με ενδιαφέρει μόνο η 1η γραμμή
{import*} Δημοσ. 7 Ιανουαρίου 2012 Δημοσ. 7 Ιανουαρίου 2012 Υπάρχουν 3 πίνακες με πεδία material [mtrl, code, company] Ειδος substitute [mtrl, code, company] barcodes ανα είδος. Σχέση 1 προς πολλά με το [material] remain [mtrl, qty, house] Υπόλοιπα ανα αποθήκη. Σχέση 1 προς 1 με το [material] 1ο βήμα: όταν ενημερώνω τον remain του βάζω τιμές [mtrl, το id του είδους, qty, το υπόλοιπο που θα έχει στην αποθήκη, το ID της αποθήκης που έχουμε] 2ο βήμα: όταν κάνω καταμέτρηση του είδους σε ένα αρχείο txt καταγράφω το barcode και την ποσότητα. Το barcode μπορεί να είναι είτε απο τον πίνακα [material] το πεδίο code, είτε απο τον πίνακα [substitute] το πεδίο code. 3ο βήμα: Πρέπει να βρω ποιο είδος είναι και να του αφαιρέσω απο την ποσότητα που βρήκα (αρχείο txt) την ποσότητα που του έστειλα. Οπότε θα ξέρω τι πούλησε. sql : > select m.mtrl, sum(p.remain) remain from material m left outer join substitute s on (s.mtrl=m.mtrl) and s.company=m.company left outer join remain p on m.mtrl=p.mtrl and p.mtrl=s.mtrl where m.company = 1 and ((m.code = '5031713351009') or (s.code = '5031713351009')) group by m.mtrl Στην συγκεκριμένη περίπτωση το barcode βρίσκεται στον s. το θέμα είναι ότι γυρνάει τόσες γραμμές, όσες εγγραφές έχει ο [substitute] γιατί τον linkάρω με το ID. τι μπορώ να κάνω για να το ξεπεράσω; Προσπάθησα με αυτό εδώ αλλά δεν ξέρω αν είναι σωστό: > select sum(p.remain) remain, p.whouse, p.mtrl from remain p left outer join mtrl m on m.mtrl =p.mtrl and m.code1 = '50317133510091111' and m.company=1 left outer join mtrsubstitute s on s.mtrl = p.mtrl and s.code = '503171335100911111' and s.company=1 where p.mtrl in (select mtrl from material) group by p.house, p.mtrl 1)Καλό είναι μας λές τα PK και FK 2)Καλό είναι να μην χρησιμοποίείς το ίδιο όνομα ακόμα και σε διαφορετικούς πίνακες μέσα στην ίδια βάση γιατί σε ένα μεγαλύτερο έργο θα τα κάνεις μπάχαλο 3)Σύμφωνα με τα λεγόμενα και σου και αν καταλάβα καλά τότε έχουμε ένα τέτοιο παράδειγμα Είδος -> πινακας material πχ ('RAM,'King-123','KingCOmpany') Barcode ->πίνακας substitute πχ ('RAM',????,'KingCOmpany') remain ->πίνακας remain πχ ('RAM','10','Παράρτημα Χαλανδρίου(?)') 4)Σύμφωνα με το 3 τότε μεταφέρεις το ΟΝΟΜΑ του προιόντος ΚΑΙ τον κωδικό του (?) (σε αυτο το σημείο μας εξηγείς εσύ) ανάμεσα σε δύο πίνακες που έχουν σχέση μεταξύ τους και δεν μεταφέρεις ενα κλειδί απο τον πίνακα material στον πίνακα substitute δημιουργώντας το barcode για το ΣΥΓΚΕΚΡΙΜΕΝΟ προιόν (το οποίο αν θέλεις μπορεί να έιναι το πρωτεύων κλειδί του πίνακα substritute) δλδ ο πίνακας substritute να είναι substitute [barcode (PK) ,mtrcode (FK)] όπου mtrcode = dbo.material.code 5)Αναφέρεις υπόλοιπο απο αποθήκη χώρις να έχεις βάλει τον συνολικό αριθμό του συγκεκριμένου Χ προιόντος που έχεις διαθέσιμο προς πώληση πρίν γίνει η πρώτη (και οι μετέπειτα) πωλήσεις. Και εν συνεχεία πρέπει μέσω T-SQL να δημιουργήσεις μια transaction και ένα trigger όταν μια συναλλαγή είναι επιτυχής για να μειώνει τον αριθμό του υπόλοιπου εμπορεύματος αυτόματα Πάντα φιλίκα προς τωρινή και μελλοντική διευκόλυνση δικής σου και των υπολοίπων με αποτελέσμα την καλύτερη ανάγνωση, την ευκολότερη κατανόηση του δικού σου προβλήματος πρός απάντηση ΥΓ:PK=primary key (πρωτεύων κλειδί) FK=Foreign key (δευτερέυων κλειδί) ΥΓ2:ΤΟ PK εμφανίζεται ώς μονή υπογράμμιση κάτω απο την λέξη και το FK ως διπλή υπογραμμίση κάτω απο την λέξη
evagelos_21 Δημοσ. 10 Ιανουαρίου 2012 Μέλος Δημοσ. 10 Ιανουαρίου 2012 1)Καλό είναι μας λές τα PK και FK PK στον material : mtrl PK στον substitute : mtrl, code PK στον remain : mtrl, house Τα FK τα καταλαβαίνουμε απο το ονομα του πεδίου. Θα μπορούσα να βάλω και στον [remain] ένα πεδίο αλλά εκεί είναι 2πλό το κλειδί απο ότι βλέπεις 2)Καλό είναι να μην χρησιμοποίείς το ίδιο όνομα ακόμα και σε διαφορετικούς πίνακες μέσα στην ίδια βάση γιατί σε ένα μεγαλύτερο έργο θα τα κάνεις μπάχαλο Αυτή την ταχτική την ακολουθώ (copy) απο ένα πρόγραμμα ERP που παίζει πολύ. Οπότε βρίσκω εύκολα ποιο πεδίο είναι σε ποιο FK. 3)Σύμφωνα με τα λεγόμενα και σου και αν καταλάβα καλά τότε έχουμε ένα τέτοιο παράδειγμα Είδος -> πινακας material πχ ('RAM,'King-123','KingCOmpany') Barcode ->πίνακας substitute πχ ('RAM',????,'KingCOmpany') remain ->πίνακας remain πχ ('RAM','10','Παράρτημα Χαλανδρίου(?)') Παράδειγμα: material [mtrl, code, company] => [1,'001-01',1] substitute [mtrl, code, company] => [1,'5201212354323',1] και 2ο barcode [1,'5206543234534',1] remain [mtrl, qty, house] => [1, 12, 1] 4)Σύμφωνα με το 3 τότε μεταφέρεις το ΟΝΟΜΑ του προιόντος ΚΑΙ τον κωδικό του (?) (σε αυτο το σημείο μας εξηγείς εσύ) ανάμεσα σε δύο πίνακες που έχουν σχέση μεταξύ τους και δεν μεταφέρεις ενα κλειδί απο τον πίνακα material στον πίνακα substitute δημιουργώντας το barcode για το ΣΥΓΚΕΚΡΙΜΕΝΟ προιόν (το οποίο αν θέλεις μπορεί να έιναι το πρωτεύων κλειδί του πίνακα substritute) δλδ ο πίνακας substritute να είναι substitute [barcode (PK) ,mtrcode (FK)] όπου mtrcode = dbo.material.code Εδώ δεν σε καταλαβαίνω. Sorry Ισως τα έχω γράψει μπάχαλο 5)Αναφέρεις υπόλοιπο απο αποθήκη χώρις να έχεις βάλει τον συνολικό αριθμό του συγκεκριμένου Χ προιόντος που έχεις διαθέσιμο προς πώληση πρίν γίνει η πρώτη (και οι μετέπειτα) πωλήσεις. Και εν συνεχεία πρέπει μέσω T-SQL να δημιουργήσεις μια transaction και ένα trigger όταν μια συναλλαγή είναι επιτυχής για να μειώνει τον αριθμό του υπόλοιπου εμπορεύματος αυτόματα Η ενημέρωση γίνετε απο άλλο section του προγράμματος και παίζει μια χαρά. Κάθε φορά που γίνετε μια κίνηση τότε ενημερώνω τον πίνακα με το υπόλοιπο του είδους για τον συγκεκριμένο Αποθηκευτικό χώρο (Αυτό μου το δείνει το πρόγραμμα σε μεταβλητή) Πάντα φιλίκα προς τωρινή και μελλοντική διευκόλυνση δικής σου και των υπολοίπων με αποτελέσμα την καλύτερη ανάγνωση, την ευκολότερη κατανόηση του δικού σου προβλήματος πρός απάντηση ΥΓ:PK=primary key (πρωτεύων κλειδί) FK=Foreign key (δευτερέυων κλειδί) ΥΓ2:ΤΟ PK εμφανίζεται ώς μονή υπογράμμιση κάτω απο την λέξη και το FK ως διπλή υπογραμμίση κάτω απο την λέξη Γενικότερα έχω την εντύπωση ότι σε κάθε κίνηση καλύτερα θα είναι να σβήνω πρώτα την εγγραφή στον remain για το είδος που γίνετε η κίνηση και μετά να την δημιουργώ με τις νέες τιμές. Οπότε το remain θα έχει 1 τιμή ανα είδος ανα Α.Χ και δεν θα χρειαστεί να κάνω sum στο select.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα