Hola amigos, de nuevo molestandolos ... estoy diseñado un sistema de ventas e inventarios, lo estoy haciendo en VB.Net 2005. Ya estoy controlando lo que son salidas y entradas de mercancia al almacen, al igual que las altas y bajas de clientes, lo cual pues no es dificil, mi problema ahora viene en como programo la parte de las ventas Por ejemplo, estoy pensando en manejar un tabla de ventas que es en la que quiero registrar que articulo vendo cada vez, con su id y su descripcion, asi como el cliente que lo compro, la cantidad,fecha y un id de ventas, con lo cual si quiero checar todos los articulos de un venta especifica pues pueda hacerlo, obviamente al hacer una venta a credito voy a afrectar otra tabla que se llama creditos, en donde tengo id de mis clientes, id de venta, y el monto total de cada venta, asi como la fecha de la venta y claro, no puede faltar que afecte mi tabla de inventario pues en la cual tengo que actualizar la 'cantidad' de articulos que van a quedar,lo que estaba pensando hacer era poner un DataGridView en el formulario de ventas, y en el campo de clave que vayan tecleando o entrando la clave del articulo, la cantidad y al dar enter haga la consulta y meta los demas datos necesarios a datagridview, ya lo que no se es cuando ya este todo en la datagridvew ejecutar la venta y de ahi se hagan todas las modificaciones a las tablas pertinentes , alguna idea? u orientación? saludos. :-X
Podrias:
* Crear un procedure para registrar la venta, en el mismo proc actualiza el stock segun ingreses un producto a la venta.
* Usar triggers para actualizar el stock del producto cuando se haga una insercion en la tabla de venta.
Recomendaria que en este caso uses la segunda opcion.
Saludos.
Cita de: Hadess_inf en 23 Abril 2009, 19:21 PM
Podrias:
* Crear un procedure para registrar la venta, en el mismo proc actualiza el stock segun ingreses un producto a la venta.
* Usar triggers para actualizar el stock del producto cuando se haga una insercion en la tabla de venta.
Recomendaria que en este caso uses la segunda opcion.
Saludos.
A ver, es que este es mi primer sistema de ventas asi que ando algo oscuro en el asunto xD. Con lo que me has dicho quiere decir que cada vez que ingrese un artciulo al datagrid view se hace la consulta de insercion en la tabla ventas, y eso dispara el trigger o el SP que me actualizara los demas datos en las tablas consecuentes??? Lo pregunto porque yo pensaba que primero se llenaba el datagrid y luego con todos los datos se hacia una consulta que tomara los datos de cada row y asi se iba haciendo todo, y asi si antes de efectuar la venta el cliente queria eliminar algun producto pues solo lo eliminaba del DGview, entonces si lo hago asi como dices debo hacer otro procedimiento para eliminar un articulo tanto del datagridview como de la tabla de ventas en la base de datos???
Lo que dices es correcto, pero solo una parte. Claro esta que llamaras al sp cuando des click en algun boton "VENDER" y no cuando estes en pleno llenado de la grilla (sino iamginate que puede ocurrir lo que tu comentas, y en ese caso tendrias que elaborar otro procedimiento para eliminar lo ya insertado).
Cita de: Hadess_inf en 24 Abril 2009, 02:25 AM
Lo que dices es correcto, pero solo una parte. Claro esta que llamaras al sp cuando des click en algun boton "VENDER" y no cuando estes en pleno llenado de la grilla (sino iamginate que puede ocurrir lo que tu comentas, y en ese caso tendrias que elaborar otro procedimiento para eliminar lo ya insertado).
Gracias Hadess ya estoy trabajando sobre eso ;D , ahora solo necesito acostumbrame a manipular los campos del DGview para hacer las consultas jo jo jo , no se poruqe VB se me complica tanto para manipular los controles :s
El manejo de la grilla es en realidad sencillo. Solo trabajar con rows, columns, cells o items. En todo caso cualquier consulta a este foro. Un saludo.
Cita de: Hadess_inf en 24 Abril 2009, 18:42 PM
El manejo de la grilla es en realidad sencillo. Solo trabajar con rows, columns, cells o items. En todo caso cualquier consulta a este foro. Un saludo.
Bueno pues abusando para no abrir otro post, mira hay algo que quiero hacer pero no encuentro como, ya he checado en la red pero solo me aparece como llenar toda la grilla con una consulta y yo no ando buscando eso, mi sistema se ve mas o menos así, es un preeliminar:
(http://img244.imageshack.us/img244/9336/sistemadeventa.jpg)
Cuando entro la clave del cliente pues ya la consulta me manda los datos a los boxes y depues el focus se va a la grilla, la cosa es que quiero que en la grilla yo pueda poner en la columna de id del producto la clave del producto y cuando le de "Enter" poder invocar un query que me haga la consulta y llene los datos faltantes como son descripcion, y precio unitario, ya que lo que es cantidad lo tecleara el usuario y ahi debe de poder hacerse la operacion para determinar el importe de cada row . . espero explicarme >.<
'El evento es CellLeave, ocurre cuando quitas el foco de una celda.
Private Sub DataGridView1_CellLeave(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellLeave
If e.ColumnIndex = 1 Then 'si el indice de la columna es 0 = significa que estas en la columna del id
'aqui empieza el codigo para establecer el valor en las demas celdas
Dim ind As Integer = e.RowIndex
Me.DataGridView1.Item(ind, 1).Value = "valor" '1 es el indice de la columna.varia segun tu caso
Me.DataGridView1.Item(ind, 2).Value = "valor" '2 es el indice de la columna.varia segun tu caso
End If
End Sub
Espero sirva. Cualquier duda que tengas, solo avisanos.
Un saludo.
Hola Hadess_inf muchas gracias por el dato ya estoy trabajando sobre eso y ya casi lo tengo, solo tengo un problema, por alguna razon no puedo obtener el valor de la celda donde introduzco la clave, no se si es porque el Sub es de tipo CellLeave y no de Click o Content . . te pondre mi código par que lo veas:
Private Sub venta_dgv_CellLeave(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles venta_dgv.CellLeave
If e.ColumnIndex = 0 Then
Dim ind As Integer = e.RowIndex
fila = venta_dgv.Item(0, ind).Value
con = New MySqlConnection
con.ConnectionString = "server = 192.168.1.151;" & "user = root;" & "password = 18281e78a8;" & "database = rocar;"
Try
con.Open()
consulta = "select id_prd from inventario where id_prd ='" & fila & "'"
comando.Connection = con
comando.CommandText = consulta
adaptador.SelectCommand = comando
If adaptador.Fill(datos) = Nothing Then
MsgBox("Clave no encontrada, verificala, clave introducida:" & fila)
id_cte.Text = Nothing
venta_dgv.Focus()
Else
consulta2 = "select descripcion,p_vta from inventario where id_prd='" & fila & "'"
comando.Connection = con
comando.CommandText = consulta2
lector = comando.ExecuteReader
' While
lector.Read()
Me.venta_dgv.Item(2, ind).Value = lector(0).ToString()
Me.venta_dgv.Item(3, ind).Value = lector(1).ToString()
'Me.venta_dgv.Item(4, ind).Value = resulta
'End While
End If
Catch ex As Exception
MsgBox("Se produjo el siguiente error: " & ex.Message)
End Try
con.Dispose()
End If
' Else
' MsgBox(" Campo equivocado, por favor usa el campo CLAVE.")
End Sub
End Class
Ya intente poniendo el valor de fila directo con la clave de un producto existente, y si funciona, pero poir alguna razon cuando lo ejecuto asi como lo tengo me manda una cadena vacia, y si le agrego el .tostring al final de cuando le paso a "fila" el valor del campo me manda un error que dice: Excepción no controlada del tipo 'System.NullReferenceException' en Rocar Sys 0.1b.exe
Información adicional: Object reference not set to an instance of an object.
Asi que la neta ya le anduve buscando y no entiendo, creo que soy muy lelo para esto :(
Ya lo pude obtener, use este codigo:
clave_prd = Me.venta_dgv.CurrentCell.GetEditedFormattedValue(0, Me.venta_dgv.CurrentRow.Index)
Ahora solo hay un detallito molesto, cuando cambio de de fila, me sale el mensaje de que la clave no existye, me imagino que por alguna razon en algun lado manda cadena vacia. . lo checare con calma, pero ahi si tienen alguna observacion se las agradezco.
Recuerda que el metodo Item(A,B).value donde:
A = Fila (Row)
B = Columna (Column)
Estas usando la sintaxis al reves.
Saludos.
Que tonto soy! es cierto, ya quedo . . . ahora a seguir con los prcedimientos :D en cuanto lo termine subo el proyecto para que los que estan iniciando como yo se puedan dar una idea >.<
Seria una buena idea. Y recuerda cualquier problema pasate por el foro. Un saludo.
Hola amigos, no me he olvidado jejeje, soloque he seguido trabajando en mi sistema y he hecho algunas modificaciones para no ciomplicarme tanto la vida, les pongo una screenshot de como está quedando la interfaz:
(http://img525.imageshack.us/img525/1172/noinventory.th.jpg) (http://img525.imageshack.us/my.php?image=noinventory.jpg)
Opté por no hacer las consultas directamente desde el DGView, sino que mejor lo hago desde unos textboxes, uso el evento TextChanged de los text box para que cuando se presione enter se haga la consulta indicada ( en los textbox de ID CLIENTE e ID PRODUCTO), asi mismo en el textbox de CANTIDAD uso ese mismo evento para pasar los datos de los textboxes al datagrid y ahi mismo hago el calculo de el subtotoal, el iva y el total y cada vez que agrego una nueva linea se ejecuta una ciclo for que recorre el datagrid para actualizar los totales de la operacion en los textboxes, tambien al DGView le agregué el evento KeyDown para que cada vez que un usuario selecciona una fila del DGView que quiera eliminar ésta sea removida del DGView y se vuelva a ejecutarel ciclo del recorrido del DGView y actualice el subtotal, iva y total, espero poder seguir aldente, cualquier critica constructiva y comentario son bien recibidos, saludos!
Felicidades te esta quedando muy bien, mm en mi proyecto no he tenido tiempo de trabajar en ello, pero bueno, ya avance un poco, solo como 20 minutos he trabajado en el desde hace una semana :P
Saludos
Hola ezugaru, veo que estas trabajando com mysql en vb 2005, como te ha ido con este motor? hasta el momento no has tenido ningun problema? porque estas usando este motor y no sql server? solo curiosidad, cualquier comentario es bien recibido, saludos
Cita de: abel_c_b en 4 Mayo 2009, 19:04 PM
Hola ezugaru, veo que estas trabajando com mysql en vb 2005, como te ha ido con este motor? hasta el momento no has tenido ningun problema? porque estas usando este motor y no sql server? solo curiosidad, cualquier comentario es bien recibido, saludos
Hola! uso MySQL por dos razones:
1.- Es un motor mas ligero que el SQLServer de Microsoft , ya que las maquinas que usualmente uso como servidores de bases de datos, son maquinas con pocos recursos o de prueba, y el poder hacer que SQL server sea así de ligero requiere demasiado trabajo y es tiempo que no me pueod dar el lujo de invertir en eso.
2.- La licencia es menos problema que con SQL Server.
A mi me ha ido muy bien, yo uso el connector/NET 5.2 y esta muy bien, en lo personal soy de ese tipo de personas que no le gusta usar los datasources que se integran al IDE, no sé, no me siento cómodo, prefiero hacer algo de talacha y saber que es todo lo que ewl programa hace exactamente.
AYUDAAAAAA!!!! por alguna razon, no se si movi algo o que es, pero los textboxes me marcan errores >< cuando asigno a una variable c1 el valor de existencia.text me marca un error que dice que Conversion from String ''' to type Integer is not valid , y si trato de hacer Parsing me marca que La cadena que se envia no estaba en el formato correcto, antes estaba fuincionando bien y esto pasó de repente >.< no sé que hacer. alguna sugerencia? ya he avanzado bastantito como para empezar de nuevo T_T
P.S. Puse un Msgbox antes de la asignacion de los textboxes a las variables, en el cual le digo que me mande el valor de exixtencia.text y el msgbox salta vacio!!!!! no sé porqueeee T_T
Les pongo todo más detallado, aquí está el código de el cantidad_textchanged textbox que es donde creo esta el error >.< :
Private Sub cantidad_TextChanged(ByVal sender As System.Object, ByVal e As KeyEventArgs) Handles cantidad.KeyDown, cantidad.KeyDown
resultado = Nothing
If e.KeyCode = Keys.Escape Then
id_prd.Text = Nothing
existencia.Text = Nothing
descripcion.Text = Nothing
p_unitario.Text = Nothing
id_prd.Text = Nothing
cantidad.Text = Nothing
marca_txt.Text = Nothing
id_prd.Focus()
Else
If e.KeyCode = Keys.Enter Then
'Asignamos valores a las variables para checar la cantidad existente con la que se quiere vender
MsgBox(existencia.Text)
c2 = cantidad.Text
c1 = existencia.Text
If c1 <= 0 Then
MsgBox("No hay inventario")
cantidad.Text = Nothing
p_unitario.Text = Nothing
descripcion.Text = Nothing
existencia.Text = Nothing
id_prd.Text = Nothing
id_prd.Focus()
Else
If c1 < c2 Then
MsgBox("No puedes vender más de " & c1 & " piezas.")
cantidad.Text = Nothing
cantidad.Focus()
Else
If c1 >= c2 Then
'MsgBox("El enter funka! Cantidad: " & cantidad.Text)
'Agregamos los datos de los textboxes a el DGview
resultado = p_unitario.Text * cantidad.Text
venta_dgv.Rows.Add(id_prd.Text, descripcion.Text, marca_txt.Text, cantidad.Text, p_unitario.Text, resultado)
'comienza codigo de recorrido de datagrid para insertar datos en textbox
suma_col = Nothing
Dim iTotal As Integer = Me.venta_dgv.Rows.Count
Dim i As Integer
For i = 0 To iTotal - 1
suma_col = suma_col + Double.Parse(Me.venta_dgv(4, i).Value)
Next
Dim subt As Double = Nothing
Dim impto As Double = Nothing
subt = suma_col / 1.1
impto = suma_col - subt
total.Text = Format(suma_col, "$ #,##0.00")
iva.Text = Format(impto, "#,##0.00")
subtotal.Text = Format(subt, "#,##0.00")
'Termina código de recorrido de inserción de datos
id_prd.Text = Nothing
existencia.Text = Nothing
descripcion.Text = Nothing
p_unitario.Text = Nothing
id_prd.Text = Nothing
cantidad.Text = Nothing
marca_txt.Text = Nothing
id_prd.Focus()
End If
End If
End If
End If
End If
End Sub
Y acá les dejo unas imágenes de lo que pasa, al parecer, se ejecuta bien una vez el procedimiento, pero por alguna razón como que vuelve a entrar, y obviamente en ese momento ya vacié los contenidos de los textboxes y todos los contenidos estan vacios, les pongo imagenes de como me resulta:
Aqui sale todo bien, el msgbox me dice el contenido de existencia.text e inmediatamente despues hace la carga de la fila al DGView , lo que indica que está bien:
(http://img230.imageshack.us/img230/5449/primerpaso.th.jpg) (http://img230.imageshack.us/my.php?image=primerpaso.jpg)
Ahora acá Se ve ya donde el DGView fue afectado y metió todos los datos, pero sorpresivamente el MSGbox salta de nuevo pero ahora sin ningun contenido ( cadena vacia) y no sé porque >.<:
(http://img230.imageshack.us/img230/6351/segundooo.th.jpg) (http://img230.imageshack.us/my.php?image=segundooo.jpg)
Y de ahi con la cadena vacia obviamente salta el error:
(http://img230.imageshack.us/img230/3922/error2s.th.jpg) (http://img230.imageshack.us/my.php?image=error2s.jpg)
Ayudaaaaa me siento perdido >.<
Olvidenlo, ya encontre el error, analizando el codigo con Pollo me di cuentsa que el Handler del evento tenia dos veces el argumento de el text box, por eso aunque le daba un solo enter lo ejecutaba dos veces, seguramente manejando el visual del form clique sin darme cuenta
Private Sub cantidad_TextChanged(ByVal sender As System.Object, ByVal e As KeyEventArgs) Handles cantidad.KeyDown, cantidad.KeyDown
Elimine el ultimo cantidad.KeyDown , quedando:
Private Sub cantidad_TextChanged(ByVal sender As System.Object, ByVal e As KeyEventArgs) Handles cantidad.KeyDown
Y ya funka como debe . . . sorry pero entré en pánico
Cita de: ezugaru en 8 Mayo 2009, 23:34 PM
sorry pero entré en pánico
Como todos en algun momento. xD
ok, aqui voy de nuevo . . . ya ando en otro form programando las consultas de productos, pero al querer llenar la grilla no manda nada, queda en blanco y no se que pasa, este codigo es el que siempre he usado, pero poa alguna razon ahora no hace efecto, se los pongo:
Imports MySql.Data
Imports MySql.Data.MySqlClient
Imports System
Public Class consulta_productos
Dim lector As MySqlDataReader
Dim con As New MySqlConnection
Dim comando As New MySqlCommand
Dim adaptador As New MySqlDataAdapter
Dim consulta, consulta2 As String
Dim datos As New DataTable
Dim DS As New DataSet
Private Sub id_prd_KeyDown(ByVal sender As System.Object, ByVal e As KeyEventArgs) Handles id_prd.KeyDown
If e.KeyCode = Keys.Enter Then
con = New MySqlConnection
con.ConnectionString = "server = 192.168.1.151;" & "user = root;" & "password = 18281e78a8;" & "database = rocar;"
Try
con.Open()
consulta = "SELECT id_prd from inventario where id_prd='" & id_prd.Text & "'"
comando.Connection = con
comando.CommandText = consulta
adaptador.SelectCommand = comando
If adaptador.Fill(datos) = Nothing Then
MsgBox("Clave no encontrada, verificala")
id_prd.Text = Nothing
id_prd.Focus()
Else
consulta2 = "SELECT DISTINCT inventario.id_prd,inventario.descripcion,marcas.marca,marcas.cantidad,marcas.precio_lista FROM inventario,marcas WHERE inventario.id_prd='" & id_prd.Text & "' AND marcas.id_prd='" & id_prd.Text & "'"
MsgBox(consulta2)
comando.Connection = con
comando.CommandText = consulta2
adaptador.SelectCommand = comando
Me.consulta_dgv.DataSource = adaptador.Fill(datos)
id_prd.Text = Nothing
id_prd.Focus()
'End While
End If
Catch ex As Exception
MsgBox("Se produjo el siguiente error: " & ex.Message)
End Try
datos.Reset()
con.Dispose()
consulta = Nothing
id_prd.Text = Nothing
id_prd.Focus()
End If
End Sub
End Class
Resuelto, jaja, voy a ir poniendo aqui como estoy solucionando estos detalles por si a alguien le pasa lo mismo pues se de una idea que le pasa, no creo que sea el uinico que tenga éstos problemas, resulta que yo le añadía en la vista de diseño las columnas al Datagrid y al parecer eso ocasionaba algun conflicto al momento de pasar el datatable al datagrid, y pues dejo que el datatable le ponga las comunas con los nombres de las columnas al datagrid, el codigo queda asi:
Private Sub id_prd_KeyDown(ByVal sender As System.Object, ByVal e As KeyEventArgs) Handles id_prd.KeyDown
If e.KeyCode = Keys.Enter Then
con = New MySqlConnection
con.ConnectionString = "server = 192.168.1.151;" & "user = root;" & "password = 18281e78a8;" & "database = rocar;"
Try
con.Open()
consulta = "select id_prd from inventario where id_prd ='" & id_prd.Text & "'"
comando.Connection = con
comando.CommandText = consulta
adaptador.SelectCommand = comando
If adaptador.Fill(datos) = Nothing Then
MsgBox("Clave no encontrada, verificala")
id_prd.Text = Nothing
id_prd.Focus()
Else
consulta = "SELECT DISTINCT inventario.id_prd,inventario.descripcion,marcas.marca,marcas.cantidad,marcas.precio_lista FROM inventario,marcas WHERE inventario.id_prd='" & id_prd.Text & "' AND marcas.id_prd='" & id_prd.Text & "'"
comando.Connection = con
comando.CommandText = consulta
adaptador.SelectCommand = comando
datos.Clear()
adaptador.Fill(datos)
consulta_dgv.DataSource = datos
id_prd.Text = Nothing
id_prd.Focus()
End If
Catch ex As Exception
MsgBox("Se produjo el siguiente error: " & ex.Message)
End Try
con.Dispose()
End If
End Sub
Y tambien agregue una busqueda por descripcion, por ejemplo si quieren buscar todos los articulos de un auto en especifico, digamos una urvan, un tsuru, un cirrus, solo ponen la palabra en el textbox y la busqueda se ejecuta buscando todas las coincidencias posibles:
Private Sub describe_KeyDown(ByVal sender As System.Object, ByVal e As KeyEventArgs) Handles describe.KeyDown
If e.KeyCode = Keys.Enter Then
con = New MySqlConnection
con.ConnectionString = "server = 192.168.1.151;" & "user = root;" & "password = 18281e78a8;" & "database = rocar;"
Try
con.Open()
consulta = "SELECT inventario.id_prd,inventario.descripcion,marcas.marca,marcas.cantidad,marcas.precio_lista from inventario,marcas WHERE inventario.descripcion LIKE '%" & describe.Text & "%' AND inventario.id_prd=marcas.id_prd"
comando.Connection = con
comando.CommandText = consulta
adaptador.SelectCommand = comando
datos.Clear()
If adaptador.Fill(datos) = Nothing Then
MsgBox("Descripcion no encontrada, usa otra palabra")
describe.Text = Nothing
describe.Focus()
Else
consulta_dgv.DataSource = datos
describe.Text = Nothing
id_prd.Focus()
End If
Catch ex As Exception
MsgBox("Se produjo el siguiente error: " & ex.Message)
End Try
con.Dispose()
End If
End Sub
cualquier sugerencia o comentario será muy bien recibido.
Soy yo de nuevo, sigo vivo !!!! ya casi temino el sistema :D solo estoy terminando lo que son pedidos y devoluciones con sus respectivos reportes y estará terminado, una vez hecho así subo la solucion del proyecto para todo aquel que quiera checarla, y pueda ya sea tomar parte de lo que hice o bien, corregirme y ayudarme a mejorar mi modo de programar, saludos!