Foro oficial de SQL

ayuda en consulta sql (generacion de informe)

resulta que tengo un software que genera variados informes de las ventas que este mismo realiza...


informe de ventas por cliente, ventas por vendedor, ventas anuales y ventas por producto.

en este ultimo me entrega datos erroneos, especificamente un valor mas alto al correspondiente.

les dejo el procedimiento almacenado que genera ese informe

estructura de las tablas



editado codigo comentado y resumido solo a boletas de venta
Código:
--sintaxis de tablas
--MAE = maestra (encabezado)
--DET = detalle
--ej. mae_boleta_Venta : guarda encabezados de las boletas de venta
--det_boleta_venta : guarda las lineas de detalle de las boletas de venta

--sintaxis para los campos de cada tabla
--InicialesDeNombreDeTabla_DescripcionCampo
--ej. mps_id_producto_servicio
--mps viene de la tabla Mae_Producto_Servicio

--sintaxis del procedimiento almacenado (sp_tipo_nombre)
--tipos de procedimientos almacenados
--sel : seleccion
--ins : insercion
--del : delete

-- he estado realizando las pruebas con los 2 primeros parametros en 0
-- y con distintas fechas de inicio y final

alter PROCEDURE [dbo].[sp_SEL_InfoVentasPorProducto]      
      
    @IdProducto numeric, --parametro recibido para filtrar por un producto en especifico, cuando no se filtra recibe un 0    
    @IdCategoria numeric, --parametro recibido para filtrar por una categoria de producto en especifico, cuando no se filtra recibe un 0         
    @FechasDesde datetime, --parametro recibido desde el formulario para filtrar las ventas (fecha inicio)    
    @FechasHasta datetime  --parametro recibido desde el formulario para filtrar las ventas (fecha final)       
      
AS      
      
      
declare @MontoBoletas  decimal (26,8)   --variable que almacena el monto total neto de boletas de venta por producto 
declare @CantidadProductoBOV numeric  --variable almacena cantidad vendida de productos en boleta         
 
--los montos netos deben ser calculados, ya que los precios de venta se almacenan con iva
    
set @FechasHasta = dateadd(dd,1,@FechasHasta)      
      

--los documentos de venta cuentan con un descuento general (encabezado) y un descuento por linea de detalle
--los siguientes 2 updates de las tablas mae_boleta_venta (encabezado boleta) y det_boleta_venta (glosa detalle 
-- de boleta) calculan el factor de descuento del encabezado que le corresponde a cada detalle para saber
-- realmente a cuanto se vendio el producto efectivamente
 
--solo por asegurarme vuelvo a calcular el subtotal bruto de la boleta, correspondiente al total con descuento mas el descuento
update mae_boleta_venta  
set mbv_subtotal_bruto = mbv_total + mbv_monto_descuento  

--el descuento de encabezado es un factor que se calcula dividiendo el monto de descuento general de la boleta por el subtotal de la boleta, 
--el subtotal de la boleta corresponde a la suma de todos los totales de las lineas o tuplas del detalle de la boleta
--el total de la linea, corresponde a el subtotal de la linea menos el descuento de la linea
--el subtotal de la linea corresponde a la cantidad vendida por el valor unitario bruto de producto

--procedo a calcular el factor que le corresponde a cada linea por descuento general de boleta 
update det_boleta_venta  
set dbv_descuento_encabezado = mae_boleta_venta.mbv_monto_descuento / mae_boleta_venta.mbv_subtotal_bruto  
from det_boleta_venta  
join mae_boleta_venta   
on det_boleta_venta.dbv_id_boleta_venta = mae_boleta_venta.mbv_id_boleta_venta  
where mbv_subtotal_bruto > 0  
  

----------------------------------------------------------------------------------    
IF(@IdCategoria=0 AND @IdProducto > 0)     --si no se ingreso categoria de producto y si se ingreso id de producto en formulario 
BEGIN      
    
--asigno al monto de las boletas el neto de la suma de los detalles con el descuento por encabezado y ya aplicado mediante el calculo
set @MontoBoletas = (SELECT  sum(((D.dbv_total*100)/(b.mbv_porcentaje_iva + 100))* (1 - isnull(d.dbv_descuento_encabezado,0)))  
      FROM MAE_BOLETA_VENTA B --tabla maestra de la boleta (encabezado)      
     JOIN DET_BOLETA_VENTA D  --tabla detalles de boleta (almacena todas las lineas de productos vendidos)     
     ON (B.mbv_id_boleta_venta = D.dbv_id_boleta_venta)      
     JOIN MAE_PRODUCTO_SERVICIO P      
     ON (P.mps_id_producto_SErvicio = D.dbv_id_producto_servicio)      
     WHERE (D.dbv_id_producto_servicio = @IdProducto OR @IdProducto=0)  --filtro segun el id de producto ingresado     
     AND (B.mbv_fecha>=@FechasDesde AND B.mbv_fecha<=@FechasHasta)     --filtro segun rango de fechas ingresadas  
                    AND  (P.mps_id_categoria_producto_servicio = @IdCategoria OR @IdCategoria=0) --filtro segun id de categorias de producto ingresado     
     AND B.mbv_nula = 0)    --selecciono solo las boletas que no son nulas   
    
      
set @CantidadProductoBOV = (SELECT SUM(D.dbv_cantidad)   --sumo la cantidad de productos en el detalle y la asigno a la variable    
       FROM MAE_BOLETA_VENTA B       
       JOIN DET_BOLETA_VENTA D       
       ON (B.mbv_id_boleta_venta = D.dbv_id_boleta_venta)      
       JOIN MAE_PRODUCTO_SERVICIO P      
       ON (P.mps_id_producto_SErvicio = D.dbv_id_producto_servicio)      
       WHERE (D.dbv_id_producto_servicio = @IdProducto OR @IdProducto=0) --filtro segun el id de producto ingresado      
              AND (B.mbv_fecha>=@FechasDesde AND B.mbv_fecha<=@FechasHasta) --filtro segun rango de fechas ingresado      
                            AND  (p.mps_id_categoria_producto_servicio = @IdCategoria OR @IdCategoria=0) --filtro segun el id de categoria de producto ingresado      
       AND B.mbv_nula = 0) --selecciono solo las boletas que no son nulas       
      
      
if(@MontoBoletas is null)   --si el monto de las boletas es nulo le asigno un 0
 set @MontoBoletas = 0      
      
if(@CantidadProductoBOV is null)      --si la cantidad de productos en boleta es nulo le asigno un 0
 set @MontoBoletas = 0            
      
SELECT       
MAE_PRODUCTO_SERVICIO.mps_id_producto_servicio AS IdProducto, --id producto para manejo interno de consultas (llave primaria)     
MAE_PRODUCTO_SERVICIO.mps_descripcion AS NombreProducto, --el nombre del producto p ej.: 'Coca Cola'     
MAE_PRODUCTO_SERVICIO.mps_codigo_barra AS CodigoProducto, --codigo producto manejado por usuario de sw  (codigo barras)   
isnull(@MontoBoletas,0) AS MontoBoletas,      
isnull(@MontoFacturas,0) AS MontoFacturas,      
isnull(@MontoNotaCreditoVenta,0) AS MontoNotaCreditoVenta,      
isnull(@MontoTotalVentas,0) AS MontoTotalVentas,      
isnull(@CantidadProducto,0) as Cantidad,      
isnull(mps_precio_venta,0) as PrecioVenta --precio bruto unitario del producto      
FROM MAE_PRODUCTO_SERVICIO    --table donde se guardan todos los datos que corresponden al producto  
WHERE      
(MAE_PRODUCTO_SERVICIO.mps_id_producto_servicio = @IdProducto or @IdProducto=0) AND  --que el id del producto sea igual al que me ingresaron o el parametro venga en 0 lo 
																					---que hace que el informe liste todos los productos y no un producto especifico    
(MAE_PRODUCTO_SERVICIO.mps_id_categoria_producto_servicio=@IdCategoria OR @IdCategoria=0) --y que este en la categoria ingresada o que no filtre categorias      
       
      
END      
      
      
IF(@IdCategoria>=0 AND @IdProducto=0)  --si no me ingresaron id de producto y me ingresaron o no un id de categoria de producto   
BEGIN      
      
declare @TotalProdCat numeric   -- variable para almecenar la cantidad de tuplas en #TempIdProd
declare @Contador numeric  --contador para recorrer la tabla  #TempIdProd  
declare @IdProd numeric   --variable auxiliar para filtr        
declare @PrecioVenta numeric  --almacena el precio del producto    
      
      
CREATE TABLE #TempVentasProd    (  --tabla temporal para almacenar los detalles de la venta del producto      
 IdProducto numeric,   --pk del producto     
 NombreProducto varchar(55),      --descripcion del producto
 CodigoProducto varchar(55),     --codigo de barras del producto
 MontoBoletas decimal(26,8),      -- monto neto vendido del producto en boletas 
 MontoTotalVentas decimal (26,8),   -- monto neto vendido del producto incluye facturas, notas de credito y boletas (en este caso es irrelevante xq solo mostrate la consulta que tiene q ver con las boletas)  
 Cantidad numeric,  --cantidad vendida del producto correspondiente entre boletas, facturas y notas de credito.    
 PrecioVenta numeric  --precio unitario bruto del producto    
)      
      
 CREATE TABLE #TempIdProd --almacena id o pk de los productos vendidos      
 (        
  id int IDENTITY (1, 1),      --genero un id autoincremental para poder usarlo como identificador de lineas
  IdProd numeric,        --campo para guardar el id del producto encontrado
 )      
      
      
      
      
       
      
      
 INSERT #TempIdProd     --guarda los id de los productos vendidos
 SELECT DISTINCT DET_BOLETA_VENTA.dbv_id_producto_servicio  --trae las distintas pk de producto en detalles de boleta  
 FROM MAE_PRODUCTO_SERVICIO --desde la tabla maestra de productos
 JOIN DET_BOLETA_VENTA --unida con el detalle de la boleta de venta (productos vendidos)
 ON MAE_PRODUCTO_SERVICIO.mps_id_producto_servicio = DET_BOLETA_VENTA.dbv_id_producto_servicio
 JOIN MAE_BOLETA_VENTA --y unida con la cabecera de la boleta donde se vendio el producto
 ON DET_BOLETA_VENTA.dbv_id_boleta_venta = MAE_BOLETA_VENTA.mbv_id_boleta_venta
 WHERE (DET_BOLETA_VENTA.dbv_id_producto_servicio = @IdProducto OR @IdProducto=0) --donde el id del producto este en el detalle de la boleta           
 AND (MAE_BOLETA_VENTA.mbv_fecha>=@FechasDesde AND MAE_BOLETA_VENTA.mbv_fecha<=@FechasHasta) --y la boleta haya sido generada en el rango de fecha ingresado por usuario         
 AND  (MAE_PRODUCTO_SERVICIO.mps_id_categoria_producto_servicio = @IdCategoria OR @IdCategoria=0) --y que el producto este en la categoria seleccionada
 AND mbv_nula = 0    --donde la boleta no este anulada (mbv_nula es un bit donde 0 significa que la boleta no ha sido anulada)      
           
      
 set @TotalProdCat= (Select count(*) from #TempIdProd) --total de lineas en tabla temporal #TempIdProd     
 set @Contador=1      
   
--mientras el contador sea menor a la cantidad total de registros en  #TempIdProd  
  WHILE (@Contador <= @TotalProdCat)   --recorre la tabla temporal #TempIdProd   
  BEGIN      
      
   --extrae  el id de producto correspondiente a la linea segun indique el contador   
   set @IdProd = (Select IdProd from #TempIdProd where id=@Contador)      
      
--asigno el neto de la suma de las lineas de detalle de la boleta sin el descuento que corresponde por el encabezado
--a la variable '@MontoBoletas'
   set @MontoBoletas = (SELECT sum(((D.dbv_total*100)/(b.mbv_porcentaje_iva + 100)) --el neto de la suma de las lineas de detalle de la boleta
								*(1- isnull(d.dbv_descuento_encabezado,0)))   --calcula el valor segun lo que le corresponde de descuento por el encabezado de la boleta
         FROM DET_BOLETA_VENTA  D    --tabla que almacena los detalles de la boleta de venta 
         JOIN MAE_BOLETA_VENTA b       --unida a la tabla del encabezado de boleta de venta
         ON (b.mbv_id_boleta_Venta = D.dbv_id_boleta_venta)      --las uno por su clave primaria y foranea respectivamente correspondiente al id interno de la boleta de venta
         WHERE (D.dbv_id_producto_servicio = @IdProd)    --y filtro segun el id del producto  ... 
         AND (b.mbv_fecha>=@FechasDesde AND b.mbv_fecha<=@FechasHasta)   --  ...segun el rango de fechas ingresados...
         AND b.mbv_nula = 0)      --...y que la boleta no este anulada.
    
    
    
--asigno la cantidad de productos     
   set @CantidadProductoBOV = (SELECT SUM(DET_BOLETA_VENTA.dbv_cantidad)  --suma la cantidad de productos vendidos segun lo que indica la linea de detalle     
          FROM DET_BOLETA_VENTA --detalle de boleta de venta
			join MAE_BOLETA_VENTA   --unido con el encabezado
			on  DET_BOLETA_VENTA.dbv_id_boleta_venta = MAE_BOLETA_VENTA.mbv_id_boleta_venta --a traves de la clave primaria del encabezado de la boleta de venta    
          WHERE (DET_BOLETA_VENTA.dbv_id_producto_servicio = @IdProd) --filtrado por el producto que me ingresaron a traves de formulario            
          AND (MAE_BOLETA_VENTA.mbv_fecha>=@FechasDesde AND MAE_BOLETA_VENTA.mbv_fecha<=@FechasHasta)  --y que haya sido vendido en el rango de fechas indicado por el usuario    
          AND mbv_nula = 0 ) --donde la boleta no hata sido anulada     
      
   if(@MontoBoletas is null)      
            begin      
    set @MontoBoletas = 0  --si el monto de boletas es nulo le asigno un 0    
   end      

   if(@CantidadProductoBOV is null)      
            begin      
    set @CantidadProductoBOV = 0   --y si la cantidad es nula asigno un 0   
   end      
      
      
   set @MontoTotalVentas = @MontoBoletas    --  se asigna a @MontoTotalVentas todo lo que se vendio del producto entre
											--boletas, facturas y notas de credito.. en este caso solo lo mostrare con boletas para q veas una consulta mas corta
      
   set @CantidadProducto = @CantidadProductoBOV  -- se asigna el total de productos vendidos (en este caso solo boletas por lo explicado anteriormente)     
      

      
   set @PrecioVenta = (SELECT isnull(mps_precio_venta,0) -- consulta el precio unitario bruto de venta del producto, y si es nulo le asigna un 0       
        FROM MAE_PRODUCTO_SERVICIO   -- de la tabla maestra de productos    
        WHERE mps_id_producto_servicio=@IdProd)      --donde el id del producto sea igual al almacenado en la tabla temporal
      
      
   
   INSERT #TempVentasProd     --guarda los montos de venta segun el producto
   SELECT       
   MAE_PRODUCTO_SERVICIO.mps_id_producto_servicio,  --pk de producto    
   MAE_PRODUCTO_SERVICIO.mps_descripcion,      --nombre de producto
   MAE_PRODUCTO_SERVICIO.mps_codigo_barra,       --codigo de producto
   isnull(@MontoBoletas,0) AS MontoBoletas,     --monto vendido del producto en boletas    (neto)
   isnull(@MontoTotalVentas,0) AS MontoTotalVentas,  --monto total vendido del producto    (neto)
            isnull(@CantidadProducto,0) as Cantidad, --cantidad de productos vendidos      
            isnull(@PrecioVenta,0) as PrecioVenta     --precio unitario de venta de producto (bruto)
   FROM MAE_PRODUCTO_SERVICIO      
   WHERE (MAE_PRODUCTO_SERVICIO.mps_id_producto_servicio = @IdProd)     --filtra segun el id que se este filtrando entre los productos vendidos 
          
      
   set @Contador = @Contador + 1    --suma 1 al contador para poder avanzar una tupla en  #TempIdProd 
      
  END      
      
      
      
 SELECT DISTINCT *     --selecciona los distintos registros que se guardaron en la tabla y con eso genera el informe  
 FROM #TempVentasProd      
      
 DROP TABLE #TempIdProd   --borra la tabla temporal   
 DROP TABLE #TempVentasProd --bora la tbla temporal que almacena el informe (quedo cargado en grilla del formulario)     
      
     
END

Pantallazos de Software


[img=http://img213.imageshack.us/img213/7987/informevendedor.th.png]



espero que me puedan ayudar... me he craneado bastante con esto y no se como arreglarlo..

saludos.. y gracias de antemano
 
ese procedimiento almacenado esta demasiado complejo, para que puedas recibir ayuda creo que vas a tener que poner la estructura de las tablas que intervienen en este codigo que esta extenso.
 
Segun entiendo necesitas el informe del total de ventas por producto? si es así la consulta solo debería viajar entre los detalles de ventas e ir acumulando precios de ventas. Si esto es correcto te puedo enviar un código que te podría ayudar, confirma si estos datos son correctos.
En que ciudad estas?
 
silvius, lo que me dices es correcto, salvo que debe acumular el precio neto de cada total de linea. estoy en santiago de chile. saludos y gracias.. espero tu codigo.
 
una pregunta... que talvez sea un poco noob... pero... cómo le hago para crear un campo tipo numérico desde SQL para Access 2003... he intentado con AUTO_INCREMENT, declarando la variable como número (number) ínteger (int) (y cuando la declaro como integer me marca error -.-' ) pero, siempre me marca error en AUTO_INCREMENT, pero me saca un msg de error "Error de sintáxis en la sentencia CREATE TABLE".

y -sigh- bueno, se me acabaron las ideas para decirle a la máquina que me ponga un campo autonumérico T-T ... plz ayuda!
 
una pregunta... que talvez sea un poco noob... pero... cómo le hago para crear un campo tipo numérico desde SQL para Access 2003... he intentado con AUTO_INCREMENT, declarando la variable como número (number) ínteger (int) (y cuando la declaro como integer me marca error -.-' ) pero, siempre me marca error en AUTO_INCREMENT, pero me saca un msg de error "Error de sintáxis en la sentencia CREATE TABLE".

y -sigh- bueno, se me acabaron las ideas para decirle a la máquina que me ponga un campo autonumérico T-T ... plz ayuda!

no se si en access sera lo mismo.. pero no pierdes nada con intentar

pero yo en sql server lo hago asi

CREATE TABLE <nombre_tabla>
( <nombre_campo_autoincremento> int IDENTITY (1, 1),
...
)

int identity (1,1) se usa para que comience en 1 e incremente de a 1..

si quisieras que comience en 0 lo dejas int identity (0,1) y asi

espero te sirva... saludos


PD.: mi problema lo resolvi... no estaba en el procedimiento almacenado... sino en que la suma de los detalles de boleta no concordaban con el total de la boleta...
 
sumar dos tablas con un query SQL

Muchachos, buenas noches para todos.

Tengo una duda, y pues veo que estoy muy basico en SQL, se puede hacer de todo y yo ni idea.

resulta que tengo una tabla asi:
tabla1
ValorItem||Item
30 ||video
40 ||discoduro
50 || motherboard

ahora tengo otra tabla asi:
tabla2
ValorItem || Item
60 ||procesador
70 || memoria
80 ||powersupply

yo se que con un "select sum(valoritem) from tabla1" sumo los valores de una tabla, pero, ¿y si quiero sumar los valores de ambas tablas en una sola instruccion?

tambien lo pude hacer con un view, pero pues la idea es que me tire el resultado de una vez, el cual seria "33", ¿me ayudan por favor?? jajaja, toda la tarde he intendado hacer de todo y pues nada, no me da 33 jejeje, me da un numero super grande, no se que estoy haciendo mal.

Gracias si me pueden enviar el comando y yo lo analizaria.
 
Muchachos, buenas noches para todos.

Tengo una duda, y pues veo que estoy muy basico en SQL, se puede hacer de todo y yo ni idea.

resulta que tengo una tabla asi:
tabla1
ValorItem||Item
30 ||video
40 ||discoduro
50 || motherboard

ahora tengo otra tabla asi:
tabla2
ValorItem || Item
60 ||procesador
70 || memoria
80 ||powersupply

yo se que con un "select sum(valoritem) from tabla1" sumo los valores de una tabla, pero, ¿y si quiero sumar los valores de ambas tablas en una sola instruccion?

tambien lo pude hacer con un view, pero pues la idea es que me tire el resultado de una vez, el cual seria "33", ¿me ayudan por favor?? jajaja, toda la tarde he intendado hacer de todo y pues nada, no me da 33 jejeje, me da un numero super grande, no se que estoy haciendo mal.

Gracias si me pueden enviar el comando y yo lo analizaria.


no se sql server.

pero eso se hace con un UNION

SELECT SUM(valoritem)
FROM
(select valoritem from tabla1
UNION
select valoritem from tabla2)
 
33? si es una suma le debe dar bien alto, 330 digamos que le falton un cero.
Asi como le dijo juank se puede e incluso funciona en SQL Server.
 
  • Me gusta
Reacciones: 2 personas
no se sql server.

pero eso se hace con un UNION

Exacto, pero como que me parece que para que de 33 seria en una columna de cantidad

33? si es una suma le debe dar bien alto, 330 digamos que le falton un cero.
Asi como le dijo juank se puede e incluso funciona en SQL Server.
Exacto, como dije arriba, para que de 33 seria que que tuviera una columna de cantidad, porque con valor item solo lo veo posible si lo divide entre entre 33 o algo parecido a:

SELECT SUM(valoritem)/10
FROM
(select valoritem from tabla1
UNION
select valoritem from tabla2)


SuerteX :)
 
  • Me gusta
Reacciones: 2 personas
hola, mi pregunta es si alguien conoce de un manual o tutorial de MySQL Workbench en español y si conocen si el programa tambien biene en español.

gracias...
 
resulta que tengo un software que genera variados informes de las ventas que este mismo realiza...


informe de ventas por cliente, ventas por vendedor, ventas anuales y ventas por producto.

en este ultimo me entrega datos erroneos, especificamente un valor mas alto al correspondiente.

les dejo el procedimiento almacenado que genera ese informe

estructura de las tablas



editado codigo comentado y resumido solo a boletas de venta
Código:
--sintaxis de tablas
--MAE = maestra (encabezado)
--DET = detalle
--ej. mae_boleta_Venta : guarda encabezados de las boletas de venta
--det_boleta_venta : guarda las lineas de detalle de las boletas de venta

--sintaxis para los campos de cada tabla
--InicialesDeNombreDeTabla_DescripcionCampo
--ej. mps_id_producto_servicio
--mps viene de la tabla Mae_Producto_Servicio

--sintaxis del procedimiento almacenado (sp_tipo_nombre)
--tipos de procedimientos almacenados
--sel : seleccion
--ins : insercion
--del : delete

-- he estado realizando las pruebas con los 2 primeros parametros en 0
-- y con distintas fechas de inicio y final

alter PROCEDURE [dbo].[sp_SEL_InfoVentasPorProducto]      
      
    @IdProducto numeric, --parametro recibido para filtrar por un producto en especifico, cuando no se filtra recibe un 0    
    @IdCategoria numeric, --parametro recibido para filtrar por una categoria de producto en especifico, cuando no se filtra recibe un 0         
    @FechasDesde datetime, --parametro recibido desde el formulario para filtrar las ventas (fecha inicio)    
    @FechasHasta datetime  --parametro recibido desde el formulario para filtrar las ventas (fecha final)       
      
AS      
      
      
declare @MontoBoletas  decimal (26,8)   --variable que almacena el monto total neto de boletas de venta por producto 
declare @CantidadProductoBOV numeric  --variable almacena cantidad vendida de productos en boleta         
 
--los montos netos deben ser calculados, ya que los precios de venta se almacenan con iva
    
set @FechasHasta = dateadd(dd,1,@FechasHasta)      
      

--los documentos de venta cuentan con un descuento general (encabezado) y un descuento por linea de detalle
--los siguientes 2 updates de las tablas mae_boleta_venta (encabezado boleta) y det_boleta_venta (glosa detalle 
-- de boleta) calculan el factor de descuento del encabezado que le corresponde a cada detalle para saber
-- realmente a cuanto se vendio el producto efectivamente
 
--solo por asegurarme vuelvo a calcular el subtotal bruto de la boleta, correspondiente al total con descuento mas el descuento
update mae_boleta_venta  
set mbv_subtotal_bruto = mbv_total + mbv_monto_descuento  

--el descuento de encabezado es un factor que se calcula dividiendo el monto de descuento general de la boleta por el subtotal de la boleta, 
--el subtotal de la boleta corresponde a la suma de todos los totales de las lineas o tuplas del detalle de la boleta
--el total de la linea, corresponde a el subtotal de la linea menos el descuento de la linea
--el subtotal de la linea corresponde a la cantidad vendida por el valor unitario bruto de producto

--procedo a calcular el factor que le corresponde a cada linea por descuento general de boleta 
update det_boleta_venta  
set dbv_descuento_encabezado = mae_boleta_venta.mbv_monto_descuento / mae_boleta_venta.mbv_subtotal_bruto  
from det_boleta_venta  
join mae_boleta_venta   
on det_boleta_venta.dbv_id_boleta_venta = mae_boleta_venta.mbv_id_boleta_venta  
where mbv_subtotal_bruto > 0  
  

----------------------------------------------------------------------------------    
IF(@IdCategoria=0 AND @IdProducto > 0)     --si no se ingreso categoria de producto y si se ingreso id de producto en formulario 
BEGIN      
    
--asigno al monto de las boletas el neto de la suma de los detalles con el descuento por encabezado y ya aplicado mediante el calculo
set @MontoBoletas = (SELECT  sum(((D.dbv_total*100)/(b.mbv_porcentaje_iva + 100))* (1 - isnull(d.dbv_descuento_encabezado,0)))  
      FROM MAE_BOLETA_VENTA B --tabla maestra de la boleta (encabezado)      
     JOIN DET_BOLETA_VENTA D  --tabla detalles de boleta (almacena todas las lineas de productos vendidos)     
     ON (B.mbv_id_boleta_venta = D.dbv_id_boleta_venta)      
     JOIN MAE_PRODUCTO_SERVICIO P      
     ON (P.mps_id_producto_SErvicio = D.dbv_id_producto_servicio)      
     WHERE (D.dbv_id_producto_servicio = @IdProducto OR @IdProducto=0)  --filtro segun el id de producto ingresado     
     AND (B.mbv_fecha>=@FechasDesde AND B.mbv_fecha<=@FechasHasta)     --filtro segun rango de fechas ingresadas  
                    AND  (P.mps_id_categoria_producto_servicio = @IdCategoria OR @IdCategoria=0) --filtro segun id de categorias de producto ingresado     
     AND B.mbv_nula = 0)    --selecciono solo las boletas que no son nulas   
    
      
set @CantidadProductoBOV = (SELECT SUM(D.dbv_cantidad)   --sumo la cantidad de productos en el detalle y la asigno a la variable    
       FROM MAE_BOLETA_VENTA B       
       JOIN DET_BOLETA_VENTA D       
       ON (B.mbv_id_boleta_venta = D.dbv_id_boleta_venta)      
       JOIN MAE_PRODUCTO_SERVICIO P      
       ON (P.mps_id_producto_SErvicio = D.dbv_id_producto_servicio)      
       WHERE (D.dbv_id_producto_servicio = @IdProducto OR @IdProducto=0) --filtro segun el id de producto ingresado      
              AND (B.mbv_fecha>=@FechasDesde AND B.mbv_fecha<=@FechasHasta) --filtro segun rango de fechas ingresado      
                            AND  (p.mps_id_categoria_producto_servicio = @IdCategoria OR @IdCategoria=0) --filtro segun el id de categoria de producto ingresado      
       AND B.mbv_nula = 0) --selecciono solo las boletas que no son nulas       
      
      
if(@MontoBoletas is null)   --si el monto de las boletas es nulo le asigno un 0
 set @MontoBoletas = 0      
      
if(@CantidadProductoBOV is null)      --si la cantidad de productos en boleta es nulo le asigno un 0
 set @MontoBoletas = 0            
      
SELECT       
MAE_PRODUCTO_SERVICIO.mps_id_producto_servicio AS IdProducto, --id producto para manejo interno de consultas (llave primaria)     
MAE_PRODUCTO_SERVICIO.mps_descripcion AS NombreProducto, --el nombre del producto p ej.: 'Coca Cola'     
MAE_PRODUCTO_SERVICIO.mps_codigo_barra AS CodigoProducto, --codigo producto manejado por usuario de sw  (codigo barras)   
isnull(@MontoBoletas,0) AS MontoBoletas,      
isnull(@MontoFacturas,0) AS MontoFacturas,      
isnull(@MontoNotaCreditoVenta,0) AS MontoNotaCreditoVenta,      
isnull(@MontoTotalVentas,0) AS MontoTotalVentas,      
isnull(@CantidadProducto,0) as Cantidad,      
isnull(mps_precio_venta,0) as PrecioVenta --precio bruto unitario del producto      
FROM MAE_PRODUCTO_SERVICIO    --table donde se guardan todos los datos que corresponden al producto  
WHERE      
(MAE_PRODUCTO_SERVICIO.mps_id_producto_servicio = @IdProducto or @IdProducto=0) AND  --que el id del producto sea igual al que me ingresaron o el parametro venga en 0 lo 
																					---que hace que el informe liste todos los productos y no un producto especifico    
(MAE_PRODUCTO_SERVICIO.mps_id_categoria_producto_servicio=@IdCategoria OR @IdCategoria=0) --y que este en la categoria ingresada o que no filtre categorias      
       
      
END      
      
      
IF(@IdCategoria>=0 AND @IdProducto=0)  --si no me ingresaron id de producto y me ingresaron o no un id de categoria de producto   
BEGIN      
      
declare @TotalProdCat numeric   -- variable para almecenar la cantidad de tuplas en #TempIdProd
declare @Contador numeric  --contador para recorrer la tabla  #TempIdProd  
declare @IdProd numeric   --variable auxiliar para filtr        
declare @PrecioVenta numeric  --almacena el precio del producto    
      
      
CREATE TABLE #TempVentasProd    (  --tabla temporal para almacenar los detalles de la venta del producto      
 IdProducto numeric,   --pk del producto     
 NombreProducto varchar(55),      --descripcion del producto
 CodigoProducto varchar(55),     --codigo de barras del producto
 MontoBoletas decimal(26,8),      -- monto neto vendido del producto en boletas 
 MontoTotalVentas decimal (26,8),   -- monto neto vendido del producto incluye facturas, notas de credito y boletas (en este caso es irrelevante xq solo mostrate la consulta que tiene q ver con las boletas)  
 Cantidad numeric,  --cantidad vendida del producto correspondiente entre boletas, facturas y notas de credito.    
 PrecioVenta numeric  --precio unitario bruto del producto    
)      
      
 CREATE TABLE #TempIdProd --almacena id o pk de los productos vendidos      
 (        
  id int IDENTITY (1, 1),      --genero un id autoincremental para poder usarlo como identificador de lineas
  IdProd numeric,        --campo para guardar el id del producto encontrado
 )      
      
      
      
      
       
      
      
 INSERT #TempIdProd     --guarda los id de los productos vendidos
 SELECT DISTINCT DET_BOLETA_VENTA.dbv_id_producto_servicio  --trae las distintas pk de producto en detalles de boleta  
 FROM MAE_PRODUCTO_SERVICIO --desde la tabla maestra de productos
 JOIN DET_BOLETA_VENTA --unida con el detalle de la boleta de venta (productos vendidos)
 ON MAE_PRODUCTO_SERVICIO.mps_id_producto_servicio = DET_BOLETA_VENTA.dbv_id_producto_servicio
 JOIN MAE_BOLETA_VENTA --y unida con la cabecera de la boleta donde se vendio el producto
 ON DET_BOLETA_VENTA.dbv_id_boleta_venta = MAE_BOLETA_VENTA.mbv_id_boleta_venta
 WHERE (DET_BOLETA_VENTA.dbv_id_producto_servicio = @IdProducto OR @IdProducto=0) --donde el id del producto este en el detalle de la boleta           
 AND (MAE_BOLETA_VENTA.mbv_fecha>=@FechasDesde AND MAE_BOLETA_VENTA.mbv_fecha<=@FechasHasta) --y la boleta haya sido generada en el rango de fecha ingresado por usuario         
 AND  (MAE_PRODUCTO_SERVICIO.mps_id_categoria_producto_servicio = @IdCategoria OR @IdCategoria=0) --y que el producto este en la categoria seleccionada
 AND mbv_nula = 0    --donde la boleta no este anulada (mbv_nula es un bit donde 0 significa que la boleta no ha sido anulada)      
           
      
 set @TotalProdCat= (Select count(*) from #TempIdProd) --total de lineas en tabla temporal #TempIdProd     
 set @Contador=1      
   
--mientras el contador sea menor a la cantidad total de registros en  #TempIdProd  
  WHILE (@Contador <= @TotalProdCat)   --recorre la tabla temporal #TempIdProd   
  BEGIN      
      
   --extrae  el id de producto correspondiente a la linea segun indique el contador   
   set @IdProd = (Select IdProd from #TempIdProd where id=@Contador)      
      
--asigno el neto de la suma de las lineas de detalle de la boleta sin el descuento que corresponde por el encabezado
--a la variable '@MontoBoletas'
   set @MontoBoletas = (SELECT sum(((D.dbv_total*100)/(b.mbv_porcentaje_iva + 100)) --el neto de la suma de las lineas de detalle de la boleta
								*(1- isnull(d.dbv_descuento_encabezado,0)))   --calcula el valor segun lo que le corresponde de descuento por el encabezado de la boleta
         FROM DET_BOLETA_VENTA  D    --tabla que almacena los detalles de la boleta de venta 
         JOIN MAE_BOLETA_VENTA b       --unida a la tabla del encabezado de boleta de venta
         ON (b.mbv_id_boleta_Venta = D.dbv_id_boleta_venta)      --las uno por su clave primaria y foranea respectivamente correspondiente al id interno de la boleta de venta
         WHERE (D.dbv_id_producto_servicio = @IdProd)    --y filtro segun el id del producto  ... 
         AND (b.mbv_fecha>=@FechasDesde AND b.mbv_fecha<=@FechasHasta)   --  ...segun el rango de fechas ingresados...
         AND b.mbv_nula = 0)      --...y que la boleta no este anulada.
    
    
    
--asigno la cantidad de productos     
   set @CantidadProductoBOV = (SELECT SUM(DET_BOLETA_VENTA.dbv_cantidad)  --suma la cantidad de productos vendidos segun lo que indica la linea de detalle     
          FROM DET_BOLETA_VENTA --detalle de boleta de venta
			join MAE_BOLETA_VENTA   --unido con el encabezado
			on  DET_BOLETA_VENTA.dbv_id_boleta_venta = MAE_BOLETA_VENTA.mbv_id_boleta_venta --a traves de la clave primaria del encabezado de la boleta de venta    
          WHERE (DET_BOLETA_VENTA.dbv_id_producto_servicio = @IdProd) --filtrado por el producto que me ingresaron a traves de formulario            
          AND (MAE_BOLETA_VENTA.mbv_fecha>=@FechasDesde AND MAE_BOLETA_VENTA.mbv_fecha<=@FechasHasta)  --y que haya sido vendido en el rango de fechas indicado por el usuario    
          AND mbv_nula = 0 ) --donde la boleta no hata sido anulada     
      
   if(@MontoBoletas is null)      
            begin      
    set @MontoBoletas = 0  --si el monto de boletas es nulo le asigno un 0    
   end      

   if(@CantidadProductoBOV is null)      
            begin      
    set @CantidadProductoBOV = 0   --y si la cantidad es nula asigno un 0   
   end      
      
      
   set @MontoTotalVentas = @MontoBoletas    --  se asigna a @MontoTotalVentas todo lo que se vendio del producto entre
											--boletas, facturas y notas de credito.. en este caso solo lo mostrare con boletas para q veas una consulta mas corta
      
   set @CantidadProducto = @CantidadProductoBOV  -- se asigna el total de productos vendidos (en este caso solo boletas por lo explicado anteriormente)     
      

      
   set @PrecioVenta = (SELECT isnull(mps_precio_venta,0) -- consulta el precio unitario bruto de venta del producto, y si es nulo le asigna un 0       
        FROM MAE_PRODUCTO_SERVICIO   -- de la tabla maestra de productos    
        WHERE mps_id_producto_servicio=@IdProd)      --donde el id del producto sea igual al almacenado en la tabla temporal
      
      
   
   INSERT #TempVentasProd     --guarda los montos de venta segun el producto
   SELECT       
   MAE_PRODUCTO_SERVICIO.mps_id_producto_servicio,  --pk de producto    
   MAE_PRODUCTO_SERVICIO.mps_descripcion,      --nombre de producto
   MAE_PRODUCTO_SERVICIO.mps_codigo_barra,       --codigo de producto
   isnull(@MontoBoletas,0) AS MontoBoletas,     --monto vendido del producto en boletas    (neto)
   isnull(@MontoTotalVentas,0) AS MontoTotalVentas,  --monto total vendido del producto    (neto)
            isnull(@CantidadProducto,0) as Cantidad, --cantidad de productos vendidos      
            isnull(@PrecioVenta,0) as PrecioVenta     --precio unitario de venta de producto (bruto)
   FROM MAE_PRODUCTO_SERVICIO      
   WHERE (MAE_PRODUCTO_SERVICIO.mps_id_producto_servicio = @IdProd)     --filtra segun el id que se este filtrando entre los productos vendidos 
          
      
   set @Contador = @Contador + 1    --suma 1 al contador para poder avanzar una tupla en  #TempIdProd 
      
  END      
      
      
      
 SELECT DISTINCT *     --selecciona los distintos registros que se guardaron en la tabla y con eso genera el informe  
 FROM #TempVentasProd      
      
 DROP TABLE #TempIdProd   --borra la tabla temporal   
 DROP TABLE #TempVentasProd --bora la tbla temporal que almacena el informe (quedo cargado en grilla del formulario)     
      
     
END

Pantallazos de Software


[img=http://img213.imageshack.us/img213/7987/informevendedor.th.png]



espero que me puedan ayudar... me he craneado bastante con esto y no se como arreglarlo..

saludos.. y gracias de antemano


No crees que te estac complicando mucho con un join?, por que no intentas realizar el cruce de las tablas directamente en el where

set @MontoBoletas = (SELECT sum(((D.dbv_total*100)/(b.mbv_porcentaje_iva + 100))* (1 - isnull(d.dbv_descuento_encabezado,0)))
FROM MAE_BOLETA_VENTA B --tabla maestra de la boleta (encabezado)
JOIN DET_BOLETA_VENTA D --tabla detalles de boleta (almacena todas las lineas de productos vendidos)
ON (B.mbv_id_boleta_venta = D.dbv_id_boleta_venta)
JOIN MAE_PRODUCTO_SERVICIO P
ON (P.mps_id_producto_SErvicio = D.dbv_id_producto_servicio)
WHERE (D.dbv_id_producto_servicio = @IdProducto OR @IdProducto=0) --filtro segun el id de producto ingresado
AND (B.mbv_fecha>=@FechasDesde AND B.mbv_fecha<=@FechasHasta) --filtro segun rango de fechas ingresadas
AND (P.mps_id_categoria_producto_servicio = @IdCategoria OR @IdCategoria=0) --filtro segun id de categorias de producto ingresado
AND B.mbv_nula = 0), si quieres seleccionar las no nulas no es mejor que pongas un not null?
 
como manejar una tabla de pagos y retrazo de los pagos

Buenas noches para todos, de nuevo yo por aqui molestandolos.

Se que este es el foro de SQL, pero asi mismo se que hay mucha gente que tiene logica en esto de las bases de datos, logica que veo me hace falta porque hoy heché cabeza todo el dia para hacer lo que esta en el titulo de esta pregunta.

Estoy trabajando en Access 2007, pero pues es por especificar, ya que pues me parece que "basicamente" es lo mismo, es lenguaje SQL.

Resulta que estoy haciendo un programa en C# para llevar los pagos de las pensiones de los alumnos, pero hay alumnos que pagan tambien restaurante y ruta, entonces hice una tabla asi:

PagoFecha: fecha
PagoAlumno: foreignkey apuntando al ID del alumno
PagoPension: bool (porque se paga o no se paga)
PagoRestaurante: bool
PagoRuta: bool

¿estoy haciendolo bien? pero pues bueno, el pago lo puedo hacer, y todo bien, pero, ¿y si pasa marzo y el alumno no ha pagado? ahi ya hay mora de un 10% digamos, pero, ¿como hago para que mi programa detecte que hay mora?

gracias por la ayuda muchachos.
 
Señores, creo que tendre que desarrollar un sistema (mi primer sistema que se utilizara en un negocio :D), lo hace con Visual Basic .NET 9 y SQL Server 2005 Express y creo que necesitare asesoria con la base de datos, soy novato en esto y espero tener buena acojida .... espero que me den soporte ahh y de antemanos gracias....



SuerteX :)
 
Señores, creo que tendre que desarrollar un sistema (mi primer sistema que se utilizara en un negocio :D), lo hace con Visual Basic .NET 9 y SQL Server 2005 Express y creo que necesitare asesoria con la base de datos, soy novato en esto y espero tener buena acojida .... espero que me den soporte ahh y de antemanos gracias....



SuerteX :)

viejo VIRUTERO_5 cuente conmigo.... saludos!
no soy experto pero hay se le hace....

saludos y exitos con su proyecto.
 
Señores, creo que tendre que desarrollar un sistema (mi primer sistema que se utilizara en un negocio :D), lo hace con Visual Basic .NET 9 y SQL Server 2005 Express y creo que necesitare asesoria con la base de datos, soy novato en esto y espero tener buena acojida .... espero que me den soporte ahh y de antemanos gracias....



SuerteX :)

Bueno yo tambien me le uno solo diga en q se le puede ayudar... y listo....=)=)

suerte y exito con su programa...
 
  • Me gusta
Reacciones: 2 personas
Muchas gracias, el software seria para una farmacia (creo que en colombia le dice drogueria) ... desde que tenga los datos a mano los expongo para ver como puedo desarrollar la base de datos y aplicar los constraints, triggers, etc., correspondientes.... relamente lo que quiero es hacerla y que entre todos vean los avances y me corrijan donde tenga puntos debiles ;)


Gracias anticipada


SuerteX :)