Saldos en inventarios

Estoy en la construcción de una herramienta que permita el manejo de los inventarios disponibles, pero me he encontrado con el siguiente problema, existe un formulario en el cual se ingresan las prioridades de insumos requeridos por cada pedido, un mismo insumo puede estar en varios pedidos, lo se pretende es que que al ejecutar un botón asigne por insumo si tiene disponibilidad o no, por ejemplo tengo en existencia 100 und de cinta teflón, y tengo 3 pedidos el primero de 40, el segundo de 50 y el tercero de 30, al ejecutar el botón se deben marcar con disponibilidad el pedido 1 y 2 y el tercero no, esto es lo que necesito para los diferentes insumos.

Agradezco tu ayuda y que e orientes como lo puedo hacer

1 respuesta

Respuesta
1

Vamos a intentar orientarte, porque darte una solución exacta, sin conocer tu BD, es imposible.

Supongo que el stock disponible en cada momento lo calculas mediante una consulta (la llamaré CStock)

Supongo también que tienes identificados los insumos y los pedidos por un Id único (IDInsumo, IDPedido, por ejemplo)

La idea es esta, para el código del botón:

1º/ Creas un recordset sobre la consulta CStock, filtrada por el insumo, y recoges en una variable (por ejemplo vExistencias) la cantidad de existencia.

2º/ Creas un recordset sobre la tabla pedidos, donde tendrás que recoger sólo los que no tengan disponibilidad, o los del día (no sé como trabajas exactamente), ordenados por el orden del pedido.

3º/ Creas un bucle que recorra los registros de ese recordset, y evalúe si hay o no existencias para ese pedido.

Si vExistencias>=Insumo requerido, entonces se marca el pedido como disponible, y se resta a vExistencias el insumo requerido.

Si vExistencias<Insumo requerido, se deja como no disponible el pedido

A ver si con estas indicaciones te llega. Si no, me comentas e intento escribirte un código.

Buenos días

perdona pero no tengo conocimiento en temas de recordset y bucle, los pedidos y los insumos tienen su id único, los inventarios disponibles los calculo en una consulta, he visto que crean ciclos en excel, manejando esta clase de información, pero no se como hacerlo en access, te agradezco que me orientes por medio del código que me dices o si tienes alguna base con esta clase de ejemplos

Supondré los nombres que te comentaba en mi respuesta anterior, tu tendrás que cambiarlos por los que tengas:

El código para el botón seria parecido a este:

'Declaras las variables

Dim miSQL as String

Dim rst as Recordset

Dim vExistencias as Long

Dim vProducto as Integer

'Coges el insumo de que se trate (el del formulario)

vProducto=Me.IdInsumo

'Paso 1: creas el recordset sobre la consulta para saber las existencias del insumo:

miSQL="SELECT * FROM CStock WHERE IdInsumo=" & vProducto

Set rst=CurrentDb.Openrecordset(miSQL, dbOpenDynaset)

vExistencias=rst("Existencias")

rst.close

'Paso 2: creas un recordset sobre la tabla pedidos, recogiendo sólo los que no tengan disponibilidad, ordenados por el orden del pedido.

miSQL="SELECT * FROM TPedidos WHERE Disponibilidad=0 ORDER BY IdPedido ASC"

Set rst=CurrentDb.Openrecordset(miSQL, dbOpenDynaset)

'Paso 3: creas el bucle para ver para cada pedido si hay disponibilidad o no

If rst.recordcount =0 Then 'Si no hay pedidos sin disponibilidad, avisa y sale

MsgBox "No hay pedidos pendientes"

Exit Sub

End If

Do Until rst.EOF

If vExistencias>=rst("InsumoRequerido") Then 'Si hay existencias para el pedido

rst.edit

rst("Disponible")=True 'Se marca el pedido como Disponible

rst.update

vExistencias=vExistencias-rst("InsumoRequerido") 'Se resta a las existencias disponibles

Else 'Si no hay existencias

'No hace nada, y pasa al siguiente pedido

End If

rst.MoveNext

Loop

Lo que te pongo en negrita, son los nombres de tablas, consultas, campos... que yo he supuesto.

El código pretende ser una orientación, pues al no conocer la estructura de tu tabla y cómo quieres que funcione, me es imposible darte una respuesta concreta, pero creo que si entiendes la idea (y el código creo que está bastante explicado) no tendrás problemas en adaptarlo.

Buena tarde

He tratado de montarla pero al momento de oprimir el botón marca pedidos donde los insumos no poseen inventario disponible y algunos pedidos no los marca existiendo inventario disponible. He montado todo esto en una base alterna quisiera enviártela, haber si me puedes regalar tu correo y me colaboraras con eso.

Si quieres sube una copia de tu BD a www.filebig.net o web similar y me pegas aquí el enlace de descarga.

Buenos días

te he subido la copia al sitio que me indicaste, otra cosa que se ha olvidado comentarte, la asignación del inventario no la necesito ordenada por pedido sino por numero de parte.

Agradezco tu ayuda

Ttienes que ponerme aquí el enlace de descarga, si no no hacemos nada...

http://www.filebig.net/files/usFb5uyeuH

http://www.filebig.net/files/usFb5uyeuH

<b><a href="http://www.filebig.net/files/usFb5uyeuH">http://www.filebig.net/files/usFb5uyeuH</a></b>

http://www.filebig.net/del.php?usFb5uyeuHcGcM3YND4Z

ESTOS SON LOS ENLACES QUE ME DIERON CUANDO SUBÍ EL ARCHIVO...ESPERO RESPUESTA

Te subo el archivo modificado, creo que ahora funciona correctamente.

http://www.filebig.net/files/vzzTnNmuNk

Antes no funcionaba porque sólo evaluaba la disponiblilidad para el registro que estuviera activo en ese momento. La solución: poner un ciclo que recorra toda la tabla. El código queda así:

Private Sub Asignadisponiblidad_Click()
'Declaras las variables
Dim miSQL As String
Dim rst As Recordset, rst2 As Recordset
Dim vExistencias As Long
Dim vProducto As Integer
'Paso 1: creas un bucle para recorrer todos los registros de la tabla
Set rst = CurrentDb.OpenRecordset("PrioridadInsumos", dbOpenDynaset)
If rst.RecordCount = 0 Then
rst.Close
Set rst = Nothing
Exit Sub
End If
Do Until rst.EOF
'Coges el insumo de que se trate
vProducto = rst("# Parte")
'Paso 2: creas el recordset sobre la consulta para saber las existencias del insumo:
miSQL = "SELECT * FROM [InvDisponible] WHERE [# Parte]=" & vProducto
Set rst2 = CurrentDb.OpenRecordset(miSQL, dbOpenDynaset)
vExistencias = Nz(rst2("Disponible"), 0)
rst2.Close
'Paso 3: creas un recordset sobre la tabla pedidos, recogiendo sólo los que no tengan disponibilidad, ordenados por el orden del pedido.
miSQL = "SELECT * FROM PrioridadInsumos WHERE Disponibilidad=0 AND [# Parte]=" & _
vProducto & " ORDER BY [# Parte] ASC"
Set rst2 = CurrentDb.OpenRecordset(miSQL, dbOpenDynaset)
'Paso 4: creas el bucle para ver para cada pedido si hay disponibilidad o no
If rst2.RecordCount = 0 Then 'Si no hay pedidos sin disponibilidad, pasa al siguiente
GoTo Siguiente
End If
Do Until rst2.EOF
If vExistencias >= rst2("QPrioridad") Then 'Si hay existencias para el pedido
rst2.Edit
rst2("Disponibilidad") = True 'Se marca el pedido como Disponible
rst2.Update
vExistencias = vExistencias - rst2("QPrioridad") 'Se resta a las existencias disponibles
Else 'Si no hay existencias
'No hace nada, y pasa al siguiente pedido
End If
rst2.MoveNext
Loop
Siguiente:
rst.MoveNext
Loop
'Cierras conexiones y liberas memoria:
rst.Close
rst2.Close
Set rst = Nothing
Set rst2 = Nothing
Me.Requery
End Sub

De todos modos, mira este enlace, de la web de Neckkito, en el que explica como llevar un control de inventarios de productos, porque tu sistema es un poco "peculiar" (desde mi punto de vista, claro)

http://siliconproject.com.ar/neckkito/index.php/ejemplos-explicados/aplicaciones/94-ejemplos-explicados/ejemplos-de-aplicaciones/124-gestion-almacen

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas