Creación de un sistema de almacén con C# (Parte 3)


Entradas al Almacén

Diseño de la pantalla

Empezaremos diseñando la pantalla de entradas (formulario frmEntrada), la apariencia debe de quedar mas o menos así:


A continuacion una tabla descriptiva con los nombres de los objetos:

Objeto Propiedad Valor

Label
Name lblFechaEntrada
Text Fecha Entrada:

DateTimePicker
Name dtpFechaEntrada
Format Custom
CustomFormat dd/MM/yyyy

Label
Name lblFechaFactura
Text Fecha Factura:

DateTimePicker
Name dtpFechaFactura
Format Custom
CustomFormat dd/MM/yyyy

Label
Name lblFolioFactura
Text Folio Factura:
TextBox Name txtFolioFactura
Label Name lblNombreProveedor
Text Nombre del Proveedor:
TextBox Name txtNombreProveedor
Label Name lblIdArticulo
Text Articulo:
TextBox Name txtIdArticulo
Label Name lblCantidad
Text Cantidad:

TextBox
Name txtCantidad
Label Name lblPrecioCompra
Text Precio:
TextBox Name txtPrecioCompra
Button Name btnAgregar
Text Agregar
Button Name btnGrabar
Text Grabar
Button Name btnCancelar
Text Cancelar
ListView Name lvEntrada
FullRowSelect True
GridLines True
HideSelection False

Programación

La parte de la programación es la mas enredada. Voy a considerar que el lector es un novato con nociones bastante
básicas e insuficientes como para comprender la estructura de la programación C#. Recomiendo al lector poner mucha atención
a los pasos que aqui se describan y no omitir nada, leer y re-leer hasta que haya comprendido lo que tiene que hacer.

Comprendiendo el código de un formulario C#

Con mucho cuidado haremos doble clic sobre el formulario asegurándonos de no tocar con el puntero del mouse ningun objeto. Veremos un código
muy parecido al siguiente:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace almacen.Formularios
{
 public partial class frmEntrada : Form
 {
     public frmEntrada()
     {
         InitializeComponent();
     }

     private void frmEntrada_Load(object sender, EventArgs e)
     {

     }
 }
}

A continuación incluiré comentarios en esta misma porción de código con la finalidad de que podamos identificar claramente su organización:
/**
 * Aqui se agrupan los espacios de nombres
 * Son necesarios para facilitarnos el acceso
 * a ciertas librerias o DLLs
 */
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
//Aqui inicia nuestro espacio de nombres
namespace almacen.Formularios
{
 //aqui inicia la clase
 public partial class frmEntrada : Form
 {
     //este es el constructor predeterminado
     public frmEntrada()
     {
         InitializeComponent();
     }
     //Aqui declararemos nuestras variables
     private void frmEntrada_Load(object sender, EventArgs e)
     {
         /**
             * Aqui incia la ejecución del Formulario
             */
     }
     //Aqui se ubican los procedimientos y funciones
 }
 //Fin de la clase, normalmente no se utiliza
}
/**
 * Fin del Espacio de Nombres
 * Este espacio no lo utilizaremos,
 * normalmente no se utiliza
 */

Así se organiza el código de un formulario C#. Debemos notar que todo inicia y termina con las llaves { }, existen algunos casos en los que
puede omitirse el uso de las llaves, principalmente en las estructuras de desición if, pero
para este tutorial, me aseguraré de escribir tanto mucho o tanto poco (mucho o poco) código segun sea necesario para evitar confusiones.
Ahora comenzaremos a programar, iniciamos nuestra tarea declarando todas las variables que vamos a utilizar.
En la zona de declaraciones, declaramos las siguientes variables:

DataTable tmpEntrada = new DataTable();
string CnnStr = @" Provider=Microsoft.Jet.OLEDB.4.0; "+
 "Data Source=D:\\DOCS\\tyrodeveloper\\almacen.mdb; "+
 "Jet OLEDB:Database Password=; Persist Security Info=False;";

Ahora escribiremos el código de las funciones y procedimientos:

void generaColumnas()
{
 lvEntrada.Clear();
 lvEntrada.View = View.Details;
 lvEntrada.Columns.Add("", 0, HorizontalAlignment.Left);
 lvEntrada.Columns.Add("Id ", 100, HorizontalAlignment.Left);
 lvEntrada.Columns.Add("Producto", 240, HorizontalAlignment.Left);
 lvEntrada.Columns.Add("Cantidad", 60, HorizontalAlignment.Right);
 lvEntrada.Columns.Add("Precio", 60, HorizontalAlignment.Right);
 lvEntrada.Columns.Add("Total", 80, HorizontalAlignment.Right);
}
void mostrarEntrada()
{
 try
 {
     double varIVA = 0;
     double varTOTAL = 0;
     lvEntrada.Items.Clear();
     for (int i = 0; i < tmpEntrada.Rows.Count; i++)
     {
         lvEntrada.Items.Add(tmpEntrada.Rows[i]["id"].ToString());
         lvEntrada.Items[i].SubItems.Add(tmpEntrada.Rows[i]["id_articulo"].ToString());
         lvEntrada.Items[i].SubItems.Add(tmpEntrada.Rows[i]["articulo"].ToString());
         lvEntrada.Items[i].SubItems.Add(String.Format("{0:N}",
             Convert.ToDouble(tmpEntrada.Rows[i]["cantidad"])));
         lvEntrada.Items[i].SubItems.Add(String.Format("{0:C}",
             Convert.ToDouble(tmpEntrada.Rows[i]["precio_compra"])));
         lvEntrada.Items[i].SubItems.Add(String.Format("{0:C}",
             (Convert.ToDouble(tmpEntrada.Rows[i]["precio_compra"]) *
             Convert.ToDouble(tmpEntrada.Rows[i]["cantidad"]))));
         varTOTAL += Convert.ToDouble(tmpEntrada.Rows[i]["precio_compra"]) *
             Convert.ToDouble(tmpEntrada.Rows[i]["cantidad"]);
         varIVA += (Convert.ToDouble(tmpEntrada.Rows[i]["cantidad"]) *
             Convert.ToDouble(tmpEntrada.Rows[i]["precio_compra"])) -
             ((Convert.ToDouble(tmpEntrada.Rows[i]["cantidad"]) *
             Convert.ToDouble(tmpEntrada.Rows[i]["precio_compra"])) / (1.16));
     }
 }
 catch (Exception ex)
 {
     MessageBox.Show(ex.Message, "Error",
         MessageBoxButtons.OK, MessageBoxIcon.Error);
 }
}
bool agregarArticulo(string prmId, double prmCantidad, double prmPrecioCompra, double prmIVA)
{
 try
 {
     string varId = "";
     string varNombre = "";
     OleDbConnection cnn = new OleDbConnection(CnnStr);
     cnn.Open();
     string strSQL="select articulo from articulos "+
         "where id_articulo='"+ prmId +"'";
     OleDbCommand cmd = new OleDbCommand(strSQL, cnn);
     OleDbDataReader dr = cmd.ExecuteReader();
     if (dr.Read())
     {
         varId = prmId;
         varNombre = dr["articulo"].ToString(); ;
         //agregamos la venta a la tabla temporal
         DataRow row = tmpEntrada.NewRow();
         row["id_articulo"] = varId;
         row["articulo"] = varNombre;
         row["cantidad"] = prmCantidad;
         row["precio_compra"] = prmPrecioCompra;
         row["iva"] = prmIVA;
         tmpEntrada.Rows.Add(row);
     }
     else
     {
         MessageBox.Show("El articulo no existe", "Error",
             MessageBoxButtons.OK, MessageBoxIcon.Error);
         return (false);
     }
     dr.Close();
     cnn.Close();

     return (true);
 }
 catch (Exception ex)
 {
     MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK,
         MessageBoxIcon.Error);
     return (false);
 }
}
bool grabarEntrada(string prmFechaEntrada, string prmFechaFactura, string prmFolioFactura,
 string prmNombreProveedor, string prmUserLogin)
{
 try
 {
     OleDbConnection cnn = new OleDbConnection(CnnStr);
     cnn.Open();
     OleDbTransaction tran = cnn.BeginTransaction();
     OleDbCommand cmd = new OleDbCommand();
     cmd.Connection = cnn;
     cmd.Transaction = tran;
     //insertamos el registro de la Entrada
     try
     {
         cmd.CommandText = "insert into entradas(fecha_entrada,fecha_factura,folio_factura,proveedor,user_login) " +
             " values (#" + prmFechaEntrada + "#,#" + prmFechaFactura + "#,'" +
             prmFolioFactura + "','" + prmNombreProveedor + "','" + prmUserLogin + "')";
         cmd.ExecuteNonQuery();
         //obtenemos el folio
         int _FolioEntrada = 0;
         cmd.CommandText = "select @@identity";
         _FolioEntrada = Convert.ToInt32(cmd.ExecuteScalar());
         //insertamos el detalle de laentrada
         for (int i = 0; i < tmpEntrada.Rows.Count; i++)
         {
             string _IdArticulo = Convert.ToString(tmpEntrada.Rows[i]["id_articulo"]);
             double _Cantidad = Convert.ToDouble(tmpEntrada.Rows[i]["cantidad"]);
             double _IVA = Convert.ToDouble(tmpEntrada.Rows[i]["iva"]);
             double _PrecioCompra = Convert.ToDouble(tmpEntrada.Rows[i]["precio_compra"]);
             double _CostoPromedio = 0;
             //insertamos el articulo
             cmd.CommandText = "insert into entradas_detalle(id_entrada,id_articulo,cantidad,precio_compra,iva) " +
                 "values(" + _FolioEntrada + ",'" + _IdArticulo + "'," + _Cantidad + "," +
                 _PrecioCompra + "," + _IVA + ")";
             cmd.ExecuteNonQuery();
             //actualizamosexistencias
             cmd.CommandText = "update articulos set " +
                 " existencia=existencia + " + _Cantidad + "" +
                 " where id_articulo='" + _IdArticulo + "'";
             cmd.ExecuteNonQuery();
             //establecemos el costo promedio
             cmd.CommandText = "select avg(precio_compra) " +
                 " from entradas_detalle " +
                 " where id_articulo='" + _IdArticulo + "'";
             _CostoPromedio = Convert.ToDouble(cmd.ExecuteScalar());
             cmd.CommandText = "update articulos set " +
                 " costo_promedio=" + _CostoPromedio + "" +
                 " where id_articulo='" + _IdArticulo + "'";
             cmd.ExecuteNonQuery();
         }
         //finalizamos la transaccion
         tran.Commit();
         cnn.Close();
         MessageBox.Show("Entrada grabada correctamente",
         "Información del Sistema", MessageBoxButtons.OK,
         MessageBoxIcon.Information);
         return (true);
     }
     catch (OleDbException errEntrada) {
         tran.Rollback();
         cnn.Close();
         MessageBox.Show(errEntrada.Message);
         return (false);
     }
 }
 catch (Exception ex)
 {
     MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK,
         MessageBoxIcon.Error);
     return (false);
 }
}

Ahora damos doble clic sobre el botón Agregar (btnAgregar) y escribimos el siguiente código:

try {
 if (agregarArticulo(txtIdArticulo.Text,
     Convert.ToDouble(txtCantidad.Text),
     Convert.ToDouble(txtPrecioCompra.Text),
     0.16)) {
         mostrarEntrada();
 }
}
catch (Exception ex) {
 MessageBox.Show(ex.Message);
}

Ahora, agregaremos el código para grabar la entrada, hacemos doble clic sobre el botón Grabar (btnGrabar) y escribimos el siguiente código:

if (grabarEntrada(dtpFechaEntrada.Value.ToShortDateString(),
 dtpFechaFactura.Value.ToShortDateString(),
 txtFolioFactura.Text, txtNombreProveedor.Text,"admin")) {
     this.Close();
}


El código que pondremos en el Form_Load es el siguiente:

//>Definimos la tabla para las ventas Temporales
DataColumn idColumn = new DataColumn("id", typeof(int));
idColumn.Unique = true;
idColumn.AutoIncrement = true;
idColumn.AutoIncrementSeed = 1;
idColumn.AutoIncrementStep = 1;
tmpEntrada.Columns.Add(idColumn);
//declaramos el resto de los campos
tmpEntrada.Columns.Add("id_articulo", typeof(string));
tmpEntrada.Columns.Add("articulo", typeof(string));
tmpEntrada.Columns.Add("cantidad", typeof(Double));
tmpEntrada.Columns.Add("precio_compra", typeof(Double));
tmpEntrada.Columns.Add("iva", typeof(Double));
//agregamos un primary key
tmpEntrada.PrimaryKey = new DataColumn[] { tmpEntrada.Columns["id"] };
//<termina la deficinicón de la tabla temporal
generaColumnas();
mostrarEntrada();


En el botón Salir (btnSalir) escribimos esto:

this.Close();

Para efectos de aprendizaje basico me aseguré de no poner funcionalidad demasiado complicada. Lo que tratamos de desarrollar es un sistema de almacén
sencillo, no se trata de desarrollar un sistema comercial cero errores, tratamos de sentar las bases técnicas para, en un futuro, lograr un gran sistema de almacén
con toda la funcionalidad comercial.

Aqui un ejemplo de la pantalla funcionando:

Regresar a la parte 2|Ir a la parte 4

88 comentarios:

  1. Hola, soy nuevo en esto de la programación he leido mucho acerca de las bases de datos porque queria crear un control de inventarios sencillo y tu tutorial me vino como anillo al dedo , lo he seguido al pie de la letra, pero tengo una duda, todo esto me funcionara bien si tengo win7 64 bits, access 2010? ya que me salen varios mensajes de error "Error 1 The type or namespace name 'OleDbConnection' could not be found (are you missing a using directive or an assembly reference?) C:\Users\usuario\Documents\Visual Studio 2010\Projects\Almacen\Almacen\Formularios\frmEntrada.cs 31 2017 Almacen
    " Gracias.

    ResponderEliminar
    Respuestas
    1. Hola! Pues vieras que yo tenia ese problema con un programa de Avalúos que estoy tratando de hacer. Ese problema pasa con los windows de 64 bits, lo que tienes q hacer es que el programa compile en 32 bits (x86) y listo.

      Eliminar
  2. Agrega:
    using System.Data.OleDb;

    Tambien cambia las propiedades de la depuracion,..
    Normalmente dice "Any CPU", cambialo a X86

    Saludos

    ResponderEliminar
  3. Muchas gracias por tu respuesta , agregue lo que me dijiste y ya no salen errores. Ahora el problema es cuando le doy en Build --» Build almacen y me sale le siguiente error:
    Error 1Program
    'c:\users\usuario\documents\visual studio 2010\Projects\almacen\almacen\obj\x86\Debug\almacen.exe' does not contain a static 'Main' method suitable for an entry pointalmacen,
    Del tutorial lo he hecho solo hasta aqui,, no se si tenga que terminarlo para poder ver la pantalla que tienes de ejemplo ya funcionando y mi base de datos tiene la extencion ".accdb" ya que fue hecha en access 2010, Saludos y Gracias ,,, de todos modos sigo buscando en google a ver si puedo resolver mi prblema,

    ResponderEliminar
  4. esa parte la encuentras en la parte 7
    http://www.tyrodeveloper.com/2011/07/creacion-de-un-sistema-de-almacen-con-c_12.html

    ResponderEliminar
  5. Tengo una pregunta, para que usted utiliza una entrada_detalle y una salida_detalle, en que lo ayuda o cual es su funcion ?

    ResponderEliminar
  6. Por favor podrias decir donde va el codigo fuente exactamente,y en el de abajo dice form_load,cual es ese

    ResponderEliminar
  7. tengo una duda, donde es que debo agregar
    using System.Data.OleDb;
    ayuda por favor, veo muy interesante este tutorial, muchas gracias, sigue asi.

    ResponderEliminar
  8. tengo un problema al ingresar una entrada

    ResponderEliminar
  9. hola aque se refiere a tmpentrada

    ResponderEliminar
  10. tmpEntrada es una tabla temporal que se crea en tiempo de ejecución para almacenar los registros. Tales registros se vaciarán en la base de datos cuando se decida...

    ResponderEliminar
  11. Me da un error en la parte double varIva que puedo hacer

    ResponderEliminar
  12. verifica que la tengas bien ubicada, no olvides el punto y coma (;) y...
    si puedes decirnos el error exacto,...

    ResponderEliminar
  13. HORA ME SALE ESTE ERROR

    Error 1 Program 'C:\Users\Leandro\Documents\Visual Studio 2010\Projects\Almacen\Almacen\obj\x86\Debug\Almacen.exe' does not contain a static 'Main' method suitable for an entry point Almacen

    QUE DEBO DE HACER DONDE LO REPARO

    ResponderEliminar
  14. Ese error es por que te hace falta un proecimiento llamado Main
    C# respeta mayusculas y minusculas. Asegurate de que lo tienes y que dice:

    static void Main(){
    //contenido
    }

    a veces lo escribimos mal...
    Otra situación puede ser que no has llegado a la parte en donde se crea ese procedimiento...

    Saludos..

    ResponderEliminar
  15. nesecito un poco de ayuda, cuando le doy al boton agregar me lansa el mensaje de "el archivo no esxiste" y no me hace nada solamente lo guarda en la base de datos directo

    ResponderEliminar
    Respuestas
    1. buenas, pudiste solventar ese problema? a mi me sucede lo mismo.

      Eliminar
    2. Erik Cabrera, pudiste solucionar el problema, podrias ayudarnos enviame respuesta a cg-isla@hotmail.com

      Eliminar
    3. pudieron solucionar este problema? conmigo lo mismo :S

      Eliminar
    4. Yo tampoco puedo corregir ese error

      ¿supiste algo?

      Eliminar
    5. Alguna solución a esto?

      Eliminar
  16. Buenos dias, necesito un poco de ayuda tengo un problema y no si será por lo siguiente, al poner estos códigos:
    DataTable tmpEntrada = new DataTable();
    string CnnStr = @" Provider=Microsoft.Jet.OLEDB.4.0; "+
    "Data Source=D:\\DOCS\\tyrodeveloper\\almacen.mdb; "+
    "Jet OLEDB:Database Password=; Persist Security Info=False;";

    Y siendo la ruta de mi proyecto un poco diferente:
    "C:\Users\Hogar\Documents\Visual Studio 2010\Projects\Sistema de inventario\Sistema de inventario\Sistema de inventario.csproj"
    El archivo.mdb al que ustedes hacen referencia donde lo puedo conseguir?? Ya que todos los comandos o códigos que comienzas por OleDb(Connection, Command, DataReader, Transaction, etc…) me aparecen subrayados y me dan el siguiente error: “The type or namespace name “OleDbXXXX” could not be found(are you missing a using directive or an assembly reference?)

    ResponderEliminar
  17. Primeramente el archivo .mdb es la extencion del archivo de access, ya que dependiendo el access si es 2000 o 2007 te guardan con extenciones diferentes el 2000 te guarda en mdb y el 2007 es accdb.
    En la parte donde te da el error del "oledb" es por que tienes que agregar la libreria "using system.data.oledb", desde que agregues esa libreria todos los oledb que hallas agregado te funcionaran correctamente.

    suerte!!

    ResponderEliminar
  18. ok, gracias por la ayuda, pero en que parte del codigo agregaria la libreria que me estas mencionando???

    ResponderEliminar
    Respuestas
    1. Al inicio del programa donde veas las directivas using ahí se agrega todas las librerías
      Necesarias que va solicitando el sistema.

      Eliminar
  19. cual es el form_load ?? ese codigo donde se pone ??? ahi me perdi

    ResponderEliminar
  20. que es el form_load ????? donde se pone el penultimo codigo ????

    ResponderEliminar
    Respuestas
    1. El form load(), se genera automáticamente, al dar doble click en el formulario o simplemente al dar doble click en un botón. Ahí se mandan llamar las conexiones a la base de datos o simplemente las funciones que deseas cargar como primera instancia en tu sistema.

      Eliminar
  21. Daniel Ramos, la libreria la cual menciono se agrega en la parte superior, data cuenta que en la parte superior de los codigos al pricipio, aparecen multiples librerias, hay es donde debes agregar el que menciono.

    suerte

    ResponderEliminar
  22. Anonimo, el form_load lo sacas dando dos click en el form, temandara automaticamente a la linea de codigo del form exactamente al evento form_load.

    suerte!!

    ResponderEliminar
  23. Muchas gracias, por la ayuda....

    ResponderEliminar
  24. Con un favor.

    Me manda un error cuando le doy guardar:
    "No se puede agregar o cambiar el registro por que se necesita un registro relacionado en la tabla "users".

    Por su apoyo muchas gracias.

    ResponderEliminar
  25. al grabar una entrada me genera un cuadro de dialogo con el siguiente error
    Incorrect Syntaxis near '#' espero puedas ayudarme...

    ResponderEliminar
  26. También me manda este erro: "No se puede agregar o cambiar el registro por que se necesita un registro relacionado en la tabla "users". Necesitamos iniciar con un usuario y contraseña, para poder modificar datos.
    Creo que falta esa parte dentro del tutorial, en conjunto de las ventanas para las entradas y salidas.

    ResponderEliminar
  27. fijate que no me reconoce lvEntrada me podrias ayudar con eso porfa

    ResponderEliminar
  28. Hola pues e segido los pasos pero no me funciona agregue """"static void Main()"" pero ahora no se ejecuta la depuracion pero tampoco me genera ningun error podrian ayudarme. Si le quito el procedimiento static void Main() me marca este error
    Error 1 El programa 'C:\Users\Bynoter\documents\visual studio 2010\Projects\Almacen\Almacen\obj\x86\Debug\Almacen.exe' no contiene ningún método 'Main' estático adecuado para un punto de entrada Almacen

    ResponderEliminar
  29. Hola muy bueno tu ejemplo muy simple y demaciado utilizable!! Perfecto
    1 pregunta como puedo hacer que dentro de mi formulario o que mi formulario tenga apariencia de 1 libro?

    ResponderEliminar
  30. Tengo listo todo el Proyecto, tengo un problema cuando grabo la salida o el ingreso, este error:

    El nombre "#10" no es valido en este contexto, las expresiones validas son constantes o expresiones de constantes y en algunos contexto, variables. No se permite nombres de columna.

    Por favor si me puedes ayudar.

    Iván López

    ResponderEliminar
  31. como se pone el texto encima de los textbox?

    mandame un mail a inievam@hotmail.es

    me toy volviendo loco con visual studio 2010 para hacerlo.

    gracias

    ResponderEliminar
  32. Cuando intento GRABAR en el formulario entrada o salida me da el siguiente error: "No se puede agregar o quitar el registro relacionado con la tabla 'users'". No se puede grabar los datos. ¿Alguien me podría ayudar?

    ResponderEliminar
    Respuestas
    1. Es problema es por que en tu tabla de Access lo Tienes en relacion Al User_login user y entradas si lo quitas ya no te saldra es error

      Eliminar
    2. Es correcto, sólo ingresa a la BD Access y elimina la relación entre User y Entrada y es User_login.

      Saludos

      Eliminar
  33. hola tengo un problema con la Tabla de entrada en el cuando doy agregar me da error El Articulo No Existe

    ResponderEliminar
  34. disculpa he seguido los pasos al pie de la letra y la verdad me ayudo mucho tu tutorial gracias. Solo tengo un error con la base de datos
    DataTable tmpEntrada = new DataTable();
    string CnnStr = @" Provider=Microsoft.Jet.OLEDB.4.0; " +
    "Data Source=C:\\Users\\Lourdes\\Desktop\\DatabaseAlamacen.accdb; " +
    "Jet OLEDB:Database Password=; Persist Security Info=False;";

    ya e cambiado dataSource donde esta mi archivo de base de datos pero me sale un error: "No se reconocio formato de base de datos" no se que estoy asiendo mal
    por favor ayudame

    ResponderEliminar
  35. Para resolver el problema con el Main , solo hay q añadir en InicioAplicacion.cs, una libreria la cual es:

    using System.Windows.Forms;

    Despues agregar el Main, el cual quedaria asi:

    static void Main(string[] args)
    {
    Application.Run(new Formularios.frmEntrada());
    }

    Y con eso se soluciona

    ResponderEliminar
  36. hola buenos dias esta super este tutorial, apenas me estoy adentrando en lo que es la programacion en el lemguaje c#... no se creo que no me que da la base de datos o no porque al momento de que ejecuto la aplicacion. no marca ningun error pero cuando trato de llenar los campos me y termino doy agregar y dice que los datos no pueden ser cargar porque falta una referencia en la tabla users.

    ResponderEliminar
  37. hola! excelente aporte, justo lo que estaba buscando. tengo un inconveniente, cuando ejecuto el formulario de entrada lleno todos los campos, al darle al boton "agregar" me indica q el articulo no existe. espero me puedan ayudar. Gracias!

    ResponderEliminar
  38. se me cierra la aplicacion al momento de correrla, no marca ningun error

    ResponderEliminar
  39. el codigo esta bien y el formulario de las entradas, solo me da un error al momento de yo introducir una entrada , agrego el folio, codigo, nombre proveedor, cantidad y precio y me da el error: format of the initialization string does not conform to specification starting at index 55

    y en la ventana de inmediato este otro
    Excepción del tipo 'System.ArgumentException' en System.Data.dll

    ResponderEliminar
  40. oye como saco el form porque no puedo añadir lo ultimo

    ResponderEliminar
  41. hola necesito saber porque me da el siguiente error "no se puede comvertir un objeto BDNullen otros tipos" CUANDO AGREGO LOS DATOS EJ:
    articulo,cantidad y presio...

    espero tu respuesta

    ResponderEliminar
    Respuestas
    1. puede ser por que alguno de los datos de retorno es nulo. Es decir, el problema podría no ser al agregar el registro, sinó al intentar mostrarlo en la pantalla

      Eliminar
    2. mira ya me muestra pero no he podido pasar al otro formulario ya que ahora me sale porque OleDbConnection cnn = new OleDbConnection(CnnStr);me sale null en el boton grabar

      Eliminar
    3. Es raro ese error. Sería buena idea poner puntos de interrupción antes de grabar y verificar los valores se insertarán. Otra cosa importante es que los datos autonuméricos estén establecidos correctamente en la base de datos.

      Eliminar
  42. Nesecito ayuda hago todo bn y corre el programa pero cuando introdusco un valor donde sea me dice: Error de disco o de red,


    ResponderEliminar
  43. ¿Alguien sabe por qué me sale Error de disco o de red? Si alguien me pudiera brindar una solución se lo agradecería muchísimo...

    ResponderEliminar
  44. tengo un problema ayudenme me sale k lvEntradas no existe por que sera

    ResponderEliminar
  45. en que parte del código tendría que cambiarle para realisar consultas y que se conecte con una base de datos sqlServer porfavor espero tu resp gracias de antemano

    ResponderEliminar
  46. Hola Buenas noches nose si me podrias ayudar soy nuevo en este hermoso mundo de la programacion. Saben el erro que tengo es a la hora de registrar los datos al lvEntrada me dice que el Articulo NO EXISTE. Ya estube buscandole una solucion y no se la encuentro nose si ustedes me pueden ayudar?

    ResponderEliminar
  47. alguien supo solucionar el probelma de IvEntrada?

    ResponderEliminar
  48. tego 3 datos almacenados enla base de datos, el data listado no me muestra nada, al momento de darle grabar me sale ke se grabo correctamente y se cierra y almomento de darle agregar me sale un error al go se los valores de los parametros son incorretos

    ResponderEliminar
    Respuestas
    1. Acabo de compilar y esperando el funcionamiento de la captura de entrada, sin embargo, me dice que "La columna precio_compra" no pertenece a la tabla.

      Repasando el código veo lo siguiente:

      bool agregarArticulo(string prmId, double prmCantidad, double prmPrecioCompra, double prmIVA)
      {
      try
      {
      string varId = "";
      string varNombre = "";
      OleDbConnection cnn = new OleDbConnection(CnnStr);
      cnn.Open();
      String strSQL = "select articulo from articulos " + "where id_articulo='" + prmId + "'";
      OleDbCommand cmd = new OleDbCommand(strSQL, cnn);
      OleDbDataReader dr = cmd.ExecuteReader();
      if (dr.Read())
      {
      varId = prmId;
      varNombre = dr["articulo"].ToString();
      //agregamos la venta a la tabla temporal
      DataRow row = tmpEntrada.NewRow();
      row["id_articulo"] = varId;
      row["articulo"] = varNombre;
      row["cantidad"] = prmCantidad;
      //Aquí comentarize "precio_compra" y me ahora me despliega; "iva" no pertenece a la tabla el //row["precio_compra"] = prmPrecioCompra;
      row["iva"] = prmIVA;
      tmpEntrada.Rows.Add(row);
      }
      else
      {
      MessageBox.Show("El artículo no existe", "Error",
      MessageBoxButtons.OK, MessageBoxIcon.Error);
      return (false);
      }
      dr.Close();
      cnn.Close();

      return (true);
      }
      catch (Exception ex)
      {
      MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK,
      MessageBoxIcon.Error);
      return (false);
      }
      }

      Eliminar
  49. Acabo de compilar y esperando el funcionamiento de la captura de entrada, sin embargo, me dice que "La columna precio_compra" no pertenece a la tabla.

    Repasando el código veo lo siguiente:

    bool agregarArticulo(string prmId, double prmCantidad, double prmPrecioCompra, double prmIVA)
    {
    try
    {
    string varId = "";
    string varNombre = "";
    OleDbConnection cnn = new OleDbConnection(CnnStr);
    cnn.Open();
    String strSQL = "select articulo from articulos " + "where id_articulo='" + prmId + "'";
    OleDbCommand cmd = new OleDbCommand(strSQL, cnn);
    OleDbDataReader dr = cmd.ExecuteReader();
    if (dr.Read())
    {
    varId = prmId;
    varNombre = dr["articulo"].ToString();
    //agregamos la venta a la tabla temporal
    DataRow row = tmpEntrada.NewRow();
    row["id_articulo"] = varId;
    row["articulo"] = varNombre;
    row["cantidad"] = prmCantidad;
    //Aquí comentarize "precio_compra" y me ahora me despliega; "iva" no pertenece a la tabla el //row["precio_compra"] = prmPrecioCompra;
    row["iva"] = prmIVA;
    tmpEntrada.Rows.Add(row);
    }
    else
    {
    MessageBox.Show("El artículo no existe", "Error",
    MessageBoxButtons.OK, MessageBoxIcon.Error);
    return (false);
    }
    dr.Close();
    cnn.Close();

    return (true);
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK,
    MessageBoxIcon.Error);
    return (false);
    }
    }

    ResponderEliminar
    Respuestas
    1. Encontré la causa, fue que no estaba definida en la tabla temporal. había omitido "precio_compra","iva".

      Saludos y muchas gracias.

      Eliminar
  50. Tengo un detalle, estoy corriendo la aplicación y al momento de guardar registro, me manda el siguiente mensaje "No se puede agregar o cambiar el registro porque se necesita un registro relacionado en la tabla Users", Sin embargo, revisando el proyecto no existe nada para el registro de usuario. Qué me recomiendan ?

    ResponderEliminar
    Respuestas
    1. Por el momento es eliminar la relación de Users y entrada en Access.

      Eliminar
  51. Estoy perdido, las variables realmente no se donde van, se remplaza "private void frmEntrada_Load(object sender, EventArgs e)" o va abajo?.
    Lo mismo con el Form_Load ni idea de exactamente donde va, al dar doble click en form me manda a "private void frmEntrada_Load(object sender, EventArgs e)" y como aqui no supe donde van las variables, menos donde va el codigo de form_load, exactamente.

    ResponderEliminar
  52. cuando lo ejecuto en el ListViewer no me aparecen columnas

    ResponderEliminar
  53. Hola tengo un problema con el proyecto en el momento de guarda me dice error de disco o de red

    ResponderEliminar
  54. es lo mismo para hacerlo en mysql o sqlserver

    ResponderEliminar
  55. Error 1 El nombre 'prmFechaEntrada' no existe en el contexto actual F:\proyecto final\programa final\programa final\Formularios\frmEntrada.cs 110 29 programa final
    y asi me sale con prmFechaFactura,
    prmFolioFactura + "','" + prmNombreProveedor + "','" + prmUserLogin

    ResponderEliminar
  56. hola, he estoy tratanto de aprender un poco de Visual Studio, tu tutorial me parece muy bueno, pero me gustaria adaptarlo a SQL, me ayudas con la sentencia de coneccion a SQL server 2008?

    ResponderEliminar
  57. Pregunta
    suponiendo que el usuario agregó por error un producto a la lista
    como sería el código para eliminarlo?

    ResponderEliminar
  58. Me sale el error " Nose reconoce base de datos C:\Users\Andre\Tutoria 3 capas\BD\BasedeDatos_Almacen.accdb(Access 2013) segui cada paso comose menciono pero me sale ese error :s como podria solucionarlo

    ResponderEliminar
    Respuestas
    1. DataTable tmpEntrada = new DataTable();
      string CnnStr = @" Provider=Microsoft.Jet.OLEDB.4.0; " +
      "Data Source=C:\\Users\\Brandon\\Tutoria 3 capas\\BD\\BasedeDatos_Almacen.accdb; " +
      "Jet OLEDB:Database Password=; Persist Security Info=False;";

      Eliminar
    2. Hola. Si usas access 2013. Cambia la version de conexion. es Microsoft.ACE.OLEDB.12.0...

      osea lo mismo q dice en el tuto. nomas que es 12.0. y cambia la extencion del archivo a accdb

      DataTable tmpEntrada = new DataTable();
      string CnnStr = @" Provider=Microsoft.Jet.OLEDB.12.0; " +
      "Data Source=C:\\Users\\Brandon\\Tutoria 3 capas\\BD\\BasedeDatos_Almacen.accdb; " +
      "Jet OLEDB:Database Password=; Persist Security Info=False;";

      Eliminar
    3. he hecho todo exactamente igual como esta en el tutorial, pero cuando voy a grabar o agregar me sale este error:

      "D:\DOCS\TYRODEVELOPER\almacen.mdb no es una ruta de acceso valida"
      no se que hacer porfavor ayuda :(

      Eliminar
  59. ya logre terminar todo el tutorial
    pero tengo una pregunta
    suponiendo que el usuario agregó por error un producto a la lista
    como sería el código para eliminarlo?

    ResponderEliminar
    Respuestas
    1. Se puede a medias con esto:

      private void lvEntrada_KeyDown(object sender, KeyEventArgs e)
      {
      if (Keys.Delete == e.KeyCode)
      {
      foreach (ListViewItem listViewItem in ((ListView)sender).SelectedItems)
      {
      listViewItem.Remove();
      }
      }
      }

      Sin embargo al agregar otro articulo, vuelve a aparecer el eliminado. imagino que el detalle es por la tabla temporal.

      Eliminar
  60. cuando ejecuto el boton grabar me sale un error que dice.. error de sintaxis cerca de '#.'
    por favor alguien me puede ayudar

    ResponderEliminar
  61. Al darle al boton agregar me aparece un error
    Microsoft.Jet.OLEDB.12.0 Provider is not registered in the local machine'.
    Alguien me puede ayudar? usé vs 2012 y acces 2016.

    ResponderEliminar
  62. Saludos, como puedo descargar o conseguir todo de una vez?

    ResponderEliminar
  63. Gracias por el GRACIAS. Me alegra saber que les ha servido este pequeño esfuerzo. Saludos.

    ResponderEliminar