Archivos para febrero, 2015

Creación de un sistema de almacén con C#

Publicado: 27 de febrero de 2015 en Actualidad

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

Creación del Proyecto

Nuestro proyecto lo realizaremos con Visual Studio 2010.

También puede utilizarse Visual C# 2010 Express el cual puede descargarse desde la página:http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-csharp-express

1. Creamos un nuevo proyecto:

2. Eliminamos el formulario y la clase:

3. Agregamos varias carpetas las cuales nos servirán para organizar nuestro proyecto:

4. Ahora agregamos cinco formularios y una clase, así como se muestra en la figura:

Nota: Por favor ignorar la carpeta llamada "Turorial", es la que estoy utilizando para generar este documento.
Una vez hecho esto, continuaremos con el diseño de la base de datos

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

Creación de la Base de datos

Creamos una base de datos con Microsoft Access, con las siguientes tablas:

users
Nombre del Campo Tipo de Datos Descripción
user_login Texto(50) Nombre de inicio de sesión
user_password Texto(255) Contraseña del usuario
nombre Texto(255) Nombre del usuario
activo Si/No Si está activo
administrar Si/No Si puede administrar el sistema
reportes Si/No Si puede ver reportes
articulos
Nombre del Campo Tipo de Datos Descripción
id_articulo Texto(50) Id del artículo
articulo Texto(255) Nombre del artículo
localizacion Texto(255) Ubicación en el almacén
grupo Texto(255) Grupo del articulo
unidad_medida Texto(255) Unidad de medida
existencia Número(Doble) Existencia
cant_min Número(Doble) Existencia mínima
costo_promedio Número(Doble) Costo promedio
entradas
Nombre del Campo Tipo de Datos Descripción
id_entrada Autonumérico Id de la entrada
fecha_registro Fecha/Hora Fecha de registro en el sistema
fecha_entrada Fecha/Hora Fecha de la entrada en el almacen
proveedor Texto(255) Nombre del proveedor
folio_factura Texto(50) Folio de la factura de compra
fecha_factura Fecha/Hora Fecha de la factura
user_login Texto(50) Usuario que registra la entrada
entradas_detalle
Nombre del Campo Tipo de Datos Descripción
id_entrada_detalle Autonumérico Id del detalle de la entrada
id_entrada Número Id de la entrada
id_articulo Texto(50) Id del artículo
cantidad Número(Doble) Cantidad que entra al almacén
precio_compra Número(Doble) Precio de compra (segun factura)
iva Número(Doble) Impuesto que cobra el proveedor (en porcentaje)
salidas
Nombre del Campo Tipo de Datos Descripción
id_salida Autonumérico Id de la salida
fecha_registro Fecha/Hora Fecha de registro en el sistema
fecha_salida Fecha/Hora Fecha de la salida
responsable Texto(255) Responsable de la salida
user_login Texto(50) Usuario que registra la salida
salidas_detalle
Nombre del Campo Tipo de Datos Descripción
id_salida_detalle Autonumérico Id del detalle de la salida
id_salida Número Id de la salida
id_articulo Texto(50) Id del artículo
cantidad Número(Doble) Cantidad que sale

Una vez que diseñamos nuestras tablas, las relacionamos. Las relaciones deben de quedar así:


Especificaciones técnicas:

  • Todos los nombres de los campos son con minúsculas. Esto no afecta en la programación, pero deseamos poder llevar un estándar en todo lo que vayamos desarrollando.
  • Deberá respetar los tipos de datos, eso nos evitará posibles errores en tiempo de ejecución.

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:

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

Reporte de Entradas

Diseño de la pantalla

Para comenzar, le daremos diseño al formulario "frmEntradasLista" el cual nos servirá para mostrar un listado de las entradas que se hayan registrado, la apariencia debe de quedar mas o menos así:


Se agregaron tres Button, un ListView y un Label, las propiedades están descritas en la siguiente tabla:

Objeto Propiedad Valor
Button Name btnNueva
Text Nueva
Button Name btnMostrar
Text Mostrar
Button Name btnSalir
Text Salir
ListView Name lvEntradas
FullRowSelect True
GridLines True
HideSelection False
Label Name lblMensaje
Text Doble clic para imprimir.

Ahora procedemos con el diseño del reporte de entradas, lo primero que haremos será crear un DataSet el cual nos servirá para el posterior diseño del reporte.

Agregamos un nuevo objeto del tipo DataSet y le asignamos el nombre dsRptEntrada como se muestra:

Le damos diseño para que quede como se muestra:

El DataSet aparece vacío, debemos agregar un DataTable y darle el diseño para que

quede como se muestra en la imagen. De entre las propiedades que debemos destacar
es que el tipo de datos de los campos cantidad, precio_compra e iva son System.Double.

Los tipos de datos para los campos id_articulo y articulo son System.String.

Una vez terminado el diseño del DataSet agregamos un Reporte, pero utilizaremos un asistente, aqui muestro con imagenes todo el proceso:


Selecionamos que nuestro origen de datos es un objeto:


En la siguiente ventana, expanda todo y ubique el DataSet que acaba de crear anteriormente, como se muestra a continuación:


Luego, escriba un nombre para el DataSet (propiedad Name), se recomienda poner el mismo que puso anteriormente:


Arrastre los campos que desea mostrar en el reporte a la sección Values como se muestra en la imagen:


Desactive la operación Sum:


Seleccione un formato (apariencia):


Elija a su gusto:


Agregue el encabezado y el pié del reporte:


Agregue los parametros prmFechaEntrada, prmFechaFactura, prmFolioFactura y prmProveedor


Ejemplo de como agregar un parametro (Repitalo con los demás):


Agregue cuatro TextBox al encabezado y organicelos ordenadamente:


Arrastre los parametros creados enfrente de los TextBox:


Agrege una columna al reporte:


Puede darle diseño al reporte, hagalo a su gusto, aqui se muestra algo muy básico:


Agregaremos una función para calcular el total:


En seguida se muestra como hacerla:


Agregaremos un nuevo formulario llamado frmVerReporte al cual agregaremos un control ReportViewer al cual estableceremos una propiedad Modifiers=Public (En la ventana de propiedades), aqui se muestra una imagen:


Hasta aqui todo ha sido diseño, ahora escribiremos el código que hace todo posible:

Declaramos las siguientes variables (En el formulario frmEntradasLista):

string CnnStr = @" Provider=Microsoft.Jet.OLEDB.4.0; " + "Data Source=D:\\DOCS\\tyrodeveloper\\almacen.mdb; " + "Jet OLEDB:Database Password=; Persist Security Info=False;"; string reportFile = @"D:\\DOCS\\tyrodeveloper\\almacen\\almacen\\Reportes\\rptEntrada.rdlc";

Ahora agregamos los siguientes procedimientos:

void generaColumnas() { lvEntradas.Clear(); lvEntradas.View = View.Details; lvEntradas.Columns.Add("Folio ", 40, HorizontalAlignment.Left); lvEntradas.Columns.Add("Fecha Entrada", 85, HorizontalAlignment.Left); lvEntradas.Columns.Add("Fecha Factura", 85, HorizontalAlignment.Left); lvEntradas.Columns.Add("Folio Factura", 85, HorizontalAlignment.Left); lvEntradas.Columns.Add("Proveedor", 200, HorizontalAlignment.Left); } void mostrarEntradas() { try { OleDbConnection cnn = new OleDbConnection(CnnStr); cnn.Open(); OleDbCommand cmd = new OleDbCommand(); cmd.Connection = cnn; cmd.CommandText = "select * from entradas"; OleDbDataReader dr = cmd.ExecuteReader(); int i = 0; lvEntradas.Items.Clear(); while (dr.Read()) { //mostramos los datos lvEntradas.Items.Add(dr["id_entrada"].ToString()); lvEntradas.Items[i].SubItems.Add(String.Format("{0:dd/MM/yyyy}",dr["fecha_entrada"])); lvEntradas.Items[i].SubItems.Add(String.Format("{0:dd/MM/yyyy}", dr["fecha_factura"])); lvEntradas.Items[i].SubItems.Add(dr["folio_factura"].ToString()); lvEntradas.Items[i].SubItems.Add(dr["proveedor"].ToString()); i++; } dr.Close(); cnn.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } void mostrarReporte(int prmIdEntrada) { try { if (!File.Exists(reportFile)) { MessageBox.Show(String.Format("No se encuentra \n{0}\nRevise por favor", reportFile)); return; } //AHORA MOSTRAMOS EL REPORTE OleDbConnection cnn = new OleDbConnection(CnnStr); cnn.Open(); DataSet dsReporte = new DataSet(); OleDbDataAdapter da = new OleDbDataAdapter("select d.*,a.articulo "+ " from entradas_detalle d,articulos a "+ " where a.id_articulo=d.id_articulo and id_entrada="+ prmIdEntrada +"", cnn); da.Fill(dsReporte, "rptentrada"); if (dsReporte.Tables["rptEntrada"].Rows.Count == 0) { cnn.Close(); MessageBox.Show("No hay Datos"); return; } Formularios.frmVerReporte frm = new Formularios.frmVerReporte(); frm.reportViewer1.LocalReport.DataSources.Clear(); frm.reportViewer1.LocalReport.Dispose(); frm.reportViewer1.Reset(); frm.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("dsRptEntrada", dsReporte.Tables["rptEntrada"])); frm.reportViewer1.LocalReport.ReportPath = reportFile; //parametros List<ReportParameter> param = new List<ReportParameter>(); OleDbCommand cmd = new OleDbCommand("select * from entradas where id_entrada=" + prmIdEntrada + "", cnn); OleDbDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { //folio_factura ReportParameter pFolioFactura = new ReportParameter(); pFolioFactura.Name = "prmFolioFactura"; pFolioFactura.Values.Add(dr["folio_factura"].ToString()); param.Add(pFolioFactura); //fecha_entrada ReportParameter pFechaEntrada = new ReportParameter(); pFechaEntrada.Name = "prmFechaEntrada"; pFechaEntrada.Values.Add(dr["fecha_entrada"].ToString()); param.Add(pFechaEntrada); //fecha_factura ReportParameter pFechaFactura = new ReportParameter(); pFechaFactura.Name = "prmFechaFactura"; pFechaFactura.Values.Add(dr["fecha_factura"].ToString()); param.Add(pFechaFactura); //proveedor ReportParameter pProveedor = new ReportParameter(); pProveedor.Name = "prmProveedor"; pProveedor.Values.Add(dr["proveedor"].ToString()); param.Add(pProveedor); } dr.Close(); //agregamos los parametros a la coleccion frm.reportViewer1.LocalReport.SetParameters(param); frm.reportViewer1.RefreshReport(); frm.ShowDialog(); cnn.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message, "Error loading report", MessageBoxButtons.OK, MessageBoxIcon.Error); } }

Agregamos sl siguiente código en el Form_Load:

lvEntradas.DoubleClick += new EventHandler(lvEntradas_DoubleClick); generaColumnas(); mostrarEntradas();

Luego, agregamos el siguiente código:

void lvEntradas_DoubleClick(object sender, EventArgs e) { if (lvEntradas.SelectedItems.Count != 0) { int _FolioEntrada = Convert.ToInt32(lvEntradas.SelectedItems[0].Text); mostrarReporte(_FolioEntrada); } }

El código para el botón btnNueva:

frmEntrada entrada = new frmEntrada(); entrada.StartPosition = FormStartPosition.CenterScreen; entrada.ShowDialog();

El código para el botón btnMostrar:

mostrarEntradas();
El código para el botón btnSalir

this.Close();

Aqui un ejemplo de la pantalla funcionando:

Aqui un ejemplo del reporte:

Creación de la ONU Sistema de almacén con C # (Parte 5)

Salidas del Almacén

Diseño de la Pantalla

Empezaremos Diseñando la Pantalla de Salidas (Formulario frmSalida), La apariencia Dębe de quedar mas o menos ASI: A Continuación del una del tabla descriptiva con los Nombres de los Objetos:

Objeto Propiedad Valor
Etiqueta Nombre lblFechaSalida
Texto Fecha de Salida:
DateTimePicker Nombre dtpFechaSalida
Formato Costumbre
CustomFormat dd / MM / aaaa
Etiqueta Nombre lblResponsable
Texto Responsable de la Salida:
TextBox Nombre txtResponsable
Etiqueta Nombre lblIdArticulo
Texto Articulo:
TextBox Nombre txtIdArticulo
Etiqueta Nombre lblCantidad
Texto Cantidad:
TextBox Nombre txtCantidad
Botón Nombre btnAgregar
Texto Buscas? Busca otros
Botón Nombre btnGrabar
Texto Grabar
Botón Nombre btnCancelar
Texto Cancelar
ListView Nombre lvSalida
FullRowSelect Verdadero
GridLines Verdadero
HideSelection Falso

Programación

La instancia de parte de la programación cuándo es la mas Enredada. Voy a considerar Que el lector Es Un novato con Nociones Bastante
Básicas e insuficientes Como párr Comprender la Estructura de la Programación C #. Recomiendo al lector Atención mucha Poner
un Los Pasos Que aqui se describan y no omitir nada, leer y re-leer Qué hacer Tiene Que he comprendido Haya Que hasta.

Declaramos las Siguientes variables:

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

Escribiremos el Código de las Funciones Procedimientos y:

void generaColumnas () { lvSalida.Clear (); lvSalida.View = View.Details; lvSalida.Columns.Add ("", 0, HorizontalAlignment.Left); lvSalida.Columns.Add ( "Id" , 100, HorizontalAlignment.Left); lvSalida.Columns.Add ( "Producto" , 240, HorizontalAlignment.Left); lvSalida.Columns.Add ( "Cantidad" , de 60 años, HorizontalAlignment.Right); } anular mostrarEntrada () { intentar { lvSalida.Items.Clear (); para ( int i = 0; i <tmpEntrada.Rows.Count; i ++) { lvSalida.Items.Add (tmpEntrada.Rows [i] [ "id" ] .ToString ()); lvSalida.Items [i] .SubItems.Add (tmpEntrada.Rows [i] [ "id_articulo" ] .ToString ()); lvSalida.Items [i] .SubItems.Add (tmpEntrada.Rows [i] [ "articulo" ] .ToString ()); lvSalida.Items [i] .SubItems.Add (String.Format ( "{0: N}" , Convert.ToDouble (tmpEntrada.Rows [i] [ "cantidad" ]))); } } captura (Exception ex) { MessageBox.Show (ex.Message, "Error" , MessageBoxButtons.OK, MessageBoxIcon.Error); } } bool agregarArticulo ( cadena prmIdArticulo, doble prmCantidad) { intentar { cadena VarID = ""; cadena varNombre = ""; doble varExistencia = 0; OleDbConnection cnn = nuevo OleDbConnection (CnnStr); cnn.Open (); cadena strSQL = "select articulo, existence de articulos" + "donde id_articulo = '" + prmIdArticulo + "'" ; OleDbCommand cmd = nuevo OleDbCommand (strSQL, cnn); Dr OleDbDataReader = cmd.ExecuteReader (); si (dr.Read ()) { VarID = prmIdArticulo; varNombre = dr [ "articulo" ] .ToString (); varExistencia = Convert.ToDouble (dr [ "existencia" ]); si (varExistencia> = prmCantidad) { // Agregamos la venta a la tabla temporal DataRow fila = tmpEntrada.NewRow (); fila [ "id_articulo" ] = VarID; fila [ "articulo" ] = varNombre; fila [ "cantidad" ] = prmCantidad; tmpEntrada.Rows.Add (fila); } otra cosa { MessageBox.Show ( "No hay suficientes EXISTENCIAS" ); } } más { MessageBox.Show ( "El articulo no existe" , "Error" , MessageBoxButtons.OK, MessageBoxIcon.Error); volver ( falso ); } dr.Close (); cnn.Close (); volver ( verdadero ); } captura (Exception ex) { MessageBox.Show (ex.Message, "Error" , MessageBoxButtons.OK, MessageBoxIcon.Error); volver ( falso ); } } bool grabarSalida ( cadena prmFechaSalida, cadena prmResponsable, cadena prmUserLogin) { intentar { OleDbConnection cnn = nuevo OleDbConnection (CnnStr); cnn.Open (); Tran OleDbTransaction = cnn.BeginTransaction (); OleDbCommand cmd = nuevo OleDbCommand (); cmd.Connection = cnn; cmd.Transaction = tran; // Insertamos el Registro de la Entrada tratar { cmd.CommandText = "insert into Salidas (fecha_salida, responsable, user_login)" + "valores (#" + prmFechaSalida + "#, '" + prmResponsable + "", "" + prmUserLogin + "')" ; cmd.ExecuteNonQuery (); // Obtenemos el folio int _FolioSalida = 0; cmd.CommandText = "select@@identidad" ; _FolioSalida = Convert.ToInt32 (cmd.ExecuteScalar ()); // Insertamos el detalle de laentrada para ( int i = 0; i <tmpEntrada.Rows.Count; i ++) { cadena _IdArticulo = Convert.ToString (tmpEntrada.Rows [i] [ "id_articulo" ]); doble _Cantidad = Convert.ToDouble (tmpEntrada.Rows [i] [ "cantidad" ]); // Insertamos el articulo cmd.CommandText = "INSERT INTO salidas_detalle (id_salida, id_articulo, amount)" + "valores (" + _FolioSalida + "," + _IdArticulo + "'," + _Cantidad + ")" ; cmd.ExecuteNonQuery (); // Actualizamosexistencias cmd.CommandText = "articulos de actualización del conjunto" + "existence = existence -" + _Cantidad + "" + "donde id_articulo = '" + _IdArticulo + "'" ; cmd.ExecuteNonQuery (); } // Finalizamos la transaccion tran.Commit (); cnn.Close (); MessageBox.Show ( "Salida GRABADA correctamente" , "Información del Sistema" , MessageBoxButtons.OK, MessageBoxIcon.Information); volver ( verdadero ); } captura (OleDbException errEntrada) { tran.Rollback (); cnn.Close (); MessageBox.Show (errEntrada.Message); volver ( falso ); } } captura (Exception ex) { MessageBox.Show (ex.Message, "Error" , MessageBoxButtons.OK, MessageBoxIcon.Error); volver ( falso ); } }

Ahora Damos doble click Sobre El Botón buscas? Busca otros (btnAgregar) y escribimos el siguiente código:

intentar { si (agregarArticulo (txtIdArticulo.Text, Convert.ToDouble (txtCantidad.Text))) { mostrarEntrada (); } } captura (Exception ex) { MessageBox.Show (ex.Message); }

Ahora, agregaremos el código párr grabar la entrada, doble hacemos click Sobre El Botón Grabar (btnGrabar) y escribimos el siguiente código:

si (grabarSalida (dtpFechaSalida.Value.ToShortDateString (), txtResponsable.Text, "admin" )) { este .Close (); }

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

//> Definimos la tabla párr las salida temporal DataColumn idColumn = nuevo DataColumn ( "id" , typeof ( int )); idColumn.Unique = verdadero ; idColumn.AutoIncrement = verdadero ; idColumn.AutoIncrementSeed = 1; idColumn.AutoIncrementStep = 1; tmpEntrada.Columns.Add (idColumn); // Declaramos el resto de los campos tmpEntrada.Columns.Add ( "id_articulo" , typeof ( cuerda )); tmpEntrada.Columns.Add ( "articulo" , typeof ( cuerda )); tmpEntrada.Columns.Add ( "cantidad" , typeof (Doble)); // agregamos ONU primaria clave tmpEntrada.PrimaryKey = nuevo DataColumn [] {tmpEntrada.Columns [ "id" ]}; // <Termina la deficinicón De La Tabla temporal generaColumnas (); mostrarEntrada ();

En El Botón Salir (btnSalir) escribimos ESTO:

este .Close ();

Aqui ONU EJEMPLO de la Pantalla FUNCIONANDO:

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

Reporte de Salidas

Diseño de la pantalla

Para comenzar, le daremos diseño al formulario "frmSalidasLista" el cual nos servirá para mostrar un listado de las salidas que se hayan registrado, la apariencia debe de quedar mas o menos así:


Se agregaron tres Button, un ListView y un Label, las propiedades están descritas en la siguiente tabla:

Objeto Propiedad Valor
Button Name btnNueva
Text Nueva
Button Name btnMostrar
Text Mostrar
Button Name btnSalir
Text Salir
ListView Name lvSalidas
FullRowSelect True
GridLines True
HideSelection False
Label Name lblMensaje
Text Doble clic para imprimir.

Ahora procedemos con el diseño del reporte de salidas, este proceso se muestra en la parte 4 de este tutorial, el cual deberá quedar mas o menos así:

Ahora agregamos los siguientes procedimientos:

void generaColumnas(){ lvSalidas.Clear(); lvSalidas.View = View.Details; lvSalidas.Columns.Add("Folio ", 40, HorizontalAlignment.Left); lvSalidas.Columns.Add("Fecha Salida", 85, HorizontalAlignment.Left); lvSalidas.Columns.Add("Responsable", 200, HorizontalAlignment.Left); } void mostrarSalidas(){ try { OleDbConnection cnn = new OleDbConnection(CnnStr); cnn.Open(); OleDbCommand cmd = new OleDbCommand(); cmd.Connection = cnn; cmd.CommandText = "select * from salidas"; OleDbDataReader dr = cmd.ExecuteReader(); int i = 0; lvSalidas.Items.Clear(); while (dr.Read()) { //mostramos los datos lvSalidas.Items.Add(dr["id_salida"].ToString()); lvSalidas.Items[i].SubItems.Add(String.Format("{0:dd/MM/yyyy}", dr["fecha_salida"])); lvSalidas.Items[i].SubItems.Add(dr["responsable"].ToString()); i++; } dr.Close(); cnn.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } void mostrarReporte(int prmIdSalida){ try{ if (!File.Exists(reportFile)){ MessageBox.Show(String.Format("No se encuentra \n{0}\nRevise por favor", reportFile)); return; } //AHORA MOSTRAMOS EL REPORTE OleDbConnection cnn = new OleDbConnection(CnnStr); cnn.Open(); DataSet dsReporte = new DataSet(); OleDbDataAdapter da = new OleDbDataAdapter("select d.*,a.articulo " + " from salidas_detalle d,articulos a " + " where a.id_articulo=d.id_articulo and id_salida=" + prmIdSalida + "", cnn); da.Fill(dsReporte, "rptSalida"); if (dsReporte.Tables["rptSalida"].Rows.Count == 0) { cnn.Close(); MessageBox.Show("No hay Datos"); return; } Formularios.frmVerReporte frm = new Formularios.frmVerReporte(); frm.reportViewer1.LocalReport.DataSources.Clear(); frm.reportViewer1.LocalReport.Dispose(); frm.reportViewer1.Reset(); frm.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("dsRptSalida", dsReporte.Tables["rptSalida"])); frm.reportViewer1.LocalReport.ReportPath = reportFile; //parametros List<ReportParameter> param = new List<ReportParameter>(); OleDbCommand cmd = new OleDbCommand("select * from salidas where id_salida=" + prmIdSalida + "", cnn); OleDbDataReader dr = cmd.ExecuteReader(); while (dr.Read()){ //fecha_salida ReportParameter pFechaEntrada = new ReportParameter(); pFechaEntrada.Name = "prmFechaSalida"; pFechaEntrada.Values.Add(dr["fecha_salida"].ToString()); param.Add(pFechaEntrada); //responsable ReportParameter pProveedor = new ReportParameter(); pProveedor.Name = "prmResponsable"; pProveedor.Values.Add(dr["responsable"].ToString()); param.Add(pProveedor); } dr.Close(); //agregamos los parametros a la coleccion frm.reportViewer1.LocalReport.SetParameters(param); frm.reportViewer1.RefreshReport(); frm.ShowDialog(); cnn.Close(); } catch (Exception ex){ MessageBox.Show(ex.Message, "Error al cargar el reporte", MessageBoxButtons.OK, MessageBoxIcon.Error); } }

Agregamos sl siguiente código en el Form_Load:

lvSalidas.DoubleClick += new EventHandler(lvSalidas_DoubleClick); generaColumnas(); mostrarSalidas();

Luego, agregamos el siguiente código:

void lvSalidas_DoubleClick(object sender, EventArgs e) { if (lvSalidas.SelectedItems.Count != 0){ int _FolioSalida = Convert.ToInt32(lvSalidas.SelectedItems[0].Text); mostrarReporte(_FolioSalida); } }

El código para el botón btnNueva:

frmSalida salida = new frmSalida(); salida.StartPosition = FormStartPosition.CenterScreen; salida.ShowDialog();

El código para el botón btnMostrar:

mostrarSalidas();
El código para el botón btnSalir

this.Close();

Aqui un ejemplo de la pantalla funcionando:


Aqui un ejemplo del reporte:


Hasta este punto ya hemos desarrollado la funcionalidad básica. En la siguiente parte haremos que aparesca una pantalla pricipal desde la que mandaremos llamar las que hasta hoy hemos desarrollado.

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

Pantalla principal

Le daremos diseño al formulario frmPrincipal agregando un MenuStrip, un ToolStrip y estableciendo su pripiedad IsMdiContainer = true para que quede de la siguiente manera:

A continuación una tabla que describe los objetos:

Objeto Propiedad Valor
MenuStrip Name mnuPrincipal
ToolStripMenuItem Name mnuArchivo
Text Archivo
ToolStripMenuItem Name mnuAyuda
Text Ayuda
ToolStripMenuItem Name mnuEntradas
Text Entradas
ToolStripMenuItem Name mnuSalidas
Text Salidas
ToolStripMenuItem Name mnuSalir
Text Salir del Sistema
ToolStrip Name barPrincipal
ToolStripButton Name btnEntradas
Text Entradas
DisplayStyle ImageAndText
TextImageRelation ImageAboveText
Image (A su gusto)
ToolStripButton Name btnSalidas
Text Salidas
DisplayStyle ImageAndText
TextImageRelation ImageAboveText
Image (A su gusto)
ToolStripButton Name btnSalir
Text Salir
DisplayStyle ImageAndText
TextImageRelation ImageAboveText
Image (A su gusto)

Ahora crearemos los siguientes procedimientos:

void entradas() { frmEntradasLista entradas = new frmEntradasLista(); entradas.MdiParent = this; entradas.Show(); } void salidas() { frmSalidasLista salidas = new frmSalidasLista(); salidas.MdiParent = this; salidas.Show(); } void salir() { this.Close(); } 

Ahora solo resta poner el código en cada uno de los botones y menús, los ponemos de uno por uno, dando doble clic sobre cada uno, iniciamos con mnuEntradas:

entradas();
Seguimos con mnuSalidas:

salidas();
Asi lo hacemos también con los botones btnEntradas y btnSalidas

Ahora, el toque final de nuestra aplicación, abrimos la clase InicioAplicacion y nos aseguramos que esté como se muestra a continuación:

using System; using System.Windows.Forms; namespace almacen.Clases { class InicioAplicacion { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Formularios.Principal()); } } } 

Aqui un ejemplo de la pantalla funcionando:

Taxi alerta retenciones de ISLR UT 150

Publicado: 26 de febrero de 2015 en Actualidad

Mendoza, Delgado, Labrador & Asociados
Miembro de Ernst & Young Global

Tiene el gusto de poner a su disposición un nuevo EY Tax Alert Venezuela por cuanto fueron modificadas las tasas aplicables a la retención del pago del Impuesto Sobre la Renta en función del reajuste de la Unidad Tributaria.

Para tener acceso al texto completo del EY Tax Alert:

En caso de que tenga alguna duda relacionada con este EY Tax Alert Venezuela, contáctenos por el teléfono: +58-212-905.6600

Para obtener más información sobre nuestros servicios, lo invitamos a que visite nuestra página web: http://www.ey.com/ve y Twitter: @EY_Venezuela

Si usted no desea continuar recibiendo el EY Tax Alert Venezuela, favor escribir a la siguiente dirección: jessica.crincoli con la palabra DESINCORPORAR en el asunto, indicando el correo electrónico que debe ser removido de la lista de distribución de información.

Freddy Johan Moreno Diaz
Tlf: 0412 3759126

TAX ALERT UT 150.pdf

Avance Extraordinario
AVANCE EXTRAORDINARIO Nº 01 DE IMPUESTOS (2015)
REAJUSTE DE LA UNIDAD TRIBUTARIA
Fue publicada en Gaceta Oficial de la República Bolivariana de Venezuela, Nº 40.608 de fecha 25 de febrero de 2015, Providencia N° SNAT/2015/0019 por la cual se reajusta la Unidad Tributaria a CIENTO CINCUENTA BOLÍVARES (Bs. 150,00) quedando de esta manera derogada la Providencia Administrativa del SENIAT N° SNAT/2014/0008 de fecha 19 de febrero de 2014, publicada en Gaceta Oficial No. 40.359, que establecía dicho valor en CIENTO VEINTISIETE BOLÍVARES (Bs. 127,00).

En los casos de tributos que se liquiden por períodos anuales, la unidad tributaria aplicable será la que esté vigente durante por lo menos ciento ochenta y tres días (183) continuos del período respectivo, y para los tributos que se liquiden por períodos distintos al anual, la unidad tributaria aplicable será la que esté vigente para el inicio del período, todo de conformidad con lo establecido en el Parágrafo Tercero del artículo 3 del Decreto con Rango, Valor y Fuerza de Ley del Código Orgánico Tributario.

En consecuencia:

  • Si el AR-I (Determinación del porcentaje de retención por conceptos de sueldos y salarios), ya se realizó; deberá modificarse de acuerdo con lo establecido en el Art. 7 del Decreto 1.808 en materia de Retenciones del ISLR durante la primera quincena del mes de marzo. Si aún no se ha efectuado, el mismo se debe elaborar con base a la nueva unidad tributaria.
  • Se incrementa el costo de las estampillas, timbres fiscales y multas que se paguen a partir de la fecha de publicación en la Gaceta Oficial. Asimismo, los reparos emitidos a partir de esta fecha tendrán el nuevo valor, así como el pago de los reparos elaborados con fecha anterior pero no pagados hasta el día de hoy.
  • La Declaración Definitiva de Rentas correspondiente al ejercicio fiscal del año 2014, deberá ser efectuada con base a la unidad tributaria correspondiente a dicho año, a lo que corresponde la unidad tributaria de Bs. 127,00.
  • El cambio de la unidad tributaria en materia de Retenciones de ISLR deberá tomarse en consideración a partir del 01 de marzo de 2015.
Twitter@JDTonline Facebook Ediciones Jurisprudencia del Trabajo Twitterwww.juris-line.com.ve
Para dejar de recibir esta Información por correo electronico por favor escriba a la cuenta jdt y notifiquelo. Muchas Gracias!

w.php?A=694&L=24701&C=124835&ID=fmoreno@lvs.com.ve

no_span.gif <a href="http://www.radarsystems.net/aa/?accion=frmremover&A=694&ID=fmoreno | Reenviar | Politicas de Privacidad

JURIS EVENTUM C. A.
Paseo Colon, Torre Oeste, Piso 14 Urb. Los Caobos, Plaza Venezuela
Rif: J-00269617-6
Teléfonos: +58-212-793 0084
Fax: +58-212-793.3003

Monitoreado por
RadarSystems

25 February, 2015 23:51

Publicado: 25 de febrero de 2015 en Actualidad

PASOS PARA CONFIGURAR SQL SERVER 2008 PARA ADMITIR CONEXIONES REMOTAS.

Las nuevas políticas de Seguridad de Microsoft incorporan restricciones a la hora de comenzar a usar SQL Server 2008. Los Servicios que antes estaban habilitados por defecto, ahora no lo están, y es función del Administrador ir habilitándolos según las necesidades de uso del mismo.

Una de las cuestiones más importantes es la de Admitir Conexiones Remotas en nuestro Servidor. A fin de habilitarlas y asegurarnos que se pueden conectar desde otros ordenadores debemos seguir unos sencillos pasos:

1. Abriremos SQL Server Management Studio, nos situamos encima de la instancia de nuestro Servidor y pulsamos botón derecho, Propiedades, seleccionamos Conexiones, nos mostrara la siguiente pantalla:

1.jpg

Ahora marcamos el checkbox: “Permitir conexiones remotas con este servidor” u pulsamos aceptar.

2. Vamos al Menú de Inicio > Programas > Microsoft SQL Server 2008 > Herramientas de Configuración > Administrador de Configuración de SQL Server, aparece la siguiente ventana:

2.jpg

Seleccionamos la Configuración de red de SQL Server y luego Protocolos de MSSQLSERVER. Como podemos observar, por defecto solo tiene habilitado el protocolo de Memoria compartida, el resto estan deshabilitados. Básicamente es el tipo de protocolo que se usa, cuando nos conectamos a SQL Server desde el mismo Servidor.

Lo que debemos hacer es habilitar los protocolos: “Canalizaciones con nombre” y “TCP/IP”. Para lo cual, pulsamos con el botón derecho del ratón encima de los mismos y pulsamos Habilitar. En las dos ocasiones nos mostrara un mensaje informándonos, que para que la nueva configuración surta efecto abra que reiniciar el Servicio de SQL Server.

Ahora nos quedará así:

3.jpg

3. Vamos al Menú de Inicio > Ejecutar y escribimos services.msc y le damos aceptar. De esta forma nos abrirá la Consola de Administración de Servicios. Nos desplazamos hasta el Servicio con nombre “SQL Server (MSSQLSERVER)”, nos situamos encima y pulsamos el botón derecho del ratón, seleccionando; reiniciar. Con esto aplicaremos los cambios efectuados en el paso anterior.

4.jpg

4. SI estamos utilizando SQL Server con nombre de instancia y sin emplear un número concreto de puerto TCP/IP, debemos habilitar el servicio SQL Server Browser, que se encuentra en la misma ventana de Servicios con el nombre de “SQL Server Browser”. Nos situamos encima y con el botón derecho del ratón pulsamos en Propiedades, o bien podemos hacer doble click, es lo mismo.

5.jpg

En el Tipo de Inicio, seleccionamos Automático y pulsamos Iniciar para que el Servicio arranque. Aceptar para cerrar la pantalla.

Este Servicio comporta ciertos riesgos de seguridad que deben ser considerados, pues existen otras alternativas a utilizar como configurar el Cliente de SQL Servidor con el Alias del Servidor, o utilizar la conexión incorporando el puerto de TCP/IP a usar, por defecto en SQL Server es el 1433.

5. Y por último, en caso de tener habilitado el Firewall de Windows, cosa que deberíamos tener por Seguridad, deberemos configurarlo para que los Servicios de SQL Server y SQL Browser puedan comunicarse con el exterior. Vamos a Menú de Inicio , hacemos clic en Ejecutar , escribimos firewall.cpl y pulsamos Aceptar. Nos muestra esta ventana:

6.jpg

Pulsamos en “Permitir un programa a través del Firewall de Windows” nos muestra:

7.jpg

Pulsamos en Agregar programa nos muestra la ventana:

8.jpg

Pulsamos en Examinar e introducimos la carpeta donde se encuentra el Servicio de SQL Server: “C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Binn” en la misma seleccionamos el programa: “sqlservr.exe” y pulsamos Aceptar. Repetimos la operación para añadir el SQL Server Browser que se encuentra en la carpeta: “C:\Program Files\Microsoft SQL Server\90\Shared”. Seleccionamos el programa: “sqlbrowser.exe” y pulsamos Aceptar. Veremos que ambas excepciones nos aparecen en la pantalla de Configuración del Firewall.

Y con esto ya tenemos configurado nuestro Servidor SQL 2008 para permitir Conexiones desde cualquier ordenador de nuestra red.

TASA SIMADI A LAS IMPORTACIONES

Publicado: 23 de febrero de 2015 en Actualidad

YI

Por medio de la presente se les informa que según las nuevas regulaciones establecidas en el convenio cambiario N° 33 en concordancia con la circular 226 del SENIAT, todas las importaciones se deben nacionalizar con el tipo de cambio que corresponda al de la obtención de divisas (CADIVI, SICAD I o SICAD II), en el caso de las importaciones con fondos propios se utilizara la tasa de cambio vigente del BCV que corresponda al SIMADI y la misma es aplicable para el momento de la declaración de aduana indistintamente de su fecha de llegada. Esta normativa aplica a partir del 18 de Febrero del presente año.

La Tasa Simadi publicada por el Banco Central de Venezuela (BCV) el día hábil bancario anterior a la fecha de la nacionalización para todas sus importaciones, de acuerdo con lo establecido en el artículo 26 en concordancia con el artículo 24 del Convenio Cambiario 33, que establece que el BCV fijará diariamente el tipo de cambio de referencia para la conversión de la moneda extranjera en la determinación de la base imponible de las obligaciones tributarias derivadas de las operaciones aduaneras.

Como es de su conocimiento, en Emerson Venezuela estamos importando con recursos Propios, por tal motivo para efectos aduaneros la TASA a utilizar para el Tipo de Cambio es SIMADI.

Veamos el impacto en el cambio de las tasas a través de un ejemplo:

Calculado a 49.985

MONEDA EXTR CAMBIO MONEDA BS
Precio Neto según Factura 16.081,57 49,985 803.837,28
Flete Internacional 2.076,82 49,985 103.809,85
Seguro 48,25 49,985 2.411,78
Total Valor a declarar: CIF 910.058,90
BASE IMPONIBLE TARIFA IMPORTE BS
Impuesto AD-VALOREM 910.058,90 14 127.408,25
TASA POR SERVICIO ADUANA 910.058,90 0,5 4.550,29
TASA SENIAT 910.058,90 0,5 4.550,29
IVA 1.046.567,74 12 125.588,13
MULTA 0,00 0 635,00
TOTAL ESTIMADO 262.731,96

De esta manera, hago extensa esta información, haciéndoles llegar la circular emitida por el SENIAT y el convenio cambiario # 33.

Adicional, anexo circular emitida por Bolipuertos donde se indica el nuevo esquema de facturación, lo que significa un incremento considerable en las tarifas.

CIRCULAR 226 del 18022015 tasa de cambio Valor.pdf
convenio33.pdf

Freddy Johan Moreno Diaz
Tlf: 0412 3759126

Reforma LOA enero 2015 ver1.pdf

SENIAT Reforma Leyes Tributarias 2015.pdf

Combinar Tablas

Publicado: 19 de febrero de 2015 en Actualidad

Combinar tablas – JOIN
Otros (Articulos) | Fecha: 20/09/06
Versiones
Editar
Envía tu artículo >>

Un join es una combinación de dos o más tablas de una base de datos relacional, es una instrucción de lo más imprescindible si queremos realizar una aplicación que realice un uso correcto e intensivo de un gestor de Bases de datos cómo MySQL.

Y es que gracias a los JOIN podemos leer datos de diferentes bases de datos en una única consulta. Lo que nos permitirá diseñar fácilmente tablas relacionadas entre ellas, veamos un ejemplo:

join.png
Figura 1: En este ejemplo podemos ver una relación entre las tablas de empleados y de despachos, y la representación de un join entre ambas

MySQL soporta muchas sintaxis diferentes para la instrucción JOIN en comandos de SELECT, DELETE y UPDATE.

Escribiremos la instrucción de JOIN en el apartado de referéncia de tablas ( el WHERE ) de nuestra consulta SQL, escojeremos la sintaxis de JOIN de las mencionadas anteriormente según el tipo de JOIN que queramos realizar.

A continuación se explican, con sus ejemplos en MySQL, los principales tipos de JOIN.

ArribaTabla de contenido

ArribaINNER JOIN o ,

Este tipo de JOIN une los resultados coincidentes en ambas tablas, no devolverá un registro de una tabla si no coincide con otro de la otra.

000
SELECT * FROM empleados,despachos WHERE empleados.despacho_id = despachos.id

selecc.gif Seleccionar colr.gif SQL

join_result_01.png

ArribaLEFT (RIGHT) JOIN

LEFT JOIN retorna los registros de la primera tabla aunque no coincidan con ninguno de la otra.

RIGHT JOIN realiza lo mismo pero en base a la segunda tabla.

000
SELECT * FROM empleados LEFT JOIN despachos ON empleados.despacho_id = despachos.id

selecc.gif Seleccionar colr.gif SQL

join_result_02.png

ArribaNATURAL JOIN

Este JOIN retorna los registros de ambas tablas que coincidan en todos los campos con el mismo nombre ( en el ejemplo empleados.nombre y despachos.nombre ).

RIGHT JOIN realiza lo mismo pero en base a la segunda tabla.

000
SELECT * FROM empleados NATURAL JOIN despachos

selecc.gif Seleccionar colr.gif SQL

join_result_03.png

Cursos

Cursos Cuestionarios Curso de MySQL Capítulo

3 votos

Combinar tablas – Subconsultas
Otros (Articulos) | Fecha: 02/10/13
Versiones
Editar
Envía tu artículo >>

Las subconsultas, introducidas en la versión 5 de mySQL, nos permiten combinar datos de tablas diferentes en una consulta determinada. Las subconsultas las delimitamos entre paréntesis y las podemos usar en muchas clausulas ( SELECT, WHERE, SET … ).

ArribaTabla de contenido

ArribaSubconsultas con un resultado

Vamos a ver un ejemplo sencillo de subconsulta en la que suponemos las siguientes tablas:
ejemplo-subquery.jpg
Dadas estas tablas, haremos una consulta que seleccione los despachos con el numero de empleados en cada despacho.

000
SELECT despachos.*, ( SELECT count(*) FROM empleados WHERE empleados.despacho_id = despachos.id ) as empleados FROM despachos

selecc.gif Seleccionar colr.gif SQL

También podríamos seleccionar los despachos que tienen más de 5 empleados poniendo la subconsulta en el WHERE:

000
SELECT despachos.* FROM despachos WHERE ( SELECT count(*) FROM empleados WHERE empleados.despacho_id = despachos.id ) > 5

selecc.gif Seleccionar colr.gif SQL

Una consideración a tener en cuenta y se cumple en los ejemplos anteriores es que la subconsulta debe estar diseñada para que siempre devuelva un único resultado y que éste resultado tenga una única columna. De lo contrario obtendremos un Error mySQL

ejemplo-subquery-2.jpg
La subconsulta sólo puede devolver una fila y una columna

ArribaSubconsultas con resultado array

Acabamos de explicar que una subconsulta sólo puede tener un resultado ( una fila y una columna ). Esto es así porqué al asignar un nombre de columna ‘( SUBCONSULTA ) as empleados’ o utilizar el operador ‘( SUBCONSULTA ) > 5’ tenemos un operador que espera un único parámetro.

En algunos casos podemos querer una subconsulta que nos retorne más de un resultado, por ejemplo imaginemos que tenemos la tabla despachos anterior y esta:

ejemplo-subquery-3.jpg

Y queremos obtener todas los despachos en una planta dirigida por ‘Jose María’ .

000
SELECT * FROM despachos WHERE planta IN ( SELECT id FROM plantas WHERE director = 'Jose María' )

selecc.gif Seleccionar colr.gif SQL

Suponiendo que hay 2 plantas dirigidas por ‘Jose María’ con id 1 y 3, el resultado de la subconsulta seria:

ejemplo-subquery-4.jpg

Con lo que la consulta seria equivalente a:

000
SELECT * FROM despachos WHERE planta IN ( 1, 3 )

selecc.gif Seleccionar colr.gif SQL