Como calcular inventario teórico en biblioteca

Quisiera programar mediante un formulario que despliegue toda la existencia de libros en biblioteca (en teoría debería ser algo así: Saldo Inicial (+) Compras (-) Bajas (=) Saldo Final; sin embargo las bibliotecas se caracterizan por ser un tipo de Almacén que su movimiento fuerte son de carácter de Préstamo y Devoluciónes. Entonces agregando esos otros elementos quedaría algo así: Saldo Inicial (+)Compras (-)Bajas (-)Préstamo (+)Devoluciónes. Esto significa que aunque un libro esté prestado y ande fuera de biblioteca no quiere decir que esté de baja, por lo tanto debe aparecer en listado y quisiera que si está prestado entonces que se remarque de color de fondo como distintivo que llame la atención. Bien lo que tengo es el formato

y un poquitito de código 

Private Sub Form_Load()
    Me.LstInvgral.Visible = False
    Me.TxtFecinv = "(Fecha Inv. teórico)"
    Me.TxtFecinv.SetFocus 'Esto lleva el foco al control TxtBuscar.
End Sub
Private Sub TxtFecinv_Click()
If Me.TxtFecinv = "(Fecha Inv. teórico)" Or Nz(Me.TxtFecinv, "") = "" Then
    MsgBox "Debe indicar una fecha final de inventario", vbInformation + vbOKOnly, "SIN FECHA"
Else
    Me.LstInvgral.Visible = True
    LstInvgral.RowSource = "??? Por favor..."
    End If
End Sub
Private Sub TxtBuscar_LostFocus()
    If Me.TxtLstInvgral = "" Then Me.LstInvgral = "(Fecha Inv. teórico)"
End Sub

1 respuesta

Respuesta
1

No pones cómo es la consulta de la que obtienes los datos, sólo pones el campo calculado, que imagino será uno de los de la consulta...

Me parece que tu mejor opción para lograr el inventario final, es aplicar la máxima de "divide y vencerás", y realizarlo en varias consultas:

1º/ Haces una consulta de totales (que llamas, por ej. CInvIngresos) sobre las tablas 02 y 09 para obtener los ingresos (compras) de cada libro, con esta SQL:

SELECT [02LIBROS].CodLib, Sum([09INGRESOS].CantIng) AS SumaDeCantIng FROM 02LIBROS INNER JOIN 09INGRESOS ON [02LIBROS].CodLib = [09INGRESOS].CodLib GROUP BY [02LIBROS].CodLib;

2º/ Haces una consulta de totales (que llamas, por ej. CInvEgresos) sobre las tablas 02 y 10 para obtener las salidas (bajas) de cada libro, con esta SQL:

SELECT [02LIBROS].CodLib, Sum([10EGRESOS].CantEgr) AS SumaDeCantEgr FROM 02LIBROS INNER JOIN 10EGRESOS ON [02LIBROS].CodLib = [10EGRESOS].CodLib GROUP BY [02LIBROS].CodLib;

3º/ Haces una consulta de totales (que llamas, por ej. CInvPrestamos) sobre las tablas 02 y 11 para obtener los préstamos de cada libro, con esta SQL:

SELECT [02LIBROS].CodLib, Count([11VALES_PRÉSTAMO].ValeNo) AS CuentaDeValeNo FROM 02LIBROS INNER JOIN 11VALES_PRÉSTAMO ON [02LIBROS].CodLib = [11VALES_PRÉSTAMO].CodLib GROUP BY [02LIBROS].CodLib;

4º/ Haces una consulta de totales (que llamas, por ej. CInvDevoluciones) sobre las tablas 02, 11 y 12 para obtener los préstamos de cada libro, con esta SQL:

SELECT [02LIBROS].CodLib, Count([12DEVOLUCIONES].DescargoNo) AS CuentaDeDescargoNo
FROM (02LIBROS INNER JOIN 11VALES_PRÉSTAMO ON [02LIBROS].CodLib = [11VALES_PRÉSTAMO].CodLib) INNER JOIN 12DEVOLUCIONES ON [11VALES_PRÉSTAMO].ValeNo = [12DEVOLUCIONES].ValeNo GROUP BY [02LIBROS].CodLib;

Con estas 4 consultas, tendrás para cada libro los totales de cada movimiento.

5º/ Creas una consulta (CInventario) sobre la tabla 02 y las 4 consultas anteriores, cogiendo los datos que quieras mostrar de la tabla 02 y los campos de totales de las 4 consultas. Tendrás que crear las relaciones entre el campo CodLib de la tabla 02Libros y lso campos CodLib de cada una de las consultas, y modificarlas para que te muestre todos los registros de la tabla 02Libros y los relacionados de cada consulta. Por último, añades el campo calculado "InvFinal", según la fórmula que describes antes. Te podría quedar una SQL como esta:

SELECT [02LIBROS].CodLib, [02LIBROS].ISBN, [02LIBROS].Libro, [02LIBROS].InvInicial, CInt(Nz([SumaDeCantIng],0)) AS Ingresos, CInt(Nz([SumaDeCantEgr],0)) AS Egresos, CInt(Nz([CuentaDeValeNo],0)) AS Prestamos, CInt(Nz([CuentaDeDescargoNo],0)) AS Devoluciones, [InvInicial]+[Ingresos]-[Egresos]-[Prestamos]+[Devoluciones] AS InvFinal
FROM (((CInvDevoluciones RIGHT JOIN 02LIBROS ON CInvDevoluciones.CodLib = [02LIBROS].CodLib) LEFT JOIN CInvEgresos ON [02LIBROS].CodLib = CInvEgresos.CodLib) LEFT JOIN CInvIngresos ON [02LIBROS].CodLib = CInvIngresos.CodLib) LEFT JOIN CInvPrestamos ON [02LIBROS].CodLib = CInvPrestamos.CodLib;

Con esto creo que ya tienes un inventario como pides, o al menos, una idea para empezar a montarlo.

En cuanto a la segunda parte, destacar los libros que tienen préstamos, en un cuadro de lista como pretendes es imposible. Tienes la opción de mostrar los resultados en un subformulario continuo, en vez del cuadro de lista, y usar el formato condicional para destacar esos libros. En la web de Neckkito tienes un ejemplo de esto: ¿Combo de colores... o no?

¡Gracias!  Sveinbjorn El Rojo, por tu pronta respuesta.

Tienes toda la razón con lo de hacer cada caso por separado dado a las diversas limitaciones.  Primero me disculpo por no haberme recordado y no plantearlo "perdón con tanto se me olvidó" que las bajas los programé para que se eliminaran del maestro 02LIBROS y se trasladasen a la tabla 10EGRESOS. Es decir que al listar 02LIBROS +09INGRESOS obtendré por así decirlo un Inventario General.

Y pensando en lugar del subformulario contínuo, programar tres botones uno INVENTARIO GENERAL el cual muestre todos los libros en el cuadro de lista según la consulta 02LIBROS +09INGRESOS, a la fecha indicada.  Otro botón INVENTARIO EN PRÉSTAMO que liste los libros que según la fórmula den "cero" de existencia a la fecha indicada INV INICIAL +INGRESOS -PRÉSTAMOS +DEVOLUCIONES.  Y de esta misma fórmula que liste todos los que den como resultado "uno" para el último botón.

Bueno estoy en dilema si dejar pendiente este hilo porque aún no he podido probar tus SQL.  

Felicitaciones!!! he quedado sorprendido con tu habilidad de programar.

Disculpa me surge otra duda, no me habéis dicho nada a cerca de la fecha ya que esta juega un papel muy importante.  

Mmmmm, Pero creo que si lo tomaste en cuenta ya que aun debo digerir muy bien esta primer intervención....Saludos!!!

Si quieres añadir filtros de fechas, te explico cómo sería en el sistema que te propuse:

En cada una de las consultas de los pasos 1 a 4, añades el campo de fecha de las tablas 9, 10, 11 y 12 (FechIng, FechEgr...), y como criterio le pones:

<=[Formularios]![NombreFormulario]![TxtFecinv]

Es decir, que la fecha sea menor o igual a la que pongas en el cuadro de texto que tienes para meter la fecha en tu formulario (pon el nombre del formulario en vez de lo que está en negrita)

En la última consulta, la del paso 5, añades el campo Fecha de la tabla 2 Libros, y le pones el mismo criterio.

En el sistema que tu uses, sería similar.

En cuanto al método de los botones, una vez que tengas montadas las consultas, le tienes que asignar al cuadro de lista la SQL de las mismas en el código del botón, y refrescarlas, algo así:

Private Sub NombreBoton_Click()

Me.LstInvgral.RowSource='Aquí la SQL de la consulta

Me.LstInvgral..Requery

End Sub

Y así para cada botón.

¡Un montononón Gracias! Excelentísimo.!!!  Recién lo veo y aún no lo he montado pero está muy bien explicado. Saludos!!!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas