Академический Документы
Профессиональный Документы
Культура Документы
1. En cliente:
- cuando se actualiza y adiciona nuevo un dato no se ve reflejado en la gv
- cuando es persona natural no escribe nombre y aplellido de contacto en el nombre
comercial
- no sirve quitar filtros ni nada de filtros del formulario buscarcliente
- no actuliza gv al borrar
2. en ptos
- debera al guardar limpiar gv
3. en compras
- limpiar proveedor y bodega cuando se agrega
Delete barra
DeleteCliente
ExisteBarra
ExisteConcepto
ExisteDepartamento
ExisteTipoDocumento
ExisteUnidadMedida
GetBodegaProductoByIdBodegaAndIdProducto
InsertBarra
InsertBodegaProducto
InsertCliente
MantenimientoTablas
UpdateBodegaProducto
UpdateCliente
1.
2.
3.
4.
5. El formulario login lo 1ro al ejecutar la aplicacin es que aparezca una ventana donde el
usuario se autentifique con usuario y contrasea.
6. Propiedad text: ingreso al sistema. Label: llamado &Usuaro(& subraya la u) y el name
lblUsuario
7. Textbox: en el name txtUsuario
8. Lo mismo con clave adicionarle en propiedad passwordChard *
9. Agregar un PictureBox colocarle imagen de ingreso y propiedad sizemode: strechImage
10. Agregar botn llamarlo aceptar y btnAceptar y colocarle propiedad imagen y tambin el
botn cancelar
11. Otra propiedad para el formulario Accept button que es para darle aceptar con enter:
Button Accept y cancel button para cuando se presione esc con btnCancelar y para no
cambiarle el tamao al formulario formBorderStyle: FixedDialog y quitar botn de
minimizar y maximizar
Video 2 Menus
1. Arrastrar la hmienta menustrip que tendr las siguientes opciones con sus diferentes
opciones cada una
&Archivo
- &Bodegas
- &Clientes
- C&onceptos
- &Productos (&Departamentos, &IVA, &Productos, &Unidades de medida)
- Pr&oveedores
- &Tipo de documento
- &Usuarios
Hasta ac son las tablas maestras que son las que se les puede hacer crud (separador
con -)
-
Ca&mbio de Usuario
Cam&bio de clave
Guion
&Salir
&Movimientos (no se pueden modificar, afecta varias tablas mnimo 4 tablas)
&Compras
&Devoluciones (De clientes, A Proveedores
&Traslados
&Ventas
&Consultas
&Kardex
&Reportes
&Inventario
&Ventas
A&yuda
A&cerca de
A&yuda
Antes de todo toca activarle un evento al formulario principal para cuando este se cierre la
aplicacin tambin deje de ejecutarse en eventos formclosing copiar lo siguiente para que
se termine la aplicacin
private void frmPrincipal_FormClosing(object sender, FormClosingEventArgs e)
{
Application.Exit();
}
{
frmClientes miForm = new frmClientes();
miForm.MdiParent = this;
miForm.Show();
}
2. Miramos en la table clientes los campos que tienen y de esos cuales son los obligatorio
3. Colocar los controles para hacer el formulario label, textbox
IdUsuario (label) no se modifica porque es autonumerico (Textbox) su propiedad
readonly: true
IdTipoDocumento(label) combobox (tipo de documento)
4. Lo que se hace en el combobox para que salga la lista de tipo de documento
a. Ir al ds y arrastrar la tabla tipodocumento
b. El ds de aplicacin comercial se tiene que crear al otro proyecto para hacer las consultas
en proyecto aplicacin comercial agregar nuevo elemento llamamos
dsAplicacionComercial arrastrar todas las tablas (utiliza para llenar gridview, combos)
c. En el control tipo de documento usar elementos enlazados a datos otros orgenes de
datos DSAplicacionComercial llenar origen de datos: tipodedocumento, mostrar
miembro: Descripcin (Valor que se va a mostrar) miembro de valor: IdtipoDocumento,
valor seleccionado: ninguno.
d. Probar y colocar la propiedad enabled del combobox en false
e. Documento (textbox y readonly true)
f. Nombre comercial (aplica para las empresas) en personas naturales nombre de contacto
puede ser la misma empresa se hara lo mismo con todos los dems campos todos con
label y textbox
Video 2.3 CRUD, clientes cargar datos en grid
1. Seguir haciendo formulario clientes desde correo el campo aniversario se hace con
control datetimepicker colocarle enable en false y notas al textbox se le coloca la
propiedad multiline en true y Scrolbals: vertical
2. Colocar abajo un datagridview con nombre dgvDatos y definimos las siguientes
propiedades anchor: seleccionar todas queden negrilla.
3. Vamos a crear una clase CAD que devuelva todos los clientes para llenarlos en la
cuadricula
4. Vamos al ds del CAD y arrastramos la tabla cliente ya se tiene una consulta getdata que
devuelve todos los clientes pero no se puede usar si no se tiene clase para acceder a esa
consulta
5. Crear clase que permita manipular clientes
6. Para manipular los datos necesitamos un objeto que es un adaptador de la clase cliente
que se crea con el siguiente cdigo en CADCliente
private static ClienteTableAdapter adaptador = new ClienteTableAdapter();
public static dsAplicacionComercial.ClienteDataTable GetData()
{
return adaptador.GetData();
}
Se hizo un mtodo llamado getdata que trae los datos del adaptador cliente y los devuelve
en un objeto que va ser un clientedatatable y lo que se debe hacer es que ese objeto nos
sirve para cargar los clientes al gridview al proyecto de arriba.
7. Compilemos solucin
8. Colocar publica la clase cliente
9. Activamos evento load dando doble clic en cualquier parte del formulario cliente y colocar
el siguiente cdigo
dgvDatos.DataSource = CADCliente.GetData();
10. Probar que salgan todos los clientes
11. Para que nos muestre el 1er registro
12. Declarar al formulario de clientes un atributo privado al inicio del formulario despus de
public partial class frmClientes : Form
{ // ya seta
private int i = 0;
//i es un subndice porque los registros se comportan como un vector
13. La grid view solo dejarle chulito habilitar reordenacin de columnas
14. Vamos a crear un mtodo llamado mostrarregistros
MostrarRegistros(); ctl + .
}
private void MostrarRegistros()
{
txtIDCliente.Text = dgvDatos.Rows[i].Cells["IdCliente"].Value.ToString();
txtDocumento.Text = dgvDatos.Rows[i].Cells["Documento"].Value.ToString();
txtNombresContacto.Text = dgvDatos.Rows[i].Cells["NombresContacto"].Value.ToString();
txtApellidosContacto.Text = dgvDatos.Rows[i].Cells["ApellidosContacto"].Value.ToString();
txtNombreComercial.Text = dgvDatos.Rows[i].Cells["NombreComercial"].Value.ToString();
txtDireccion.Text = dgvDatos.Rows[i].Cells["Direccion"].Value.ToString();
txtTelefono1.Text = dgvDatos.Rows[i].Cells["Telefono1"].Value.ToString();
}
Video 2.4 crud clientes botones de navegacin
1. Seguir con lo anterior los cuadros de texto
txtTelefono1.Text = dgvDatos.Rows[i].Cells["Telefono1"].Value.ToString();
txtTelefono2.Text = dgvDatos.Rows[i].Cells["Telefono2"].Value.ToString();
txtCorreo.Text = dgvDatos.Rows[i].Cells["Correo"].Value.ToString();
txtNotas.Text = dgvDatos.Rows[i].Cells["Notas"].Value.ToString();
2. El combobox y datepicker
cmbTipoDocumento.SelectedValue = dgvDatos.Rows[i].Cells["IdTipoDocumento"].Value;
dtpAniversario.Value = Convert.ToDateTime(dgvDatos.Rows[i].Cells["Aniversario"].Value);
3. En caso de que no haya registros para que no saque error se hace una validacin debajo
de
tsbBuscar.Enabled = true;
tsbGuardar.Enabled = false;
tsbCancelar.Enabled = false;
txtDocumento.ReadOnly = true;
txtNombresContacto.ReadOnly = true;
txtApellidosContacto.ReadOnly = true;
txtNombreComercial.ReadOnly = true;
txtDireccion.ReadOnly = true;
txtTelefono1.ReadOnly = true;
txtTelefono2.ReadOnly = true;
txtCorreo.ReadOnly = true;
txtNotas.ReadOnly = true;
cmbTipoDocumento.Enabled = false;
dtpAniversario.Enabled = false;
}
5. PROBAR
6. Para botn nuevo
private void tsbNuevo_Click(object sender, EventArgs e)
{
HabilitarCampos();
LimpiarCampos(); ctl +.
}
private void LimpiarCampos()
{
txtIDCliente.Text = "";
txtDocumento.Text = "";
txtNombresContacto.Text = "";
txtApellidosContacto.Text = "";
txtNombreComercial.Text = "";
txtDireccion.Text = "";
txtTelefono1.Text = "";
txtTelefono2.Text = "";
txtCorreo.Text = "";
txtNotas.Text = "";
cmbTipoDocumento.SelectedIndex = -1;
dtpAniversario.Value = DateTime.Now;
}
7. Para saber si se digito o no un registro nuevo (si no es nuevo era registro editado)
8. En botn editar
nuevo = false;
9. En el botn nuevo
nuevo = true;
//para saber si al presionar guardar se le dio esta opcin por ser registro nuevo o
modificado
Video 3.1 crud clientes botn guardar
1. Para hacer el botn guardar primero hay que validar se debe utilizar un errorprovider
arrastra a cualquier parte del formulario
3.
4.
5.
6.
string Telefono2, string Correo, string Notas, DateTime Aniversario, int IdCliente)
{
adaptador.UpdateCliente(IdTipoDocumento, Documento, NombreComercial,
NombresContacto,
ApellidosContacto, Direccion, Telefono1, Telefono2, Correo, Notas, Aniversario, IdCliente);
}
Delete
public static void DeleteCliente(int IdCliente)
{
adaptador.DeleteCliente(IdCliente);
}
2. Cuando se diga guardar ahora si se llena
if (!ValidarCampos()) return;
if (nuevo)
{
CADCliente.InsertCliente((int)cmbTipoDocumento.SelectedValue, txtDocumento.Text,
txtNombreComercial.Text, txtNombresContacto.Text, txtApellidosContacto.Text,
txtDireccion.Text, txtTelefono1.Text, txtTelefono2.Text, txtCorreo.Text,
txtNotas.Text, dtpAniversario.Value);
}
else
{
CADCliente.UpdateCliente((int)cmbTipoDocumento.SelectedValue, txtDocumento.Text,
txtNombreComercial.Text, txtNombresContacto.Text, txtApellidosContacto.Text,
txtDireccion.Text, txtTelefono1.Text, txtTelefono2.Text, txtCorreo.Text, txtNotas.Text,
dtpAniversario.Value, Convert.ToInt32(txtIDCliente.Text));
}
DeshabilitarCampos();
dgvDatos.DataSource = null;
dgvDatos.DataSource = CADCliente.GetData();
if (nuevo) tsbUltimo_Click(sender, e);
MostrarRegistros();
3. Probar
4. Hacer botn eliminar
private void tsbBorrar_Click(object sender, EventArgs e)
{
DialogResult rta = MessageBox.Show("Esta seguro que desea borrar el registro actual",
"Confirmacion", MessageBoxButtons.YesNo, MessageBoxIcon.Question,
MessageBoxDefaultButton.Button2);
if (rta == DialogResult.No) return;
CADCliente.DeleteCliente(Convert.ToInt32(txtIDCliente.Text));
dgvDatos.DataSource = null;
dgvDatos.DataSource = CADCliente.GetData();
if (i != 0) i--;
MostrarRegistros();
}
En caso de que no haya registros para que no saque error se hace una validacin debajo
de
private void MostrarRegistros()
{ // Ya est antes de lo ingresado anteriormente
if (dgvDatos.Rows.Count == 0) return; //solo para tener en cuenta an no se ha
hecho
7. Organizar formulario y colocarle nombres y orden de tabulacin
Video 4.1 CRUD Proveedores parte 2
1. Arreglarle a la cuadricula para colocarle las tilde con editar columnas en la propiedad
header text y ponerle chulito solo en habilitar reordenacin.
}
2. probar
3. En el botn guardar colocar el siguiente codigo debajo del que ya se coloc
automticamente
private void bnGuardar_Click(object sender, EventArgs e)
{
this.Validate();
this.proveedorBindingSource.EndEdit();
this.tableAdapterManager.UpdateAll(this.dSAplicacionComercial);
DeshabilitarCampos(); ctl + .
}
private void DeshabilitarCampos()
{
bnPrimero.Enabled = true;
bnAnterior.Enabled = true;
bnActual.Enabled = true;
bnCantidadRegistros.Enabled = true;
bnSiguiente.Enabled = true;
bnUltimo.Enabled = true;
bnModificar.Enabled = true;
bnNuevo.Enabled = true;
bnBorrar.Enabled = true;
bnCancelar.Enabled = false;
bnBuscar.Enabled = true;
bnGuardar.Enabled = false;
cmbTipoDocumento.Enabled = false;
txtDocumento.ReadOnly = true;
txtNombresContacto.ReadOnly = true;
txtApellidosContacto.ReadOnly = true;
txtNombre.ReadOnly = true;
txtDireccion.ReadOnly = true;
txtTelefono1.ReadOnly = true;
txtTelefono2.ReadOnly = true;
txtCorreo.ReadOnly = true;
txtNotas.ReadOnly = true;
}
4. Probar
5. Hacer botn de cancelar el cdigo es
private void bnCancelar_Click(object sender, EventArgs e)
{
this.proveedorBindingSource.CancelEdit();
DeshabilitarCampos();
}
6. Probar
errorProvider1.SetError(txtApellidosContacto, "");
}
if (txtNombre.Text == "")
{
errorProvider1.SetError(txtNombre, "Debe ingresar un nombre de proveedor");
txtNombre.Focus();
return false;
}
errorProvider1.SetError(txtNombre, "");
return true;
Video 5.1 CRUD Proveedores parte 5
1. Validamos que el correo sea vlido para eso toca agregar una clase llamada
RegexUtilities en aplicacin comercial agregar elemento existente y buscar la clase
regexUtilities esta clase tiene un mtodo llamado IsValidEmail que devuelve verdadero si
el correo es valido
errorProvider1.SetError(txtNombre, "");
if (txtCorreo.Text != "")
{
RegexUtilities regexUtilities = new RegexUtilities();
if (!regexUtilities.IsValidEmail(txtCorreo.Text))
{
errorProvider1.SetError(txtCorreo, "Si ingresa un correo, este debe ser valido");
txtCorreo.Focus();
return false;
}
errorProvider1.SetError(txtCorreo, "");
}
return true;
2. Probar
3. Para botn nuevo
private void bnNuevo_Click(object sender, EventArgs e)
{
HabilitarCampos();
proveedorBindingSource.AddNew();
cmbTipoDocumento.Focus();
}
4. Probar
Video 5.2 CRUD Proveedores parte 6
1. Cuando el tipo de documento es para persona natural una cedula los nombres de
contacto y comercial son los mismos para no escribirlo dos veces se hace lo siguiente
para eso le damos doble clic al cuadro de texto NombresContacto activa evento de
textChanged que significa que cuando cambie el texto vamos a llamar un procedimiento
que se llama arma nombre ponemos el siguiente cdigo.
private void txtNombresContacto_TextChanged(object sender, EventArgs e)
{
ArmaNombre(); ctl + .
}
private void ArmaNombre()
{
if (cmbTipoDocumento.SelectedIndex == 1)
{
txtNombre.Text = txtNombresContacto.Text + " " + txtApellidosContacto.Text;
}
}
private void txtApellidosContacto_TextChanged(object sender, EventArgs e)
{
ArmaNombre();
}
2. Intervenir el botn eliminar
private void bnBorrar_Click(object sender, EventArgs e)
{
DialogResult rta = MessageBox.Show("Est seguro que desea borrar el registro actual",
"Confirmacin", MessageBoxButtons.YesNo, MessageBoxIcon.Question,
MessageBoxDefaultButton.Button2);
if (rta == DialogResult.No) return;
proveedorBindingSource.RemoveAt(proveedorBindingSource.Position);
this.tableAdapterManager.UpdateAll(this.dSAplicacionComercial);
//falta validar que cuando un proveedor ya se le ha hecho una compra no se pueda borrar
}
INSERT INTO [dbo].[Proveedor] ([IdTipoDocumento], [Documento], [NombresContacto],
[ApellidosContacto], [Nombre], [Direccion], [Telefono1], [Telefono2], [Correo], [Notas])
VALUES (@Nombre, @IdTipoDocumento, @Documento, @NombresContacto,
@ApellidosContacto, @Direccion, @Telefono1, @Telefono2, @Correo, @Notas);
UPDATE [dbo].[Proveedor] SET [IdTipoDocumento] = @IdTipoDocumento, [Documento] =
@Documento, [NombresContacto] = @NombresContacto, [ApellidosContacto] =
@ApellidosContacto, [Nombre] = @Nombre, [Direccion] = @Direccion, [Telefono1] =
@Telefono1, [Telefono2] = @Telefono2, [Correo] = @Correo, [Notas] = @Notas WHERE
[IdProveedor] = @IdProveedor
DELETE FROM [dbo].[Proveedor] WHERE [IdProveedor] = @IdProveedor
public class CADProveedor
{
private static ProveedorTableAdapter adaptador = new ProveedorTableAdapter();
public static dsAplicacionComercial.ProveedorDataTable GetData()
{
return adaptador.GetData();
}
public static void UpdateProveedor( int IdTipoDocumento, string Documento,
2. Colocar una cuadricola donde se muestran todos los proveedores para eso arrastrar
control dataGridView llamarlo dgvBusqueda y en el triangulito en elegir orgenes de datos
escogemos la tabla proveedor
3. Personalizamos cuadricula los nombres de los campos y solo dejar habilitado opcin de
reordenacin.
4. Ir al formulario de proveedores y clic en icono de buscar y colocar el siguiente codigo
private void bnBuscar_Click(object sender, EventArgs e)
{
frmBusquedaProveedor miBusqueda = new frmBusquedaProveedor();
miBusqueda.ShowDialog(); //abrir formulario como modal y es de dialogo por lo que no se
puede hacer clic en otro lado
}
5. Cambiar los cdigos de los tipos de documentos por la descripcin desde la <gridview en
el triangulo colocar el columntype: combobox en datos la opcin datasource: tabla tipo
de documento displaymenber: descripcin valuemember: idtipodoc y la propiedad
anchor: 4 esquinas.
6. Otra vez en el triangulito agregar consulta copiar lo siguiente
SELECT IdProveedor, Nombre, IdTipoDocumento, Documento, NombresContacto,
ApellidosContacto, Direccion, Telefono1, Telefono2, Correo, Notas
FROM dbo.Proveedor WHERE Documento LIKE @Documento
AND Nombre LIKE @Nombre AND NombresContacto LIKE @NombresContacto
AND ApellidosContacto LIKE @ApellidosContacto aceptar
7. Cambiar el fiiby1 la propiedad displayStyle: Image y colocarle una imagen y el
tooltipText: Aplica los criterios de bsqueda seleccionados y cambiarle nombres a los
textbox que se crearon
8. Intervenir ese botn de bsqueda
1.
2.
3.
4.
5.
}
else if (rbtEmpiece.Checked == true)
{
Documento = tstxtDocumento.Text + "%";
Nombre = tstxtNombre.Text + "%";
NombreContacto = tstxtNombresContacto.Text + "%";
ApellidoContacto = tstxtApellidosContacto.Text + "%";
}
else if (rbtTermine.Checked == true)
{
Documento = "%" + tstxtDocumento.Text;
Nombre = "%" + tstxtNombre.Text;
NombreContacto = "%" + tstxtNombresContacto.Text;
ApellidoContacto = "%" + tstxtApellidosContacto.Text;
}
else
{
Documento = tstxtDocumento.Text;
Nombre = tstxtNombre.Text;
NombreContacto = tstxtNombresContacto.Text;
ApellidoContacto = tstxtApellidosContacto.Text;
}
try
{
this.proveedorTableAdapter.FillBy(this.dSAplicacionComercial.Proveedor,
Documento, Nombre, NombreContacto, ApellidoContacto);
}
catch (System.Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}
}
6. Probar
7. Colocar botn para que quite los filtros con el siguiente cdigo
private void btnQuitarFiltros_Click(object sender, EventArgs e)
{
tstxtDocumento.Text = "";
tstxtNombre.Text = "";
tstxtNombresContacto.Text = "";
tstxtApellidosContacto.Text = "";
fillByToolStripButton_Click(sender, e);
}
Video 6.2 Bsqueda proveedores parte 3
1. En el formulario de bsqueda de proveedores crear un atributo privado y con esto
comunicar el idcliente entre los dos formularios el de proveedor y el de bsqueda
public partial class frmBusquedaProveedor : Form
{
if (!ValidarCampos()) return;
this.Validate();
this.proveedorBindingSource.EndEdit();
try
{
this.tableAdapterManager.UpdateAll(this.dSAplicacionComercial);
}
catch (Exception)
{
errorProvider1.SetError(txtDocumento, "Ese nmero de documento ya esta asgnado");
txtDocumento.Focus();
return;
}
errorProvider1.Clear();
DeshabilitarCampos();
2. Hacer crud clientes, bodegas, conceptos, departamento, unidades de medida, tipo doc
falta validacin de que no se repita una bodega, departamento, unidad de medida, tipo
doc
3. Al hacer el crud de productos en ese mismo crud se podr agregar los cdigos de barras
asociados a ese producto y parmetros de bodega
4. Agregar formulario frmProductos
5. Orgenes de datos - tabla productos definirle propiedad anchor
Video 7.1 CRUD Productos parte 2
1. En el formulario principal en la opcin productos colocar
frmProductos miform = new frmProductos();
miform.MdiParent = this;
miform.Show();
3. Borrar la barra herramientas que se creo ya q esa solo se necesitaba codigo y borrar
tambin el codigo q se creo con la barra de herramientas
4. Probar
5. Crear evento llenarGrillas(); antes de cerrar corchete
6. Con esre codigo de arriba pasarlo abajo
private void LlenarGrillas()
{
// TODO: esta lnea de cdigo carga datos en la tabla 'dSAplicacionComercial.Barra' Puede
moverla o quitarla segn sea necesario.
this.barraTableAdapter.FillBy1(this.dSAplicacionComercial.Barra,
Convert.ToInt32(txtIdProducto.Text));
}
7. Clic en estos botones llaar evento
private void bnSiguiente_Click(object sender, EventArgs e)
{
LlenarGrillas();
}
private void bnAnterior_Click(object sender, EventArgs e)
{
LlenarGrillas();
}
private void bnPrimero_Click(object sender, EventArgs e)
{
LlenarGrillas();
}
private void bnUltimo_Click(object sender, EventArgs e)
{
LlenarGrillas();
}
5. En los botones de primero ultimo, etc despus del mtodo colocar esto y tambin cuando el
formulario haga load
private void bnSiguiente_Click(object sender, EventArgs e)
{
LlenarGrillas();
CargarImagen();
}
6. Probar
6.
7.
8.
9.
{
barra = 0;
this.Close();
}
10. Para el botn aceptar el siguiente codigo de validaciones vacio, numrica, que no haya otra barra
igual, que no haya un codigo de producto igual al de una barra
private void btnAceptar_Click(object sender, EventArgs e)
{
if (txtBarra.Text == string.Empty)
{
errorProvider1.SetError(txtBarra, "Debe ingresar un nmero de cdigo barras");
txtBarra.Focus();
return;
}
errorProvider1.Clear();
if(!long.TryParse(txtBarra.Text, out barra))
{
errorProvider1.SetError(txtBarra, "Debe ingresar un nmero entero en el cdigo barras");
txtBarra.Focus();
return;
}
errorProvider1.Clear();
if (barra < 10000000)
{
errorProvider1.SetError(txtBarra, "El nmero no corresponde a un cdigo de barras");
txtBarra.Focus();
return;
}
errorProvider1.Clear();
this.Close();
}
}
2. Para poder accede a esta consulta se necesita una clase que pueda usar esa consulta en el
proyecto CAD agregamos la clase CADBarra a la clase que se crea toca colocarla publica y un
mtodo que utilice la consulta de ese table adapter llamado existe barra
4. Se debe agregar una consulta en la tabla barra para agregar registros que se llamara insertBarra y
queda de la siguiente manera
INSERT INTO [dbo].[Barra] ([IdProducto], [Barra]) VALUES (@IdProducto, @Barra)
5. Creamos en el mtodo CADBarra que llame ese insert barra de la siguiente forma
if (adapter.ExisteBarra(Barra) == null)
{
return false;
}
else
{
return true;
}
}
public static void InsertBarra(int IdProducto, long Barra)
{
adapter.InsertBarra(IdProducto, Barra);
}
6. En el botn agregar barra que esta en formulario ptos despues de mostrar el formulario barra
miform.ShowDialog();
if (miform.Barra == 0) return;
CADBarra.InsertBarra(Convert.ToInt32(txtIdProducto.Text), miform.Barra);
this.barraTableAdapter.FillBy1(this.dSAplicacionComercial.Barra,
Convert.ToInt32(txtIdProducto.Text)); //este ultimo se coje de el mtodo llenargirllas() la
parte de barra ya que no se invoca como tal xq el tambin llena la tabla bodegaProducto
7. Probar
8. Hacer botn eliminar
private void btnEliminarBarra_Click(object sender, EventArgs e)
{
DialogResult rta = MessageBox.Show("Est seguro que desea borrar la barra",
"Confirmacin", MessageBoxButtons.YesNo, MessageBoxIcon.Question,
MessageBoxDefaultButton.Button2);
if (rta == DialogResult.No) return;
}
9. Toca ir al dataset para hacer la consulta de eliminar barra llama deleteBarra
C
10. En el CADBarra despues del insertBarra colocamos
public static void DeleteBarra(long Barra)
{
adapter.DeleteBarra(Barra);
}
2. Probar
3. HAGAMOS CRUD DE EXISTECONCEPTOS EXISTEBODEGAS, EXISTE DEPARTAMENTO,
existeunidadMedida, existeBodega (pendiente existecorreo)
4. Vamos modificar parmetros bodega
5. Agregamos formulario llamado frmParamentrosBodegas propiedad formBorderStyle: fixeddialog:
maximixebox y minimixebox en false y startposition: centerparent
6. Agregar label llamado bodega con su respectivo combobox y editar las propiedades especiales y la
ultima se deja en ninguno por no estar ligado al formulario
7. En formulario de ptos en el agregar de parametrosbodegas se coloca
private void btnAgregarBodegas_Click(object sender, EventArgs e)
{
frmParametrosBodega miForm = new frmParametrosBodega();
miForm.ShowDialog();
}
8. Cuando se carga formulario aadimos este codigo para que no seleccione la primera opcion por
defecto
private void frmParametrosBodega_Load(object sender, EventArgs e)
{
// TODO: esta lnea de cdigo carga datos en la tabla 'dSAplicacionComercial.Bodega' Puede
moverla o quitarla segn sea necesario.
this.bodegaTableAdapter.Fill(this.dSAplicacionComercial.Bodega);
cmbBodegas.SelectedIndex = -1;
}
9. Aadimos los controles segn campos de la tabla BodegaProducto con textbox del stock con
readonly y para los que son nmeros un control llamado numericupdown
10. Demos doble clic en combobox de bodega
11. Vamos al ds y agregamos tabla bodegaProducto
12. Hagamos un mtodos que devuelva todos los datos agregar consulta para mostrarlo en el
formulario pero como son varios campos se empaqueta en una clase se agrega consulta que
devuelva filas que queda asi
SELECT IdBodega, IdProducto, Stock, Minimo, Maximo, DiasReposicion, CantidadMinima
FROM dbo.BodegaProducto
WHERE IdBodega =@IdBodega AND IdProducto = @IdProducto
Llamara GetBodegaProductoByIdBodegaAndIdProducto
Quitamos chulito de rellenar datatable y le ponemos mismo nombre mtodo
{
CADBodegaProducto miBodegaProducto = null;
dsAplicacionComercial.BodegaProductoDataTable miTabla =
adapter.GetBodegaProductoByIdBodegaAndIdProducto(IdBodega, IdProducto);
if (miTabla.Rows.Count == 0) return miBodegaProducto;
dsAplicacionComercial.BodegaProductoRow miRegistro =
(dsAplicacionComercial.BodegaProductoRow)miTabla.Rows[0]; //miregistro tiene la
informacion de ese registro como tal
//miregistro se convierte al objeto asi
miBodegaProducto = new CADBodegaProducto();
//CTIVAR PROPIEDADES
miBodegaProducto.CantidadMinima = (float)miRegistro.CantidadMinima;
miBodegaProducto.DiasReposicion = miRegistro.DiasReposicion;
miBodegaProducto.IdBodega = miRegistro.IdBodega;
miBodegaProducto.IdProducto = miRegistro.IdProducto;
miBodegaProducto.Maximo = (float)miRegistro.Maximo;
miBodegaProducto.Minimo = (float)miRegistro.Minimo;
miBodegaProducto.Stock = (float)miRegistro.Stock;
return miBodegaProducto;
}
}
3.
if (miBodegaProducto == null)
{
txtStock.Text = string.Empty;
nudCantidadMinimaOrdenar.Value = 1;
nudMaximo.Value = 1;
nudMinimo.Value = 1;
nudDias.Value = 1;
}
}
2. Probar
3. Para el botn aceptar si el prametro de bodega existe se actualiza y si no existe se inserta
por lo que toca agregar dos mtodos el de insertar y el de actualizar
INSERT INTO [dbo].[BodegaProducto] ([IdBodega], [IdProducto], [Stock], [Minimo],
[Maximo], [DiasReposicion], [CantidadMinima]) VALUES (@IdBodega, @IdProducto, 0,
@Minimo, @Maximo, @DiasReposicion, @CantidadMinima) llamado
insertBodegaProducto
UPDATE [dbo].[BodegaProducto] SET [Minimo] = @Minimo, [Maximo] = @Maximo,
[DiasReposicion] = @DiasReposicion, [CantidadMinima] = @CantidadMinima WHERE
[IdBodega] = @IdBodega) AND [IdProducto] = @IdProducto llamado
updateBodegaProducto
4. Vamos hacer mtodo que haga insert o update segn lo que se necesite en
CADBodegaProducto
public static void UpdateBodegaProducto(int IdBodega, int IdProducto, double Minimo,
double Maximo, int DiasReposicion, double CantidadMinima)
{
try
{
adapter.InsertBodegaProducto(IdBodega, IdProducto, Minimo, Maximo, DiasReposicion,
CantidadMinima);
}
catch (Exception)
{
adapter.UpdateBodegaProducto(Minimo, Maximo, DiasReposicion, CantidadMinima,
IdBodega, IdProducto);
}
}
{
CADBodegaProducto.UpdateBodegaProducto((int)cmbBodegas.SelectedValue, idProducto,
(double) nudMinimo.Value, (double)nudMaximo.Value, (int)nudDias.Value,
(double)nudCantidadMinimaOrdenar.Value);
this.Close();
}
3. Cargar errorprovider
4. Intervenir botn editar (fecha de modificacin no se manipula nuca siempre
estar desabilitada solo se deja a manera de consulta
5. Probar
6. Intervenir botn cancelar con ayuda de otro codigo de otro formulario
quedando asi
private void bnCancelar_Click(object sender, EventArgs e)
{
DeshabilitarCampos();
this.usuarioBindingSource.CancelEdit();
txtConfirmacion.Text = txtClave.Text;
errorProvider1.Clear();
private void DeshabilitarCampos() //solo habilitar campos es que se da focus
{
bnPrimero.Enabled = true;
bnAnterior.Enabled = true;
bnActual.Enabled = true;
bnCantidadRegistros.Enabled = true;
bnSiguiente.Enabled = true;
bnUltimo.Enabled = true;
bnModificar.Enabled = true;
bnBorrar.Enabled = true;
bnCancelar.Enabled = false;
bnBuscar.Enabled = true;
bnGuardar.Enabled = false;
txtIdUsuario.ReadOnly = true;
cmbIdRol.Enabled = false;
txtNombres.ReadOnly = true;
txtClave.ReadOnly = true;
txtConfirmacion.ReadOnly = true;
txtCorreo.ReadOnly = true;
}
Nuevo = false
nuevo = true;
Esto sirve para cuando se guarde se pueda validar si el usuario existe o no
existe por lo que el codigo de guardar queda asi
12.Crear mtodo validar usuario select que devuele solo valor llamado
existeUsuario
SELECT 1 FROM Usuario WHERE IdUsuario = @IdUsuario
13.Modicamos clase cadUsuario
public static bool ExisteUsuario(string IdUsuario)
{
if (adaptador.ExisteUsuario(IdUsuario) == null)
{
return false;
}
else
{
return true;
}
}
{
errorProvider1.SetError(txtApellido, "Debe ingresar al menos un apellido de usuario");
txtApellido.Focus();
return false;
}
errorProvider1.Clear();
if (txtClave.Text == string.Empty)
{
errorProvider1.SetError(txtClave, "Debe ingresar una clave para el usuario");
txtClave.Focus();
return false;
}
errorProvider1.Clear();
if (txtConfirmacion.Text == string.Empty)
{
errorProvider1.SetError(txtConfirmacion, "Debe ingresar una confirmacin para la clave de
usuario");
txtConfirmacion.Focus();
return false;
}
errorProvider1.Clear();
if (txtClave.Text != txtConfirmacion.Text)
{
errorProvider1.SetError(txtClave, "La clave y la confirmacin no coinciden");
errorProvider1.SetError(txtConfirmacion, "La clave y la confirmacin no coinciden");
txtClave.Focus();
return false;
}
errorProvider1.Clear();
if (txtCorreo.Text != txtCorreo.Text)
{
errorProvider1.SetError(txtCorreo, "Debe ingresar una direccin de correo");
txtCorreo.Focus();
return false;
}
errorProvider1.Clear();
RegexUtilities miValidador = new RegexUtilities();
if (!miValidador.IsValidEmail(txtCorreo.Text))
{
errorProvider1.SetError(txtCorreo, "Debe ingresar una direccin de correo valida");
txtCorreo.Focus();
return false;
}
errorProvider1.Clear();
return true;
3. Probar
4. Hacer borrar
private void bnBorrar_Click(object sender, EventArgs e)
{
DialogResult rta = MessageBox.Show("Est seguro que desea borrar el registro actual",
"Confirmacin", MessageBoxButtons.YesNo, MessageBoxIcon.Question,
MessageBoxDefaultButton.Button2);
if (rta == DialogResult.No) return;
usuarioBindingSource.RemoveAt(usuarioBindingSource.Position);
this.tableAdapterManager.UpdateAll(this.dSAplicacionComercial);
5. Valida permisos segn rol necesario saber con que usuario se entro
6. Creamos un empaquetado con todo atributos de la clase usuario para crear
objetos de la clase usuario eso se hace en el CADUsuarios
public class CADUsuario
{
public string IdUsuario { get; set; }
public string Nombres { get; set; }
public string Apellidos { get; set; }
public string Clave { get; set; }
public DateTime FechaModificaionClave { get; set; }
public int IdRol { get; set; }
public string Correo { get; set; }
private static UsuarioTableAdapter adaptador = new UsuarioTableAdapter();
//continua siguiente video //pendiente hacer consulta y mtodo para ExisteCorreo
{
private CADUsuario usuarioLogueado;
public CADUsuario UsuarioLogueado
{
get { return usuarioLogueado; }
set { usuarioLogueado = value; }
}
Y en el login colocamos esto
frmPrincipal miForm = new frmPrincipal();
miForm.UsuarioLogueado = CADUsuario.GetUsuario(txtUsuario.Text);
miForm.Show();
this.Hide();
5. Creamos barra de estado en el formulario principal para saber quien es elq esta logueado
6. En barra de hmientas cogemos un statusstip y agregamos statusLabel se cambia nombre y
en el text no ponemos nada la idea es que cuando el formulario cargue en esa barra diga el
nombre de usuario
7. En el load del formulario principal
private void frmPrincipal_Load(object sender, EventArgs e)
{
tstNombresUsuarios.Text = "Usuario: " + usuarioLogueado.Nombres
+ " " + usuarioLogueado.Apellidos;
}
8. Probar
{
frmCambioClave miform = new frmCambioClave();
miform.Show();
}
3. Copiar atributo y propiedad CADUsuario del formulario principal al cambio clave(se tiene
que hacer en casi todos los formularios)
public partial class frmCambioClave : Form
{
private CADUsuario usuarioLogueado;
public CADUsuario UsuarioLogueado
{
get { return usuarioLogueado; }
set { usuarioLogueado = value; }
}
4. Y en formulario cambio clave aadimos esta lnea
frmCambioClave miform = new frmCambioClave();
miform.UsuarioLogueado = this.usuarioLogueado;
5. En el boton aceptar
private void btnAceptar_Click(object sender, EventArgs e)
{
if(txtClaveAnterior.Text == string.Empty)
{
errorProvider1.SetError(txtClaveAnterior, "Debe ingresar la clave anterior");
txtClaveAnterior.Focus();
return;
}
errorProvider1.Clear();
if (usuarioLogueado.Clave != usuarioLogueado.Clave)
{
errorProvider1.SetError(txtClaveAnterior, "Clave incorrecta");
txtClaveAnterior.Focus();
return;
}
errorProvider1.Clear();
if (txtConfirmacionClave.Text == string.Empty)
{
errorProvider1.SetError(txtConfirmacionClave, "Debe ingresar una confirmacin para
clave");
txtConfirmacionClave.Focus();
return;
}
errorProvider1.Clear();
if(txtNuevaClave.Text == string.Empty)
{
errorProvider1.SetError(txtNuevaClave, "Debe ingresar una nueva clave");
txtNuevaClave.Focus();
return;
}
errorProvider1.Clear();
if (txtNuevaClave.Text != txtConfirmacionClave.Text)
{
errorProvider1.SetError(txtNuevaClave, "La clave y la confirmacin no son iguales");
errorProvider1.SetError(txtConfirmacionClave, "La clave y la confirmacin no son iguales");
txtNuevaClave.Focus();
return;
}
errorProvider1.Clear();
4. Probar
5. Para obligar a cambiar clave en el load del formulario principal hacemos el ste
mtodo
tslNombresUsuarios.Text = "Usuario: " + usuarioLogueado.Nombres + " " +
usuarioLogueado.Apellidos;
VerificaCambioClave(sender,e);
}
private void VerificaCambioClave(object sender, EventArgs e)
{
if (usuarioLogueado.FechaModificaionClave.AddMonths(1) < DateTime.Now)
{
cambioDeClaveToolStripMenuItem_Click(sender, e);
}
}
2. Para la opcin cambio usuario creamos otro formulario copiamos los botones del de login
definimos prop de maximeBox, minimeBox, formborderstile, acceptbutton y cancelbutton
3. Intervenir botn aceptar le colocamos la propiedad de cambio de usuario y lo del botn
aceptar del login todo prcticamente igual pero quitamos la lnea de cargar formulario ppal
public partial class frmCambioUsuario : Form
{
private CADUsuario usuarioLogueado;
public CADUsuario UsuarioLogueado
{
get { return usuarioLogueado; }
set { usuarioLogueado = value; }
}
public frmCambioUsuario()
{
InitializeComponent();
}
private void btnAceptar_Click(object sender, EventArgs e)
{
if (txtClave.Text == string.Empty)
{
errorProvider1.SetError(txtClave, "Debe ingresar una clave");
txtClave.Focus();
return;
}
errorProvider1.Clear();
if (!CADUsuario.ValidaUsuario(txtUsuario.Text, txtClave.Text))
{
MessageBox.Show("Usuario o clave no valido", "Error", MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
txtUsuario.Text = "";
txtClave.Text = "";
txtUsuario.Focus();
return;
}
usuarioLogueado = CADUsuario.GetUsuario(txtUsuario.Text);
this.Close();
}
private void btnCancelar_Click(object sender, EventArgs e)
{
usuarioLogueado = null;
this.Close();
}
4. En el formulario principal en evento de cambioUsuario colocamos lo siguiente
private void cambioDeUsuarioToolStripMenuItem_Click(object sender, EventArgs e)
{
frmCambioUsuario miForm = new frmCambioUsuario();
miForm.ShowDialog();
if (miForm.UsuarioLogueado != null)
{
this.usuarioLogueado = miForm.UsuarioLogueado;
tslNombresUsuarios.Text = "Usuario: " +
usuarioLogueado.Nombres + " " + usuarioLogueado.Apellidos;
}
}
5. Probar
1.
2.
-
3. probar
4. Ahora se mira si el usuario puede modificar y puede borrar ejemplo con
proveedores
5. Entramos al formulario de proveedores y se le vca a cargar el usuario logueado
public partial class frmProveedores : Form
{
private CADUsuario usuarioLogueado;
public CADUsuario UsuarioLogueado
{
get { return usuarioLogueado; }
set { usuarioLogueado = value; }
}
else
{
bindingNavigatorDeleteItem.Enabled = false;
}
}
8. En guardar y cancelar adicionar despus de deshabilitar
DeshabilitarCampos();
VerificarPermisos();
}
else
{
bindingNavigatorAddNewItem.Enabled = false;
BindingNavigatorEditItem.Enabled = false;
}
if (CADPermisoRol.PuedeBorrar(usuarioLogueado.IdRol, this.Name))
{
bindingNavigatorDeleteItem.Enabled = true;
}
else
{
bindingNavigatorDeleteItem.Enabled = false;
}
}
Se borro en clients
6. Las opciones q estan en la barra de hmientas se valida tambien permisos en formulario
principal en verificar permisos aadir lo ste en ptos, clients y proveedores
if (CADPermisoRol.PuedeVer(usuarioLogueado.IdRol, "frmProductos"))
{
productosToolStripMenuItem1.Visible = true;
ProductostoolStripButton.Visible = true;
}
else
{
productosToolStripMenuItem1.Visible = false;
ProductostoolStripButton.Visible = false;
}
8. Para bodegas
SELECT IdBodega, Descripcion FROM dbo.Bodega
ORDER BY Descripcion
9. Probar
10.Cuando se empiece una compra nueva adicionar el ste codigo para que no este
por defecto el primer proveedor y bodeha en el load del formulario y que tenga
por defecto cla fecha del sistema
this.proveedorTableAdapter.FillBy2(this.dSAplicacionComercial.Proveedor);
FechaDateTimePicker.Value = DateTime.Now;
ProveedorComboBox.SelectedIndex = -1;
BodegsComboBox.SelectedIndex = -1;
}
2. Probar
3. Comenzamos con la opcin de agregar productos a la compra (min 4:34)
agregamos otro label llamado pto y cuadro textbox para el pto que se puede
encontrar x codigo de barras, cod de pto o descrpcion y un botn para buscarlo
y un label que le ponemos Descripcion Producto lo ponemos yn azul y negrita
que se llama ProductoLabel. El textbox y le colocamos nombre altextbox y al
boton
4. Cargar errorprovider
5. Se necesita un evento que cuando salga de ah dispare el evento algo las
propiedades del textbox escoger entre los eventos el llamado validating
6. Toca validar si lo ingresado existe como pto o como barras
7. Hacer validaciones locales en el evento activado
if (producto <= 0)
{
errorProvider1.SetError(ProductoTextBox, "Debe ingresar un valor mayor a 0");
return;
}
errorProvider1.Clear();
8. Probar
9. Cuando el formulario haga load tambin debe blanquear el label
BodegaComboBox.SelectedIndex = -1;
ProductoLabel.Text = string.Empty;
10. Otras validaciones de si existe o no existe. SsE Necesita ir a la base de datos para en caso
de que exista lo digitado corresponde a un codigo de barras o a un Id de producto para eso
se necesita hacer un metodo
dsAplicacionComercial.ProductosDataTable miTabla =
adaptador.GetProductoByBarra(Barra);
if (miTabla.Rows.Count == 0) return miProducto;
dsAplicacionComercial.ProductosRow miRegistro =
(dsAplicacionComercial.ProductosRow)miTabla.Rows[0];
miProducto = new CADProducto();
miProducto.Descripcion = miRegistro.Descripcion;
miProducto.IdDepartamento = miRegistro.IdDepartamento;
miProducto.IdIVA = miRegistro.IdIVA;
miProducto.IdMedida = miRegistro.IdMedida;
miProducto.IdProducto = miRegistro.IdProducto;
miProducto.Imagen = miRegistro.Imagen;
miProducto.Medida = (float)miRegistro.Medida;
miProducto.Notas = miRegistro.Notas;
miProducto.Precio = miRegistro.Precio;
return miProducto;
}
2. En la clase del formulario compras se valida si existe o no
3. Crear un objeto de la clase CADProducto asi
errorProvider1.Clear();
CADProducto miProducto = CADProducto.GetProductoByIdProducto((int)producto);
if (miProducto == null) // no lo encontro como codigo de pto
{
miProducto = CADProducto.GetProductoByBarra(producto);
}
if (miProducto == null) // no esta en bd
{
errorProvider1.SetError(ProductoTextBox, "Producto no existe");
ProductoLabel.Text = string.Empty;
}
else
{
ProductoLabel.Text = miProducto.Descripcion;
}
}
4. Como saca error cuando no hay imagen y cuando no hay nada en el campo
notas en cambiar este codigo del dsaplicacioncomercial.designer
public string Imagen {
get {
try {
return ((string)(this[this.tableProductos.ImagenColumn]));
}
catch (global::System.InvalidCastException e) {
throw new global::System.Data.StrongTypingException("El valor de la
columna \'Imagen\' de la tabla \'Productos\' es DBNull.", e); borrar eso y colocar
return ;
}
}
set {
this[this.tableProductos.ImagenColumn] = value;
}
}
5. Probar
6. Codigo botn de bsqueda de pto y disparar evento validating
private void BuscarProductoButton_Click(object sender, EventArgs e)
7. Probar
8. Colocar que salga imagen para los ptos que tienen imagen el picture box de ptos pegarlo
en formulario de compras
CADProducto miProducto = CADProducto.GetProductoByIdProducto((int)producto);
if (miProducto == null) // no lo encontro como codigo de pto
{
miProducto = CADProducto.GetProductoByBarra(producto);
}
if (miProducto == null) // no esta en bd
{
errorProvider1.SetError(ProductoTextBox, "Producto no existe");
ProductoLabel.Text = string.Empty;
pbxImagen.Image = null;
}
else
{
ProductoLabel.Text = miProducto.Descripcion;
if (miProducto.Imagen != string.Empty)
{
if (File.Exists("Images\\" + miProducto.Imagen))
{
pbxImagen.Load("Images\\" + miProducto.Imagen);
}
else
{
pbxImagen.Image = null;
}
}
else
{
pbxImagen.Image = null;
}
}
}
9. Probar
10. Se necesita saber la cantidad de ptos a comprar
11. Hacemos label y textbox para la cantidad y un boton para agregar le colocamos imagen y
nombre
12. Adicionar un dataGrid en donde se coloca los datos de lo que el usuario esta comprando
Video 12.5 Compras parte 5
1. La cuadricola tiene una temporal de los ptos q se van comprando y para eso se debe
crear una lista para almacenar ptos temporales que vamos comprando
2. Para crear una lista se crea una clase llamada DetalleCompra y se agrega en aplicacin
comercial no en el CAD que tendr los atributos que se quiere que vayan temporales en la
compra
class DetalleCompra
{
public int IdProducto { get; set; }
public string Descripcion { get; set; }
public decimal Costo { get; set; }
public float Cantidad { get; set; }
public float PorcentajeIVA { get; set; }
public float PorcentajeDescuento { get; set; }
}
4.
5.
6.
7.
{
ProductoLabel.Text = miProducto.Descripcion;
ultimoProducto = miProducto;
ProductoTextBox.Focus();
return;
}
errorProvider1.Clear();
}
9. Probar
10. Vamos a validar cantidad, costo, %Descuento valido en agregar pto colocar ste codigo
if (CantidadTextBox.Text == string.Empty)
{
errorProvider1.SetError(CantidadTextBox, "Debe ingresar una cantidad");
return;
}
errorProvider1.Clear();
float cantidad;
if (!float.TryParse(CantidadTextBox.Text, out cantidad))
{
errorProvider1.SetError(CantidadTextBox, "Debe ingresar un valor numrico");
return;
}
errorProvider1.Clear();
if (cantidad <= 0)
{
errorProvider1.SetError(CantidadTextBox, "Debe ingresar un valor mayor a 0");
return;
}
errorProvider1.Clear();
if (CostoTextBox.Text == string.Empty)
{
errorProvider1.SetError(CostoTextBox, "Debe ingresar un costo del producto");
return;
}
errorProvider1.Clear();
decimal costo;
if (!decimal.TryParse(CostoTextBox.Text, out costo))
{
errorProvider1.SetError(CostoTextBox, "Debe ingresar un valor numrico");
return;
}
errorProvider1.Clear();
if (costo <= 0)
{
errorProvider1.SetError(CostoTextBox, "Debe ingresar un valor mayor a 0");
return;
}
errorProvider1.Clear();
float porcentajeDescuento = 0;
if (PorcentajeDescuentoTextBox.Text != string.Empty)
{
if (!float.TryParse(PorcentajeDescuentoTextBox.Text, out porcentajeDescuento))
numrico");
return;
}
errorProvider1.Clear();
11. Probar
12. Lo agregado aparezca en la gridview
if (porcentajeDescuento < 0 && porcentajeDescuento>100)
{
errorProvider1.SetError(PorcentajeDescuentoTextBox, "Debe ingresar un valor
mayor o igual a 0" y mennor o igual a 100);
return;
}
errorProvider1.Clear();
}
DetalleCompra miDetalle = new DetalleCompra();
miDetalle.Cantidad = cantidad;
miDetalle.Costo = costo;
miDetalle.Descripcion = ultimoProducto.Descripcion;
miDetalle.IdProducto = ultimoProducto.IdProducto;
miDetalle.PorcentajeDescuento = porcentajeDescuento;
miDetalle.PorcentajeIVA = 0; //OJO PENDIENTE
misDetalles.Add(miDetalle);
DetalleDataGridView.DataSource = null;
DetalleDataGridView.DataSource = misDetalles;
//codigo adicional agregado por mi no en videop pero si aparece desues
ultimoProducto = null;
CantidadTextBox.Text = string.Empty;
CostoTextBox.Text = string.Empty;
PorcentajeDescuentoTextBox.Text = string.Empty;
4. Hacer un metodo que devuelva una tarifa de IVA, hay un metodo getData ya pero
ese nos devuelve toda la table de IVA agregar consula .- nuevo proc almac
select que devuelve filas
SELECT IdIVA, Descripcion, Tarifa FROM dbo.IVA WHERE IdIVA = @IdIVA el
nombre del metodo sera GetIVA
5. Para poder accede a la clase se necesita consulta vamos
6. agregar una nueva clase CADIVA colocarla publica
public class CADIVA
{
public int IdIVA { get; set; }
public string Descripcion { get; set; }
public float Tarifa { get; set; }
private static IVATableAdapter adaptador = new IVATableAdapter();
public static CADIVA GetIva(int IdIVA)
{
CADIVA miIVA = null;
dsAplicacionComercial.IVADataTable miTabla = adaptador.GetIVA(IdIVA);
if (miTabla.Rows.Count == 0) return miIVA;
dsAplicacionComercial.IVARow miRegistro = (dsAplicacionComercial.IVARow)
miTabla.Rows[0];
miIVA = new CADIVA();
miIVA.Descripcion = miRegistro.Descripcion;
miIVA.IdIVA = miRegistro.IdIVA;
miIVA.Tarifa = (float)miRegistro.Tarifa;
return miIVA;
}
}
7.
errorProvider1.Clear();
}
CADIVA miIVA = CADIVA.GetIva(ultimoProducto.IdIVA);
DetalleCompra miDetalle = new DetalleCompra();
miDetalle.Cantidad = cantidad;
miDetalle.Costo = costo;
miDetalle.Descripcion = ultimoProducto.Descripcion;
miDetalle.IdProducto = ultimoProducto.IdProducto;
miDetalle.PorcentajeDescuento = porcentajeDescuento;
miDetalle.PorcentajeIVA = miIVA.Tarifa; PARA QUE TOME TARIFA EN DECIMAL
9. Lo que se areglo anteriormete con respect al campo notas e imagen que se coloca
return en vez del codigo largo se daa cada vez que se agrega un metodo por lo
tanto es necesario hacer lo siguiente vamos al dataset del CAD seleccionamos
DetalleDataGridView.Columns["PorcentajeIVA"].Width = 80;
DetalleDataGridView.Columns["PorcentajeDescuento"].HeaderText = "Porcentaje
Descuento";
DetalleDataGridView.Columns["PorcentajeDescuento"].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleRight;
DetalleDataGridView.Columns["PorcentajeDescuento"].DefaultCellStyle.Format =
"P2";
DetalleDataGridView.Columns["PorcentajeDescuento"].Width = 80;
DetalleDataGridView.Columns["ValorBruto"].HeaderText = "Valor Bruto";
DetalleDataGridView.Columns["ValorBruto"].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleRight;
DetalleDataGridView.Columns["ValorBruto"].DefaultCellStyle.Format = "C2";
DetalleDataGridView.Columns["ValorBruto"].Width = 80;
DetalleDataGridView.Columns["ValorIVA"].HeaderText = "Valor IVA";
DetalleDataGridView.Columns["ValorIVA"].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleRight;
DetalleDataGridView.Columns["ValorIVA"].DefaultCellStyle.Format = "C2";
DetalleDataGridView.Columns["ValorIVA"].Width = 80;
DetalleDataGridView.Columns["ValorDescuento"].HeaderText = "Valor Descuento";
DetalleDataGridView.Columns["ValorDescuento"].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleRight;
DetalleDataGridView.Columns["ValorDescuento"].DefaultCellStyle.Format = "C2";
DetalleDataGridView.Columns["ValorDescuento"].Width = 80;
DetalleDataGridView.Columns["ValorNeto"].HeaderText = "Valor Neto";
DetalleDataGridView.Columns["ValorNeto"].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleRight;
DetalleDataGridView.Columns["ValorNeto"].DefaultCellStyle.Format = "C2";
DetalleDataGridView.Columns["ValorNeto"].Width = 80;
}
5. QUITAR /100 DE %IVA
6.
Crear en el formulario 4 textbox para mostrar totales con readonly en true y anchor
Bottom, Right y colocarle nombres a los textbox
private void RefrescaGrid()
{
totalBruto = 0;
totalDescuento = 0;
totalIVA = 0;
totalNeto = 0;
DetalleDataGridView.DataSource = null;
DetalleDataGridView.DataSource = misDetalles;
foreach (DetalleCompra miDetalle in misDetalles)
{
totalBruto += miDetalle.ValorBruto;
totalIVA += miDetalle.ValorIVA;
totalDescuento += miDetalle.ValorDescuento;
totalNeto += miDetalle.ValorNeto;
}
if (BodegaComboBox.SelectedIndex == -1)
{
errorProvider1.SetError(BodegaComboBox, "Debe seleccionar una
bodega");
BodegaComboBox.Focus();
return;
}
errorProvider1.Clear();
if (misDetalles.Count==0)
{
errorProvider1.SetError (ProductoTextBox, "Debe ingresar productos en la
compra");
ProductoTextBox.Focus();
return;
}
errorProvider1.Clear();
}
Producto
entrada
Salida
Saldo
Ultimo
costo
Costo
promedio
13 sept
14 sept
15 sept
Mango
Mango
Mango
10
10
20
37
10
20
40
77
1000
1000
2000
1345.78
1000
1000
1500
1425.89
20*1000 = 20000
20*2000 = 40000
20000 + 40000 =
60000 y 20+20= 40
60000/40= 1500
Costo prom
public
public
public
public
public
public
public
public
CADBodegaProducto.AumentarStock(miDetalle.Cantidad, IDBodega,
miDetalle.IdProducto);
// actualizamos el kardex
CADKardex miKardex = CADKardex.UltimoKardex(IDBodega,
miDetalle.IdProducto);
if (miKardex == null)
{
}
miDetalle.Costo, miDetalle.Cantidad,
IdKardex, miDetalle.PorcentajeIVA, miDetalle.PorcentajeDescuento);
}
totalBruto = 0;
totalDescuento = 0;
totalIVA = 0;
totalNeto = 0;
3. Limpiar registros basura si la bd los tiene en lo que tiene que ver con inventario
hacer consulta en sql con este codigo
4. Probar
Video 15 Compras parte 16
1. Cosas para corregir
- Botn de eliminar uno o todas las compras
- Corregir lo del cambio de posicin
- Imgenes
4. Probar
5. BORRAR LINEA CODDIGO
SI HAY UNA LINEA SELECCIONADA ESA SE BORRA Y SI NO SE BORRA EN
ORDEN
if (rta == DialogResult.No) ;
{
e.Cancel = true;
2. El otro areglo es lo de corregir cambio posicin en form pto llega un momento que
no actualiza parmetros de bodega se activa evento alboton ptobindingsource
positionchanged y colocamos ste
if (adaptador.ProveedorTieneCompras(IdProveedor) == null)
{
return false;
}
return true;
4. Cadkardex
if (CADKardex.KardexTieneMovimientoPorIdProducto
(Convert.ToInt32(idProductoTextBox.Text)))
{
MessageBox.Show("No se puede borrar producto porque ya tiene movimientos",
"Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
productosBindingSource.RemoveAt(productosBindingSource.Position);
this.tableAdapterManager.UpdateAll(this.dSAplicacionComercial);
CADBarra.DeleteBarraByIdProducto(Convert.ToInt32(idProductoTextBox.Text));
CADBodegaProducto.DeleteBodegaProductoByIdProducto(Convert.ToInt32(idProductoTextBo
x.Text));
productosBindingSource.RemoveAt(productosBindingSource.Position);
this.tableAdapterManager.UpdateAll(this.dSAplicacionComercial);
CargarImagen();
nuevoSaldo = miDetalle.Cantidad;
nuevoCostoPromedio = miDetalle.ValorNeto / (decimal)miDetalle.Cantidad;
if (File.Exists("Images\\" + miProducto.Imagen))
{
pbxImagen.Load("Images\\" + miProducto.Imagen);
}
else
{
pbxImagen.Image = null;
}
}
else
{
pbxImagen.Image = null;
}
}
6. Saca error por errorProveder que se aade al form ventas y por la variable ultimoPto
que toca definirla al inicio del formulario comose hizo en compras en el load de vtas
7. probar
8. adicionar para que salga precio
else
{
pbxImagen.Image = null;
}
}
PrecioTextBox.Text = string.Format("{0:C2}", ultimoProducto.Precio);
this.bodegaTableAdapter.Fill(this.dSAplicacionComercial.Bodega);
// TODO: esta lnea de cdigo carga datos en la tabla 'dSAplicacionComercial.Cliente'
Puede moverla o quitarla segn sea necesario.
this.clienteTableAdapter.Fill(this.dSAplicacionComercial.Cliente);
ClienteComboBox.SelectedIndex = -1;
BodegaComboBox.SelectedIndex = -1;
ProductoLabel.Text = string.Empty;
}
private void BuscarClienteButton_Click(object sender, EventArgs e)
{
frmBusquedaClientes miBusqueda = new frmBusquedaClientes();
miBusqueda.ShowDialog();
if (miBusqueda.IDCliente == 0) return;
ClienteComboBox.SelectedValue = miBusqueda.IDCliente;
}
private void BuscarBodegaButton_Click(object sender, EventArgs e)
{
frmBusquedaBodegas miBusqueda = new frmBusquedaBodegas();
miBusqueda.ShowDialog();
if (miBusqueda.IDBodega == 0) return;
BodegaComboBox.SelectedValue = miBusqueda.IDBodega;
}
private void BuscarProductoButton_Click(object sender, EventArgs e)
{
frmBusquedaProductos miBusqueda = new frmBusquedaProductos();
miBusqueda.ShowDialog();
if (miBusqueda.IDProducto == 0) return;
ProductoTextBox.Text = miBusqueda.IDProducto.ToString();
ProductoTextBox_Validating(sender, new CancelEventArgs());
}
private void ProductoTextBox_Validating(object sender, CancelEventArgs e)
{
if (ProductoTextBox.Text == string.Empty)
{
errorProvider1.SetError(ProductoTextBox, "Debe ingresar un Id de producto o un
cdigo de barras");
return;
}
errorProvider1.Clear();
long producto;
if (!long.TryParse(ProductoTextBox.Text, out producto))
{
errorProvider1.SetError(ProductoTextBox, "Debe ingresar un valor numrico
entero");
return;
}
errorProvider1.Clear();
if (producto <= 0)
}
errorProvider1.Clear();
}
errorProvider1.Clear();
float cantidad;
if (!float.TryParse(CantidadTextBox.Text, out cantidad))
{
errorProvider1.SetError(CantidadTextBox, "Debe ingresar un valor numrico");
return;
}
errorProvider1.Clear();
if (cantidad <= 0)
{
errorProvider1.SetError(CantidadTextBox, "Debe ingresar un valor mayor a 0");
return;
}
errorProvider1.Clear();
float porcentajeDescuento = 0;
if (PorcentajeDescuentoTextBox.Text != string.Empty)
{
if (!float.TryParse(PorcentajeDescuentoTextBox.Text, out porcentajeDescuento))
{
errorProvider1.SetError(PorcentajeDescuentoTextBox, "Debe ingresar un valor
numrico");
}
errorProvider1.Clear();
if (porcentajeDescuento < 0 && porcentajeDescuento > 100)
{
errorProvider1.SetError(PorcentajeDescuentoTextBox, "Debe ingresar un valor
mayor o igual a 0 y mennor o igual a 100");
return;
}
errorProvider1.Clear();
porcentajeDescuento /= 100;
}
CADIVA miIVA = CADIVA.GetIva(ultimoProducto.IdIVA);
DetalleVenta miDetalle = new DetalleVenta();
miDetalle.Cantidad = cantidad;
miDetalle.Descripcion = ultimoProducto.Descripcion;
miDetalle.IdProducto = ultimoProducto.IdProducto;
miDetalle.PorcentajeDescuento = porcentajeDescuento;
miDetalle.PorcentajeIVA = miIVA.Tarifa / 100;
misDetalles.Add(miDetalle);
RefrescaGrid();
//DetalleDataGridView.DataSource = null; //no esta
//DetalleDataGridView.DataSource = miDetalle; //no esta
//PersonalizaGrid(); //no esta
ultimoProducto = null;
ProductoTextBox.Text = string.Empty;
ProductoLabel.Text = string.Empty;
CantidadTextBox.Text = string.Empty;
PrecioTextBox.Text = string.Empty;
PorcentajeDescuentoTextBox.Text = string.Empty;
ProductoTextBox.Focus();
}
//pbxImagen.Image = null;
DetalleDataGridView.Columns["PorcentajeDescuento"].HeaderText = "Porcentaje
Descuento";
DetalleDataGridView.Columns["PorcentajeDescuento"].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleRight;
DetalleDataGridView.Columns["PorcentajeDescuento"].DefaultCellStyle.Format =
"P2";
DetalleDataGridView.Columns["PorcentajeDescuento"].Width = 80;
DetalleDataGridView.Columns["ValorBruto"].HeaderText = "Valor Bruto";
DetalleDataGridView.Columns["ValorBruto"].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleRight;
DetalleDataGridView.Columns["ValorBruto"].DefaultCellStyle.Format = "C2";
DetalleDataGridView.Columns["ValorBruto"].Width = 80;
DetalleDataGridView.Columns["ValorIVA"].HeaderText = "Valor IVA";
DetalleDataGridView.Columns["ValorIVA"].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleRight;
DetalleDataGridView.Columns["ValorIVA"].DefaultCellStyle.Format = "C2";
DetalleDataGridView.Columns["ValorIVA"].Width = 80;
DetalleDataGridView.Columns["ValorDescuento"].HeaderText = "Valor Descuento";
DetalleDataGridView.Columns["ValorDescuento"].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleRight;
DetalleDataGridView.Columns["ValorDescuento"].DefaultCellStyle.Format = "C2";
DetalleDataGridView.Columns["ValorDescuento"].Width = 80;
DetalleDataGridView.Columns["ValorNeto"].HeaderText = "Valor Neto";
DetalleDataGridView.Columns["ValorNeto"].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleRight;
DetalleDataGridView.Columns["ValorNeto"].DefaultCellStyle.Format = "C2";
DetalleDataGridView.Columns["ValorNeto"].Width = 80;
1.
}probar
}
}
5. Creamos una consulta en el ds de Kardex un select que devuelve filas
saldo = -(float)misKardex[0].Salida;
}
adaptador.UpdateKardex(saldo, costoPromedio, ultimoCosto, misKardex[0].IdKardex);
//adicionar despus de crear mtodo updateKardex en el prximo video //se adiciona lo no
coloreado
for (int i = 1; i < misKardex.Rows.Count; i++)
{
if (misKardex[i].Entrada > 0)
{
costoPromedio = ((decimal)saldo * costoPromedio +
(decimal)misKardex[i].Entrada*misKardex[i].UltimoCosto)/
(decimal)(saldo + misKardex[i].Entrada);
saldo+=
}
}
}
2. En ds Kardex creamos mtodo para actualizar Kardex
UPDATE [dbo].[Kardex] SET
[Saldo] = @Saldo,
[CostoPromedio] = @CostoPromedio,
[UltimoCosto] = @UltimoCosto // se actualizo y se coloco esto que faltaba
WHERE [IdKardex] = @IdKardex
Llamado UpdateKardex
6. Personalizar la cuadricula
Idkarx, idpto y IdBodega visible: false
Fecha ancho colocarlo 150
Docum: 80 ancho
Entrada, Salida y saldo formato alineacin derecha N2
Ultimocosto y costoprom alineacin derecha C2
}
errorProvider1.Clear();
ProductoTextBox.Text = miProducto.IdProducto.ToString();
ActualizarDatos();
CompraComboBox.SelectedIndex = -1;
VentaComboBox.SelectedIndex = -1;
Para que cuando inicie no este seleccionado ninguna venta o compra por defecto
15.Para pintar los datos en devCLiente y DevProv es mas fcil para poder
hacer clculos en una lista por lo que tiene dos listas
- disponibles a devolver (cant disp. A devolver)
- Los que se han devuelto (cantidad devuelta)
Se necesitan dos clases por lo que en el proyecto Windows se crean dos
clases para DevCliente y dos Clases para devCompra
Video 7 devolucion clientes parte 3
1. La 1ra clase creada en el proyecto Windows la llamamos
DevolucionClienteDisponible que dice cuales son los disponibles para
devolver y creamos otra clase llama DevolucionClienteDevuleto que es
lo que ya se ha devuelto en esa devolucin
2. Lo mismo hacemos en compra DevolucionProveedorDisponible y
DevolucionProveedorDevuelto
class DevolucionClienteDisponible
{
public int IdProducto { get; set; }
public string Descripcion { get; set; }
public decimal Precio { get; set; }
public float CantidadOriginal { get; set; }
public float PorcentajeIVA { get; set; }
public float PorcentajeDescuento { get; set; }
public float CantidadDevuelta { get; set; }
public float CantidadDisponible { get { return CantidadOriginal - CantidadDevuelta;} }
}
class DevolucionClienteDevuelto
{
public int IdProducto { get; set; }
public string Descripcion { get; set; }
public
public
public
public
class DevolucionProveedorDisponible
{
public int IdProducto { get; set; }
public string Descripcion { get; set; }
public decimal Costo { get; set; }
public float CantidadOriginal { get; set; }
public float PorcentajeIVA { get; set; }
public float PorcentajeDescuento { get; set; }
public float CantidadDevuelta { get; set; }
public float CantidadDisponibleDevolver { get { return CantidadOriginal CantidadDevuelta; } }
}
lass DevolucionProveedorDevuelto
{
public int IdProducto { get; set; }
public string Descripcion { get; set; }
public decimal Costo { get; set; }
public float CantidadADevolver { get; set; }
public float PorcentajeIVA { get; set; }
public float PorcentajeDescuento { get; set; }
}
6. Probar
}
DisponibleDataGridView.DataSource = null;
DisponibleDataGridView.DataSource = misDisponibles;
PersonalizarDisponibles();
PersonalizarDevueltos();
CADAplicacionComercial.dsAplicacionComercial.VentaDetalleDataTable miTabla
= CADVentaDetalle.GetVentaDetalleByIdVenta(miVenta.IdVenta);
foreach ( CADAplicacionComercial.dsAplicacionComercial.VentaDetalleRow
miRegistro in miTabla.Rows)
{
DevolucionClienteDisponible miDisponible = new DevolucionClienteDisponible();
miDisponible.CantidadDevuelta = 0;//ojo falta llenar dev previas
miDisponible.CantidadOriginal = (float)miRegistro.Cantidad;
miDisponible.Descripcion = miRegistro.Descripcion;
miDisponible.IdProducto = miRegistro.IdProducto;
miDisponible.PorcentajeDescuento = (float)miRegistro.PorcentajeDescuento;
miDisponible.PorcentajeIVA = (float)miRegistro.PorcentajeIVA;
miDisponible.Precio = miRegistro.Precio;
misDisponibles.Add(miDisponible);
}
DisponibleDataGridView.DataSource = null;
DisponibleDataGridView.DataSource = misDisponibles;
PersonalizarDisponibles();
PersonalizarDevueltos();
9. Probar
10.Personalizar gv
DevueltoDataGridView.Columns["CantidadADevolver"].HeaderText = "Cantidad
disponible a devolver";
DevueltoDataGridView.Columns["CantidadADevolver"].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleRight;
DevueltoDataGridView.Columns["CantidadADevolver"].DefaultCellStyle.Format =
"N2";
DevueltoDataGridView.Columns["CantidadADevolver"].Width = 80;
DevueltoDataGridView.Columns["PorcentajeIVA"].HeaderText = "Porcentaje IVA";
DevueltoDataGridView.Columns["PorcentajeIVA"].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleRight;
DevueltoDataGridView.Columns["PorcentajeIVA"].DefaultCellStyle.Format = "P2";
DevueltoDataGridView.Columns["PorcentajeIVA"].Width = 80;
DevueltoDataGridView.Columns["PorcentajeDescuento"].HeaderText = "Porcentaje
Descuento";
DevueltoDataGridView.Columns["PorcentajeDescuento"].DefaultCellStyle.Alignment
= DataGridViewContentAlignment.MiddleRight;
DevueltoDataGridView.Columns["PorcentajeDescuento"].DefaultCellStyle.Format =
"P2";
DevueltoDataGridView.Columns["PorcentajeDescuento"].Width = 80;
}
6. Probar
7. Copiar los botones y el de cantidad de vta y compra
8. Codigo para botn agregar de ambos formularios
if (ProductoComboBox.SelectedIndex == -1)
{
errorProvider1.SetError(ProductoComboBox, "Debe seleccionar un producto");
ProductoComboBox.Focus();
return;
}
errorProvider1.Clear();
if (CantidadTextBox.Text == string.Empty)
{
errorProvider1.SetError(CantidadTextBox, "Debe ingresar una cantidad");
return;
}
errorProvider1.Clear();
float cantidad;
if (!float.TryParse(CantidadTextBox.Text, out cantidad))
{
errorProvider1.SetError(CantidadTextBox, "Debe ingresar un valor numrico");
return;
}
errorProvider1.Clear();
if (cantidad <= 0)
{
errorProvider1.SetError(CantidadTextBox, "Debe ingresar un valor mayor a 0");
return;
}
errorProvider1.Clear();
if (cantidad > misDisponibles[ProductoComboBox.SelectedIndex].CantidadDisponible)
{
errorProvider1.SetError(CantidadTextBox, "La cantidad a devolver no puede ser
mayor a la disponible");
return;
}
errorProvider1.Clear();
11.
Agregamos en el formulario otro campo para fechaDevolucion con
un dateTimePicker y cambiamos el que se llama fecha por FechaVenta
12.
Organizar orden de tabulacin
13.
Cuando formulario haga load aadir
FechaDevolucionDateTimePicker1.Value = DateTime.Now;
3. Los cdigos de los botones grabar de los formularios son los siguientes
private void GrabarButton_Click(object sender, EventArgs e)
{
if (CompraComboBox.SelectedIndex == -1)
{
errorProvider1.SetError(CompraComboBox, "Debe seleccionar una compra");
CompraComboBox.Focus();
return;
}
errorProvider1.Clear();
if (misDevueltos.Count == 0)
{
errorProvider1.SetError(ProductoComboBox, "Debe ingresar productos en la
devolucin");
ProductoComboBox.Focus();
return;
}
errorProvider1.Clear();
DialogResult rta = MessageBox.Show("Es seguro que querer grabar la
devolucin?",
"Confirmacin", MessageBoxButtons.YesNo, MessageBoxIcon.Question,
MessageBoxDefaultButton.Button2);
if (rta == DialogResult.No) return;
int IDBodega = (int)BodegaComboBox.SelectedValue;
int IDCompra = (int)CompraComboBox.SelectedValue; // se hace para no estarlo
casteando a cada rato
DateTime Fecha = FechaDevolucionDateTimePicker1.Value; //cambiamos de posicion
de antes a despues de comentario
//grabamos cencabezado de la devolucin
int IDDevolucion = CADDevolucionProveedor.InsertDevolucionProveedor(Fecha,
IDCompra);
//grabamos detalle de la devolucion cliente
foreach (DevolucionProveedorDevuelto miDetalle in misDevueltos)
{
//consultar saldo de pto en una bodega hacer un metodo que nos devuelva
detalle de un pto en una bodega con el metodo getbodegaProductoBIdpto que nos devuelva
el dellae en esa bodega de un pto
CADBodegaProducto miBodegaProducto =
CADBodegaProducto.GetBodegaProductoByIdBodegaAndIdProducto(
IDBodega, miDetalle.IdProducto);
if (miBodegaProducto == null) //actualizamos bodegaPto
{
CADBodegaProducto.UpdateBodegaProducto(IDBodega, miDetalle.IdProducto,
1, 1, 1, 1);
}
CADBodegaProducto.AumentarStock(miDetalle.CantidadADevolver, IDBodega,
miDetalle.IdProducto); //HUBO CAMBIOS CON RESPECTO A ESTE CODIGO
CADKardex miKardex = CADKardex.UltimoKardex(IDBodega,
miDetalle.IdProducto);
int IdKardex;
float nuevoSaldo;
decimal nuevoCostoPromedio;
decimal nuevoUltimoCosto; //adiciona despues
if (miKardex == null)
{
nuevoSaldo = miDetalle.CantidadADevolver;
nuevoCostoPromedio = miDetalle.Costo;
nuevoUltimoCosto = nuevoCostoPromedio;
}
else
{
nuevoSaldo = miKardex.Saldo + miDetalle.CantidadADevolver;
nuevoCostoPromedio =
(miKardex.CostoPromedio * (decimal)miKardex.Saldo +
miDetalle.Costo * (decimal)miDetalle.CantidadADevolver) /
(decimal)nuevoSaldo;
nuevoUltimoCosto = miDetalle.Costo;
}
IdKardex = CADKardex.InsertKardex(IDBodega, miDetalle.IdProducto,
Fecha, string.Format("DV-{0}", IDDevolucion), miDetalle.CantidadADevolver, 0,
nuevoSaldo, nuevoUltimoCosto, nuevoCostoPromedio);
// actualizamos devolucion PROVEEDOR detalle
CADDevolucionProveedorDetalle.InsertDevolucionProveedorDetalle(IDDevolucion,
miDetalle.IdProducto, miDetalle.Descripcion,
miDetalle.Costo, miDetalle.CantidadADevolver, IdKardex,
miDetalle.PorcentajeIVA, miDetalle.PorcentajeDescuento);
}
MessageBox.Show(string.Format("La devolucin al proveedor: {0}, fue grabada de
forma exitosa", IDDevolucion),
"Confirmacin", MessageBoxButtons.OK, MessageBoxIcon.Information);
CompraComboBox.SelectedIndex = -1;
ProveedorComboBox.SelectedIndex = -1;
BodegaComboBox.SelectedIndex = -1;
misDisponibles.Clear();
misDevueltos.Clear();
DisponibleDataGridView.DataSource = null;
DevueltoDataGridView.DataSource = null;
DisponibleDataGridView.DataSource = misDisponibles;
DevueltoDataGridView.DataSource = misDevueltos;
PersonalizarDisponibles();
PersonalizarDevueltos();
FechaDevolucionDateTimePicker1.Value = DateTime.Now;
}
CompraComboBox.Focus();
Grabar devclientes
private void GrabarButton_Click(object sender, EventArgs e)
{
if (VentaComboBox.SelectedIndex == -1)
{
errorProvider1.SetError(VentaComboBox, "Debe seleccionar una venta");
VentaComboBox.Focus();
return;
}
errorProvider1.Clear();
if (misDevueltos.Count == 0)
{
errorProvider1.SetError(ProductoComboBox, "Debe ingresar productos en la
devolucin");
ProductoComboBox.Focus();
return;
}
errorProvider1.Clear();
DialogResult rta = MessageBox.Show("Es seguro que querer grabar la
devolucin?",
"Confirmacin", MessageBoxButtons.YesNo, MessageBoxIcon.Question,
MessageBoxDefaultButton.Button2);
if (rta == DialogResult.No) return;
int IDBodega = (int)BodegaComboBox.SelectedValue;
int IDVenta = (int)VentaComboBox.SelectedValue; // se hace para no estarlo
casteando a cada rato
DateTime Fecha = FechaDevolucionDateTimePicker1.Value; //cambiamos de posicion
de antes a despues de comentario
//grabamos cencabezado de la devolucin
int IDDevolucion = CADDevolucionCliente.InsertDevolucionCliente(Fecha,
IDVenta);
//grabamos detalle de la devolucion cliente
foreach (DevolucionClienteDevuelto miDetalle in misDevueltos)
{
//consultar saldo de pto en una bodega hacer un metodo que nos devuelva
detalle de un pto en una bodega con el metodo getbodegaProductoBIdpto que nos devuelva
el dellae en esa bodega de un pto
CADBodegaProducto miBodegaProducto =
CADBodegaProducto.GetBodegaProductoByIdBodegaAndIdProducto(
IDBodega, miDetalle.IdProducto);
if (miBodegaProducto == null) //actualizamos bodegaPto
{
CADBodegaProducto.UpdateBodegaProducto(IDBodega, miDetalle.IdProducto,
1, 1, 1, 1);
}
CADBodegaProducto.AumentarStock(miDetalle.CantidadADevolver, IDBodega,
miDetalle.IdProducto); //HUBO CAMBIOS CON RESPECTO A ESTE CODIGO
CADKardex miKardex = CADKardex.UltimoKardex(IDBodega,
miDetalle.IdProducto);
int IdKardex;
float nuevoSaldo;
decimal nuevoCostoPromedio;
decimal nuevoUltimoCosto; //adiciona despues
if (miKardex == null)
{
nuevoSaldo = miDetalle.CantidadADevolver;
nuevoCostoPromedio = miDetalle.Precio;
nuevoUltimoCosto = nuevoCostoPromedio;
}
else
{
nuevoSaldo = miKardex.Saldo + miDetalle.CantidadADevolver;
nuevoCostoPromedio =
(miKardex.CostoPromedio * (decimal)miKardex.Saldo +
miDetalle.Precio * (decimal)miDetalle.CantidadADevolver) /
(decimal)nuevoSaldo;
nuevoUltimoCosto = miDetalle.Precio;
}
IdKardex = CADKardex.InsertKardex(IDBodega, miDetalle.IdProducto,
Fecha, string.Format("DC-{0}", IDDevolucion), miDetalle.CantidadADevolver, 0,
nuevoSaldo, nuevoUltimoCosto, nuevoCostoPromedio);
// actualizamos devolucion cliente detalle
CADDevolucionClienteDetalle.InsertDevolucionClienteDetalle(IDDevolucion,
miDetalle.IdProducto, miDetalle.Descripcion,
miDetalle.Precio, miDetalle.CantidadADevolver, IdKardex,
miDetalle.PorcentajeIVA, miDetalle.PorcentajeDescuento);
}
MessageBox.Show(string.Format("La devolucin de cliente: {0}, fue grabada de
forma exitosa", IDDevolucion),
"Confirmacin", MessageBoxButtons.OK, MessageBoxIcon.Information);
VentaComboBox.SelectedIndex = -1;
ClienteComboBox.SelectedIndex = -1;
BodegaComboBox.SelectedIndex = -1;
misDisponibles.Clear();
misDevueltos.Clear();
DisponibleDataGridView.DataSource = null;
DevueltoDataGridView.DataSource = null;
DisponibleDataGridView.DataSource = misDisponibles;
DevueltoDataGridView.DataSource = misDevueltos;
PersonalizarDisponibles();
PersonalizarDevueltos();
FechaDevolucionDateTimePicker1.Value = DateTime.Now;
}
VentaComboBox.Focus();
SELECT SUM(DevolucionClienteDetalle.Cantidad)
FROM DevolucionCliente
INNER JOIN DevolucionClienteDetalle ON
DevolucionCliente.IdDevolucionCliente =
DevolucionClienteDetalle.IdDevolucionCliente
WHERE (DevolucionCliente.IDVenta = @IdVenta) AND
(DevolucionClienteDetalle.IdProducto = @IdProducto) llamado
GetHistoriaDevolucionCliente
SELECT SUM(DevolucionProveedorDetalle.Cantidad)
FROM DevolucionProveedor
INNER JOIN DevolucionProveedorDetalle ON
DevolucionProveedor.IdDevolucionProveedor =
DevolucionProveedorDetalle.IdDevolucionProveedor
WHERE (DevolucionProveedor.IDCompra = @IdCompra) AND
(DevolucionProveedorDetalle.IdProducto = @IdProducto) llamado
GetHistoriaDevolucionProveedor
2. Vamos al cadDevClienteDet y DevProvDet para poder usar mtodos
acabados de crear
try
{
return (double)adaptador.GetHistoriaDevolucionProveedor(IdCompra, IdProducto);
}
catch (Exception)
{
return 0;
}
}
return 0;
4. Probar
5. Otra validacin
else
{
int IDProducto = (int)DevueltoDataGridView.SelectedRows[0].Cells[0].Value;
for (int i = 0; i < misDevueltos.Count; i++)
{
if (misDevueltos[i].IdProducto == IDProducto)
{
misDevueltos.RemoveAt(i);
break;
}
}
}
RefrescarDevueltos()
}
}
}
RefrescarDevueltos();
{
DialogResult rta = MessageBox.Show
("Est seguro de querer agregar todos los productos de la venta oroginal a la
devolucin?",
"Confirmacin", MessageBoxButtons.YesNo, MessageBoxIcon.Question,
MessageBoxDefaultButton.Button2);
if (rta == DialogResult.No) return;
misDevueltos.Clear();
foreach (DevolucionClienteDisponible miDisponible in misDisponibles)
{
if (miDisponible.CantidadDisponible > 0)
{
DevolucionClienteDevuelto miDevuelto = new DevolucionClienteDevuelto();
miDevuelto.CantidadADevolver = miDisponible.CantidadDisponible;
miDevuelto.Descripcion = miDisponible.Descripcion;
miDevuelto.IdProducto = miDisponible.IdProducto;
miDevuelto.PorcentajeDescuento = miDisponible.PorcentajeDescuento;
miDevuelto.PorcentajeIVA = miDisponible.PorcentajeIVA;
miDevuelto.Precio = miDisponible.Precio;
misDevueltos.Add(miDevuelto);
}
}
RefrescarDevueltos();
3. Agrego una opcin de inventario fsico a la barra de mov con las stes
opciones
- Paso 1: Programar inventario
- Paso 2: Ingresar primer conteo
- Paso 3: Ingresar segundo conteo
- Paso 4 Ingresar conteo final y hacer ajustes
- Cancelar inventarios no terminados
4. Actualizar inventario inicializarInventario
CHECKIDENT
CHECKIDENT
CHECKIDENT
CHECKIDENT
CHECKIDENT
CHECKIDENT
CHECKIDENT
CHECKIDENT
CHECKIDENT
CHECKIDENT
CHECKIDENT
CHECKIDENT
CHECKIDENT
CHECKIDENT
CHECKIDENT
(DevolucionClienteDetalle, RESEED, 0)
(DevolucionCliente, RESEED, 0)
(DevolucionProveedorDetalle, RESEED, 0)
(DevolucionProveedor, RESEED, 0)
(InventarioDetalle, RESEED, 0)
(Inventario, RESEED, 0)
(SalidaDetalle1, RESEED, 0)
(Salida, RESEED, 0)
(TrasladoDetalle, RESEED, 0)
(Traslado, RESEED, 0)
(VentaDetalle, RESEED, 0)
(Venta, RESEED, 0)
(CompraDetalle, RESEED, 0)
(Compra, RESEED, 0)
(Kardex, RESEED, 0)
8. Del cuadro de hmientas agregamos un panel que ocupe casi todo el form y
luego un crystalReportViewer Y UN BOTON EN LA PARTE DE ARRIBA
9. EN EL PPAL UN AGREGAMOS AL MEMU REPORTES LA OPCION LISTADOS
5. En el ppal llamarlo
6. Probar
7. Como sale error en el ds no solo dejar de clave 1ria el idventa si no que
adicionarle fevha
8. Vamos hacer filtros en el ds en reporteVentas agregamos nueva consulta
usar instrucciones sql select que devuelve filas
Para que sea SI debe responder preguntas los datos volverlos informacin
Con el reporte de ventas se reponde pregunta de
- cuanto he vendido?
- Cuanto vale mi inventario?
- Cual fue mi utilidad?
- Cuales ptos me generan perdidas?
- Cuales ptos tienen inventario negativo?
- Cuanto me han valido las salidas de mercanca?
- Cuanto me valio el ajuste de inventario?
- Cuales artculos tienen mayor rotacin?
- Cuales deberan ser mis precios para obtener la utilidad deseada?
1. Se empieza creando una consulta en una vista en sql para saber cuanto
vale mi inventario hacemos una vista que diga de todos los artculos cual
es el ultimo costo, costo promedio y saldo de los artculos escojemos la
tabla kartex
2. Quiero consulta que muestre todos los datos del Kardex
SELECT
FROM
SELECT
dbo.Kardex.IdBodega, dbo.Bodega.Descripcion AS Bodega,
dbo.Kardex.IdProducto, dbo.Productos.Descripcion AS Producto,
dbo.Kardex.Saldo, dbo.Kardex.UltimoCosto, dbo.Kardex.CostoPromedio
FROM
dbo.UltimoKardex1 ON dbo.Kardex.IdBodega =
dbo.UltimoKardex1.IdBodega AND dbo.Kardex.IdProducto =
dbo.UltimoKardex1.IdProducto AND dbo.Kardex.Fecha =
dbo.UltimoKardex1.Fecha INNER JOIN
dbo.Bodega ON dbo.Kardex.IdBodega = dbo.Bodega.IdBodega
INNER JOIN
dbo.Productos ON dbo.Kardex.IdProducto =
dbo.Productos.IdProducto
}
}
2. Hacemos filtros
3. Creamos otro group box llamado bodegas donde aadimos un checkbox con prop
checked en true y que llamamos todas y un combobox al lado con enable en false y
lo enlazamos con bodegas
4. Al hacer clic en el checkbox copiamos lo ste
BodegasComboBox.Enabled = true;
if (CostoPromedioRadioButton.Checked)
{
cryValorInventarioCostoPromedio miReporte = new
cryValorInventarioCostoPromedio();
DSAplicacionComercial miDS = new DSAplicacionComercial();
ReporteValorInventarioCostoPromedioTableAdapter adaptador = new
ReporteValorInventarioCostoPromedioTableAdapter();
if (TodasLasBodegasCheckBox.Checked && TodosRadioButton.Checked)
{
adaptador.Fill(miDS.ReporteValorInventarioCostoPromedio);
}
else if (TodasLasBodegasCheckBox.Checked && PositivosRadioButton.Checked)
{
adaptador.FillByPositivos(miDS.ReporteValorInventarioCostoPromedio);
}
else if (TodasLasBodegasCheckBox.Checked && NegativosRadioButton.Checked)
{
adaptador.FillByNegativos(miDS.ReporteValorInventarioCostoPromedio);
}
else if (!TodasLasBodegasCheckBox.Checked && TodosRadioButton.Checked)
{
adaptador.FillByIdBodega(miDS.ReporteValorInventarioCostoPromedio,
(int)BodegasComboBox.SelectedValue);
}
else if (!TodasLasBodegasCheckBox.Checked && PositivosRadioButton.Checked)
{
adaptador.FillByIdBodegaAndPositivos(miDS.ReporteValorInventarioCostoPromedio,
(int)BodegasComboBox.SelectedValue);
}
else
{
adaptador.FillByIdBodegaAndNegativos(miDS.ReporteValorInventarioCostoPromedio,
(int)BodegasComboBox.SelectedValue);
}
miReporte.SetDataSource(miDS);
crystalReportViewer1.ReportSource = miReporte;
}
Hacer para ultimo costo las mismas consultas y el codigo anterior sirve tambin
}
return IDCompra;
}
}
return IDCompra;
<add
name="CADAplicacionComercial.Properties.Settings.AplicacionComercialDianaConnectionSt
ring"
connectionString="Data Source=DIANA-PC\SQLEXPRESS;Initial
Catalog=AplicacionComercialDiana;Integrated Security=True"
providerName="System.Data.SqlClient" />
<connectionStrings>
<add
name="AplicacionComercial.Properties.Settings.AplicacionComercialDianaConnectionString"
connectionString="Data Source=DIANA-PC\SQLEXPRESS;Initial
Catalog=AplicacionComercialDiana;Integrated Security=True"
providerName="System.Data.SqlClient" />
<add
name="CADAplicacionComercial.Properties.Settings.AplicacionComercialDianaConnectionSt
ring"
connectionString="Data Source=DIANA-PC\SQLEXPRESS;Initial
Catalog=AplicacionComercialDiana;Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
7. En la carpeta account estn las pantallas que nos permiten hacer login,
cambio de contrasea, pagina registro
8. En app_data define archivos de configuracin
9. Dntro de content hay un archivo que es el css es el archivo que maneja
estilo de la aplicacin
10.Dentro de themes encontramos estilos de j query
11.Esta carpeta images
12.En scripts hay script de jquery
13.Crea pagina about acerca de y la pagina de contacto
14.Tiene la pagina importante que es el site master que es el encabezado
que tienen todas las paginas
15.Y el web config es donde se guarda la configuracin
16.Vamos a cambiar la bd que trae por defecto ya que si yo quiero coger mi
aplicacin y montarla en servidor web el no es capaz de hacer eso
17.De nuestra bd no usaremos ni la tabla usuario ni rol
18.Pegamos con el memberchip la aplicacin web valida usuarios con
memberships y la aplicacin Windows con la tabla usuarios
19.Vamos a crear web service que valide los usuarios para que toda la
aplicacin valide con membership
20.Creamos un web service y hacemos que la aplicacin Windows consuma
ese web service que es el q da los mtodos de si el usuario es valido o
no y a que roles pertenecen
21.Crear tablas del membersghip vamos a la capeta c Windows
Microsoft.net framework64 v4030319 asp.net_regsql.exe ste ste
nombre servidor: DIANA-PC\SQLEXPRESS base de datos:
AplicacionComercialDiana
<connectionStrings>
<add name="DefaultConnection" providerName="System.Data.SqlClient"
connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-WEB20151103104610;Integrated Security=SSPI;AttachDBFilename=|
DataDirectory|\aspnet-WEB-20151103104610.mdf" />
</connectionStrings>
Por este
<connectionStrings>
<add name="DefaultConnection"
connectionString="Data Source=DIANA-PC\SQLEXPRESS;Initial
Catalog=AplicacionComercialDiana;Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
<connectionStrings>
<add name="DefaultConnection" providerName="System.Data.SqlClient"
connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-WEB20151103184853;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetWEB-20151103184853.mdf" />
<add name="DefaultConnection" connectionString="Data
Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\aspnet-WEB20151103184853.mdf;Initial Catalog=aspnet-WEB-20151103184853;Integrated
Security=True;User Instance=True" providerName="System.Data.SqlClient" />
</connectionStrings>