Luis
creo que no me doy muy bien a entender. quiz�s los que hayan hecho y corrido
sistema solo a nivel LAN no lo vayan a notar, pero lo que corren sistema
f�sicamente separadas por 475 km con un acho de banda dedicado de 192 Kbps
con un servidor de datos a un extremo y en el otro los clientes ah� es donde
se siente lo de abajo mencionado.
- estoy pensando descartar los SP y crear vistas con dichos consolidado para
poder bajarlos solo con un select
- Pero que acaso es una mala caracter�stica del SQL con sus SP.
Luis
"aa" <a...@aa.com> escribi� en el mensaje de noticias
news:%236sSfqr...@TK2MSFTNGP05.phx.gbl...
--
------------------------------------------------
Maxi Accotto
MVP en SQL Server
http://blog.maxiaccotto.com
--------------------------------------------------
"Luis Mata" <lm...@cclf.com.pe> wrote in message
news:u$hBpFpfK...@TK2MSFTNGP06.phx.gbl...
- Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (X64) Jul 9 2008
14:17:44 Copyright (c) 1988-2008 Microsoft Corporation Standard Edition
(64-bit) on Windows NT 6.0 <X64> (Build 6001: Service Pack 1)
- Windows 2008 server 64 bits con todos los SP'S
Lo que sucede es que cree un sistema que yo considere cliente servidor puro,
trabajando full procedimientos almacenados para no congestionar mi ancho de
banda.
realizando consolidados de ventas, stocks, compras de clientes que tenian
cargas enormes como lo menciono en otros hilos. Pero en la practica lo que
yo creo: lanzar una linea de codigo invocando el procedure para que este
consolide los datos y cree una tabla y me devuleva solo 45 registros de lo
miles de registros que se requiere para el consolidado, a la hora de la hora
igual me satura el ancho de banda.
Ojo, a nivel LAN ni se siente, pero en mi VPN con 192 kbps se come todo mi
ancho de banda.
y el resultado final : 45 - 50 reg.
�En que me consume tanto el ancho de banda?
ahora miestras la aplicacion haga procesos simples como una proforma,
facturas, ingresos.. osea insert, update, delete..etc trabaja sin problemas
pero si en eso alguien lanza llamando los reportes de consolidado... fatal
todas las transacciones anteriores demora lo que demora el SP en devolver la
Rpta, inclusive hasta el ping se corta y todos les sale el mensaje conexion
invalida, deben de salir del sistema volver a entrar para poder trabajar.
Esto me genera incomidad de parte de los usuarios y tambien a mi, porque lo
que creia una solucion no me esta sirviendo, porque es lo mismo que hacer un
select en el cliente traer los miles de registros del servidor al cliente y
ahi recien iniciar el consolidado, lo que me sa la sensacion de haber
perdido mi tiempo haciendo lo procedimientos almacenados.
Con un simple select, inner, group by no me soluciona mi necesidad.
Pego el codigo:
ALTER proc [dbo].[meta_total_vendedor] @panio char(4), @pmes char(2)
as
declare @notc char(1)
set @notc = 'N'
--Inserto los dias del mes
SET LANGUAGE Spanish
--convirtiendo a fecha
declare @fechagen datetime,@fechatest datetime,@diastest int, @dias4m int
if cast(@panio as int)!=year(getdate()) or cast(@pmes as
int)!=month(getdate())
begin
set @fechatest = cast(@panio+'-01'+'-'+@pmes as datetime)
set @diastest = DAY(DATEADD(DAY, -1, CONVERT(VARCHAR(6), DATEADD(MONTH, 1,
@fechatest), 112) + '01'))
set @fechagen = cast(@panio+'-'+cast(@diastest as char(2))+'-'+@pmes as
datetime)
end
else
begin
set @fechagen = getdate()
end
--Variables
declare @anio int,@mes int
set @anio = YEAR(@fechagen)
set @mes = MONTH(@fechagen)
declare @dinicial datetime, @numdias int, @diaactual int, @diareal
decimal(12,4)
declare @ejecuta varchar(7500), @vnomven varchar(20)
set @dinicial = @fechagen-(day(@fechagen)-1)
set @numdias = DAY(DATEADD(DAY, -1, CONVERT(VARCHAR(6), DATEADD(MONTH, 1,
@fechagen), 112) + '01'))
set @dias4m = @numdias -4
set @diaactual = day(@fechagen)
set @diareal = (cast(@diaactual as decimal(12,4))/cast(@numdias as
decimal(12,4)))*(cast(@numdias as decimal(12,4))-4)
--creo la tabla
create table #tabmmetas(ID int not null default 0,c1 varchar(90) not null
default space(0),c2 varchar(60)not null default space(0),c3
varchar(60),metatotal decimal(12,2) not null default 0)
insert into #tabmmetas values(1,'Dia Actual (para calc: '+cast(@diareal as
nvarchar(15))+')',cast(@diaactual as varchar(2)),'Hoy',0)
insert into #tabmmetas values(2,'Cuota del Mes','','',0)
insert into #tabmmetas values(3,'Cuota Diaria',ltrim(str(@dias4m)),'Dias',0)
insert into #tabmmetas values(4,'Acumulado al Dia de HOY','','',0)
insert into #tabmmetas values(5,'Como deberia Ir S/.','','',0)
insert into #tabmmetas values(6,'Acumulado a la Fecha En %','','',0)
insert into #tabmmetas values(7,'Como deberia Ir En %','','',0)
insert into #tabmmetas values(8,'Diferencia','','',0)
insert into #tabmmetas values(9,'Acum. vs Como deberia ir En %','','',0)
declare @contar int,@metames decimal(12,2),@metatienda decimal(12,2)
declare @namebd varchar(5),@metaahora decimal(12,2)
set @namebd = (SELECT DB_NAME() AS [Current Database])
set @ejecuta = 'declare sacameta cursor for select '+@namebd+' from
maestro.dbo.tabtmetas where anio='+@panio+' and mes='+@pmes
exec (@ejecuta)
open sacameta
fetch next from sacameta into @metames
set @metatienda = @metames
deallocate sacameta
set @metaahora = @metames/(@numdias-4)
update #tabmmetas set metatotal=cast(@metames as nvarchar) where id = 2
set @ejecuta = 'update #tabmmetas set metatotal='+cast(@metames/@dias4m as
nvarchar)+' where id = 3'
exec (@ejecuta)
set @ejecuta = 'update #tabmmetas set
metatotal='+cast((@metames/@dias4m)*@diareal as nvarchar)+' where id =
5'---@numdias-4
exec (@ejecuta)
if @metames!=0
begin
set @ejecuta = 'update #tabmmetas set
metatotal='+cast((((@metaahora*@diareal)/@metames)*100) as nvarchar)+' where
id = 7'
end
exec (@ejecuta)
set @contar = 0
declare curbd cursor for SELECT VENDEDOR FROM ARCHTRA1 WHERE
year(fecha)=@anio and month(fecha)=@mes and tot_sol!=0 group by vendedor
union
SELECT VENDEDOR FROM devolu WHERE year(fecha)=@anio and
month(fecha)=@mes and tot_sol!=0 group by vendedor
UNION
SELECT VENDEDOR FROM NOTA_DEB WHERE year(fecha)=@anio and
month(fecha)=@mes and tot_sol!=0 group by vendedor ORDER BY VENDEDOR
open curbd
fetch next from curbd into @vnomven
while @@fetch_status = 0
begin
set @ejecuta = 'alter table #tabmmetas add '+LOWER(rtrim(@vnomven))+'
decimal(12,2) default 0 not null'
exec (@ejecuta)
set @metames = (select meta from tabmetavend where anio=@anio and mes =
@mes and vendedor=rtrim(@vnomven))
set @ejecuta = 'update #tabmmetas set
'+lower(rtrim(@vnomven))+'='+cast(@metames as nvarchar)+' where id = 2'
exec (@ejecuta)
if @metames != 0
begin
set @ejecuta = 'update #tabmmetas set
'+lower(rtrim(@vnomven))+'='+cast(@metames/@dias4m as nvarchar)+' where id =
3'
exec (@ejecuta)
set @ejecuta = 'update #tabmmetas set
'+lower(rtrim(@vnomven))+'='+cast((@metames/(@dias4m))*(@diareal) as
nvarchar)+' where id = 5'
exec (@ejecuta)
if @metames!=0
begin
set @ejecuta = 'update #tabmmetas set
'+lower(rtrim(@vnomven))+'='+cast((((@metames/@dias4m)*@diareal)/@metames)*100
as nvarchar)+' where id = 7'
exec (@ejecuta)
end
end
fetch next from curbd into @vnomven
end
----cambio a spanish
declare @vtatotal decimal(12,2),@nctotal decimal(12,2),@ndtotal
decimal(12,2),@totfinal decimal(12,2),@varmeta decimal(12,2), @varacumula
decimal(12,2)
DECLARE @valor int
close curbd
set @valor = 0
while @valor <= (@numdias)-1
begin
set @valor = @valor + 1
insert into #tabmmetas(id,c2,c3) values(@valor+10,datename(weekday,
dateadd(d,@valor,@dinicial)),convert(char(6),dateadd(d,@valor,@dinicial),113))
open curbd
fetch next from curbd into @vnomven
while @@fetch_status = 0
begin
declare @unisol decimal(12,4), @bsol decimal(12,2), @dsol decimal(12,4),
@neto decimal(15,6), @igv decimal(12,2), @bruto decimal(12,2),
@total decimal(12,5), @ntotal decimal(12,5)
set @total = 0
set @ntotal = 0
declare miventa cursor for select codarticul, precioprod, cantidad,
descuento,proveedor from archtra3 where year(fecha)=@anio and
month(fecha)=@mes
and day(fecha)=@valor and vendedor=rtrim(@vnomven)
union all
select codarticul, precioprod * -1, cantidad, descuento,proveedor from
devo_pro where year(fecha)=@anio and month(fecha)=@mes
and day(fecha)=@valor and vendedor=rtrim(@vnomven)
union all
select codarticul, precioprod, cantidad, descuento,proveedor from notapro
where year(fecha)=@anio and month(fecha)=@mes
and day(fecha)=@valor and vendedor=+rtrim(@vnomven) order by codarticul
declare @codigo varchar(13), @precio decimal(12,4), @cant decimal(12,4),
@dscto decimal(12,2),@prov char(6),@excluye int,@nosuma int
open miventa
fetch next from miventa into @codigo,@precio, @cant, @dscto,@prov
while @@fetch_status = 0
begin
if @prov = 'ZZZ002' OR @prov = 'SUM001' OR @prov = 'ZZZ004' OR @prov =
'ZZ003'
BEGIN
set @excluye = (select count(*) from maestro.dbo.taberrnocont where
codigo=@codigo)
if @excluye =0
begin
set @unisol = @precio
set @bsol = round(@unisol * (case @cant when 0 then 1 else @cant
end),2)
set @dsol = round(@bsol * (@dscto/100),4)
set @neto = @bsol - @dsol
set @igv = round(@neto * 0.19,2)
set @bruto = round(@neto + @igv,2)
set @ntotal = @ntotal + round(@bruto / 1.19,2)
end
END
set @unisol = @precio
set @bsol = round(@unisol * (case @cant when 0 then 1 else @cant end),2)
set @dsol = round(@bsol * (@dscto/100),4)
set @neto = @bsol - @dsol
set @igv = round(@neto * 0.19,2)
set @bruto = round(@neto + @igv,2)
set @total = @total + round(@bruto / 1.19,2)
fetch next from miventa into @codigo,@precio, @cant, @dscto,@prov
end
deallocate miventa
PRINT rtrim(@vnomven) + cast(@total as nvarchar)+' '+ cast(@ntotal as
nvarchar)
--suma todos
set @totfinal = @total-@ntotal
set @ejecuta = 'update #tabmmetas set '+@vnomven+'='+cast(@totfinal as
nvarchar)+' where id='+''''+cast(@valor+9 as varchar(2))+''''
exec (@ejecuta)
update #tabmmetas set metatotal=metatotal+@totfinal where id=@valor+9
update #tabmmetas set metatotal=metatotal+@totfinal where id=4
--Aqui muevo los datos
--Hasta aqui
set @ejecuta = 'update #tabmmetas set
'+@vnomven+'='+@vnomven+'+'+cast(@totfinal as nvarchar)+' where id=4'
exec (@ejecuta)
--Aqui las pruebas
--Desde aqui como va actualmente en %
--Para el campo meta total
declare tabmeta cursor for select metatotal from #tabmmetas where id=2
open tabmeta
fetch next from tabmeta into @varmeta
deallocate tabmeta
declare tabmeta cursor for select metatotal from #tabmmetas where id=4
open tabmeta
fetch next from tabmeta into @varacumula
deallocate tabmeta
if @varmeta!=0--@metames!=0 and
begin
update #tabmmetas set metatotal=(@varacumula /@varmeta)*100 where id=6
end
--Para el campo nombre bd
set @ejecuta = 'declare tabmeta cursor for select '+@vnomven+' from
#tabmmetas where id=2'
exec(@ejecuta)
open tabmeta
fetch next from tabmeta into @varmeta
deallocate tabmeta
set @ejecuta = 'declare tabmeta cursor for select '+@vnomven+' from
#tabmmetas where id=4'
exec(@ejecuta)
open tabmeta
fetch next from tabmeta into @varacumula
deallocate tabmeta
if @varacumula!=0 and @varmeta!=0
begin
set @ejecuta = 'update #tabmmetas set '+@vnomven+'=('+cast(@varacumula as
nvarchar)+'/'+cast(@varmeta as nvarchar)+')*100 where id=6'
exec (@ejecuta)
end
--Para el campo nombre bd
set @ejecuta = 'declare tabmeta cursor for select '+@vnomven+' from
#tabmmetas where id=2'
exec(@ejecuta)
open tabmeta
fetch next from tabmeta into @varmeta
deallocate tabmeta
--Desde aqui la diferecia existente
--Para el campo meta total
declare tabmeta cursor for select metatotal from #tabmmetas where id=4
open tabmeta
fetch next from tabmeta into @varmeta
deallocate tabmeta
declare tabmeta cursor for select metatotal from #tabmmetas where id=5
open tabmeta
fetch next from tabmeta into @varacumula
deallocate tabmeta
update #tabmmetas set metatotal=(@varmeta -@varacumula) where id=8
--Para el campo nombre bd
set @ejecuta = 'declare tabmeta cursor for select '+@vnomven+' from
#tabmmetas where id=4'
exec(@ejecuta)
open tabmeta
fetch next from tabmeta into @varmeta
deallocate tabmeta
set @ejecuta = 'declare tabmeta cursor for select '+@vnomven+' from
#tabmmetas where id=5'
exec(@ejecuta)
open tabmeta
fetch next from tabmeta into @varacumula
deallocate tabmeta
if @varacumula!=0 and @varmeta!=0
begin
set @ejecuta = 'update #tabmmetas set '+@vnomven+'=('+cast(@varmeta as
nvarchar)+'-'+cast(@varacumula as nvarchar)+') where id=8'
exec (@ejecuta)
end
--Porecentaje del avanze a la Meta
--Para el campo meta total
declare tabmeta cursor for select metatotal from #tabmmetas where id=4
open tabmeta
fetch next from tabmeta into @varmeta
deallocate tabmeta
declare tabmeta cursor for select metatotal from #tabmmetas where id=5
open tabmeta
fetch next from tabmeta into @varacumula
deallocate tabmeta
if @varacumula!=0 and @varmeta!=0
begin
update #tabmmetas set metatotal=(@varmeta /@varacumula)*100 where id=9
end
--Para el campo nombre bd %
set @ejecuta = 'declare tabmeta cursor for select '+@vnomven+' from
#tabmmetas where id=4'
exec(@ejecuta)
open tabmeta
fetch next from tabmeta into @varmeta
deallocate tabmeta
set @ejecuta = 'declare tabmeta cursor for select '+@vnomven+' from
#tabmmetas where id=5'
exec(@ejecuta)
open tabmeta
fetch next from tabmeta into @varacumula
deallocate tabmeta
if @varacumula!=0
begin
set @ejecuta = 'update #tabmmetas set '+@vnomven+'=('+cast(@varmeta as
nvarchar)+'/'+cast(@varacumula as nvarchar)+')*100 where id=9'
exec (@ejecuta)
end
fetch next from curbd into @vnomven
end
close curbd
end
deallocate curbd
----Calculos finales
select * from #tabmmetas order by id
drop table #tabmmetas
Como vez esto no es un simple consolidado.
te crea una tabla con encabezados de vendedores cuyos nombres pueden variar
porque no son estables, y crea un temporal en base a los vendedores que
internivieron en ventas del a�o y mes elegido, luego me carga las metas
establecidas e inserta los dias del mes ingresado y va asignando por
vendedor las ventas que le corresponde por dia del mes y luego suma el total
de ventas contra la meta del mes , saca el porcentaje de avance, como
deberia de ir a la fecha y su faltante o sobrant en totales.
Resultado final 41 registros simples.
es una falla mia o esta caracteristica es propia del sql.?
Luis
"Maxi Accotto" <maxi_a...@msn.comnospam> escribi� en el mensaje de
noticias news:9F9A27D0-7ED9-47DB...@microsoft.com...