Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Custom Control για έλεγχο Α.Φ.Μ!

Îåêßíçóå áðü ôï ìÝëïò Alexpap. Τελευταία δημοσίευση από το μέλος Markos στις 01-10-2013, 19:38. Υπάρχουν 9 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  25-08-2010, 11:11 59735

    Custom Control για έλεγχο Α.Φ.Μ!

    Συνημμένα: TaxChecker.rar

    Καλησπέρα σε όλους,

    Καθώς εφτίαχνα ενα πρόγραμμα, χρειαζόμουν πολλές φορές να ελέγχω το Α.Φ.Μ. ενός πελάτη... Επειδή έχω διαβάσει οτι πολλοί εκει "έξω" ψάχνουν κατι έτοιμο, σκέφτηκα να φτίαξω ενα δικό μου, custom control για winforms, του οποίου η δουλεία είναι να ελέγχει το Α.Φ.Μ., παρουσιάζοντας ενα "Check" εικονίδιο αν το Α.Φ.Μ. είναι σωστό, και ενα "Χ" εικονίδιο αν δεν είναι. Ελπίζω να σας φανεί χρήσιμο. Big Smile

    ΥΓ: Θέλω να ακούσω τις απόψεις (καλές ή κακές), αυτών των οποίων θα το δοκιμάσουν. Smile


    Αλέξανδρος Παπαίωάννου

    "If you can't make it good, at least make it look good." Bill Gates
    Δημοσίευση στην κατηγορία: , ,
  •  25-08-2010, 13:55 59740 σε απάντηση της 59735

    Απ: Custom Control για έλεγχο Α.Φ.Μ!

    Ξέχασες να βάλεις τον κώδικα αλλά δεν πειράζει, υπάρχει και το Reflector Stick out tongue Ξαναξέχασες (όπως και στο StudentGuru) να γράψεις ότι το control είναι για WinForms.

    Καταρχήν, δεν υπάρχει κανένας λόγος να φτιάξεις τα δικά σου εικονίδια για το validation καθώς το .NET έχει ήδη το ErrorProvider control γι αυτόν ακριβώς το λόγο, από την έκδοση 1.1 και μετά. Δεύτερον, το event το οποίο χρησιμοποιείται για validation στα WinForm controls είναι το Validating. Μπορείς να βέβαια να χρησιμοποιήσεις και το TextChanged για να δώσεις feedback την ώρα που γράφει ο χρήστης. Τρίτο και σημαντικότερο, η υλοποίηση του ελέγχου δεν είναι καθόλου αποδοτική - βασικά είναι η πιο αργή υλοποίηση. 

    Ο αλγόριθμος του check digit λέει χονδρικά ότι παίρνεις κάθε ψηφίο εκτός από το τελευταίο, το κάνεις shift αριστερά τόσες θέσεις όσο και η θέση του, αθροίζεις τα αποτελέσματα και σε αυτά παίρνεις το modulo 11. Αν το αποτέλεσμα είναι 10 επιστρέφεις 0. Στις γλώσσες που δεν έχουν bit shift operators όπως η Visual Basic 6 αντί για shift αριστερά χρησιμοποιούν την ισοδύμανη ύψωση σε δύναμη του δύο. Η διαφορά στην απόδοση όμως είναι δραματική (10 φορές πιο αργό και βάλε) καθώς αντικαθιστάς ένα binary operation που εκτελείται με 1 CPU instruction, σε πράξεις κινητής υποδιαστολής οι οποίες είναι ΠΟΛΥ πιο αργές.

    Πέρα από την προφανή αντικατάσταση του Math.Pow με το <<, ο τρόπος με τον οποίο χειρίζεσαι τα ψηφία θέλει αλλαγή. Δεν υπάρχει λόγος να παίρνεις τα ψηφία με Substring και να τα μετατρέπεις με Parse.  Ένα string είναι ένα array από Chars και ένα Char μπορείς να το χειριστείς ως Int32 με τιμή τον κωδικό του χαρακτήρα. Για τους αριθμούς ο κωδικός αυτό είναι ίδιος με το ASCII code τους, ξεκινώντας από το 48 για το '0'. Έτσι μπορείς να πάρεις την τιμή του ψηφίου απλά αφαιρώντας 48. Τέλος, ο τρόπος που υπολογίζεις το modulo, (διαίρεση δια έντεκα, πολλαπλασιασμός πηλίκου με 11, αφαίρεση από διαιρετέο) είναι περιττός καθώς όλες οι γλώσσες έχουν modulo operators οι οποίοι είναι πολύ γρηγορότεροι. Στην περίπτωση της C# αυτός είναι το %.

    Ο κώδικας σε C# είναι κάπως έτσι:

    public  bool CheckAFM(string afm)
    {
       if (afm.Length!=9)
           return false;
       var digits=afm.ToCharArray();
       int checkDigit = digits[8 ]-48;
       long sum = ((digits[7] - 48) << 1) +
           ((digits[6 ] - 48) << 2) +
           ((digits[5] - 48) << 3) +
           ((digits[4] - 48) << 4) +
           ((digits[3] - 48) << 5) +
           ((digits[2] - 48) << 6) +
           ((digits[1] - 48) << 7) +
           ((digits[0] - 48) << 8);
      long mod = sum%11;
      if (mod == 10)
           mod = 0;
      return (mod==checkDigit);
    }

    Ο λόγος που δεν βρίσκεις "κάτι έτοιμο" είναι από τη μία ότι ο αλγόριθμος είναι πολύ απλός για να χρειάζεται εξειδικευμένο control, από την άλλη το validation πρέπει να γίνεται σε πολλαπλά επίπεδα και δεν μπορεί να "δεθεί" με ένα συγκεκριμένο τύπο control όπως το MaskedTextBox. Αν π.χ. εγώ θέλω να χρησιμοποιήσω controls της Telerik ή της DevExpress ένα "έτοιμο" control για ΑΦΜ θα μου είναι άχρηστο.



    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  25-08-2010, 20:45 59751 σε απάντηση της 59740

    Απ: Custom Control για έλεγχο Α.Φ.Μ!

    Σε ευχαριστώ για την απάντηση και για τον χρόνο που διέθεσες να το δοκιμάσεις.

    Παναγιώτης Καναβός:
    Ξαναξέχασες (όπως και στο StudentGuru) να γράψεις ότι το control είναι για WinForms.

    Στο studentguru όντως το είχα ξεχάσει να το αναφέρω, αλλα για διάβασε αυτο το post μου. Stick out tongue Οσο για την ταχύτητα του αλγορίθμου, τι θα έκανες εσυ στην θέση μου για να τον κάνεις πιο γρήγορο? Αξιζει κάποια βελτιωση?Hmm


    Αλέξανδρος Παπαίωάννου

    "If you can't make it good, at least make it look good." Bill Gates
  •  25-08-2010, 21:51 59752 σε απάντηση της 59751

    Απ: Custom Control για έλεγχο Α.Φ.Μ!

    Σου έγραψα ήδη όλο τον κώδικα. Αν αξίζει .... δεν αξίζει να γράφεις αργό κώδικα όταν είναι το ίδιο εύκολο, αν όχι ευκολότερο να γράψεις γρήγορο κώδικα. Η διαφορά στην απόδοση είναι κυριολεκτικά 1:10. Τέλος, όσον αφορά το εικονίδιο και τον ErrorProvider, δεν αξίζει να φτιάχνεις από το μηδέν αυτό που σου δίνει το .NET έτοιμο.
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  01-10-2013, 17:19 74447 σε απάντηση της 59740

    Απ: Custom Control για έλεγχο Α.Φ.Μ!

    Αυτό είναι για 9 digit ΑΦΜ.

    Τι γίνεται όταν περιέχει και γράμματα ;

    http://www.taxnews.info/news/vat-afm/ 

     Ευχαριστώ.


    George Matzouranis
  •  01-10-2013, 17:30 74448 σε απάντηση της 74447

    Απ: Custom Control για έλεγχο Α.Φ.Μ!

    Ίσως το έχεις δει και δεν ξέρω αν όντως η λύση αυτή σου κάνει. Υπάρχει wrapper class για το VIES - VAT number check web service στο CodeProject.

    Σημ.: Δεν την έχω δοκιμάσει.


    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  01-10-2013, 18:56 74449 σε απάντηση της 74447

    Απ: Custom Control για έλεγχο Α.Φ.Μ!

    gmlogic:

    Τι γίνεται όταν περιέχει και γράμματα ;

    Μπλέκεις άσχετα πράγματα. Η σελίδα που δείχνεις περιέχει τη μορφή των ΑΦΜ όλων των κρατών της Ευρωπαϊκής Ένωσης, το καθένα από τα οποία έχει και το δικό φορμάτ και το δικό του τρόπο για να γίνεται η επικύρωση. Το ελληνικό ΑΦΜ δεν περιέχει γράμματα και ελέγχεται με τον συγκεκριμένο τρόπο που έχει συζητηθεί. Όσο για το πρόθεμα, απλά το αφαιρείς πριν κάνεις το validation.

    Για τις άλλες χώρες, θα πρέπει να βρεις πως γίνεται το validation για την καθεμία. Όσο για το web service, μου φαίνεται κάπως υπερβολικά υπερβολικό αν σε ενδιαφέρουν λίγες χώρες και μπορείς να βρεις τον αλγόριθμο για το validation της κάθε μίας. Η καθυστέρηση της κλήσης είναι 1000 φορές μεγαλύτερη από την εκτέλεση του validation.

     


     


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  01-10-2013, 19:04 74450 σε απάντηση της 74448

    Απ: Custom Control για έλεγχο Α.Φ.Μ!

    Markos:

    Ίσως το έχεις δει και δεν ξέρω αν όντως η λύση αυτή σου κάνει. Υπάρχει wrapper class για το VIES - VAT number check web service στο CodeProject.

    Σημ.: Δεν την έχω δοκιμάσει.

    Μακριά κι αλάργα! Δεν πρόκειται για wrapper. Ο τύπος φαίνεται ότι δεν ξέρει από .NET και δημιουργεί και ASMX service reference με το χέρι. Όλο το άρθρο περιγράφει πως να βάλεις ένα service reference με το δύσκολο τρόπο.

    Ο εύκολος τρόπος: Δεξί κλίκ στο References του project, επιλογή Add Service Reference, βάζουμε το URL του WSDL, GO, OK, τελειώσαμε. ΑΑΑΑΑΛΑΑΑΑ προσοχή. Αν κάνουμε αυτό, θα πάρουμε ένα proxy όπου τα In arguments θα έχουν τη μορφή ref parameters και τα output θα έχουν τη μορφή out parameters

    ΜΠΛΙΑΧ. Προφανώς το wsdl είναι message-style αντί για RPC style, οπότε, πριν πατήσουμε OK, πατάμε Advanced και τσεκάρουμε το "Always generate Message Contracts". Το αποτέλεσμα θα είναι ένα proxy όπου η checkVat θα παίρνει ένα request object και θα επιστρέφει ένα response object

     


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  01-10-2013, 19:24 74451 σε απάντηση της 74450

    Απ: Custom Control για έλεγχο Α.Φ.Μ!

    ΓΚΡΡΡΡΡΡΡΡΡΡΡΡAngryAngry. Δεν κατέβασα το zip. Αλλά διάβασα επιπόλαια και το κείμενο. Αν υπάρχει wrapper class εκεί μέσα είναι μόνο (!!) για τα αυστριακά ΑΦΜ (για τα υπόλοιπα θα ήταν δύσκολο):

    Within the zip file attached to this article, you can find a small wrapper class called ViesVatCheck which adds a heading character for Austrian VATs when its CheckVat() method is called.

    Βρήκα κι άλλη μία υπηρεσία αλλά είναι επί πληρωμή.


    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  01-10-2013, 19:38 74452 σε απάντηση της 74449

    Απ: Custom Control για έλεγχο Α.Φ.Μ!

    Παναγιώτης Καναβός:

    Όσο για το web service, μου φαίνεται κάπως υπερβολικά υπερβολικό αν σε ενδιαφέρουν λίγες χώρες και μπορείς να βρεις τον αλγόριθμο για το validation της κάθε μίας. Η καθυστέρηση της κλήσης είναι 1000 φορές μεγαλύτερη από την εκτέλεση του validation.

     

    Δε νομίζω ότι πρόκειται για Web Service που κάνει απλό αλγοριθμικό validation. Απ' ό,τι βλέπω, επιστρέφει και στοιχεία που αφορούν την επιχείρηση (ονομασία, διεύθυνση). Η αναζήτηση πρέπει να γίνεται σε βάση δεδομένων.


    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems