Παρασκευή 5 Φεβρουαρίου 2016

Βάση Εργαζομένων Μέρος Β

Δείτε το πιο προχωρημένο εδώ

Σε αυτήν την ανάρτηση, θα οργανωθούμε λίγο! Δηλαδή θα δούμε πως ή με αρχείο χωριστό ή σε τμήμα χωριστό μπορούμε να βάλουμε τις κοινές ρουτίνες για δυο ή περισσότερα τμήματα.

Αντί να έχουμε γενικές όλες τις ρουτίνες που θέλουμε, μπορούμε να τις φορτώνουμε σαν να ήταν γραμμένες στο κώδικα του τμήματος. Με Σ Α ξέρουμε ότι διορθώνουμε το τμήμα Α αλλά τώρα μαθαίνουμε ότι με Σ "αλφα.gsb" διορθώνουμε άμεσα ένα πρόγραμμα χωρίς να το φορτώσουμε στα τμήματα.
Δείτε λοιπόν τι θα κάνουμε το παρακάτω θα το γράψουμε σε ένα τμήμα μισθωτοι.gsb
Μην βάλετε τόνο, ή αν βάλετε να τον βάλετε και στη Φόρτωσε γιατί στα ονόματα αρχείων η Μ2000 δεν αφαιρεί τους τόνους!
Σ "μισθωτοι.gsb"
Αντιγράφουμε το παρακάτω πατάμε Esc. Με την εντολή Τμήματα βλέπουμε στο τέλος το πιο πρόσφατο, και πρέπει να είναι το μισθωτοι  (το .gsb δεν το δείχνει)

Τι το καινούργιο έχουμε;
Έχουμε φτιάξει για τις δυο κλάσεις, Μισθωτός και Εργασία ένα τμήμα Στοιχεία και μια συναρτηση Στοιχεία$. Κανονικά για να περάσουμε τα στοιχεία ενός αντικειμένου (ομάδα λέγεται στην Μ2000) σε ένα άλλο το κάνουμε με απλά αντιγραφή Α=Β, όταν τα αντικείμενα τα δίνουμε σε πίνακα π.χ. Α(0)=Β τότε σβήνουμε το Α(0) και στη θέση του μπαίνει ο Β, ενώ στο Α=Β έχουμε ένωση ομάδων,
Όμως αυτή η αντιγραφή, ή ένωση ανάλογα, δεν κάνει για να σώσουμε την ομάδα σε αρχείο. Πρέπει να κάνουμε όλα τα δεδομένα σε ένα αλφαριθμητικό, να κάνουμε serialize θα λέγαμε σε άλλες γλώσσες. Και όχι μόνο αριθμούς ή αλφαριθμητικά αλλά και στοιχεία πίνακα. Χρησιμοποιούμε την Σωρός$() που τα αλφαριθμητικά τα πακετάρει με μήκος, άρα μπαίνουν μέσα και οι αλλαγές γραμμών.

Σκοπός μας στο Μέρος Β είναι να σώσουμε σε αρχείο τα στοιχεία του πίνακα Μισθωτοί() που περιέχει ομάδες κλάσης Μισθωτός. Κάθε τέτοια ομάδα μπορεί να έχει τρεις πίνακες, ένας η φορολογική κλίμακα, ένας που κρατάει την τρέχουσα εργασία και ένας που κρατάει τις παλιές εργασίες, την προϋπηρεσία. Παράλληλα ο μισθός (που έχει μέχρι τώρα δοθεί) και οι κρατήσεις (που έχουν μέχρι τώρα γίνει) φαίνονται άμεσα, και μπορούμε όποτε γίνει πληρωμή να αυξήσουμε και τα δύο. Λογικά κάθε πέρα σεζόν, υπολογίζουμε το φόρο και τον γράφουμε αλλού, και μηδενίζουμε τα "κοντέρ"...(counter, μετρητές).
Μπορούμε σε ορισμένα τμήματα να περιμένουμε αντίγραφο ομάδας ή αναφορά ομάδας, δουλεύουν δηλαδή και με τα δυο περάσματα (η Μ2000 δεν προκαθορίζει το τι θα περάσουμε σε ένα τμήμα, μπορούμε να το διαχειριστούμε εντός)!

Τμημα Κατάσταση {
     Αν Ταύτιση("Ο") τότε {
            Διαβασε Α
      } Αλλιώς  Διάβασε
      Για Α {
            Τύπωσε .όνομ_επών$+γραφη$(.Είναι_Άνεργος(),ειναιδενειναι$)+.Λεκτικό_Άνεργος$()
            Τύπωσε .όνομ_επών$+γραφη$(.Έχει_Προϋπηρεσία(),εχειδενεχει$)+"προϋπηρεσία"
      }
}
Τμήμα Φορολογική_Κλίμακα {
     Αν Ταύτιση("Ο") τότε {
            Διαβασε ΑΑ
      } Αλλιώς  Διάβασε &ΑΑ
      Σούμα=0
      Για ΑΑ {
            κ= διάσταση(.κλιμακα())
            Αν κ=0 τότε Λάθος "Δεν έχω φορολογική κλίμακα"
            κ= διάσταση(.κλιμακα(),1)
            ι=0
            Αν κ>0  Τότε {
                  Για ι=0 έως κ-1 {
                        Αν  ι<κ-1 τότε {
                              Τύπωσε "Από ";Σούμα;
                              Σούμα+=.κλιμακα(ι,0)                        
                              Τύπωσε " Έως ";
                        } Αλλιώς {
                              Τύπωσε "Από "; 
                        }
                        Τύπωσε Σούμα;" Φόρος ";Γραφη$(.κλιμακα(ι,1)," #0");"%"
                  }
            }
      }    
}
Τμήμα Βιογραφικό {
      \\ τροποποίηση για να διαβάζει και με αναφορά και με τιμή
      Αν Ταύτιση("Ο") τότε {
            Διαβασε Α
      } Αλλιώς  Διάβασε
      Τμήμα Εμφάνιση {
            Διάβασε Α      
            Για Α {
                  Τύπωσε "","Επιχείρηση με ΑΦΜ:"; .ΑφμΕργοδ$
                  Τύπωσε "","Ιδιότητα:";.ΙδιότηταΕργαζομένου$
                  Τύπωσε "","Απο ";Ημέρα$(.ΗμΠρόσλ);
                  Αν .Τελική=0 Τότε { Τύπωσε } Αλλιώς Τύπωσε " Έως ";Ημέρα$(.Τελική)
            }
      }
      Για Α {
            Πένα 15 {
                  Τύπωσε "Βιογραφικό",@(20),.όνομ_επών$
                  Τύπωσε "Φύλο",@(20),γραφη$(.Φύλο,"ΆΝΔΡΑΣ;;ΓΥΝΑΙΚΑ")
                  Τύπωσε "ΑΜΚΑ",@(20),.αμκα$
                  Τύπωσε "ΑΦΜ",@(20),.αφμ$
                  Τύπωσε "Έτη ασφάλισης",@(20),Γραφή$(.έτη_ασφ, "# ")+Γραφή$(.έτη_ασφ-1, "Χρόνια;Χρόνια;Χρόνο")
            }
            Πένα 13 {
                  Τύπωσε "Κατάσταση";
                  Αν .Είναι_Άνεργος() Τότε {
                        Τύπωσε γραφη$(.Είναι_Άνεργος(),ειναιδενειναι$)+.Λεκτικό_Άνεργος$()
                 } Αλλιώς {                
                       Τύπωσε " εργάζεται"
                       Πένα 14 {
                             Εμφάνιση .τρέχουσα(0) 
                       }
                  }
            }
            Αν .Έχει_Προϋπηρεσία() τότε {
                  Τύπωσε "Προϋπηρεσία"
                  κ=Διάσταση(.προϋπηρεσία(),1)
                  Για ι=κ-1 εως 0 {
                        Τύπωσε γραφη$(κ-ι,"###)")
                              Εμφάνιση .προϋπηρεσία(ι)
                  }
            }
      }
}
Κλάση Εργασία {
      ΑφμΕργοδ$, ΙδιότηταΕργαζομένου$, ΗμΠρόσλ, Τελική
      Τμήμα Εργασία {
            Αν όχι Κενό τότε {
                  Διάβασε .ΑφμΕργοδ$, .ΙδιότηταΕργαζομένου$, .ΗμΠρόσλ
            }
      }
      Τμήμα Διακοπή_Συνεργασίας {
            Διάβασε .Τελική
            Αν .Τελική < .ΗμΠρόσλ  Τότε Λάθος "Αδύνατη η διακοπή σε προηγούμενη μέρα"
      }
      Συνάρτηση Στοιχεία$ {
            =Σωρός$(.ΑφμΕργοδ$, .ΙδιότηταΕργαζομένου$, .ΗμΠρόσλ, .Τελική)
      }
      Τμήμα Στοιχεία {
            Διάβασε Α$
            Σωρός Α$
            Διάβασε .ΑφμΕργοδ$, .ΙδιότηταΕργαζομένου$, .ΗμΠρόσλ, .Τελική
      }
}
Κλάση Μισθωτός {
      αμκα$, όνομ_επων$, φύλο, αφμ$, μισθός, έτη_ασφ, κρατήσεις 
      πίνακας κλιμακα()  \\ φορολογική κλίμακα
      πινακας προϋπηρεσία(), τρέχουσα()
      Τμήμα Μισθωτός {
            Αν κενό τότε έξοδος
            Διάβασε .αμκα$, .όνομ_επων$, .φύλο, .αφμ$, .έτη_ασφ, .κλιμακα()
            \\ έλεγχος - αμακ 11 ψηφια, ονομα-επώνυμο μέγιστο 50, 
            \\ αφμ  9 ψηφία...μια άλλη φορά!
      }     
      Τμήμα Εισαγωγή_μισθός_κρατήσεις {
            \\ κρατήσεις ως ποσοστό π.χ. 30 σημαίνει 30%
            \\ μισθός - μεικτά - μηνιαίος
            Αν .Είναι_Ανεργος() Τότε Λάθος "Δεν έχεις δώσει εργασία"
            Διάβασε .μισθός1, .κρατήσεις1
            .μισθός+=.μισθός1
            .κρατήσεις+=.κρατήσεις1
      }
      Συνάρτηση Υπολογισμός_Φόρου {
            Α=.μισθός
            Σούμα=0
            κ= διάσταση(.κλιμακα())
            Αν κ=0 τότε Λάθος "Δεν έχω φορολογική κλίμακα"
            κ= διάσταση(.κλιμακα(),1)
            Για ι=0 έως κ-1 {
                  Αν .κλιμακα(ι,0)>Α τότε Σούμα+=Α*.κλιμακα(ι,1)/100 : Έξοδος
                  Σούμα+=.κλιμακα(ι,0)*.κλιμακα(ι,1)/100 
                  Α-=.κλιμακα(ι,0)
            }
            =Σούμα, .κρατήσεις, Σούμα-.κρατήσεις
      }
      Συνάρτηση Είναι_Άνεργος {
            =Διάσταση(.τρεχουσα())=0
      }
      Συνάρτηση Λεκτικό_Άνεργος$ {
            Αν .Φύλο=1 Τότε { = "άνεργος" } Αλλιώς ="άνεργη"
      }
      Συνάρτηση Έχει_Προϋπηρεσία {
            =Διάσταση(.προϋπηρεσία())<>0
      }
      Τμήμα Πρόσληψη {
            Αν Δεν .Είναι_Ανεργος() Τότε Λάθος "Δεν είναι "+.Λεκτικό_Άνεργος$()
            Πίνακας .τρέχουσα(1)
            Διάβασε .τρέχουσα(0)
      }
      Τμήμα Διακοπή_Εργασίας {
            Αν .Είναι_Ανεργος() Τότε Λάθος "Είναι "+.Λεκτικό_Άνεργος$()
            \\ αφήνουμε την ημερομηνία για το άλλο τμημα:
            .τρέχουσα(0).Διακοπή_Συνεργασίας
            κ=Διάσταση(.προϋπηρεσία())
            Αν κ=0 τότε {
                  κ=1            
                  Πίνακας .προϋπηρεσία(1)=Εργασια()
             } αλλιώς {
                  κ=Διάσταση(.προϋπηρεσία(),1)+1
                  Πίνακας .προϋπηρεσία(κ)
            }
            .προϋπηρεσία(κ-1)=.τρέχουσα(0)
            Πίνακας .τρέχουσα()
      }
      Συνάρτηση Στοιχεία$ {
            Εγγραφο Α$
            Α$=Σωρός$(.αμκα$, .όνομ_επων$, .φύλο, .αφμ$, .μισθός, .έτη_ασφ, .κρατήσεις)
            κ=Διάσταση(.κλιμακα()) 
            Αν κ<>2 τότε {
                  Α$=Σωρός$(0)
            } Αλλιώς {
                  Α$=Σωρός$(Διάσταση(.κλιμακα(),1))
                  Για ι=0 έως Διάσταση(.κλιμακα(),1)-1 {
                        Α$=Σωρός$(.κλιμακα(ι,0),.κλιμακα(ι,1))
                  }
            }
            κ=Διάσταση(.τρέχουσα())
            Αν κ=0 τότε {
                  Α$=Σωρός$(0)
            } αλλιώς {
                  Α$=Σωρός$(1,.τρέχουσα(0).στοιχεια$())
            }
            κ=Διάσταση(.προϋπηρεσία())
            Αν κ=0 τότε {
                  Α$=Σωρός$(0)
            } αλλιώς {
                  Α$=Σωρός$(Διάσταση(.προϋπηρεσία(),1))
                  Για ι=0 έως Διάσταση(.προϋπηρεσία(),1)-1 {
                        Α$=Σωρός$(.προϋπηρεσία(ι).στοιχεια$())
                  }
            }
            =Α$
      }
      Τμήμα Στοιχεία {
            Διάβασε Α$
            Σωρός Α$
            Διάβασε .αμκα$, .όνομ_επων$, .φύλο, .αφμ$, .μισθός, .έτη_ασφ, .κρατήσεις
            Διαβασε κ
            Αν κ>0 τότε {
                  Πίνακας .κλιμακα(κ,2)
                  Για ι=0 έως κ-1 {
                  Διάβασε .κλιμακα(ι,0), .κλιμακα(ι,1)
                  }
            } Αλλιώς {
                  Πίνακας .κλιμακα()
            }
            Διάβασε κ
            Αν κ>0 τότε {
                  Πίνακας .τρέχουσα(0)
                  Πίνακας .τρέχουσα(1)=Εργασια()
                  .τρέχουσα(0).στοιχεια γράμμα$           
            } Αλλιώς {
                  Πίνακας .τρέχουσα(0)
            }            Διάβασε κ
            Αν κ>0 τότε {
                  Πίνακας .προϋπηρεσία(0)
                  Πίνακας .προϋπηρεσία(κ)=Εργασια()
                  Για ι=0 έως κ-1 {
                        .προϋπηρεσία(ι).στοιχεια γράμμα$           
                  }
            } Αλλιώς {
                  Πίνακας .προϋπηρεσία(0)
            }
      }
}
Γενικές ειναιδενειναι$="; είναι ; δεν είναι ", εχειδενεχει$="; έχει ; δεν έχει "
Πρώτα θα ετοιμάσουμε το αρχείο. Θα χρησιμοποιήσουμε το λεγόμενο σειριακό αρχείο, το οποίο γράφει γραμμές κειμένου. Επειδή στο αλφαριθμητικό που φτιάχνει η Σωρός$() μπορούν να περιέχονται  αλλαγές γραμμών, αλλά και για λόγους "ασφαλείας" θα κρυπτογραφήσουμε το αρχείο. Ο τρόπος κρυπτογράφησης της Μ2000 είναι απλός με ένα κλειδί αλφαριθμητικό και έναν αριθμό. Μπορούμε τον αριθμό να τον σκεφτούμε ως κάτι σχετικό. π.χ. το μήκος ενός "άσχετου" αρχείου.  Εδώ δεν κάνω τέτοιους λογικούς ακροβατισμούς, βάζω ένα απλό κωδικό και ένα νούμερο. Απλά πρέπει να έχω το ίδιο και στο διάβασμα! Επιπλέον μπορώ να κάνω το πρόγραμμα να ζητάει το κωδικό. Το μήκος του κωδικού δεν έχει περιορισμό. Η κρυπτογράφηση δέκα χαρακτήρων αλφαριθμητικού θα δώσει είκοσι χαρακτήρες, όπου μαζί με την καλή πληροφορία υπάρχει και άλλη άσχετη! Κάθε φορά που κρυπτογραφούμε με το ίδιο κλειδί και τον ίδιο αριθμό το κείμενο παίρνουμε ένα άλλο αλφαριθμητικό!
Το "Ευρεία" στο ορισμό της προσπέλασης του αρχείου σημαίνει ότι θα χρησιμοποιήσουμε Unicode χαρακτήρες των 2 byte (Word). Είναι το Utf-16LE που χρησιμοποιείται στα WIndows. Και όχι το Utf8 (στο Μέρος Γ θα δούμε άλλες παραλλαγές, και εκεί υπάρχει και το UTF-8)
Γράφουμε το παρακάτω (με αντιγραφή) σε ένα τμήμα έστω β
Οθόνη 5
Πένα 14
Φόρμα 80,44
\\ φορτώνουμε τη βιβλιοθήκη
 Φόρτωσε Μισθωτοι
\\ για να δουλεύουμε τη βιβλιοθήκη παράλληλα τη φορτώνουμε σε ένα τμήμα μισθ
\\ και κάνουμε ότι η Φόρτωσε αλλά αντί από το δίσκο από ένα τμήμα!
\\Ένθεση Κώδικα Μισθ 
Πίνακας Φορολογία(3,2), Φορολογία2(2,2)
Φορολογία(0,0)=10000,0,10000,35,10000,50
Φορολογία2(0,0)=10000,22,5000,33
Πίνακας Μισθωτοί(10)=Μισθωτός()
Μισθωτοι(0)=Μισθωτός("12345123451","ΧΑΡΗΣ ΑΧΑΡΟΣ",1,"012341234", 5, Φορολογία())
Για Μισθωτοι(0) {
      .Πρόσληψη Εργασία("912341234","Ιδ. Υπάλληλος",ημερα("12/10/2015"))
      .Εισαγωγή_μισθός_κρατήσεις 13000,100
      .Διακοπή_Εργασίας ημερα("14/12/2015")
      .Πρόσληψη Εργασία("992341235","Ιδ. Υπάλληλος",ημερα("11/1/2016"))
      .Εισαγωγή_μισθός_κρατήσεις 3000,100
      .Διακοπή_Εργασίας ημερα("1/2/2016")
}
Μισθωτοι(1)=Μισθωτός("32345123451","ΧΑΡΟΥΛΑ ΑΧΑΡΟΥ",0,"052341234", 1, Φορολογία2())
Για Μισθωτοι(1) {
      .Πρόσληψη Εργασία("912341234","Διευθυντής",ημερα("12/10/2015"))
      .Εισαγωγή_μισθός_κρατήσεις 3000,100
}
κ=1
ανοιξε "αλφα.μισθ"  για ευρεια εξαγωγή ως κ
Για ι=0 έως 1 {
      Τύπωσε #κ, κρυφο$(Μισθωτοι(ι).στοιχεια$(),"ΚωδικόςΑ",1234)
}
Κλείσε #κ
Τύπωσε "Οκ"



 Παρακάτω είναι το τμήμα που διαβάζει το αρχείο. Το αποκρυπτογραφεί και το επεξεργάζεται. Μας δίνει τα βιογραφικά, τη λίστα των ανέργων και τη λίστα του υπολογισμού των φόρων, καθώς επίσης μας παρουσιάζει την φορολογική κλίμακα του καθένα (έχω διαλέξει επίτηδες να έχω μισθωτούς με διαφορετική φορολογική κλίμακα, δεν ισχύουν αυτά, απλά για το παράδειγμα είναι).

Οθόνη 5
Πένα 14
Φόρμα 80,44
\\ φορτώνουμε τη βιβλιοθήκη
Φόρτωσε Μισθωτοι
\\Ένθεση Κώδικα Μισθ
Μέγεθ=10
Μισθ1=-1
Πίνακας άλλος(Μεγεθ)=Μισθωτός()
ανοιξε "αλφα.μισθ"  για ευρεια εισαγωγή ως κ
Ενώ όχι τέλος(#κ) {
     Γραμμή Εισαγωγής #κ, α$
     α$=φανερο$(α$,"ΚωδικόςΑ",1234)
     Μισθ1++
     Αν Μισθ1=Μέγεθ Τότε {
           Πίνακας άλλος(Μεγεθ*2)
           Μεγεθ*=2
     }
     άλλος(Μισθ1).στοιχεία α$
     Βιογραφικό άλλος(Μισθ1)
}
Κλείσε #κ
Αν Μισθ1>=0 τότε {
      Πένα 13 { Τύπωσε "Άνεργοι/ες" }
      Για ι=0 έως Μισθ1 {
            Για .άλλος(ι) {
                  Αν .ειναι_άνεργος() τότε Τύπωσε .όνομ_επών$
            }
      }
}
Αν Μισθ1>=0 τότε {
      Πένα 13 { Τύπωσε "Υπολογισμός Φόρου" }
      Για ι=0 έως Μισθ1 {
            Για .άλλος(ι) {
                  τοπική Α()
                  Α()=.υπολογισμός_φόρου()
                  Τύπωσε  .όνομ_επών$, " Φόρος", Α(0), "-Κρατήσεις", Α(1), "=Διαφορά", Α(2)
                  Πένα 11 { Φορολογική_Κλίμακα Αυτο }
            }
      }
}




Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου

You can feel free to write any suggestion, or idea on the subject.