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 @Prop1=@Prop select @Hilo1=@Hilo select @FECHA1=@FECHA select @Almacen1=@Almacen WHILE @@FETCH_STATUS=0 BEGIN WHILE @Almacen=@Almacen1 and @@FETCH_STATUS=0 begin WHILE @Prop=@Prop1 and @Almacen=@Almacen1 and @@FETCH_STATUS=0 begin while @Hilo=@Hilo1 and @Prop=@Prop1 and @Almacen=@Almacen1 and @@FETCH_STATUS=0 begin while @Fecha1=@fecha and @Hilo=@Hilo1 and @Prop1=@Prop and @Almacen1=@Almacen and @@FETCH_STATUS=0 begin if @tipo=-1 -- si es saldo inicial begin select @stock=@can select @stockPP=@cank select @preps=@pres select @prepd=@pred end if @tipo=0 and @cos=1 -- si es ingreso y se costea begin if @stockPP+@can>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))/(@stockPP+@can),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))/(@stockPP+@can),6) end else begin select @preps=0 select @prepd=0 end select @ValIS=@ValIS+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 @ValISK=@ValISK+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 @ValID=@ValID+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 @ValIDK=@ValIDK+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 @TotI=@TotI+@Can select @stock=@stock+@can select @stockPP=@stockPP+@can select @TotIK=@TotIK+@Can end if @tipo=0 and @cos=0 ---- si es ingreso y no se costea, se actualiza la tabla de movimientos begin select @ValIS=@ValIS+ROUND(@prepS*@can,2) select @ValID=@ValID+ROUND(@prepd*@can,2) select @TotI=@TotI+@Can select @stock=@stock+@can IF @Vkar=1 BEGIN select @stockPP=@stockPP+@can select @ValISK=@ValISK+ROUND(@prepS*@can,2) select @ValIDK=@ValIDK+ROUND(@prepd*@can,2) select @TotIK=@TotIK+@Can END end if @tipo=1 and @cos=1-- si es salida y se costea begin if @stockPP-@can>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))/(@stockPP-@can),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))/(@stockPP-@can),6) end else begin select @preps=0 select @prepd=0 end select @ValsS=@ValsS+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 @ValsSK=@ValsSK+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 @ValsD=@ValsD+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 @ValsDK=@ValsDK+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 @Tots=@Tots+@Can select @stock=@stock-@can select @stockPP=@stockPP-@can select @TotsK=@TotsK+@Can end if @tipo=1 and @cos=0-- si es salida y no se costea, se actualiza la tabla de movimientos begin select @ValsS=@ValsS+ROUND(@prepS*@can,2) select @ValsD=@ValsD+ROUND(@prepd*@can,2) select @Tots=@Tots+@Can select @stock=@stock-@can IF @Vkar=1 BEGIN select @stockPP=@stockPP-@can select @ValsSK=@ValsSK+ROUND(@prepS*@can,2) select @ValsDK=@ValsDK+ROUND(@prepd*@can,2) select @TotsK=@TotsK+@Can 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 @Fecha1=@fecha 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 @Hilo1=@Hilo end select @Prop1=@prop end select @Almacen1=@Almacen 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.