none
lector de codigo de barras y c# RRS feed

  • Pregunta

  • Buenas. Me encuentro realizando un sistema de presentismo que va a funcionar con unas tarjetas que tienen impresas códigos de barras que leen números de identificación...

    ya estuve probando y el lector funciona correctamente, use el evento keypress pero la verdad no me pone el presente en la DB.. este seria el código:

    private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
            {
               if (e.KeyChar == (Char)Keys.Enter);
               {
                    string beca = textBox1.Text;
                    string query = "update tablapresentismo set presentismo = 'PRESENTE' where beca = '" + beca + "'";
                    SqlCommand updateCommand = new SqlCommand(query);
                    updateCommand.Parameters.AddWithValue("PRESENTE", query);
                    int row = objAccesoalabase.executeQuery(updateCommand);
                    this.Hide();
                    Form1 home = new Form1();
                    home.Show();
                }

            }

    la consulta no me la hace y no me lo muestra en el datagridview (con el boton si me lo hace y me lo muestra) y por otro lado:

    tiene que fichar mucha gente por lo cual se debería borrar el numero anterior del que registró en el textbox, desconozco como hacerlo, y que además cuando vuelve a cargar el form después de fichar que se seleccione solo el textbox, porque se carga y va a un botón, y al pasar el lector me abre otra ventana...

    les agradecería mucho la ayuda

    viernes, 27 de marzo de 2020 17:04

Todas las respuestas

  • hola

    >>la consulta no me la hace y no me lo muestra en el datagridview (con el boton si me lo hace y me lo muestra)

    estas seguro que configuraste el lector de codigo para que al final de la lectura enviara un Enter ? lo planteo porque esto se configura en el lector, revisa el manual del dispositivo, puede que este enviando otra tecla como ser un Tab para que trabajes con el evento LostFocus

    >>tiene que fichar mucha gente por lo cual se debería borrar el numero anterior del que registró en el textbox,

    despues de procesar limpias el control, no se porque abres un Form1 en ese evento

    Se supone que registra la lectura no debes abrir forms

    private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
       if (e.KeyChar == (Char)Keys.Enter);
       {
    		string beca = textBox1.Text;
    		string query = "update tablapresentismo set presentismo = 'PRESENTE' where beca = @beca";
    		var updateCommand = new SqlCommand(query, connection);
    		updateCommand.Parameters.AddWithValue("@beca", beca);
    		
    		updateCommand.ExecuteNonQuery();
    		
    		textBox1.Text = "";
    		
    	}
    
    }

    No se que hace ese objAccesoalabase.executeQuery() pero esta raro, si ya tienes el command armado porque solo no lo ejecutas asignando  un connection

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    viernes, 27 de marzo de 2020 17:27
  • Hola Leando. El lector está mandando el enter, de hecho, puse para que abra de nuevo el form porque no encontré otra solución a que me borre lo que quedo registrado en el textbox. El tema es que preciona enter, vuelve y tengo como default otro botón el cual no sé cambiarlo, tengo que ir manualmente, eligir el textbox y otra vez usar el lector...

    el código que envié está en un botón, y funciona perfecto, incluso me lo actualiza en el datagridview...

    Te adjunto para que chequees como tengo programado el botón que sí funciona:

    private void button1_Click(object sender, EventArgs e)
            {

                string beca = textBox1.Text;

                if (beca.Equals(""))
                {
                    MessageBox.Show("Por favor coloque una beca");
                }
                else
                {
                    string query = "update tablapresentismo set presentismo = 'PRESENTE' where beca = '" + beca + "'";
                    SqlCommand updateCommand = new SqlCommand(query);

                    updateCommand.Parameters.AddWithValue("PRESENTE", query);
                    int row = objAccesoalabase.executeQuery(updateCommand);

                    if (row == 1)
                    {
                        MessageBox.Show("Presentismo dado correctamente");
                        this.Hide();
                        Form1 home = new Form1();
                        home.Show();


                    }
                    else
                    {
                        MessageBox.Show("Error. intente nuevamente.");

                    }
                }

            }

    viernes, 27 de marzo de 2020 17:43
  • hola

    Cuando trabajas con lecturas de codigo no se abre ningun form ni se muestra ningun mensaje como ventana porque sino pierdes el foco del textbox

    Los mensajes los muestras como label en el mismo frma donde esta el textbox

    Despues para limpiarlo asignas Text= "" y si quieres vuelves a ponerle el foco usando textbox.Focus()

    Pero eso de new Form1 descartalo porque es incorrecto

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    viernes, 27 de marzo de 2020 17:51
  • Probé sacar el new form, pero no me actualiza el datagrid, la idea es que a medida que van pasando el usuario que esta en pantalla pueda ver la db, existe algun codigo para actualizar el datagrid una vez que se le coloca presente?

    viernes, 27 de marzo de 2020 18:05
  • hola

    >>pero no me actualiza el datagrid

    Pero ese grid donde esta ubicado? porque se supone debe estar en el mismo form dodne tienes el textbox donde se ingresa el codigo

    >>existe algun codigo para actualizar el datagrid una vez que se le coloca presente?

    depende como cargues los datos del grid

    Si tomas los datos con una consulta de la db y asignas el DataSource entonces despues de asignar un registro deberias volver a ejecutar ese mismo codigo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 27 de marzo de 2020 19:10
  • Pero ese grid donde esta ubicado? porque se supone debe estar en el mismo form dodne tienes el textbox donde se ingresa el codigo

    Asi es leando, lo tengo en el mismo form del textbox.

    depende como cargues los datos del grid

    Si tomas los datos con una consulta de la db y asignas el DataSource entonces despues de asignar un registro deberias volver a ejecutar ese mismo codigo

    Mira yo arrastre el datagrid, le puse el datasource, y no hice nada más... yo iniciaba el programa y me mostraba los datos de la db... usaba el codigo para volver a ejecutar el form y era mi forma de que al usuario le muestre la db actualizada segun las modificaciones. ¿me estará faltando algo más?

    viernes, 27 de marzo de 2020 19:25
  • hola

    >>Mira yo arrastre el datagrid, le puse el datasource, y no hice nada más

    ok, pero eso va a cargar el grid cuando inicie el form, pero despeus de un UPDATE tienes que lanzar una actualizacion

    Si te animas usa codigo

    DataTable dt = new DataTable();   
    using (SqlConnection conn = new SqlConnection("connection string"))   
    {   
        string query = "select id, desc from <tabla>";   
     
        SqlCommand cmd = new SqlCommand(query, conn);   
         
        SqlDataAdapter da = new SqlDataAdapter(cmd);     
        da.Fill(dt);   
    } 
     
    dataGridView1.Datasource = dt; 

    asi despeus del update lo vuelves a ejecutar

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 27 de marzo de 2020 19:50
  • hice lo que me dijiste pero me tira error en da.fill(dt):

      Mensaje = Fill: la propiedad SelectCommand.Connection no se ha inicializado.
      Origen = System.Data

    asi me habia quedado el codigo:

    private void button1_Click(object sender, EventArgs e)
            {

                string beca = textBox1.Text;

                if (beca.Equals(""))
                {
                    MessageBox.Show("Por favor coloque una beca");
                }
                else
                {
                    DataTable dt = new DataTable();
                    string query = "update tablapresentismocadetes set presentismo = 'PRESENTE' where beca = '" + beca + "'";
                    SqlCommand updateCommand = new SqlCommand(query);
                    updateCommand.Parameters.AddWithValue("PRESENTE", query);
                    SqlDataAdapter da = new SqlDataAdapter(updateCommand);
                    da.Fill(dt);
                    textBox1.Text = "";
                    textBox1.Focus();
                    int row = objAccesoalabase.executeQuery(updateCommand);
                    if (row == 1)
                    {
                        MessageBox.Show("Presentismo dado correctamente");
                        dataGridView1.DataSource = dt;


                    }
                    else
                    {
                        MessageBox.Show("Error. intente nuevamente.");

                    }
                }

    Calculo que debe ser un error de conexion, la conexion la tengo a parte y la llamo al principio de la siguiente manera:

    public partial class Form1 : Form
        {
            Accesoalabase objAccesoalabase = new Accesoalabase();


    viernes, 27 de marzo de 2020 20:11
  • hola

    Revisaste el primer codigo que propuse? si es asi

    - porque no usas parametros

    - porque pasas el query en AddWithValue()

    - no asignas el SqlConnection en el SqlCommand

    No se que hace objAccesoalabase.executeQuery() pero para mi solo genera problemas, deberias quitarlo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 27 de marzo de 2020 20:15
  • disculpa pero no te estoy entendiendo sinceramente...

    el codigo como lo tengo, con el boton... funciona perfecto, sin fallas... si retiro lo que me mencionas no funciona más... 

    me sirvio mucho agregarle al final esto que me mencionaste:

    textBox1.Text = "";
    textBox1.Focus();

    esta perfecto y puedo seguir haciendo la funcion sin seleccionar el textbox, gracias

    pero en base a los que es el datagrid, no encuentro solucion... me sigue tirando error en "da.Fill(dt);" y no estoy entendiendo por qué... te voy a adjuntar la conexion que tengo a parte (la cual esta funcionando perfecto) para ver si podras ayudarme de por que no me funciona el da.fill(dt) ?? por favor

    namespace XXXXXXXXXXXXX
    {
        class Accesoalabase
        {
            private static SqlConnection connection = new SqlConnection();
            private static SqlCommand command = new SqlCommand();
            private static SqlDataReader DbReader;
            private static SqlDataAdapter adapter = new SqlDataAdapter();
            public SqlTransaction DbTran;

            private static string strConnString = "Data Source=(local)\\SQLEXPRESS;Initial Catalog=BasePresentismoCadetes;Integrated Security=True";



            public void createConn()
            {
                try
                {
                    if (connection.State != ConnectionState.Open)
                    {
                        connection.ConnectionString = strConnString;
                        connection.Open();
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }


            public void closeConn()
            {
                connection.Close();
            }


            public int executeDataAdapter(DataTable tblName, string strSelectSql)
            {
                try
                {
                    if (connection.State == 0)
                    {
                        createConn();
                    }

                    adapter.SelectCommand.CommandText = strSelectSql;
                    adapter.SelectCommand.CommandType = CommandType.Text;
                    SqlCommandBuilder DbCommandBuilder = new SqlCommandBuilder(adapter);


                    string insert = DbCommandBuilder.GetInsertCommand().CommandText.ToString();
                    string update = DbCommandBuilder.GetUpdateCommand().CommandText.ToString();
                    string delete = DbCommandBuilder.GetDeleteCommand().CommandText.ToString();


                    return adapter.Update(tblName);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }


            public void readDatathroughAdapter(string query, DataTable tblName)
            {
                try
                {
                    if (connection.State == ConnectionState.Closed)
                    {
                        createConn();
                    }

                    command.Connection = connection;
                    command.CommandText = query;
                    command.CommandType = CommandType.Text;

                    adapter = new SqlDataAdapter(command);
                    adapter.Fill(tblName);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }


            public SqlDataReader readDatathroughReader(string query)
            {
                SqlDataReader reader;

                try
                {
                    if (connection.State == ConnectionState.Closed)
                    {
                        createConn();
                    }

                    command.Connection = connection;
                    command.CommandText = query;
                    command.CommandType = CommandType.Text;

                    reader = command.ExecuteReader();
                    return reader;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }


            public int executeQuery(SqlCommand dbCommand)
            {
                try
                {
                    if (connection.State == 0)
                    {
                        createConn();
                    }

                    dbCommand.Connection = connection;
                    dbCommand.CommandType = CommandType.Text;


                    return dbCommand.ExecuteNonQuery();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }
    }

    aca esta el boton, que funciona bien tambien, pero ya no se como actualizar el datagrid...

    private void button1_Click(object sender, EventArgs e)
            {
                string beca = textBox1.Text;
                if (beca.Equals(""))
                {
                    MessageBox.Show("Por favor coloque una beca");
                }
                else
                {
                    string query = "update tablapresentismo set presentismo = 'PRESENTE' where beca = '" + beca + "'";
                    SqlCommand updateCommand = new SqlCommand(query);
                    updateCommand.Parameters.AddWithValue("PRESENTE", query);
                    int row = objAccesoalabase.executeQuery(updateCommand);
                    textBox1.Text = "";
                    textBox1.Focus();

                }

            }

    disculpame nuevamente, pero me estoy volviendo loco y ya no sé qué más hacer

    viernes, 27 de marzo de 2020 22:23
  • hola

    seria algo como esto

    private void button1_Click(object sender, EventArgs e)
    {
    	string beca = textBox1.Text;
    	if (string.IsNullOrEmpty(beca))
    	{
    		MessageBox.Show("Por favor coloque una beca");
    		return;
    	}
    
    	string strConnString = "Data Source=(local)\\SQLEXPRESS;Initial Catalog=BasePresentismoCadetes;Integrated Security=True";
    	using(SqlConnection connection = new SqlConnection(strConnString))
    	{
    		connection.Open();
    		
    		string query = "update tablapresentismo set presentismo = 'PRESENTE' where beca = @beca";
    		SqlCommand updateCommand = new SqlCommand(query, connection);
    		updateCommand.Parameters.AddWithValue("@beca", beca);
    		updateCommand.ExecuteNonQuery();
    		
    		textBox1.Text = "";
    		textBox1.Focus();
    	}
    }

    Esa clase Accesoalabase no sirve, es solo para complicarte

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    sábado, 28 de marzo de 2020 1:32
  • Buen dia Leandro.

    Me terminó quedando de la siguiente manera:

                

    private void button1_Click(object sender, EventArgs e)
            {
                string beca = textBox1.Text;
                if (string.IsNullOrEmpty(beca))
                {
                    MessageBox.Show("Por favor coloque una beca");
                    return;
                }

                string strConnString = "Data Source=(local)\\SQLEXPRESS;Initial Catalog=BasePresentismoCadetes;Integrated Security=True";
                using (SqlConnection connection = new SqlConnection(strConnString))
                {

                    DataTable dt = new DataTable();
                    connection.Open();
                    SqlCommand updateCommand = new SqlCommand("update tablapresentismocadetes set presentismo = 'PRESENTE' where beca = @beca", connection);
                    SqlDataAdapter da = new SqlDataAdapter(updateCommand);
                    updateCommand.Parameters.AddWithValue("@beca", beca);
                    updateCommand.ExecuteNonQuery();
                    textBox1.Text = "";
                    textBox1.Focus();
                    da.Fill(dt);
                    dataGridView1.DataSource = dt;

                   // connection.Close();
                }

            }


    Pero, sigue sin funcionar el refresh del datagrid... en vez de actualizarla lo que hace es generarme una fila en blanco y nada más, osea desaparece todo lo que veo en el DG y queda una sola fila en blanco


    • Editado sikloa sábado, 28 de marzo de 2020 14:54
    sábado, 28 de marzo de 2020 14:53
  • hola

    >>sigue sin funcionar el refresh del datagrid

    No funciona porque no implementas ninguna refresh

    Entiendes la diferencia entre un comando de actualizacio y una de consulta, no? si es asi porque usas un SqlDataAdapter con un UPDATE ? eso no aplica

    El SqlDataAdapter se usa con el SELECT, el SqlCommand se usa con el INSERT, UPDATE y DELETE

    En el codigo que implementaste mezclaste todo en una ensalada

    Tienes que ejecutar el UPDATE con el ExecuteNonQuery() del SqlCommand como lo puse en el ultimoa ejemplo y luego de que este termina realizas un SELECT ahi si con el SqlDataAdapter y realizar el Fill() que traera la info actualizada y la asignas al grid

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    domingo, 29 de marzo de 2020 5:09
  • la verdad he desistido. me hubiese gustado que me aporten el código correcto y que me funcione, aprecio tu ayuda leando pero no me has dado solución, tus respuestas son como si estuviese resolviendo un trabajo practico, la verdad esperaba que alguien me diga, oye ponlo así y funcionara. y que lo ponga y funcione, y no estar dando miles de vueltas para esto... joder, demasiadas cosas. buscare en otro foro.
    martes, 14 de abril de 2020 17:20
  • Para aquellos que hayan tenido el mismo inconveniente y ha llegado acá, he comentado en otro foro y me han ayudado con el código más fácil que en este y mejor explicado, se los adjunto aquí para que les resulte de ayuda:

    en el comienzo del código, donde va el partial class del form que están haciendo inicien y declaren los sql command, adapter y el datatable, sino no va a funcionar nunca. quedaría así:

    public partial class Form1 : Form
        {
            SqlConnection con = new SqlConnection("Data Source=(local);Initial catalog=Base; Integrated Security=True;");
            SqlCommand cmd;
            SqlDataAdapter adpt;
            DataTable dt;

    luego creen un showdata (o como quieran llamarlo, va a ser quien te va a actualizar el datagrid) e inicienlo en donde se inicia el initializeComponent así:

          public Form1()
            {
                InitializeComponent();
                showdata();
            }

    y dentro del showdata ahí si ponen lo que se estuvo "explicando" en este thread:

            public void showdata()
            {
                adpt = new SqlDataAdapter ("select * from tabla1", con);
                dt = new DataTable();
                adpt.Fill(dt);
                dataGridView1.DataSource = dt;
            }

    por último hacen el botón que necesiten, yo lo meti en un try con un catch para que si hay un error me lo muestre en un messagebox:

            private void button1_Click(object sender, EventArgs e)
            {
                try
                {
                    con.Open();
                    cmd = new SqlCommand("update tabla1 set presentismo = 'PRESENTE' where bec = 432;", con);
                    cmd.ExecuteNonQuery();
                    MessageBox.Show("Ejecutado correctamente");
                    con.Close();
                    showdata();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);

                }

            }

    es importante poner el showdata a lo último sino no funciona. Para el caso de código de barras si no quieren usar boton y quieren que funcione como en los supermercados, usen textbox y le activan el evento keypresss ah y no hace falta andar poniendo Focus en el código, no funciona para nada bien, dentro de las propiedades del textbox en la parte de TabIndex viene iniciado en 2, se pone en 0 y ya queda focuseado. Ojala a alguien le sirva, funciona 100%, saludos.

    viernes, 8 de mayo de 2020 20:05