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

 

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

barcode scanner - reader

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

    Απ: barcode scanner - reader

    Σε ευχαριστώ για την απάντηση.κανα δυο ερωτήσεις που δεν κατάλαβα

    Καταρχήν έκανα και μια αλλαγή

    Εβαλα το myval = ""; στο finally για να μηδενίζει παντα.

    Ερωτήσεις:

    1) λες: cast εφόσον δεν έχει DBNull. Αν έχει System.DBNull.Value ως τιμή ακόμα και το Convert.ToInt16 θα σκάσειcast εφόσον δεν έχει DBNull. Αν έχει System.DBNull.Value ως τιμή ακόμα και το Convert.ToInt16 θα σκάσει

    το πεδίο που καλώ είναι το ID του πινακα. Πρέπει να κάνω και εκεί DBNull;

    2) λες: IDbConnection, IDbCommand κλπ. IDbConnection, IDbCommand κλπ.

    Οταν έχω mssql μια εντολή είναι isnull και στην mysql είναι ifnull. το IDBCommand με καλύπτει;

     

     

    Libra Storm:

           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 σου.
  •  25-01-2013, 21:51 72024 σε απάντηση της 72007

    Απ: barcode scanner - reader

    evagelos:

    Σε ευχαριστώ για την απάντηση.κανα δυο ερωτήσεις που δεν κατάλαβα

    Καταρχήν έκανα και μια αλλαγή

    Εβαλα το myval = ""; στο finally για να μηδενίζει παντα.

    Ερωτήσεις:

    1) λες: cast εφόσον δεν έχει DBNull. Αν έχει System.DBNull.Value ως τιμή ακόμα και το Convert.ToInt16 θα σκάσειcast εφόσον δεν έχει DBNull. Αν έχει System.DBNull.Value ως τιμή ακόμα και το Convert.ToInt16 θα σκάσει

    το πεδίο που καλώ είναι το ID του πινακα. Πρέπει να κάνω και εκεί DBNull;

    - Εννοώ ότι από την στιγμή που κάποιο πεδίο του πίνακα σου δέχεται NULL τιμές δεν μπορείς να κάνεις cast στον τύπο τον οποίον περιέχει ( int, string κλπ ) γιατί θα σου βγάλει μήνυμα λάθους στις περιπτώσεις που η τιμή από την DataBase είναι NULL.
    - O τύπος

    - System.DBNull.Value

    - απλά εκφράζει την τιμή NULL που παίρνεις από την βάση σου σε τύπο του .net.

    - Στην περίπτωση που έχεις ID θα ήταν λάθος σχεδιασμού του πίνακα να το κάνεις να δέχεται NULL τιμές.

    2) λες: IDbConnection, IDbCommand κλπ. IDbConnection, IDbCommand κλπ.

    Οταν έχω mssql μια εντολή είναι isnull και στην mysql είναι ifnull. το IDBCommand με καλύπτει;

    - Δεν καταλαβαίνω την ερώτηση σου. Το IDbCommand είναι Interface, αν εννοείς την περίπτωση στην οποία εκτελείται το command ως Query, τότε θα πάρεις τις τιμές τις οποίες θέλεις από το select, είτε είναι isnull, ifnull ανάλογα με την βάση.
    - Επίσης θα ήταν καλό όλα αυτά να είναι functions στο Database layer και να γυρίζουν την σωστή σύνταξη ανά περίπτωση (ISNULL σε SQL, IFNULL σε MySQL, NVL σε Oracle κλπ ).

    - Πιστεύω ότι θα σε βοηθήσει καλύτερα το παρακάτω παράδειγμα, η 1η Open γυρνάει interface ανάλογα με το τι Database type έχεις δηλώσει ( ίσως σε κάποιο config file με το αντίστοιχο connection string ), το 2ο δουλεύει με generics.
    - Και στις 2 περιπτώσεις χρησιμοποιείς το αντίστοιχο Interface.

    -Ας μην σου φαίνεται παρατραβηγμένη η υλοποίηση γιατί θα είναι κρίμα να χάσεις δουλειά επειδή ο χ πελάτης έχει ήδη SQL ή κάποια άλλη βάση γιατί δεν αναφέρομαι μόνο στο συγκεκριμένο project αλλά γενικότερα.
        

        public partial class Form1 : Form
        {
            private static DatabaseType _dbType = DatabaseType.SQL;
    
            public Form1()
            {
                InitializeComponent();
            }
    
            public static enum DatabaseType
            {
                OleDb,
                SQL,
                MySQL,
            }
    
            public static IDbConnection Open(string connectionString) 
            {
                IDbConnection con = null;
    
                switch (_dbType)
                {
                    case DatabaseType.OleDb:
                        con = new System.Data.OleDb.OleDbConnection(connectionString);
                        break;
                    case DatabaseType.SQL:
                        con = new System.Data.SqlClient.SqlConnection(connectionString);
                        break;
                    case DatabaseType.MySQL:
                        // TODO
                        break;
                }
    
                con.Open();
    
                return con;
            }
    
            public static TConnection Open<TConnection>(string connectionString) 
                where TConnection : IDbConnection, new()
            {
                TConnection con = new TConnection();
    
                con.ConnectionString = connectionString;
                con.Open();
    
                return con;
            }
        }

  •  06-02-2013, 23:02 72065 σε απάντηση της 72007

    Απ: barcode scanner - reader

    Mετά απο αρκετή χρήση, σε κάποια χρονική στιγμή (δεν έχω βρει το πότε), σταματάει να κάνει hook το input απο το barcode reader.

    Στην αρχή σκέφτηκα ότι επειδή έπεφτε  η σύνδεση του ιντερνετ αλλα δεν είναι αυτό γιατί το ελεγχο αυτό με το "OPENCONNECTION()"

    καμια πρόταση για το τι πρέπει να κοιτάξω;

  •  13-02-2013, 15:33 72149 σε απάντηση της 72065

    Απ: barcode scanner - reader

    Unhook Κάνεις;
    Είσαι σίγουρος ότι ο Mr. GC δεν το μαζεύει;Surprise
    Είναι global το HookProc;

    Δες τα παρακάτω links.

    http://msdn.microsoft.com/en-us/library/windows/desktop/ms644960(v=vs.85).aspx

    http://support.microsoft.com/kb/318804

    και μιά που "έμπλεξες" με API έχε και αυτό το site γιά reference.

    http://www.pinvoke.net/

  •  24-02-2013, 03:10 72190 σε απάντηση της 72149

    Απ: barcode scanner - reader

    Εγω εχω κανει κατι αντιστοιχο με της MOTOROLA το LS2208 που ειναι τζαμι.
    Εχω χρησιμοποιησει OPOS driver (οποιος θελει λεπτομερειες ας ρωτησει) σε συνδιασμο με ενα event aggregator /messagebus  pattern στην εφαρμογή .Ετσι οταν ερχεται κατι στο σκαννερ παει παντου οπου θελω. Εχω δει αλλες υλοποιησεις που ειχαν κανει χωριστο προγραμμα server για το scanner που το ακουγε με σειριακή! 


Σελίδα 2 από 2 (20 εγγραφές)   < 1 2
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems