SQL Server Performance

No actualiza _ Begin Transaction

Discussion in 'Preguntas sobre SQL Server en Español.' started by fjac_pe, Jan 11, 2005.

  1. fjac_pe New Member

    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?.
  2. c_maldon Member

    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.
  3. Luis Martin Moderator

    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.

  4. fjac_pe New Member

    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
  5. c_maldon Member

    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.
  6. fjac_pe New Member

    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?
  7. c_maldon Member

    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

  8. fjac_pe New Member

    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.

Share This Page