none
No entiendo por q me duplica informacion RRS feed

  • Pregunta

  • Tengo un problema con un Stored q ando creando , el cual cada vez q ejecuto el Stored me duplica los campos , literalmente no toma las validaciones q le puse , asi q no entiendo por q lo sigue haciendo , pego mi codigo haber si alguien me puede ayudar y me diga cual es mi error , siento q es en la parte del cursor, ya revise en distintos lados y tengo la misma estructura como en ejemplos q he encontrado. Espero me orienten y gracias 

    DECLARE CDatosPresupuesto CURSOR FOR
    ------------CAPITULO 2000  SERVICIOS PERSONALES ---

    SELECT  
    E.id AS CtroCosto,
    F.anio,
    F.id AS Estructura,
    C.id AS PartEspecif,
    G.id AS [Id Funte],
    G.cveant,
    J.id AS [Id Gasto]

    FROM [Rf_Egr_AntPro_Cap_Par_31] AS A
    INNER JOIN HW_Macro011_Cap_Par_03 AS H ON A.idUni1 = H.idUni
    INNER JOIN[HW_Macro011_Cap_Par_02] AS B ON H.cveDoc = B.cveDoc
    INNER JOIN[parpre] AS C ON B.parespecif = C.parpre
    INNER JOIN[Rf_Egr_AntPro_Cap_Par] AS D ON A.cveDoc = D.cveDoc
    INNER JOIN[cat_ci_cencos] AS E ON D.unresp = E.cvecencos
    INNER JOIN HW_AS_AS_EstructuraProgramatica AS I ON D.cveDoc = I.CveDoc
    INNER JOIN [estrucpro] AS F ON I.estrucprog = F.cveestrucpro
    INNER JOIN HWHR_CI_CAT_FuenteFin AS G ON F.fuentefin = G.cvefuentefin
    INNER JOIN Cat_ep_TipoGasto  AS J ON F.tipgas = J.cvetgasto
    INNER JOIN AT_DI_PP_Cap_Par_11 AS K ON D.actIntitucional = K.iduni
    WHERE etaFlu IN ('30','6','33') 
    --AND  B.cvecap = '2000' AND A.CveDoc = @intNumDoc
    AND  B.cvecap = '2000' AND A.CveDoc = 233
    --AND  A.CveDoc IN(SELECT cveDoc FROM Rf_Egr_AntPro_Cap_Par WHERE cvedoc > 154 AND cveMov IN('0101','0201') )
    GROUP BY E.id,F.id,I.estrucprog,C.id,G.id, G.cveant, J.id,K.idUni, F.anio

    print('ENTRO CAPITULO 2000')

    OPEN CDatosPresupuesto
    FETCH NEXT FROM CDatosPresupuesto INTO @cvecencos, @cveestpr, @parpre, @cvetgasto, @cvefuentefin, @Cveante, @anio
    WHILE (@@FETCH_STATUS = 0)
    BEGIN
    IF EXISTS (SELECT * FROM HW_Ensamble_Percon.dbo.HWAS_AS_PRESUPUESTO_EGRESOS00020_aux WHERE cvecencos = @cvecencos AND cveestpr = @cveestpr AND parpre = @parpre AND cvetgasto = @cvetgasto AND cvefuentefin = @cvefuentefin AND Cveante = @Cveante AND anio = @anio)
    BEGIN
    print('ENTRO AL UPDATE DEL CAPITULO 2000')
    UPDATE B
    SET
    Enero= Tabla.enero, 
    Febrero = Tabla.febrero,
    Marzo = Tabla.marzo,
    Abril = Tabla.abril,
    Mayo = Tabla.mayo,
    Junio = Tabla.junio,
    Julio = Tabla.julio,
    Agosto = Tabla.agosto,
    Septiembre = Tabla.septiembre,
    Octubre = Tabla.octubre,
    Noviembre = Tabla.noviembre,
    Diciembre = Tabla.diciembre,
    Total = Tabla.total

    FROM(
    SELECT 
    E.id AS CtroCosto,
    F.anio,
    F.id AS Estructura,
    C.id AS PartEspecif,
    G.id AS [Id Funte],
    G.cveant,
    J.id AS [Id Gasto],

    enero =  isnull((SUM(A.ene * H.preciounitario)),0),
    febrero =  isnull((SUM(A.feb * H.preciounitario)),0),
    marzo = isnull((SUM(A.mar * H.preciounitario)),0),
    abril = isnull((SUM(A.abr * H.preciounitario)),0),
    mayo = isnull((SUM(A.may * H.preciounitario)),0),
    junio = isnull((SUM(A.jun * H.preciounitario)),0),
    julio =  isnull((SUM(A.jul * H.preciounitario)),0),
    agosto = isnull((SUM(A.ago * H.preciounitario)),0),
    septiembre = isnull((SUM(A.sep * H.preciounitario)),0),
    octubre = isnull((SUM(A.oct * H.preciounitario)),0),
    noviembre = isnull((SUM(A.nov * H.preciounitario)),0),
    diciembre = isnull((SUM(A.dic * H.preciounitario)),0),
    total = isnull(SUM(A.imptotal),0)

    FROM [Rf_Egr_AntPro_Cap_Par_31] AS A
    INNER JOIN  HW_Macro011_Cap_Par_03 AS H ON A.idUni1 = H.idUni
    INNER JOIN [HW_Macro011_Cap_Par_02] AS B ON H.cveDoc = B.cveDoc
    INNER JOIN [parpre] AS C ON B.parespecif = C.parpre
    INNER JOIN [Rf_Egr_AntPro_Cap_Par] AS D ON A.cveDoc = D.cveDoc
    INNER JOIN [cat_ci_cencos] AS E ON D.unresp = E.cvecencos
    INNER JOIN HW_AS_AS_EstructuraProgramatica AS I ON D.cveDoc = I.CveDoc
    INNER JOIN [estrucpro] AS F ON I.estrucprog = F.cveestrucpro
    INNER JOIN HWHR_CI_CAT_FuenteFin AS G ON F.fuentefin = G.cvefuentefin
    INNER JOIN Cat_ep_TipoGasto  AS J ON F.tipgas = J.cvetgasto
    INNER JOIN AT_DI_PP_Cap_Par_11 AS K ON D.actIntitucional = K.iduni

    WHERE etaFlu IN ('30','6','33') 
    --AND  B.cvecap = '2000' AND A.CveDoc = @intNumDoc
    AND  B.cvecap = '2000' AND A.CveDoc = 233
    --AND  A.CveDoc IN(SELECT cveDoc FROM Rf_Egr_AntPro_Cap_Par WHERE   cvedoc > 154 AND cveMov IN('0101','0201'))

    GROUP BY A.cveDoc, E.id,F.id,I.estrucprog,C.id,G.id, G.cveant, J.id,K.idUni, F.anio) AS TABLA
    INNER JOIN  HW_Ensamble_Percon.dbo.HWAS_AS_PRESUPUESTO_EGRESOS00020_aux AS B  ON B.cvecencos = Tabla.CtroCosto
    AND B.cveestpr = Tabla.Estructura
    AND B.parpre = Tabla.PartEspecif
    AND B.cvetgasto = Tabla.[Id Gasto]
    AND B.cvefuentefin = Tabla.[Id Funte]


    END 
    ELSE
    BEGIN
    print('ENTRO AL INSERT DEL CAPITULO 2000')
    INSERT INTO HW_Ensamble_Percon.dbo.HWAS_AS_PRESUPUESTO_EGRESOS00020_aux
    (
    cvecencos, 
    anio,
    cveestpr, 
    parpre, 
    cvefuentefin, 
    Cveante,
    cvetgasto, 
    enero, 
    febrero, 
    marzo,
    abril, 
    mayo, 
    junio, 
    julio, 
    agosto, 
    septiembre, 
    octubre, 
    noviembre,
    diciembre
    )
    SELECT 
    E.id AS CtroCosto,
    F.anio,
    F.id AS Estructura,
    C.id AS PartEspecif,
    G.id AS [Id Funte],
    G.cveant,
    J.id AS [Id Gasto],

    enero =  isnull((SUM(A.ene * H.preciounitario)),0),
    febrero =  isnull((SUM(A.feb * H.preciounitario)),0),
    marzo = isnull((SUM(A.mar * H.preciounitario)),0),
    abril = isnull((SUM(A.abr * H.preciounitario)),0),
    mayo = isnull((SUM(A.may * H.preciounitario)),0),
    junio = isnull((SUM(A.jun * H.preciounitario)),0),
    julio =  isnull((SUM(A.jul * H.preciounitario)),0),
    agosto = isnull((SUM(A.ago * H.preciounitario)),0),
    septiembre = isnull((SUM(A.sep * H.preciounitario)),0),
    octubre = isnull((SUM(A.oct * H.preciounitario)),0),
    noviembre = isnull((SUM(A.nov * H.preciounitario)),0),
    diciembre = isnull((SUM(A.dic * H.preciounitario)),0)
    --total = isnull(SUM(A.imptotal),0)

    FROM [Rf_Egr_AntPro_Cap_Par_31] AS A
    INNER JOIN  HW_Macro011_Cap_Par_03 AS H ON A.idUni1 = H.idUni
    INNER JOIN [HW_Macro011_Cap_Par_02] AS B ON H.cveDoc = B.cveDoc
    INNER JOIN [parpre] AS C ON B.parespecif = C.parpre
    INNER JOIN [Rf_Egr_AntPro_Cap_Par] AS D ON A.cveDoc = D.cveDoc
    INNER JOIN [cat_ci_cencos] AS E ON D.unresp = E.cvecencos
    INNER JOIN HW_AS_AS_EstructuraProgramatica AS I ON D.cveDoc = I.CveDoc
    INNER JOIN [estrucpro] AS F ON I.estrucprog = F.cveestrucpro
    INNER JOIN HWHR_CI_CAT_FuenteFin AS G ON F.fuentefin = G.cvefuentefin
    INNER JOIN Cat_ep_TipoGasto  AS J ON F.tipgas = J.cvetgasto
    INNER JOIN AT_DI_PP_Cap_Par_11 AS K ON D.actIntitucional = K.iduni

    WHERE etaFlu IN ('30','6','33') 
    --AND  B.cvecap = '2000' AND A.CveDoc = @intNumDoc
    AND  B.cvecap = '2000' AND A.CveDoc = 233
    --AND  A.CveDoc IN(SELECT cveDoc FROM Rf_Egr_AntPro_Cap_Par WHERE   cvedoc > 154 AND cveMov IN('0101','0201'))

    GROUP BY A.cveDoc, E.id,F.id,I.estrucprog,C.id,G.id, G.cveant, J.id,K.idUni, F.anio


    print('TERMINO EL INSERT DEL CAPITULO 2000')
    END 
    FETCH NEXT FROM CDatosPresupuesto INTO @cvecencos, @cveestpr, @parpre, @cvetgasto, @cvefuentefin, @Cveante, @anio
    END
    CLOSE CDatosPresupuesto
    DEALLOCATE CDatosPresupuesto


    • Editado t-bluethr viernes, 8 de febrero de 2013 20:30
    viernes, 8 de febrero de 2013 20:00

Respuestas

  • [...] no pasa por el update para decir ok esos campos ya existen [...]

    Fíjate que el UPDATE está condicionado por un "IF EXISTS (SELECT...)", y en el WHERE del SELECT se comparan todos los campos, incluido CVeante. Pero en la pantalla que has adjuntado, se ve que Cveante contiene valores NULL. Eso hace que el WHERE no se cumpla, porque dos valores NULL no se consideran iguales entre sí. Creo que es por eso por lo que te está fallando el "IF" y no se ejecuta el UPDATE.

    viernes, 8 de febrero de 2013 21:19

Todas las respuestas

  • ¿A qué te refieres por "campos" y por qué dices que los duplica? ¿puedes colocar los scripts de las tablas para probar el código?

    logo osoft
    Si he contestado tu pregunta, por favor marca mi post como respuesta.
    ...Y si mi post te ha servido, márcalo como útil smile

    viernes, 8 de febrero de 2013 20:10
  • info duplicada
    • Editado t-bluethr viernes, 8 de febrero de 2013 20:17
    viernes, 8 de febrero de 2013 20:17
  • cuando ejecuto por primera vez el Stored solo carga las tres primeras filas, lo vuelvo a ejecutar y vuelve a insertar otras 3 , no pasa por el update para decir ok esos campos ya existen , y ya no tendria q insertar nada , pero no encuentro por q sigue insrtando sin tomar en cuenta q ya existe 
    viernes, 8 de febrero de 2013 20:18
  • [...] no pasa por el update para decir ok esos campos ya existen [...]

    Fíjate que el UPDATE está condicionado por un "IF EXISTS (SELECT...)", y en el WHERE del SELECT se comparan todos los campos, incluido CVeante. Pero en la pantalla que has adjuntado, se ve que Cveante contiene valores NULL. Eso hace que el WHERE no se cumpla, porque dos valores NULL no se consideran iguales entre sí. Creo que es por eso por lo que te está fallando el "IF" y no se ejecuta el UPDATE.

    viernes, 8 de febrero de 2013 21:19
  • Hola.

    ¿Resolviste el problema?


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    domingo, 17 de febrero de 2013 17:18
    Moderador