Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Costo de Inventario (https://www.clubdelphi.com/foros/showthread.php?t=36313)

NickName 07-10-2006 21:40:06

Costo de Inventario
 
Hola.
Desde hace dias estoy batallando con esto que me pidio mi cliente; necesito hacer un reporte donde muestre las mercancias que existen en almacen, sumando el precio de compra de cada una de las mercancias opteniendo asi el costo del inventario. Bueno para esto el tiene que introducir de que fecha a que fecha se hara este calculo; Para lograr esto ami se me ocurrio hacer 2 tablas:
Código SQL [-]
HISTORIAL_COMPRAS (
    COD_HISTORIAL_COMPRA  INTEGER NOT NULL,
    COD_MERCANCIA         VARCHAR(7),
    FECHA_COMPRA          DATE
);

HISTORIAL_VENTAS (
    COD_HISTORIAL_VENTAS  INTEGER NOT NULL,
    COD_MERCANCIA         VARCHAR(7),
    FECHA_VENTA           DATE
);
Donde boy guardando cada compra y venta que se van haciendo registro por registro por ejemplo: si compro 4 Tv guardo 4 veces su codigo 0000009.
Bien ahora esas tablas en las pruebas que estoy haciendo tienen los siguientes datos:

Código SQL [-]
COD_HISTORIAL_COMPRA  COD_MERCANCIA   FECHA_COMPRA
        1               0000009       2006-10-06
        2               0000009       2006-10-06
        3               0000009       2006-10-06
        4               0000009       2006-10-06

Código SQL [-]
COD_HISTORIAL_VENTAS  COD_MERCANCIA   FECHA_VENTA
        1               0000009       2006-10-07
        2               0000009       2006-10-08

Donde he vendido esa Tv 2 Veces pero en fechas distintas; En la consulta que se hace si la hago del 2006-10-06 al 2006-10-08, en mi resultado tendrian que estar solo 2 Tv y se sumaria su precio de compra de esas 2 Tvs.

Bueno mi problema es que no puedo lograr eso, el codigo de la consulta que hago es este:
Código SQL [-]
Select HC.Cod_Mercancia
From   Historial_Compras HC
Where  Hc.Fecha_Compra >='06.10.2006' And
       Hc.Fecha_Compra <='06.10.2006' And
       (Hc.Cod_Mercancia)
       Not In (Select HV.Cod_Mercancia
               From   Historial_Ventas HV
               Where  HV.Fecha_Venta >= '06.10.2006' And
                      HV.Fecha_Venta <= '06.10.2006')
Aqui cuando no se hiso ninguna venta en esa fecha si me muestra todas las ventas pero si cambio ha una fecha que si aya hecho alguna venta me desaparece todos los registros aunque se aya vendido 1 nadamas en esa fecha...
Código SQL [-]
Select HC.Cod_Mercancia
From   Historial_Compras HC
Where  Hc.Fecha_Compra >='06.10.2006' And
       Hc.Fecha_Compra <='07.10.2006' And
       (Hc.Cod_Mercancia)
       Not In (Select HV.Cod_Mercancia
               From   Historial_Ventas HV
               Where  HV.Fecha_Venta >= '06.10.2006' And
                      HV.Fecha_Venta <= '07.10.2006')
:confused: la verdad estoy en la oscuridad ya intente otras formas y nada... alguien que me pueda iluminar con alguna idea de como lograr esto... o si existe otra forma de lograr lo que necesito... se lo agradeceria muchisimo...

poliburro 07-10-2006 23:15:59

A veces sucede que los motores de bases de datos te incluyen la parte de tiempo, por que no pruebas limitando los campos a que solo validen la parte de la fecha?.



Por cierto, que motor de base de datos usas?.

JulioGO 08-10-2006 00:40:57

Costo de Inventario
 
Hola NickName:

Tengo yo realizo el proceso de costear el inventario de un almacen de la siguiente manera: en una tabla tengo los datos de la compra y en otro los de la venta(cabeceras), cada una con su respectiva tabla de detalles. Es con las tablas de detalles con las q trabajo. En la tabla detalles de compras es donde guardo el precio de compra, y en la tabla detalles de ventas el precio de venta.

Luego lo q hago es mediante vistas, unir los datos de la cabecera(fecha, proveedor/cliente, id_articulo, precio compra, precio venta). Una vista para lo q es compras y otra para lo q es ventas.

De ahi uno las dos vistas mandando el rango de fechas q desea procesar y voy realizando el costo de inv. Todo esto ultimo en un procedimiento almacenado:

Aqui te envio el procedimiento:

Código SQL [-]
create procedure costeo_articulo(codart, fecini, fecfin)
results(tipo, fecha, proveed_cliente, cantidad, precio, total, precio_costo)
for select tipo, fecha, 
from (
     select 'C' tipo, fecha, proveedor proveed_cliente, cantidad, precio_compra
       from vista_compras
      where codart=:codart and fecha between :fecini and :fecfin
    union all
    select 'V' tipo, fecha, cliente proveed_cliente, cantid, precio_venta
      from vista_ventas
      where codart=:codart and fecha between :fecini and :fecfin
)
order by fecha
into :tipo, :fecha, :proveed_cliente, :cantidad, :precio do
begin
 total = :precio * :cantidad;
 if (:tipo = 'C') then /*si el mov. es compras realiza el precio de costo*/
      precio_costo = :cantidad/:precio;
 else
     total = :precio_costo * :cantidad;
 suspend;
end

Si revisas el codigo el procedimiento realiza el proceso de costeo por articulo
q lo puedes anexar a otro procedimeinto para poder sacar el costeo de todos los articulos

Espero te sirva.

Saludos

NickName 08-10-2006 01:45:49

Hola.
Gracias por contestar...perdon si se me paso poner con que estoy trabajando...:D Uso Delphi7, Firebird 1.0, IBx como conexión.

Cita:

JulioGo: Espero te sirva
Claro que si me sirve hasta q llego la luz...;) Muchas Gracias ahora nadamas deja probar la forma que dices aver que sale.... y les cuento.

Cita:

JulioGo: Si revisas el codigo el procedimiento realiza el proceso de costeo por articulo q lo puedes anexar a otro procedimeinto para poder sacar el costeo de todos los articulos
Si esta super bien ;) lo Pruebo y les cuento...
GRACIAS...

NickName 09-10-2006 06:30:31

Hola.

Segun yo ya resolvi lo mas importante q era sacar el costo de cada mercancia q existiera en almacen... les pongo lo que hice, bueno primero 2 vistas como me recomendo JulioGo:
Código SQL [-]
CREATE VIEW VISTA_COMPRAS(
    COD_PROVEEDOR,
    FECHA_COMPRA,
    PRECIO_COMPRA,
    COD_MERCANCIA,
    CANTIDAD)
AS
select  C.Cod_Proveedor, C.Fecha_Compra, P.Precio_Compra, LC.Cod_Mercancia, LC.Cantidad
From    Compras C, Lineas_Compra LC, Precios P
where   LC.Cod_Compra = C.Cod_Compra And
        LC.Cod_Mercancia = P.Cod_Mercancia And
        C.Cancelada = 'NO'

Código SQL [-]
CREATE VIEW VISTA_VENTAS(
    FECHA_VENTA,
    COD_MERCANCIA,
    CANTIDAD)
AS
select  N.Fecha_Venta, LN.Cod_Mercancia, LN.Cantidad
From    Notas N, Lineas_Nota LN
where   LN.Cod_Nota = N.Cod_Nota

Luego mi SP no habia hecho uno en mi vida...:D sera por eso q la variable Total_Inventario no me toma el valor q le digo... chequenlo, Jusgenlo y hechenme otra ayudadita para ver por q esa variable no me toma ningun valor:
Código SQL [-]
CREATE PROCEDURE COSTEO_INVENTARIO (
    FECHA_INICIO DATE,
    FECHA_FIN DATE)
RETURNS (
    FECHA_COMPRA DATE,
    COD_PROVEEDOR INTEGER,
    COD_MERCANCIA VARCHAR(7),
    PRECIO_COMPRA DECIMAL(15,2),
    CANTIDAD INTEGER,
    TOTAL_MERCANCIA DECIMAL(15,2),
    TOTAL_INVENTARIO DECIMAL(15,2))
AS
DECLARE VARIABLE CANTIDAD_VENTA INTEGER;
begin
For Select Cod_Proveedor, Fecha_Compra, Precio_Compra, Cod_Mercancia, Cantidad
From Vista_Compras C Where C.Fecha_Compra Between :Fecha_Inicio And :Fecha_Fin
Order By Fecha_Compra
Into :Cod_Proveedor, :Fecha_Compra, :Precio_Compra, :Cod_Mercancia, :Cantidad Do
Begin
   /* cuanto se ha vendido */
   Select Count(Cod_Mercancia)
   From Vista_Ventas V Where V.Cod_Mercancia = :Cod_Mercancia And V.Fecha_Venta Between :Fecha_Inicio And :Fecha_Fin
   Into :Cantidad_Venta;
   /* Operaciones */
   Cantidad = Cantidad - :Cantidad_Venta;
   Total_Mercancia = Precio_Compra * Cantidad;
   /* Se puede hacer esto en un SP ? por q es la variable q no toma valor */
   Total_Inventario = Total_inventario + Total_Mercancia;
  suspend;
end
End

Segun las pruebas q he realizado funciona bien exepto por la variable Total_Inventario ya comentada de hay en fuera todo bien;)

Se me estaba olvidando comentar q sumo el codigo de Mercancia de las ventas por q si una mercancia la vendo 2 veces en una Nota genero 2 Registros con el mismo codigo esto es por los numeros de serie q son distintos... bueno ojala y me aya explicado...
ha y esta super esto de los SP...:p


La franja horaria es GMT +2. Ahora son las 08:02:07.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi