porque esta SP funciona si y no

19/03/2005 - 23:46 por humberto gonzalez | Informe spam
tengo un problema y no lo he podido resolver, esta misma SP funciona
tanto en el equipo de desarrollo como en algunos de los que corren la
aplicacion cliente, pero en otros no ejecuta los comandos de
actualizacion de la tabla.
funciona en forma aleatoria en win98/win2000/winMe/WinXp ya no me
preocupo por fecha y aun eliminando el filtro por @vendedor

CREATE procedure Anula_ticket
@ticketId bigint,
@fullventa char(8000) output,
@vendedor char(6)

as
declare Allnum cursor
for
select cod_loteria,numero,monto,terminal,fecha from venta where
(numeroticket = @ticketId and rtrim(cod_vendedor) = rtrim(@vendedor))
open Allnum

SET LOCK_TIMEOUT 1800
SET NOCOUNT ON

declare @fecha datetime
declare @numero int
declare @num char(3)
declare @vende money
declare @vende2 money
declare @codigo char(8)
declare @terminal bit
declare @totlines int
declare @currline int
declare @lot char(3)
declare @equivale char(3)
declare @resultado char(8000)
declare @min_diff int
DECLARE @retcod int
set @resultado = ' '

fetch from allnum into @lot,@numero,@vende,@terminal,@fecha

set @min_diff = datediff(n,@fecha,getdate())
print convert(char(10),@min_diff)
if @min_diff > 5
begin
close allnum
deallocate allnum
return(-120)
end
if @vende < 0
begin
close allnum
deallocate allnum
return(-150)
end

while @@fetch_status = 0
Begin
print @lot
set @num = substring(convert(char(4),1000+@numero),2,3)
if @terminal = 1
set @codigo = 'M'+@lot+@num
else
set @codigo = 'T'+@lot+@num

set @vende2 = -@vende
if @terminal = 1
set @num = convert(int,@num)


execute set_top @vende = @vende2 output, @lot=@lot, @numero=@num,
@terminal=@terminal,@vendedor=@vendedor,@codigo=@codigo

print 'Vende: ' + convert(char(12),@vende)
print 'Vende2: ' + convert(char(12),@vende2)

set @resultado = @codigo + convert(char(10),@vende2) + @resultado
fetch next from allnum into @lot,@numero,@vende,@terminal

end

set @fullventa = ltrim(@resultado)

print @fullventa
close allnum
deallocate allnum

if len(@fullventa)>10
begin
begin tran

update venta set monto = -monto where numeroticket = @ticketid

if @@error > 0
begin
rollback tran
return (-100)
end

update tickets set nulo = 1,quienanula = host_id(), fechaanula = getdate
() where numeroticket = @ticketid

if @@error > 0
begin
rollback tran
return (-100)
end
commit tran
end

else
return(-155)
GO
 

Leer las respuestas

#1 MAXI
20/03/2005 - 14:44 | Informe spam
Hola, por lo que veo estas usando cursores y ademas por cada registro le
estas aplicando la ejecucion de un SP. No te recomiendo para nada usar
cursores y te recomendaria pensar el problema nuevamente.

De todas maneras, que quiere decir que no funciona en las otras pc? que
sintomas ves?



Maxi
Buenos Aires - Argentina
Desarrollador .NET 3 Estrellas
Microsoft User Group (MUG)



"humberto gonzalez" escribió en el mensaje
news:
tengo un problema y no lo he podido resolver, esta misma SP funciona
tanto en el equipo de desarrollo como en algunos de los que corren la
aplicacion cliente, pero en otros no ejecuta los comandos de
actualizacion de la tabla.
funciona en forma aleatoria en win98/win2000/winMe/WinXp ya no me
preocupo por fecha y aun eliminando el filtro por @vendedor

CREATE procedure Anula_ticket
@ticketId bigint,
@fullventa char(8000) output,
@vendedor char(6)

as
declare Allnum cursor
for
select cod_loteria,numero,monto,terminal,fecha from venta where
(numeroticket = @ticketId and rtrim(cod_vendedor) = rtrim(@vendedor))
open Allnum

SET LOCK_TIMEOUT 1800
SET NOCOUNT ON

declare @fecha datetime
declare @numero int
declare @num char(3)
declare @vende money
declare @vende2 money
declare @codigo char(8)
declare @terminal bit
declare @totlines int
declare @currline int
declare @lot char(3)
declare @equivale char(3)
declare @resultado char(8000)
declare @min_diff int
DECLARE @retcod int
set @resultado = ' '

fetch from allnum into @lot,@numero,@vende,@terminal,@fecha

set @min_diff = datediff(n,@fecha,getdate())
print convert(char(10),@min_diff)
if @min_diff > 5
begin
close allnum
deallocate allnum
return(-120)
end
if @vende < 0
begin
close allnum
deallocate allnum
return(-150)
end

while @@fetch_status = 0
Begin
print @lot
set @num = substring(convert(char(4),1000+@numero),2,3)
if @terminal = 1
set @codigo = 'M'+@lot+@num
else
set @codigo = 'T'+@lot+@num

set @vende2 =
if @terminal = 1
set @num = convert(int,@num)


execute set_top @vende = @vende2 output, @lot=@lot, @numero=@num,
@terminal=@terminal,@vendedor=@vendedor,@codigo=@codigo

print 'Vende: ' + convert(char(12),@vende)
print 'Vende2: ' + convert(char(12),@vende2)

set @resultado = @codigo + convert(char(10),@vende2) + @resultado
fetch next from allnum into @lot,@numero,@vende,@terminal

end

set @fullventa = ltrim(@resultado)

print @fullventa
close allnum
deallocate allnum

if len(@fullventa)>10
begin
begin tran

update venta set monto = -monto where numeroticket = @ticketid

if @@error > 0
begin
rollback tran
return (-100)
end

update tickets set nulo = 1,quienanula = host_id(), fechaanula = getdate
() where numeroticket = @ticketid

if @@error > 0
begin
rollback tran
return (-100)
end
commit tran
end

else
return(-155)
GO

Preguntas similares