No actualiza _ Begin Transaction | SQL Server Performance Forums

SQL Server Performance Forum – Threads Archive

No actualiza _ Begin Transaction

Otra vez yo, tengo un store de almacenes, cuando ejecuto de mes en mes, todo funciona o traslada los stocks correctamente pero si mando a que haga el trabajo de varios meses, a veces sucede que algunos codigos no actualiza, y el store no cambia puesto que lo convoco de forma mensual, si proceso 5 meses es un bucle que se repite 5 veces, pero no entiendo porque no actualiza algunos campos (no genera ningun error), y como puedo saber si una tabla esta en una transaccion en otro cliente, me explico, una persona genera una ficha de requerimiento de materiales y en ese momento la persona que se encarga de los consumos unitarios esta actualizando los codigos, como saber para avisar al de requerimiento que no puede generar porque en ese momento esta siendo actualizado, si es posible llegar al nivel de registro, como lo haria?.
Porque no le pones unos mensajes con PRINT al procedimiento y lo seguis con SQL profiler y el query analizer para ver porque no actualiza como esperabas. Tenes claves foraneas definidas en tu base de datos? Para evitar el uso del código hasta que esté totalmente actualizado podrías utilizar WITH TABLOCK y HOLDLOCK, pero deberías estudiar más los efectos del bloqueo y las implicancias.

Podrías mostrar los parámetros de la sp tanto para un mes como para 5 meses?
Luis Martin
Moderator
SQL-Server-Performance.com All postings are provided “AS IS” with no warranties for accuracy.
Revise como me indicaste pero no encuentro en si el problema, revise los select que hago de los articulos por mes, y los inserte en otra tabla y jala toda la informacion, pero si reviso uno por uno, pierdo mucho tiempo ya que se trata de 1700 codigos por mes aprox. exactamente no se sabe cuando se perdera la informacion, es como si mi servidor no tuviera todos los recursos o algo asi, porque cuando proceso ese store mando al servidor principal al 100% de uso de procesador por buen rato, me indicaron que revise una opcion donde veo la paginacion del sql, porque si se mantenia mas de 20 por varios minutos, era problema de hardware, bueno en ocasiones sube el 20 pero por escasos 2 o 3 segundos, y si el proceso lo hago mes a mes, como que la carga es menos y pasa sin problemas, alguna sugerencia?
Muchas gracias Jesus Aguilar
No entiendo cuando decis "exactamente no se sabe cuando se perdera la informacion,". El procedimiento termina de ejecutar normalmente?
y si termina llega a dar algún error. Creo que necesitamos mas detalles, podes mostrar el script del procedimiento, script de las tablas que usa y un ejemplo de como lo ejecutás. Gracias.
Una consulta, aparte de todo, tengo un store que estoy haciendo y al ejecutar me sale 1 fila afectada, bueno es por cada registro, pero quiero que ese mensaje no se imprima pero si los mensajes de inicio y fin que yo genero, hay una manera?
Agregá Set Nocount On Esto no muestra los mensajes de conteo de registro. Ej: CREATE PROC myProc
As Set Nocount On Select * from TABLA Go
Espera, estoy revisando el codigo, porque se segmenta en procesar mes, eliminar cierre, generar cierre y actualizar precios. Un proceso es el siguiente.
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO CREATE procedure Sp_AlmacenReordenaKardex @Mes varchar(2),
@Anio varchar(4),
@Alm varchar(500),
@Alm1 varchar(500),
@TipoAlm int, –0=uno,1=en,2=entre,3=todos
@Hil varchar(5000),
@Hil1 varchar(5000),
@TipoHilo int ,
@Propie varchar(500),
@Propie1 varchar(500),
@TipoProp int,
@TablaHeadvarchar(200),
@TablaItemvarchar(200),
@TablaCierrevarchar(200),
@TablaMesvarchar(200),
@CampoCodigovarchar(50),
@CampoAbrevvarchar(50),
@TipoArticuloint,
@TipoActualizacion int, –0=ambos,1=precios
@Estado int output as
declare @Stock numeric(20,10),
@StockPP numeric(20,10),
@PreS numeric(20,10),
@PreD numeric(20,10),
@PrePS numeric(20,10),
@PrePD numeric(20,10),
@TotI numeric(20,10),
@TotS numeric(20,10),
@ValIS numeric(20,10),
@ValID numeric(20,10),
@ValSS numeric(20,10),
@ValSD numeric(20,10),
@TotIK numeric(20,10),
@TotSK numeric(20,10),
@ValISK numeric(20,10),
@ValIDK numeric(20,10),
@ValSSK numeric(20,10),
@ValSDK numeric(20,10),
@Prop int,@Hilo varchar(100),@Can numeric(20,10),@CanK numeric(20,10),
@TC numeric(20,10),@Cos Int,@Fecha datetime,@Tipo int,@Almacen int,@Mon int,@Orden int,@Vkar int,@Imp int DECLARE @NroCierre int if @TipoActualizacion=0
begin
EXEC(‘ DECLARE CURMES CURSOR FOR select Nrocierre from ‘ + @TablaMes + ‘ where mes=’ + @Mes + ‘ and año=’ + @Anio) OPEN CURMES
FETCH NEXT FROM CURMES INTO @NroCierre CLOSE CURMES
DEALLOCATE CURMES
end else
select @NroCierre=0 declare @Prop1 int,@Hilo1 varchar(100),
@Fecha1 datetime,@Almacen1 int declare @Consulta varchar(500)
select @consulta=’ ‘ select @CampoAbrev=ltrim(rtrim(@CampoAbrev)) if @TipoAlm=0 SELECT @Consulta=’ and h.Alma_Codi=’ + @Alm if @TipoAlm=1 sELECT @Consulta=’ and h.Alma_Codi in (‘ + @Alm + ‘)’ if @TipoAlm=2 SELECT @Consulta=’ and h.Alma_Codi between ‘ + @Alm + ‘ and ‘ + @Alm1
declare @Consulta1 varchar(5000)
select @consulta1=’ ‘ if @TipoHilo=0 SELECT @Consulta1=’ and ‘ + @CampoCodigo + ‘=’ + @Hil if @TipoHilo=1 sELECT @Consulta1=’ and ‘ + @CampoCodigo + ‘ in (‘ + @Hil + ‘)’ if @TipoHilo=2 SELECT @Consulta1=’ and ‘ + @CampoCodigo + ‘ between ‘ + @Hil + ‘ and ‘ + @Hil1 declare @Consulta2 varchar(5000)
select @consulta2=’ ‘ if @TipoProp=0 SELECT @Consulta2=’ and Prop_Codi=’ + @Propie if @TipoProp=1 sELECT @Consulta2=’ and Prop_Codi in (‘ + @Propie + ‘)’ if @TipoProp=2 SELECT @Consulta2=’ and Prop_Codi between ‘ + @Propie + ‘ and ‘ + @Propie1
exec(‘declare cur cursor for SELECT Prop_Codi,’ + @CampoCodigo + ‘, Movi_Cant,
Movi_PrecSole+Movi_Costo1S, Movi_PrecDola+Movi_Costo1D, H.Movi_FechEmis,
H.Oper_Tipo,Oper_COST as Costea,Oper_Orde as Orden,H.Alma_codi,dbo.f_CambioFecha(CASE WHEN H.Movi_Fechfact IS NULL THEN H.Movi_FechEmis ELSE H.Movi_FechFACT end) as TipoCambio,Mone_Codi,Oper_VisuKar,0 as stockinicialKar,isnull(CompTipo_Codi,0) as Imp
fROM ‘ + @TablaItem + ‘ a INNER JOIN
‘ + @TablaHead + ‘ H ON a.Movi_Codi = H.Movi_Codi AND
a.Alma_Codi = H.Alma_codi inner join bdcomun..Operacion Operacion on H.Oper_Codi=Operacion.Oper_Codi
where (MONTH(H.Movi_FechEmis)=’ + @Mes + ‘) AND (YEAR(H.Movi_FechEmis) =’ + @Anio + ‘) ‘ + @Consulta + ‘ ‘ + @Consulta1 + ‘ ‘ + @Consulta2 + ‘ and (Oper_COST=1 or oper_visukar=0)
UNION all
SELECT Prop_Codi, ‘ + @CampoCodigo + ‘, SUM(Movi_Cant) ,
0, 0, H.Movi_FechEmis,
H.Oper_Tipo,0 ,0,H.Alma_codi,0,-1,1,0,-1
fROM ‘ + @TablaItem + ‘ a INNER JOIN ‘ + @TablaHead + ‘
H ON a.Movi_Codi = H.Movi_Codi AND
a.Alma_Codi = H.Alma_codi
inner join bdcomun..Operacion Operacion on H.Oper_Codi=Operacion.Oper_Codi
where oper_Cost=0 and oper_visukar=1
GROUP BY H.Alma_codi,Prop_Codi, ‘ + @CampoCodigo + ‘,H.Movi_FechEmis,H.Oper_Tipo
HAVING (MONTH(H.Movi_FechEmis) =’ + @Mes + ‘) AND (YEAR(H.Movi_FechEmis) =’ + @Anio + ‘) ‘ + @Consulta + ‘ ‘ + @Consulta1 + ‘ ‘ + @Consulta2 + ‘
union all
SELECT prop_codi,’ + @CampoCodigo + ‘,sum(stockinicial), max(precprominicsole), max(precprominicdola), fechainicial, – 1, 2,0,Alma_Codi,0,-1,-1,sum(stockinicialKar),-1
FROM ‘ + @TablaCierre + ‘ h inner join ‘ + @Tablames + ‘ i on h.nrocierre=i.nrocierre
WHERE i.mes=’ + @Mes + ‘ and I.Año=’ + @Anio + ‘ AND (stockinicial <> 0 or stockinicialKar<>0) ‘ + @Consulta + ‘ ‘ + @Consulta1 + ‘ ‘ + @Consulta2 + ‘
group by h.alma_codi,prop_codi,’ + @CampoCodigo + ‘,fechainicial
order by h.Alma_codi,prop_Codi,’ + @CampoCodigo + ‘,Movi_FechEmis,Costea desc,Orden,H.Oper_Tipo’
) if @@error<>0 goto err
open cur if @@cursor_rows=0 goto err
select @PreS=0
select @PreD=0
select @PrePS=0
select @PrePD=0
select @TotI=0
select @TotS=0
select @ValIS=0
select @ValID=0
select @ValSS=0
select @ValSD=0
select @TotIK=0
select @TotSK=0
select @ValISK=0
select @ValIDK=0
select @ValSSK=0
select @ValSDK=0 select @Stock=0
select @StockPP=0 fetch next from Cur Into @Prop,@Hilo,@Can,@PreS,@PreD,@Fecha,@Tipo,@CoS,@Orden,@Almacen,@TC,@Mon,@Vkar,@CanK,@Imp select @[email protected]
select @[email protected]
select @[email protected]
select @[email protected]
WHILE @@FETCH_STATUS=0 BEGIN WHILE @[email protected] and @@FETCH_STATUS=0
begin
WHILE @[email protected] and @[email protected] and @@FETCH_STATUS=0
begin
while @[email protected] and @[email protected] and @[email protected] and @@FETCH_STATUS=0
begin
while @[email protected] and @[email protected] and @[email protected] and @[email protected] and @@FETCH_STATUS=0
begin
if @tipo=-1 — si es saldo inicial
begin
select @[email protected]
select @[email protected]
select @[email protected]
select @[email protected]
end
if @tipo=0 and @cos=1 — si es ingreso y se costea
begin
if @[email protected]>0
begin
select @preps=round(((round(@preps*@stockPP,2))+round(case when @Imp=2 or @mon=0 then @preS else case when @mon=1 then case when @Tc<=0 then @pred else round(@pred*@Tc,5) end end end* @Can,2))/(@[email protected]),6)
select @prepd=round(((round(@prepd*@stockPP,2))+round(case when @Imp=2 or @mon=1 then @pred else case when @mon=0 then case when @Tc<=0 then @pres else round(@pres/@Tc,5) end end end* @Can,2))/(@[email protected]),6)
end
else
begin
select @preps=0
select @prepd=0
end select @[email protected]+ROUND(case when @Imp=2 or @mon=0 then @preS else case when @mon=1 then case when @Tc<=0 then @Pred else round(@preD*@Tc,5) end end end*@can,2)
select @[email protected]+ROUND(case when @Imp=2 or @mon=0 then @preS else case when @mon=1 then case when @Tc<=0 then @Pred else round(@preD*@Tc,5) end end end*@can,2)
–if @Tc>0
–begin
select @[email protected]+ROUND(case when @Imp=2 or @mon=1 then @pred else case when @mon=0 then case when @Tc<=0 then @pres else round(@pres/@Tc,5) end end end*@can,2)
select @[email protected]+ROUND(case when @Imp=2 or @mon=1 then @pred else case when @mon=0 then case when @Tc<=0 then @pres else round(@pres/@Tc,5) end end end*@can,2)
–end
select @[email protected][email protected]
select @[email protected][email protected]
select @[email protected][email protected] select @[email protected][email protected]
end
if @tipo=0 and @cos=0 —- si es ingreso y no se costea, se actualiza la tabla de movimientos
begin
select @[email protected]+ROUND(@prepS*@can,2)
select @[email protected]+ROUND(@prepd*@can,2)
select @[email protected][email protected]
select @[email protected][email protected]
IF @Vkar=1
BEGIN
select @[email protected][email protected]
select @[email protected]+ROUND(@prepS*@can,2)
select @[email protected]+ROUND(@prepd*@can,2)
select @[email protected][email protected]
END
end
if @tipo=1 and @cos=1– si es salida y se costea
begin
if @[email protected]>0
begin
select @preps=round(((round(@preps*@stockPP,2))-round(case when @Imp=2 or @mon=0 then @pres else case when @mon=1 then case when @Tc<=0 then @Pred else round(@pred*@Tc,5) end end end * @Can,2))/(@[email protected]),6)
select @prepd=round(((round(@prepd*@stockPP,2))-round(case when @Imp=2 or @mon=1 then @pred else case when @mon=0 then case when @Tc<=0 then @pres else round(@pres/@Tc,5) end end end * @Can,2))/(@[email protected]),6)
end
else
begin
select @preps=0
select @prepd=0
end
select @[email protected]+ROUND(case when @Imp=2 or @mon=0 then @pres else case when @mon=1 then case when @Tc<=0 then @Pred else round(@preD*@Tc,5) end end end*@can,2)
select @[email protected]+ROUND(case when @Imp=2 or @mon=0 then @pres else case when @mon=1 then case when @Tc<=0 then @Pred else round(@preD*@Tc,5) end end end*@can,2) –if @Tc>0
–begin
select @[email protected]+ROUND(case when @Imp=2 or @mon=1 then @pred else case when @mon=0 then case when @Tc<=0 then @pres else round(@pres/@Tc,5) end end end*@can,2)
select @[email protected]+ROUND(case when @Imp=2 or @mon=1 then @pred else case when @mon=0 then case when @Tc<=0 then @pres else round(@pres/@Tc,5) end end end*@can,2)
–end
select @[email protected][email protected]
select @[email protected]@can
select @[email protected]@can
select @[email protected][email protected]
end
if @tipo=1 and @cos=0– si es salida y no se costea, se actualiza la tabla de movimientos
begin
select @[email protected]+ROUND(@prepS*@can,2)
select @[email protected]+ROUND(@prepd*@can,2)
select @[email protected][email protected]
select @[email protected]@can
IF @Vkar=1
BEGIN
select @[email protected]@can
select @[email protected]+ROUND(@prepS*@can,2)
select @[email protected]+ROUND(@prepd*@can,2)
select @T[email protected][email protected]
END
end fetch next from Cur Into @Prop,@Hilo,@Can,@PreS,@PreD,@Fecha,@Tipo,@CoS,@Orden,@Almacen,@TC,@Mon,@Vkar,@CanK,@Imp
end exec(‘update a set movi_precsole=’ + @preps + ‘,movi_precdola=’ + @prepd + ‘,
Movi_ImpoSole=round(Movi_Cant*’ + @preps + ‘,2),Movi_ImpoDola=round(Movi_Cant*’ + @prepd + ‘,2)
from ‘ + @TablaItem + ‘ a inner join ‘ + @TablaHead + ‘ b on a.Alma_Codi=b.Alma_Codi and a.Movi_Codi=b.Movi_Codi
where b.Alma_Codi=’ + @Almacen1 + ‘ And Movi_FechEmis=”’ + @Fecha1 + ”’ and dbo.F_Oper_Costea(Oper_Codi)=0 and ‘ + @CampoCodigo + ‘=”’ + @Hilo1 + ”’ and Prop_Codi=’ + @Prop1)
if @@error<>0 goto err
select @[email protected]
end
if @TipoActualizacion=0
begin
exec(‘update ‘ + @TablaCierre + ‘ set StockMes=case when ‘ + @TotI + ‘=0 and ‘ + @TotS + ‘=0 then 0 else ‘ + @TotI + ‘-‘ + @Tots + ‘ end ,StockMesKar=case when ‘ + @TotIk + ‘=0 and ‘ + @TotSk + ‘=0 then 0 else ‘ + @TotIk + ‘-‘ + @Totsk + ‘ end ,PrecPromFinaSole=’ + @PrepS +
‘,PrecPromFinaDola=’ + @PrepD + ‘,TotaIngr=’ + @TotI + ‘,TotaIngrKar=’ + @TotIK +
‘,TotaSali=’ + @TotS + ‘,TotaSaliKar=’ + @TotSK + ‘,ValIngS=’ + @ValIS + ‘,ValIngKarS=’ + @ValISK +
‘,ValIngD=’ + @ValID + ‘,ValIngKarD=’ + @ValIDK + ‘,ValSalS=’ + @ValSS + ‘,ValSalKarS=’ + @ValSSK +
‘,ValSalD=’ + @ValSD + ‘,ValSalKarD=’ + @ValSDK + ‘
from ‘ + @TablaCierre + ‘ Cierre inner join ‘ + @TablaMes + ‘ MesActivo
ON cIERRE.NroCierre=MesActivo.NroCierre
where Alma_Codi=’ + @Almacen1 + ‘
and Prop_Codi=’ + @Prop1 + ‘ and ‘ + @CampoCodigo + ‘=”’ + @Hilo1 + ”’ and mes=’ + @mES + ‘ AND aÑO=’ + @aNIO )
IF @@rOWcOUNT=0
exec(‘ INSERT INTO ‘ + @TablaCierre + ‘ VALUES(‘ + @NroCierre + ‘,’ + @Almacen1 + ‘,’ + @Prop1 + ‘,”’ + @Hilo1 + ””
+ ‘,0,0,0,0,’ + @TotI + ‘-‘ + @Tots + ‘,’ + @TotIk + ‘-‘ + @Totsk + ‘,0,0,’ +
@TotI + ‘,’ + @TotIk + ‘,’ + @TotS + ‘,’ + @TotSk + ‘,’ + @ValIS + ‘,’ +
@ValISk + ‘,’ + @ValId + ‘,’ + @ValIdk + ‘,’ + @ValSS + ‘,’ + @ValSSK + ‘,’ + @ValSd + ‘,’ + @ValSdK + ‘)’)
if @@error<>0 goto err
end
else
begin
exec(‘update ‘ + @TablaCierre + ‘ set PrecPromFinaSole=’ + @PrepS +
‘,PrecPromFinaDola=’ + @PrepD + ‘
from ‘ + @TablaCierre + ‘ Cierre inner join ‘ + @TablaMes + ‘ MesActivo
ON cIERRE.NroCierre=MesActivo.NroCierre
where Alma_Codi=’ + @Almacen1 + ‘
and Prop_Codi=’ + @Prop1 + ‘ and ‘ + @CampoCodigo + ‘=”’ + @Hilo1 + ”’
and mes=’ + @mES + ‘ AND aÑO=’ + @aNIO ) if @@error<>0 goto err
end –select @PreS=0
–select @PreD=0
select @PrePS=0
select @PrePD=0
select @TotI=0
select @TotS=0
select @ValIS=0
select @ValID=0
select @ValSS=0
select @ValSD=0
select @stock=0 select @TotIK=0
select @TotSK=0
select @ValISK=0
select @ValIDK=0
select @ValSSK=0
select @ValSDK=0
select @stockPP=0
select @[email protected]
end
select @[email protected]
end
select @[email protected]
end
err: if @@error=0
select estado=0
else
select estado=1
close cur
deallocate cur
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO La unica explicacion que tengo es que el cursor si recupera los valores normalmente, si ejecuto 1 mes funciona pero si elijo mas no sale, no entiendo porque puede quedar un dato perdido si el procedimiento es un bucle desde vb.
]]>