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

 

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

barcode scanner - reader

Îåêßíçóå áðü ôï ìÝëïò evagelos. Τελευταία δημοσίευση από το μέλος Parhs88 στις 24-02-2013, 03:10. Υπάρχουν 19 απαντήσεις.
Σελίδα 1 από 2 (20 εγγραφές)   1 2 >
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  16-12-2012, 11:09 71759

    barcode scanner - reader

    Γεια σας παιδιά,

    Σε μια σχολή που είμαι έχω φτιάξει μια εφαρμογή που καταχωρεί ο χειριστής μέσα απο μια win-form τις συνδρομές των μαθητών.

    Μου ζητήθηκε να φτιαχθεί κατι ώστε όταν μπαίνει ο μαθητής στην σχολή να το καταχωρεί καποιος για να ξέρουμε ποσες φορές έχει έρθει ο μαθητής ανα μηνα-χρονο κλπ

    Σκεφτηκα να πάρουμε ένα barcode scanner και να διαβάζει το barcode που θα έχει εκτυπωθει.

    Το θέμα είναι ότι δεν θέλω να είναι στην "οθόνης καταχώρησης συνδρομών" για να σκαναρει το barcode αλλα να πιανω το event εκτός της συγκεκριμένης οθόνης.

    Ειδα ότι το scanner μετά το barcode στέλνει και ένα enter.

    Μπορώ να το πιάσω αυτό.

    Εχει κανείς καμια ιδέα;

     

    Ευχαριστώ

     

  •  17-12-2012, 09:17 71763 σε απάντηση της 71759

    Απ: barcode scanner - reader

    Τα πάντα εξαρτώνται από το scanner, τον driver του και τα utilities που σου δίνει. Οι φθηνότεροι απλά εξομοιώνουν το αριθμητικό πληκτρολόγιο. Οι ακριβότεροι σου δίνουν API για να λαμβάνεις ανεξάρτητα events από το hardware, ακριβώς όπως ζητάς.

    Θα πρέπει να ψάξεις το documentation που έχεις για το scanner ή να ψάξεις στο site του κατασκευαστή για να βγάλεις άκρη. 

    Μία αρκετά χοντροκομμένη λύση πάντως, ειδικά αν ο scanner είναι εντελώς "κινέζικος", είναι να τον ρυθμίσεις να στέλνει κάποιο συγκεκριμένο sequence πριν από κάθε scan. Συνήθως αυτό γίνεται είτε πειράζοντας dip switches (αν υπάρχουν πλέον) ή σκανάροντας συγκεκριμένους κωδικούς. 
    Μετά θα πρέπει να ελέγχεις στο KeyDown/KeyPress της φόρμας μήπως πατήθηκε αυτή η αλληλουχία. Αν συμβεί αυτό, μεταφέρεις το focus στο entry box, ή απλά συνεχίζεις να κάνεις log τα keystrokes μέχρι να έρθει και το Enter.
    Θα πρέπει να προσέξεις να είναι ενεργοποιημένο το KeyPreview της φόρμας για να μπορεί να δει όλα τα keystrokes. Διαφορετικά τα key events σταματάνε στο event που τα σήκωσε

    Οι πιο έξυπνοι λέγονται smart phones Devil! Όλες σχεδόν οι εφαρμογές πο διαβάζουν QR codes και άλλα barcode formats βασίζονται σε βιβλιοθήκες όπως η ZXing. Μπορείς άνετα να χρησιμοποιήσεις αυτή τη βιβλιοθήκη, ή το port σε C#, για να σκανάρεις barcodes με τη webcam του laptop σου ή ακόμα και ένα απλό scanner. Άσε που κάπου θα υπάρχει σίγουρα ένα app το οποίο θα κάνει τη δουλειά από το κινητό και θα ειδοποιεί το Laptop σου. Αν χρειάζεται δηλαδή, γιατί ένα app μπορεί πλέον άνετα να κάνει τη δουλειά μίας έξυπνης ταμειακής.
    Δεν ξέρω βέβαια πως θα το πάρει ο καθηγητής .... Stick out tongue

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  17-12-2012, 12:14 71771 σε απάντηση της 71763

    Απ: barcode scanner - reader

    Παναγιώτης Καναβός:
     
    Οι πιο έξυπνοι λέγονται smart phones Devil! Όλες σχεδόν οι εφαρμογές πο διαβάζουν QR codes και άλλα barcode formats βασίζονται σε βιβλιοθήκες όπως η ZXing. Μπορείς άνετα να χρησιμοποιήσεις αυτή τη βιβλιοθήκη, ή το port σε C#, για να σκανάρεις barcodes με τη webcam του laptop σου ή ακόμα και ένα απλό scanner. Άσε που κάπου θα υπάρχει σίγουρα ένα app το οποίο θα κάνει τη δουλειά από το κινητό και θα ειδοποιεί το Laptop σου. Αν χρειάζεται δηλαδή, γιατί ένα app μπορεί πλέον άνετα να κάνει τη δουλειά μίας έξυπνης ταμειακής.
    Δεν ξέρω βέβαια πως θα το πάρει ο καθηγητής .... Stick out tongue

    Απλά παίζει λίγο παραπάνω ρόλο ο φωτισμός  και οι ρυθμίσεις της φωτό. Και αν μιλάμε για webcam οπωσδήποτε auto-focus γιατί αλλιώς κλάφτα.

     


    Vir prudens non contra ventum mingit
  •  17-12-2012, 16:10 71774 σε απάντηση της 71771

    Απ: barcode scanner - reader

    και που θα βρω αυτήν την ρύθμιση του autofocus Ειναι στις ρυθμίσεις της καμερας;

    Εφτασα στο σημείο να βλέπω το barcode απο το laptop αλλά δεν το διαβάζει.

    Το κινητό το βλέπει μια χαρά.

  •  17-12-2012, 16:20 71775 σε απάντηση της 71774

    Απ: barcode scanner - reader

    Πρέπει να υποστηρίζεται από το h/w, θα πρέπει να το αφέρει ως δυνατότητα στα specs. Γενικά, οι φθηνές δεν το έχουν...

     


    Vir prudens non contra ventum mingit
  •  18-12-2012, 14:10 71781 σε απάντηση της 71759

    Απ: barcode scanner - reader

    Γιά να "πιάνεις" keystrokes ανεξάρτητα από το αν η εφαρμογή έχει focus ή όχι μπορείς να χρησιμοποιήσεις την SetWindowsHookEx function. Αυτό σε περίπτωση που ο Scanner στέλνει keys. 

    Αν ο Scanner αναγνωρίζεται ως  Device από το λειτουργικό μπορείς να χρησιμοποιήσεις την Βιβλιοθήκη Microsoft POS for .NET. Αυτή αναγνωρίζει τα POS Devices του συστήματος και σηκώνει το DataEvent σε περίπτωση που σκανάρεις κάτι.
  •  18-12-2012, 14:24 71783 σε απάντηση της 71781

    Απ: barcode scanner - reader

    Γι αυτό μιλάς? Ή υπάρχει κάτι πιο πρόσφατο? Θα πρέπει πάντως ο scanner να υποστηρίζει το UPOS για να χρησιμοποιηθεί από το POS for .NET

    Χμμμ, καιρός να δούμε τις εξελίξεις στα φτηνά barcode scanners ...

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  18-12-2012, 14:36 71784 σε απάντηση της 71783

    Απ: barcode scanner - reader

    Ναι, δυστυχώς δεν γνωρίζω αν υπάρχει πιό πρόσφατη έκδοση. Αν δεν υποστηρίζει UPOS δεν θα παίζει θα είναι "Κινέζικος"Smile.

    Δεν μας είπε τελικά ο Evagelos τι scanner έχει.
  •  19-12-2012, 11:51 71791 σε απάντηση της 71784

    Απ: barcode scanner - reader

    δεν έχω ακόμα.

    Σκέφτομουν κάτι απο εδώ : http://www.ics.gr/index.php?target=categories&category_id=50

    αλλά θέλω να είμαι σίγουρος πριν πάρω κάτι. Οσον αφορά το SetWindowsHookEx

    Μέχρι στιγμής έχω φτάσει εδώ:

    		UserActivityHook actHook;
    		void MainFormLoad(object sender, System.EventArgs e)
    		{
                actHook = new UserActivityHook(); // crate an instance with global hooks
    			// hang on events
    			//actHook.OnMouseActivity+=new MouseEventHandler(MouseMoved);
    			actHook.KeyDown+=new KeyEventHandler(MyKeyDown);
    			//actHook.KeyPress+=new KeyPressEventHandler(MyKeyPress);
    			//actHook.KeyUp+=new KeyEventHandler(MyKeyUp);
    		}
    		
    
    		
    		public void MyKeyDown(object sender, KeyEventArgs e)
    		{
    			//LogWrite("KeyDown 	- " + e.KeyData.ToString());
                
                string value = "";
                if (e.KeyValue >= ((int)Keys.NumPad0) && e.KeyValue <= ((int)Keys.NumPad9))
                { // numpad
                    value = Convert.ToInt16(e.KeyValue - ((int)Keys.NumPad0)).ToString();
                }
                else if (e.KeyValue >= ((int)Keys.D0) && e.KeyValue <= ((int)Keys.D9))
                { // regular numbers
                    value =  Convert.ToInt16(e.KeyValue - ((int)Keys.D0)).ToString();
                }
    
    
                if (chkNumber(value) == true)
                    myval = myval + value;
                else
                    myval = "";
    
                if (myval.Length == 13)
                {
                    textBox1.Text = myval;
                    myval = "";
                }
    		}
    
            private bool chkNumber(string chk)
            {
    
                double number;
                CultureInfo culture = CultureInfo.CreateSpecificCulture("el-GR");
                NumberStyles style = NumberStyles.Number;
                if (Double.TryParse(chk, style, culture, out number))
                    return true;
                else
                    return false;
            }

     

     

    Κάνω έλεγχο αν πατησε ο χρήστης ένα χαρακτήρα και αν πάτησε "μηδενίζω" το string μου.

    Μπορώ να βάλω κάποιο έλεγχο για την διαρκεια πουθ πάτησε τα 2 νούμερα;

    πχ αν πάτησε 2 νούμερα ε διάστημα 1 δευτερολέπτου το ένα απο το άλλο, είναι σίγουρο ότι δεν το έστειλε το barcode, αλλα τα πάτησε ο χρήστης

  •  19-12-2012, 23:46 71793 σε απάντηση της 71791

    Απ: barcode scanner - reader

    "Μπορώ να βάλω κάποιο έλεγχο για την διαρκεια πουθ πάτησε τα 2 νούμερα;"

    "πχ αν πάτησε 2 νούμερα ε διάστημα 1 δευτερολέπτου το ένα απο το άλλο, είναι σίγουρο ότι δεν το έστειλε το barcode, αλλα τα πάτησε ο χρήστης"

    Ναι μπορείς, με timespan struct ή με την system.enviroment.tickCount property και "κράτα" την διαφορά χρόνου μεταξύ 2 διαδοχικών keydown events, αλλά 
    αν γιά παράδειγμα ο Χρήστης πχ γράψει πολύ γρήγορα ή απλά πατήσει το ίδιο πλήκτρο συνέχεια θα νομίζει το πρόγραμμα ότι έστειλε event ο Scanner. 

    Θα σου πρότεινα Όταν φτιάξεις τα barcode πρόσθεσε στην αρχή κάποιο αναγνωριστικό ή αν ο scanner έχει ρυθμίσεις , ένα νούμερο ή κάποιους ASCII characters και μετά εφόσον ο σκάνερ στείλει Carriage Return ή οτιδήποτε άλλο έχει ρυθμιστεί να στέλνει τότε κάνε parse το string.

    Φτιάξε τα λοιπόν τα Barcodes σου, βάλε το αναγνωριστικό σου σε αυτά σε συνδυασμό με το ID του Μαθητή και αν γίνει το parse valid γράψε το στην βάση.

  •  20-12-2012, 11:20 71796 σε απάντηση της 71793

    Απ: barcode scanner - reader

    Libra Storm:

    Ναι μπορείς, με timespan struct ή με την system.enviroment.tickCount property και "κράτα" την διαφορά χρόνου μεταξύ 2 διαδοχικών keydown events, 


    Υπάρχει ήδη το System.Diagnostics.Stopwatch το οποίο κάνει αυτό ακριβώς.

    Επαυξάνω για τα υπόλοιπα, έτσι κι αλλιώς πρέπει να ρυθμίσεις το scanner να σου στείλει κάποιους χαρακτήρες στην αρχή για να καταλάβεις ότι πρόκειται για το scanner και όχι για το χρήστη.

    Όσον αφορά τους φτηνούς scanners, έριξα μία γρήγορη ματιά σε αυτούς του 40άρικου και βλέπω ότι παίζουν απλά σαν πληκτρολόγια.

    Πλατειάζοντας λίγο, βρήκα αυτό το blog post του Stephen Toub (γνωστότατος για το Task Parallel Library, Async programming) για Keyboard Hooks το οποίο συνοδεύει το άρθρο του για debugging με το Visual Studio στο MSDN Magazine του Μαΐου 2006. Βρήκα και άλλες υλοποιήσεις που "τυλίγουν" αυτό τον κώδικα σε μία κλάση που σηκώνει events και αναρωτιέμαι, γιατί events που είναι η "παλιά μόδα" και όχι Tasks που είναι ο σύγχρονος τρόπος προγραμματισμού? Αν ο καθηγητής δεν έχει επιβάλλει τη χρήση .NET 3.5-, άνετα μπορείς να γράψεις το hook με Tasks ή (σε .ΝΕΤ 4.5/4 με προϋποθέσεις) με async/await. Έτσι δεν θα κολλάει το UI όσο η εφαρμογή διαβάζει/επεξεργάζεται τα keystrokes, ούτε θα υπάρχει κίνδυνος να χαθούν keyboard events επειδή το UI thread έτρεχε κάτι άλλο.

    Η συμπεριφορά της εφαρμογής θα είναι απείρως καλύτερη και θα εντυπωσιάσει και τον καθηγητή Stick out tongue

    Υ.Γ. Αυτό εξελίσσεται σε πολύ ενδιαφέρον thread ...

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  20-12-2012, 11:26 71797 σε απάντηση της 71796

    Απ: barcode scanner - reader

    Υ.Υ.Γ Και γιατί όχι και σε Silverlight ... Το Silverlight 5 υποστηρίζει P/Invoke, ενώ με το Microsoft.Bcl.Async package μπορείς να προσθέσεις υποστήριξη για async/await σε .NET 4 και Silverlight 4
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  20-12-2012, 23:06 71798 σε απάντηση της 71796

    Απ: barcode scanner - reader

    όπως είπα και στην αρχή θα πρέπει να παίξω μέσα απο τοι υπάρχον πρόγραμμα που έχω φτιάξει.

    Αυτό είναι σε .net 3.5

    Οσον αφορά το ποστ που έδωσες πιο πάνω ομολογώ δεν καταλαβα τι πρέπει να κάνω για να το ενσωματώσω στο "δικό" μου.

    Εκτος και αν φτιάξω μια άλλη εφαρμογή που θα ανοίγει ξεχωριστά και θα κάνει hook. Οταν βρει αυτό που πρέπει να βρει, θα συνδέεται στην mysql για να κάνει το insert στους πίνακες που θέλω

     

    using System;
    using System.Diagnostics;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    
    class InterceptKeys
    {
        private const int WH_KEYBOARD_LL = 13;
        private const int WM_KEYDOWN = 0x0100;
        private static LowLevelKeyboardProc _proc = HookCallback;
        private static IntPtr _hookID = IntPtr.Zero;
    
        public static void Main()
        {
            _hookID = SetHook(_proc);
            Application.Run();
            UnhookWindowsHookEx(_hookID);
        }
    
        private static IntPtr SetHook(LowLevelKeyboardProc proc)
        {
            using (Process curProcess = Process.GetCurrentProcess())
            using (ProcessModule curModule = curProcess.MainModule)
            {
                return SetWindowsHookEx(WH_KEYBOARD_LL, proc,
                    GetModuleHandle(curModule.ModuleName), 0);
            }
        }
    
        private delegate IntPtr LowLevelKeyboardProc(
            int nCode, IntPtr wParam, IntPtr lParam);
    
        private static IntPtr HookCallback(
            int nCode, IntPtr wParam, IntPtr lParam)
        {
            if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
            {
                int vkCode = Marshal.ReadInt32(lParam);
                Console.WriteLine((Keys)vkCode);
            }
            return CallNextHookEx(_hookID, nCode, wParam, lParam);
        }
    
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr SetWindowsHookEx(int idHook,
            LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
    
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool UnhookWindowsHookEx(IntPtr hhk);
    
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,
            IntPtr wParam, IntPtr lParam);
    
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr GetModuleHandle(string lpModuleName);
    }

     

     

  •  02-01-2013, 01:16 71815 σε απάντηση της 71798

    Απ: barcode scanner - reader

    με τα πολλά:

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    public void MyKeyDown(object sender, KeyEventArgs e)
            {
                string value = "";
                if (e.KeyValue >= ((int)Keys.NumPad0) && e.KeyValue <= ((int)Keys.NumPad9))
                { // numpad
                    value = Convert.ToInt16(e.KeyValue - ((int)Keys.NumPad0)).ToString();
                }
                else if (e.KeyValue >= ((int)Keys.D0) && e.KeyValue <= ((int)Keys.D9))
                { // regular numbers
                    value = Convert.ToInt16(e.KeyValue - ((int)Keys.D0)).ToString();
                }
    
    
                if (chkNumber(value) == true)
                {
                    myval = myval + value;
                    if (myval.Length == 1)
                        myTimeStart = DateTime.Now;
                }
                else
                {
                    myval = "";
                    myTimeStart = DateTime.Now;
                }
    
    
                if (myval.Length == barLength)
                {
                    myTimerStop = DateTime.Now;
                    TimeSpan span = myTimerStop - myTimeStart;
    
                    if (this.OpenConnection() == true)
                    {
                        try
                        {
                            if (loadtrdrObj(myval) == true)
                            {
                                if (span.TotalMilliseconds < 100)
                                {
                                    if (SaveData() == 1)
                                    {                                    
                                        RemTB.Text = "Μαθητής: " + myCustomer.Name + Environment.NewLine +
                                            "Level: " + myCustomer.Level + Environment.NewLine +
                                            "Σχόλια: " +myCustomer.Remarks + Environment.NewLine + 
                                            "Ωρα: " + DateTime.Now + Environment.NewLine +
                                            "Τελ. Ημ/νία Πληρωμής: " + myCustomer.LastPayDate;
    
                                        positioncontrols();
                                        this.Activate();
                                        onePing();
                                    }
                                }
                                myval = "";
                            }
                            else
                            {
                                MessageBox.Show("Δεν βρέθηκε μαθητής με αυτό το Barcode\n\n" + myval, "Λάθος", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            }
                        }
                        catch (MySqlException ex)
                        {
                            MessageBox.Show(ex.ToString());
                        }
                        finally
                        {
                            this.CloseConnection();
                        }
                    }
                    else
                    {
                        MessageBox.Show("Δεν υπάρχει σύνδεση!!!");
                    }
                }
            }

     

    Ψάχνω μονο για νούμερα

    οταν φτάσει στο επιθυμητό μήκος το string (Γραμμή 27)

    βλέπω σε πόσο χρόνο πληκτρολογήθηκε (Γραμμή 30)

    Ψάχνω να βρω αν υπάρχει ο μάθητής στην βάση (Γραμμή 36)

    Αν ο χρόνος που χρειάστηκε να πληκτρολογηθεί το νούμερο είναι λιγότερο απο 100ms πάει να πει ότι το διάβασε το barcode scanner (Γραμμή 38)

    Αποθηκεύω τα δεδομένα (Γραμμή 40)

    Εμφανίζω στην φόρμα μου τις πληροφορίες (Γραμμή 42)

    Βάζω στο κέντρο της οθόνης την αφαρμογή μου (Γραμμή 48)

    Την φέρνω μπροστά απο κάθε άλλο ανοιχτό παράθυρο στα windows (Γραμμή 49)

    Κάνω ένα beep (Γραμμή 50)

    Μηδενίζω το string μου (Γραμμή 53)

     

    Οι υπόλοιπες functions:

     

            private void positioncontrols()
            {
                Rectangle rect = Screen.PrimaryScreen.WorkingArea;
                //Divide the screen in half, and find the center of the form to center it
                this.Top = (rect.Height / 2) - (this.Height / 2);
                this.Left = (rect.Width / 2) - (this.Width / 2);
            }
    
            private bool chkNumber(string chk)
            {
                double number;
                CultureInfo culture = CultureInfo.CreateSpecificCulture("el-GR");
                NumberStyles style = NumberStyles.Number;
    
                if (Double.TryParse(chk, style, culture, out number))
                    return true;
                else
                    return false;
            }
    
            private bool loadtrdrObj(string barcode)
            {
               bool found = false;
               string SQLtrdr = "select t.company, t.trdr, t.name, ifnull(t.epipedo, 0)level, " +
                    "(select date from trans where trdr = t.trdr and type=2 order by date desc limit 1) trndate, " +
                    "ifnull(t.remarks,'') remarks "+
                    "from trdr t " +
                    "where t.barcode = @barcode";
    
                MySqlCommand cmd = new MySqlCommand(SQLtrdr, connection);
                cmd.Parameters.AddWithValue("@barcode", barcode);
    
                DataTable dt = new DataTable();
    
                MySqlDataReader dataReader = cmd.ExecuteReader();
                dt.Load(dataReader);
                if (dt.Rows.Count > 0)
                {
                    Customer myCust = new Customer
                        (
                        Convert.ToInt16(dt.Rows[0]["company"]),
                        Convert.ToInt32(dt.Rows[0]["trdr"]),
                        dt.Rows[0]["name"].ToString(),
                        Convert.ToInt16(dt.Rows[0]["level"]),
                        Convert.ToDateTime(dt.Rows[0]["trndate"]),
                        dt.Rows[0]["remarks"].ToString()
                        );
                    myCustomer = myCust;
                    found = true;
                }
                else
                {
                    found = false;
                }
                //close Data Reader
                dataReader.Close();
                dt.Dispose();
                return found;
            }
    
            private int SaveData()
            {
                string SQLtrdr = "";
                int r = 0;
                SQLtrdr = "insert into trans(company, date, trdr, type, insdate, upddate) values (@company, @date, @trdr, @type, @insdate, @upddate)";
                MySqlCommand myCommand = new MySqlCommand();
    
                myCommand.Parameters.AddWithValue("@company", myCustomer.Company);
                myCommand.Parameters.AddWithValue("@date", DateTime.Now);
                myCommand.Parameters.AddWithValue("@trdr", myCustomer.Trdr);
                myCommand.Parameters.AddWithValue("@type", 999);
                myCommand.Parameters.AddWithValue("@insdate", DateTime.Now);
                myCommand.Parameters.AddWithValue("@upddate", DateTime.Now);
    
                myCommand.CommandText = SQLtrdr;
                myCommand.Connection = connection;
                r = myCommand.ExecuteNonQuery();
    
                if (r > 0)
                {
                    return 1;
                }
                else
                {
                    return 0;
                }
            }
    
    
            public void onePing()
            {
                SystemSounds.Asterisk.Play();
            }

     

     

    Και επειδή με ευρος 0-100 έχω 0 στον προγραμματισμό, αν μπορείτε να με διορθώσετε όπου μπορεί να κάνω λάθος ή διορθώσεις ...

    Ευχαριστώ και συγνώμη

  •  04-01-2013, 01:37 71841 σε απάντηση της 71815

    Απ: barcode scanner - reader

           public void MyKeyDown(object sender, KeyEventArgs e) // <- DeviceKeyDown ή DeviceCallBack ή ότι άλλο θες, προτείνω όχι my.
            {
                string value = "";
                // <- Κενό
                if (e.KeyValue >= ((int)Keys.NumPad0) && e.KeyValue <= ((int)Keys.NumPad9))
                { // numpad <- Θα ξεμείνεις από χαρτί στον εκτυπωτή;
                    value = Convert.ToInt16(e.KeyValue - ((int)Keys.NumPad0)).ToString(); // Convert.ToInt16;
                }
                else if (e.KeyValue >= ((int)Keys.D0) && e.KeyValue <= ((int)Keys.D9))
                { 
                    // regular numbers
                    value = Convert.ToInt16(e.KeyValue - ((int)Keys.D0)).ToString();
                }
                else // Έχεις ήδη φιλτράρει μόνο γιά νούμερα.
                {
                    myval = ""; // αν είναι private εγώ βάζω _myval.
                    myTimeStart = DateTime.Now; // _
    
                    return;
                }
    
                // Δεν χρειάζεται αυτός ο έλεγχος, θα γίνει return αν δεν είναι νούμερο στο else που βάλαμε, 
                // από την στιγμή που το barcode έχει μόνο Νούμερα.
    
                //if (chkNumber(value) == true)
                //{
                //    myval = myval + value;
                //    if (myval.Length == 1)
                //        myTimeStart = DateTime.Now;
                //}
                //else
                //{
                //    myval = "";
                //    myTimeStart = DateTime.Now;
                //}
    
                myval = myval + value; // myval += value;
    
                if (myval.Length == 1)
                {
                    myTimeStart = DateTime.Now;
                }
                else if (myval.Length == barLength)
                {
                    myTimerStop = DateTime.Now;
                    TimeSpan span = myTimerStop - myTimeStart; // ή stopwatch όπως σωστά ανέφερε ο Παναγιώτης.
    
                    if (this.OpenConnection() == true) // if (this.OpenConnection()) 
                    {
                        try
                        {
                            if (loadtrdrObj(myval) == true) // if (loadtrdrObj(myval))
                            {
                                if (span.TotalMilliseconds < 100)
                                {
                                    if (SaveData() == 1) // if (SaveData() > 0), αλλιώς αν θέλεις 0 ή 1 τότε γύρνα bool.
                                    {
                                        RemTB.Text = "Μαθητής: " + myCustomer.Name + Environment.NewLine +
                                            "Level: " + myCustomer.Level + Environment.NewLine +
                                            "Σχόλια: " + myCustomer.Remarks + Environment.NewLine +
                                            "Ωρα: " + DateTime.Now + Environment.NewLine +
                                            "Τελ. Ημ/νία Πληρωμής: " + myCustomer.LastPayDate;
                                        
                                        // RemTB; txtStudent.Text (textBox), lblStudent.Text (label), cmd or btn (Button) κλπ.
                                        
                                        //positioncontrols();
                                        //this.Activate(); // γιατί μόνο σε αυτό this;
                                        //onePing();
    
                                        // είτε
    
                                        this.positioncontrols();
                                        base.Activate(); // ή this
                                        this.onePing();
                                    }
                                }
    
                                myval = "";
                            }
                            else
                            {
                                // /n/n ?. /n = Unix, /r = Old MacOS /r/n = Windows.
                                MessageBox.Show("Δεν βρέθηκε μαθητής με αυτό το Barcode\n\n" + myval,
                                    "Λάθος", 
                                    MessageBoxButtons.OK, 
                                    MessageBoxIcon.Error);
                            }
                        }
                        catch (MySqlException ex)
                        {
                            MessageBox.Show(ex.ToString());
                        }
                        finally
                        {
                            this.CloseConnection();
                        }
                    }
                    else
                    {
                        MessageBox.Show("Δεν υπάρχει σύνδεση!!!");
                    }
                }
            }
    
            private void positioncontrols() // <- PositionControls() ή καλυτερα CenterForm()
            {
                Rectangle rect = Screen.PrimaryScreen.WorkingArea;
    
                //Divide the screen in half, and find the center of the form to center it
                this.Top = (rect.Height / 2) - (this.Height / 2); // this.Top = (rect.Height - this.Height) / 2;
                this.Left = (rect.Width / 2) - (this.Width / 2);
            }
    
            private bool chkNumber(string chk) // <- CheckNumber ή IsNumber (string checkString)
            {
                double number;
                CultureInfo culture = CultureInfo.CreateSpecificCulture("el-GR"); // γιατί el-GR; Εγώ έχω en-US δεν θα μου κάνει σωστή μετατροπή.
                NumberStyles style = NumberStyles.Number;
    
                //if (Double.TryParse(chk, style, culture, out number)) 
                //    return true;
                //else
                //    return false;
    
                return Double.TryParse(chk, style, culture, out number);
            }
    
            private bool loadtrdrObj(string barcode) // Τα ονόματα των functions πρέπει να είναι κατανοητά.
            {
                bool found = false;
    
                string SQLtrdr = "select t.company, t.trdr, t.name, ifnull(t.epipedo, 0)level, " +
                     "(select date from trans where trdr = t.trdr and type=2 order by date desc limit 1) trndate, " +
                     "ifnull(t.remarks,'') remarks " +
                     "from trdr t " +
                     "where t.barcode = @barcode";
    
                // Caps προτείνω
                string SQLtrdrCAPS = "SELECT t.company, t.trdr, t.name, IFNULL(t.epipedo, 0) level, " + 
                     "(SELECT date FROM trans WHERE trdr = t.trdr AND type = 2 ORDER BY date DESC limit 1) trndate, " +
                     "IFNULL(t.remarks,'') remarks " +
                     "FROM trdr t " +
                     "WHERE t.barcode = @barcode";
    
                MySqlCommand cmd = new MySqlCommand(SQLtrdr, connection);
                cmd.Parameters.AddWithValue("@barcode", barcode);
    
                DataTable dt = new DataTable(); // ή Using
    
                MySqlDataReader dataReader = cmd.ExecuteReader();
    
                dt.Load(dataReader);
    
                if (dt.Rows.Count > 0)
                {
                    Customer myCust = new Customer
                        (
                            (Int16)(dt.Rows[0]["company"]), // cast εφόσον δεν έχει DBNull. Αν έχει System.DBNull.Value ως τιμή ακόμα και το Convert.ToInt16 θα σκάσει.
                            Convert.ToInt32(dt.Rows[0]["trdr"]), // Το ίδιο
                            dt.Rows[0]["name"].ToString(), // << >>
                            Convert.ToInt16(dt.Rows[0]["level"]), 
                            Convert.ToDateTime(dt.Rows[0]["trndate"]),
                            dt.Rows[0]["remarks"].ToString()
                        );
    
                    myCustomer = myCust;
    
                    found = true;
                }
                //else
                //{
                //    found = false; // Ok αλλά είναι ήδη false
                //}
                //close Data Reader // πλεονασμός
                dataReader.Close(); // το βλέπουμε τι κάνει
                dt.Dispose(); // end using
    
                return found; // bFound
            }
    
            /*
             * Το πιό σημαντικό είναι ότι πρέπει να απομονώσεις τελείως τις συναρτήσεις που έχουν να κάνουν με το ADO (SaveData, CloseConnection κλπ).
             * Φτιάξε ένα DLL και βάλε εκεί ότι έχει να κάνει με την βάση.
             * Έτσι θα φτιάξεις μία βιβλιοθήκη που θα χρησιμοποιείς σε κάθε project και θα κάνεις την δουλειά σου καλύτερα και γρήγορα.
             * Επίσης μην ξεχνάς ότι το ADO σου δίνει την δυνατότητα να το διαχειρίζεσαι μέσα από τα Interfaces που σου δίνει.
             * π.χ IDbConnection, IDbCommand κλπ.
             * Έτσι θα μπορείς να παραμετροποιείς τις εφαρμογές που θα φτιάξεις στο μέλλον με τέτοιον τρόπο που θα μπορείς να
             * κάνεις connect σε όλες τις βάσεις δεδομένων, MySQL, SQL, Oracle κλπ χρησιμοποιώντας τον ίδιο κώδικα.
             */
            private int SaveData()
            {
                string SQLtrdr = "";
                // int r = 0;
                SQLtrdr = "INSERT INTO trans(company, date, trdr, type, insdate, upddate) VALUES (@company, @date, @trdr, @type, @insdate, @upddate)";
                MySqlCommand myCommand = new MySqlCommand();
    
                myCommand.Parameters.AddWithValue("@company", myCustomer.Company);
                myCommand.Parameters.AddWithValue("@date", DateTime.Now);
                myCommand.Parameters.AddWithValue("@trdr", myCustomer.Trdr);
                myCommand.Parameters.AddWithValue("@type", 999);
                myCommand.Parameters.AddWithValue("@insdate", DateTime.Now);
                myCommand.Parameters.AddWithValue("@upddate", DateTime.Now);
    
                myCommand.CommandText = SQLtrdr;
                myCommand.Connection = connection; // Το connection είναι συνέχεια ανοικτό; 
                                                   // Αν ναι σου προτείνω να το ανοίγεις και να το κλείνεις κάθε φορά.
                // r = myCommand.ExecuteNonQuery();
    
                return myCommand.ExecuteNonQuery();
    
                //if (r > 0)
                //{
                //    return 1;
                //}
                //else
                //{
                //    return 0;
                //}
    
                // Να χρησιμοποιείς ένα στυλ σε τέτοιες περιπτώσεις όπως π.χ. 
                // στο αν θα βάζεις Curly Brackets σε conditions με μία πρόταση στο if ή στο else
                // γιατί πριν λες:
    
                //if (Double.TryParse(chk, style, culture, out number)) 
                //    return true;
                //else
                //    return false;
                          
            }
    
            public void onePing() // ή και public static void αν χρησιμοποιείται και από αλλού.
            {
                SystemSounds.Asterisk.Play();
            }
     
    Και τέλος, δεν είναι δύσκολο να περάσεις σε  framework 4.0, επίσης υπάρχουν variable length barcode formats που αναγνωρίζουν και ASCII τα οποία είναι πιό βολικά και αναγνώσιμα από νούμερα όπως το 128B.
    Καλή επιτυχία στο project σου.
Σελίδα 1 από 2 (20 εγγραφές)   1 2 >
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems