ERROR EN SP...

10/10/2005 - 23:59 por Edmundo J. Davila | Informe spam
Hola amig@s:

Tengo el siguiente SP, probablemente no sea la forma mas optima de hacerlo,
pero creo que resuelve. Lo que hago es crear una tabla temporal donde pongo
uno datos que inmediatmente paso a la tabla INSS_DETALLE, luego borro de
INSS_TEMP, le pongo otros datos y los vuelvo a pasar a INSS_DETALLE. El
asunto los campos SAL-DEVENGADO, SAL-MENSUAL Y APORTE quedan con valores
NULL siempre.

Agradecería de parte de ustedes 2 cosas:

1. ¿como podria cambiar este SP para optimizar su ejecucion?
2. ¿que estoy haciendo mal que me deja los valores que quiero actualizar en
NULL?
3. ¿hay alguna forma de ver la ejecucion de un SP paso a paso?

De antemano muchas gracias por su ayuda.

EDU
CREATE PROCEDURE DBO.PA_PAGOINSS @pdPeriodo DateTime, @psSemana SmallInt,
@psNominaI VarChar(4), @psNominaF Varchar(4) AS

BEGIN TRANSACTION

DELETE FROM OCEXACTUS.DBO.INSS_DETALLE
IF @psSemana=4
INSERT INTO OCEXACTUS.DBO.INSS_DETALLE
SELECT EMPLEADO, ASEGURADO, NOMBRE_PILA, PRIMER_APELLIDO, NOMINA, '01',
@pdPeriodo, 0, 0, 0, '1111',CENTRO_COSTO, 'P'
FROM EXACTUS.MONISA.EMPLEADO
WHERE NOMINA BETWEEN @psNominaI AND @psNominaF AND ACTIVO='S'
ELSE
INSERT INTO OCEXACTUS.DBO.INSS_DETALLE
SELECT EMPLEADO, ASEGURADO, NOMBRE_PILA, PRIMER_APELLIDO, NOMINA, '01',
@pdPeriodo, 0, 0, 0, '11111',CENTRO_COSTO, 'P'
FROM EXACTUS.MONISA.EMPLEADO
WHERE NOMINA BETWEEN @psNominaI AND @psNominaF AND ACTIVO='S'

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'INSS_TEMP')
DROP TABLE INSS_TEMP

CREATE TABLE INSS_TEMP
(
EMPLEADO varchar(10),
MONTO float,
)

INSERT INTO OCEXACTUS.DBO.INSS_TEMP
SELECT EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO,
SUM(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.TOTAL) AS SALDEV
FROM EXACTUS.MONISA.EMPLEADO_CONC_NOMI INNER JOIN
EXACTUS.MONISA.NOMINA_HISTORICO ON EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA
= EXACTUS.MONISA.NOMINA_HISTORICO.NOMINA AND
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NUMERO_NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NUMERO_NOMINA
WHERE (EXACTUS.MONISA.NOMINA_HISTORICO.PERIODO = @pdPeriodo) AND
(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA BETWEEN @psNominaI AND @psNominaF)
AND (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO LIKE 'B%')
GROUP BY EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO

UPDATE OCEXACTUS.DBO.INSS_DETALLE
SET [SAL-DEVENGADO] (SELECT MONTO FROM OCEXACTUS.DBO.INSS_TEMP
WHERE OCEXACTUS.DBO.INSS_DETALLE.EMPLEADO=OCEXACTUS.DBO.INSS_TEMP.EMPLEADO)
FROM OCEXACTUS.DBO.INSS_DETALLE,OCEXACTUS.DBO.INSS_TEMP

DELETE FROM OCEXACTUS.DBO.INSS_TEMP

INSERT INTO OCEXACTUS.DBO.INSS_TEMP
SELECT EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO,
SUM(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.TOTAL) AS SALMEN
FROM EXACTUS.MONISA.EMPLEADO_CONC_NOMI INNER JOIN
EXACTUS.MONISA.NOMINA_HISTORICO ON EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA
= EXACTUS.MONISA.NOMINA_HISTORICO.NOMINA AND
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NUMERO_NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NUMERO_NOMINA
WHERE (EXACTUS.MONISA.NOMINA_HISTORICO.PERIODO = @pdPeriodo) AND
(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA BETWEEN @psNominaI AND @psNominaF)
AND (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO LIKE 'B%') AND (NOT
(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO IN ('BG01', 'BQ04', 'BS04')))
GROUP BY EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO

UPDATE OCEXACTUS.DBO.INSS_DETALLE
SET [SAL-MENSUAL] (SELECT MONTO FROM OCEXACTUS.DBO.INSS_TEMP
WHERE OCEXACTUS.DBO.INSS_DETALLE.EMPLEADO=OCEXACTUS.DBO.INSS_TEMP.EMPLEADO)
FROM OCEXACTUS.DBO.INSS_DETALLE,OCEXACTUS.DBO.INSS_TEMP

DELETE FROM OCEXACTUS.DBO.INSS_TEMP

INSERT INTO OCEXACTUS.DBO.INSS_TEMP
SELECT EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO,
SUM(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.TOTAL) AS APORTE
FROM EXACTUS.MONISA.EMPLEADO_CONC_NOMI INNER JOIN
EXACTUS.MONISA.NOMINA_HISTORICO ON EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA
= EXACTUS.MONISA.NOMINA_HISTORICO.NOMINA AND
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NUMERO_NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NUMERO_NOMINA
WHERE (EXACTUS.MONISA.NOMINA_HISTORICO.PERIODO = @pdPeriodo) AND
(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA BETWEEN @psNominaI AND @psNominaF)
AND (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO IN
('DQ03','DQ10','DS03','DS10'))
GROUP BY EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO

UPDATE OCEXACTUS.DBO.INSS_DETALLE
SET APORTE (SELECT MONTO FROM OCEXACTUS.DBO.INSS_TEMP
WHERE OCEXACTUS.DBO.INSS_DETALLE.EMPLEADO=OCEXACTUS.DBO.INSS_TEMP.EMPLEADO)
FROM OCEXACTUS.DBO.INSS_DETALLE,OCEXACTUS.DBO.INSS_TEMP

COMMIT TRANSACTIONGO

Preguntas similare

Leer las respuestas

#1 Maxi \(MVP SQL\)
11/10/2005 - 02:51 | Informe spam
Hola, a ver, porque no hacer un solo insert a la tabla final? o sea si hacer
INSERT into tabla final SELECT no pasarias por la temporal.

Si lo que quieres es tener mas de un select dentro del mismo insert entonces
puedes usar UNION ALL.

A tu otra pregunta, esos campos quedan en null porque no tienen resultado,
si quieres que esten en otro valor distinto de null entonces usar
Isnull(campo,valor)


-
MS-MVP SQL SERVER
"Edmundo J. Davila" escribió en el mensaje
news:%
Hola :

Tengo el siguiente SP, probablemente no sea la forma mas optima de
hacerlo, pero creo que resuelve. Lo que hago es crear una tabla temporal
donde pongo uno datos que inmediatmente paso a la tabla INSS_DETALLE,
luego borro de INSS_TEMP, le pongo otros datos y los vuelvo a pasar a
INSS_DETALLE. El asunto los campos SAL-DEVENGADO, SAL-MENSUAL Y APORTE
quedan con valores NULL siempre.

Agradecería de parte de ustedes 2 cosas:

1. ¿como podria cambiar este SP para optimizar su ejecucion?
2. ¿que estoy haciendo mal que me deja los valores que quiero actualizar
en NULL?
3. ¿hay alguna forma de ver la ejecucion de un SP paso a paso?

De antemano muchas gracias por su ayuda.

EDU
> CREATE PROCEDURE DBO.PA_PAGOINSS @pdPeriodo DateTime, @psSemana SmallInt,
@psNominaI VarChar(4), @psNominaF Varchar(4) AS

BEGIN TRANSACTION

DELETE FROM OCEXACTUS.DBO.INSS_DETALLE
IF @psSemana=4
INSERT INTO OCEXACTUS.DBO.INSS_DETALLE
SELECT EMPLEADO, ASEGURADO, NOMBRE_PILA, PRIMER_APELLIDO, NOMINA, '01',
@pdPeriodo, 0, 0, 0, '1111',CENTRO_COSTO, 'P'
FROM EXACTUS.MONISA.EMPLEADO
WHERE NOMINA BETWEEN @psNominaI AND @psNominaF AND ACTIVO='S'
ELSE
INSERT INTO OCEXACTUS.DBO.INSS_DETALLE
SELECT EMPLEADO, ASEGURADO, NOMBRE_PILA, PRIMER_APELLIDO, NOMINA, '01',
@pdPeriodo, 0, 0, 0, '11111',CENTRO_COSTO, 'P'
FROM EXACTUS.MONISA.EMPLEADO
WHERE NOMINA BETWEEN @psNominaI AND @psNominaF AND ACTIVO='S'

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'INSS_TEMP')
DROP TABLE INSS_TEMP

CREATE TABLE INSS_TEMP
(
EMPLEADO varchar(10),
MONTO float,
)

INSERT INTO OCEXACTUS.DBO.INSS_TEMP
SELECT EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO,
SUM(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.TOTAL) AS SALDEV
FROM EXACTUS.MONISA.EMPLEADO_CONC_NOMI INNER JOIN
EXACTUS.MONISA.NOMINA_HISTORICO ON
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NOMINA AND
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NUMERO_NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NUMERO_NOMINA
WHERE (EXACTUS.MONISA.NOMINA_HISTORICO.PERIODO = @pdPeriodo) AND
(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA BETWEEN @psNominaI AND
@psNominaF) AND (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO LIKE 'B%')
GROUP BY EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO

UPDATE OCEXACTUS.DBO.INSS_DETALLE
SET [SAL-DEVENGADO]> (SELECT MONTO FROM OCEXACTUS.DBO.INSS_TEMP
WHERE
OCEXACTUS.DBO.INSS_DETALLE.EMPLEADO=OCEXACTUS.DBO.INSS_TEMP.EMPLEADO)
FROM OCEXACTUS.DBO.INSS_DETALLE,OCEXACTUS.DBO.INSS_TEMP

DELETE FROM OCEXACTUS.DBO.INSS_TEMP

INSERT INTO OCEXACTUS.DBO.INSS_TEMP
SELECT EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO,
SUM(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.TOTAL) AS SALMEN
FROM EXACTUS.MONISA.EMPLEADO_CONC_NOMI INNER JOIN
EXACTUS.MONISA.NOMINA_HISTORICO ON
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NOMINA AND
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NUMERO_NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NUMERO_NOMINA
WHERE (EXACTUS.MONISA.NOMINA_HISTORICO.PERIODO = @pdPeriodo) AND
(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA BETWEEN @psNominaI AND
@psNominaF) AND (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO LIKE 'B%') AND
(NOT (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO IN ('BG01', 'BQ04',
'BS04')))
GROUP BY EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO

UPDATE OCEXACTUS.DBO.INSS_DETALLE
SET [SAL-MENSUAL]> (SELECT MONTO FROM OCEXACTUS.DBO.INSS_TEMP
WHERE
OCEXACTUS.DBO.INSS_DETALLE.EMPLEADO=OCEXACTUS.DBO.INSS_TEMP.EMPLEADO)
FROM OCEXACTUS.DBO.INSS_DETALLE,OCEXACTUS.DBO.INSS_TEMP

DELETE FROM OCEXACTUS.DBO.INSS_TEMP

INSERT INTO OCEXACTUS.DBO.INSS_TEMP
SELECT EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO,
SUM(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.TOTAL) AS APORTE
FROM EXACTUS.MONISA.EMPLEADO_CONC_NOMI INNER JOIN
EXACTUS.MONISA.NOMINA_HISTORICO ON
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NOMINA AND
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NUMERO_NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NUMERO_NOMINA
WHERE (EXACTUS.MONISA.NOMINA_HISTORICO.PERIODO = @pdPeriodo) AND
(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA BETWEEN @psNominaI AND
@psNominaF) AND (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO IN
('DQ03','DQ10','DS03','DS10'))
GROUP BY EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO

UPDATE OCEXACTUS.DBO.INSS_DETALLE
SET APORTE> (SELECT MONTO FROM OCEXACTUS.DBO.INSS_TEMP
WHERE
OCEXACTUS.DBO.INSS_DETALLE.EMPLEADO=OCEXACTUS.DBO.INSS_TEMP.EMPLEADO)
FROM OCEXACTUS.DBO.INSS_DETALLE,OCEXACTUS.DBO.INSS_TEMP

COMMIT TRANSACTIONGO

Respuesta Responder a este mensaje
#2 Edmundo J. Davila
11/10/2005 - 17:20 | Informe spam
Maxi,

Si lo quisiera hacer todo en la tabla principal y no pasar por la temporal,
lo que deberia hacer es un UPDATE, porque si te fijas agrego una serie de
registros a la tabla INSS_DETALLE al comienzo del SP.

DELETE FROM OCEXACTUS.DBO.INSS_DETALLE
IF @psSemana=4
INSERT INTO OCEXACTUS.DBO.INSS_DETALLE
SELECT EMPLEADO, ASEGURADO, NOMBRE_PILA, PRIMER_APELLIDO, NOMINA, '01',
@pdPeriodo, 0, 0, 0, '1111',CENTRO_COSTO, 'P'
FROM EXACTUS.MONISA.EMPLEADO
WHERE NOMINA BETWEEN @psNominaI AND @psNominaF AND ACTIVO='S'
ELSE
INSERT INTO OCEXACTUS.DBO.INSS_DETALLE
SELECT EMPLEADO, ASEGURADO, NOMBRE_PILA, PRIMER_APELLIDO, NOMINA, '01',
@pdPeriodo, 0, 0, 0, '11111',CENTRO_COSTO, 'P'
FROM EXACTUS.MONISA.EMPLEADO
WHERE NOMINA BETWEEN @psNominaI AND @psNominaF AND ACTIVO='S'

Luego hago los updates basado en el campo EMPLEADO. Yo trate de hacerlo
directamente a la tabla INSS_DETALLE, pero me resulta mas de una columna del
select, da error. Yo trate originalmente de hacerlo asi:

UPDATE OCEXACTUS.DBO.INSS_DETALLE
SET [SAL-DEVENGADO](SELECT EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO,
SUM(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.TOTAL) AS SALDEV
FROM EXACTUS.MONISA.EMPLEADO_CONC_NOMI INNER JOIN
EXACTUS.MONISA.NOMINA_HISTORICO ON
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA EXACTUS.MONISA.NOMINA_HISTORICO.NOMINA AND
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NUMERO_NOMINA EXACTUS.MONISA.NOMINA_HISTORICO.NUMERO_NOMINA
WHERE (EXACTUS.MONISA.NOMINA_HISTORICO.PERIODO = @pdPeriodo) AND
(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA BETWEEN @psNominaI AND
@psNominaF) AND (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO LIKE 'B%')
GROUP BY EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO)
FROM

Por otro lado, los campos que dices que no tienen valor, si lo tienen en la
tabla INSS_TEMP y es desde esa tabla que actualizo en INSS_DETALLE, lo que
esta pasando es que por alguna razon no reemplaza los campos de INSS_TEMP en
INSS_DETALLE.

Saludos y cualquier otra sugerencia sera bienvenida.

Gracias.

Edmundo Davila


"Maxi (MVP SQL)" escribió en el mensaje
news:
Hola, a ver, porque no hacer un solo insert a la tabla final? o sea si
hacer INSERT into tabla final SELECT no pasarias por la temporal.

Si lo que quieres es tener mas de un select dentro del mismo insert
entonces puedes usar UNION ALL.

A tu otra pregunta, esos campos quedan en null porque no tienen resultado,
si quieres que esten en otro valor distinto de null entonces usar
Isnull(campo,valor)


-
MS-MVP SQL SERVER
"Edmundo J. Davila" escribió en el mensaje
news:%
Hola :

Tengo el siguiente SP, probablemente no sea la forma mas optima de
hacerlo, pero creo que resuelve. Lo que hago es crear una tabla temporal
donde pongo uno datos que inmediatmente paso a la tabla INSS_DETALLE,
luego borro de INSS_TEMP, le pongo otros datos y los vuelvo a pasar a
INSS_DETALLE. El asunto los campos SAL-DEVENGADO, SAL-MENSUAL Y APORTE
quedan con valores NULL siempre.

Agradecería de parte de ustedes 2 cosas:

1. ¿como podria cambiar este SP para optimizar su ejecucion?
2. ¿que estoy haciendo mal que me deja los valores que quiero actualizar
en NULL?
3. ¿hay alguna forma de ver la ejecucion de un SP paso a paso?

De antemano muchas gracias por su ayuda.

EDU
>> CREATE PROCEDURE DBO.PA_PAGOINSS @pdPeriodo DateTime, @psSemana SmallInt,
@psNominaI VarChar(4), @psNominaF Varchar(4) AS

BEGIN TRANSACTION

DELETE FROM OCEXACTUS.DBO.INSS_DETALLE
IF @psSemana=4
INSERT INTO OCEXACTUS.DBO.INSS_DETALLE
SELECT EMPLEADO, ASEGURADO, NOMBRE_PILA, PRIMER_APELLIDO, NOMINA, '01',
@pdPeriodo, 0, 0, 0, '1111',CENTRO_COSTO, 'P'
FROM EXACTUS.MONISA.EMPLEADO
WHERE NOMINA BETWEEN @psNominaI AND @psNominaF AND ACTIVO='S'
ELSE
INSERT INTO OCEXACTUS.DBO.INSS_DETALLE
SELECT EMPLEADO, ASEGURADO, NOMBRE_PILA, PRIMER_APELLIDO, NOMINA, '01',
@pdPeriodo, 0, 0, 0, '11111',CENTRO_COSTO, 'P'
FROM EXACTUS.MONISA.EMPLEADO
WHERE NOMINA BETWEEN @psNominaI AND @psNominaF AND ACTIVO='S'

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'INSS_TEMP')
DROP TABLE INSS_TEMP

CREATE TABLE INSS_TEMP
(
EMPLEADO varchar(10),
MONTO float,
)

INSERT INTO OCEXACTUS.DBO.INSS_TEMP
SELECT EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO,
SUM(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.TOTAL) AS SALDEV
FROM EXACTUS.MONISA.EMPLEADO_CONC_NOMI INNER JOIN
EXACTUS.MONISA.NOMINA_HISTORICO ON
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NOMINA AND
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NUMERO_NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NUMERO_NOMINA
WHERE (EXACTUS.MONISA.NOMINA_HISTORICO.PERIODO = @pdPeriodo) AND
(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA BETWEEN @psNominaI AND
@psNominaF) AND (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO LIKE 'B%')
GROUP BY EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO

UPDATE OCEXACTUS.DBO.INSS_DETALLE
SET [SAL-DEVENGADO]>> (SELECT MONTO FROM OCEXACTUS.DBO.INSS_TEMP
WHERE
OCEXACTUS.DBO.INSS_DETALLE.EMPLEADO=OCEXACTUS.DBO.INSS_TEMP.EMPLEADO)
FROM OCEXACTUS.DBO.INSS_DETALLE,OCEXACTUS.DBO.INSS_TEMP

DELETE FROM OCEXACTUS.DBO.INSS_TEMP

INSERT INTO OCEXACTUS.DBO.INSS_TEMP
SELECT EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO,
SUM(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.TOTAL) AS SALMEN
FROM EXACTUS.MONISA.EMPLEADO_CONC_NOMI INNER JOIN
EXACTUS.MONISA.NOMINA_HISTORICO ON
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NOMINA AND
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NUMERO_NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NUMERO_NOMINA
WHERE (EXACTUS.MONISA.NOMINA_HISTORICO.PERIODO = @pdPeriodo) AND
(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA BETWEEN @psNominaI AND
@psNominaF) AND (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO LIKE 'B%')
AND (NOT (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO IN ('BG01', 'BQ04',
'BS04')))
GROUP BY EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO

UPDATE OCEXACTUS.DBO.INSS_DETALLE
SET [SAL-MENSUAL]>> (SELECT MONTO FROM OCEXACTUS.DBO.INSS_TEMP
WHERE
OCEXACTUS.DBO.INSS_DETALLE.EMPLEADO=OCEXACTUS.DBO.INSS_TEMP.EMPLEADO)
FROM OCEXACTUS.DBO.INSS_DETALLE,OCEXACTUS.DBO.INSS_TEMP

DELETE FROM OCEXACTUS.DBO.INSS_TEMP

INSERT INTO OCEXACTUS.DBO.INSS_TEMP
SELECT EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO,
SUM(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.TOTAL) AS APORTE
FROM EXACTUS.MONISA.EMPLEADO_CONC_NOMI INNER JOIN
EXACTUS.MONISA.NOMINA_HISTORICO ON
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NOMINA AND
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NUMERO_NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NUMERO_NOMINA
WHERE (EXACTUS.MONISA.NOMINA_HISTORICO.PERIODO = @pdPeriodo) AND
(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA BETWEEN @psNominaI AND
@psNominaF) AND (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO IN
('DQ03','DQ10','DS03','DS10'))
GROUP BY EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO

UPDATE OCEXACTUS.DBO.INSS_DETALLE
SET APORTE>> (SELECT MONTO FROM OCEXACTUS.DBO.INSS_TEMP
WHERE
OCEXACTUS.DBO.INSS_DETALLE.EMPLEADO=OCEXACTUS.DBO.INSS_TEMP.EMPLEADO)
FROM OCEXACTUS.DBO.INSS_DETALLE,OCEXACTUS.DBO.INSS_TEMP

COMMIT TRANSACTIONGO





Respuesta Responder a este mensaje
#3 Maxi [MVP SQL Server]
12/10/2005 - 02:53 | Informe spam
Hola, pero o yo estoy viendo mal (que es una posibilidad a esta hora de la
noche ;-)) o estas haciendo el mismo Insert

INSERT INTO OCEXACTUS.DBO.INSS_DETALLE
SELECT EMPLEADO, ASEGURADO, NOMBRE_PILA, PRIMER_APELLIDO, NOMINA, '01',
@pdPeriodo, 0, 0, 0, '1111',CENTRO_COSTO, 'P'
FROM EXACTUS.MONISA.EMPLEADO
WHERE NOMINA BETWEEN @psNominaI AND @psNominaF AND ACTIVO='S'
ELSE

INSERT INTO OCEXACTUS.DBO.INSS_DETALLE
SELECT EMPLEADO, ASEGURADO, NOMBRE_PILA, PRIMER_APELLIDO, NOMINA, '01',
@pdPeriodo, 0, 0, 0, '11111',CENTRO_COSTO, 'P'
FROM EXACTUS.MONISA.EMPLEADO
WHERE NOMINA BETWEEN @psNominaI AND @psNominaF AND ACTIVO='S'


[Microsoft MVP SQL SERVER]
Culminis SQL-Server Speakers (http://latam.culminis.com)

Maxi - Buenos Aires - Argentina
Msn_messager:
mail: Maxi.da[arroba]gmail.com

"Edmundo J. Davila" escribió en el mensaje
news:
Maxi,

Si lo quisiera hacer todo en la tabla principal y no pasar por la
temporal, lo que deberia hacer es un UPDATE, porque si te fijas agrego una
serie de registros a la tabla INSS_DETALLE al comienzo del SP.

DELETE FROM OCEXACTUS.DBO.INSS_DETALLE
IF @psSemana=4
INSERT INTO OCEXACTUS.DBO.INSS_DETALLE
SELECT EMPLEADO, ASEGURADO, NOMBRE_PILA, PRIMER_APELLIDO, NOMINA, '01',
@pdPeriodo, 0, 0, 0, '1111',CENTRO_COSTO, 'P'
FROM EXACTUS.MONISA.EMPLEADO
WHERE NOMINA BETWEEN @psNominaI AND @psNominaF AND ACTIVO='S'
ELSE
INSERT INTO OCEXACTUS.DBO.INSS_DETALLE
SELECT EMPLEADO, ASEGURADO, NOMBRE_PILA, PRIMER_APELLIDO, NOMINA, '01',
@pdPeriodo, 0, 0, 0, '11111',CENTRO_COSTO, 'P'
FROM EXACTUS.MONISA.EMPLEADO
WHERE NOMINA BETWEEN @psNominaI AND @psNominaF AND ACTIVO='S'

Luego hago los updates basado en el campo EMPLEADO. Yo trate de hacerlo
directamente a la tabla INSS_DETALLE, pero me resulta mas de una columna
del select, da error. Yo trate originalmente de hacerlo asi:

UPDATE OCEXACTUS.DBO.INSS_DETALLE
SET [SAL-DEVENGADO]> (SELECT EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO,
SUM(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.TOTAL) AS SALDEV
FROM EXACTUS.MONISA.EMPLEADO_CONC_NOMI INNER JOIN
EXACTUS.MONISA.NOMINA_HISTORICO ON
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA > EXACTUS.MONISA.NOMINA_HISTORICO.NOMINA AND
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NUMERO_NOMINA > EXACTUS.MONISA.NOMINA_HISTORICO.NUMERO_NOMINA
WHERE (EXACTUS.MONISA.NOMINA_HISTORICO.PERIODO = @pdPeriodo) AND
(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA BETWEEN @psNominaI AND
@psNominaF) AND (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO LIKE 'B%')
GROUP BY EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO)
FROM

Por otro lado, los campos que dices que no tienen valor, si lo tienen en
la tabla INSS_TEMP y es desde esa tabla que actualizo en INSS_DETALLE, lo
que esta pasando es que por alguna razon no reemplaza los campos de
INSS_TEMP en INSS_DETALLE.

Saludos y cualquier otra sugerencia sera bienvenida.

Gracias.

Edmundo Davila


"Maxi (MVP SQL)" escribió en el mensaje
news:
Hola, a ver, porque no hacer un solo insert a la tabla final? o sea si
hacer INSERT into tabla final SELECT no pasarias por la temporal.

Si lo que quieres es tener mas de un select dentro del mismo insert
entonces puedes usar UNION ALL.

A tu otra pregunta, esos campos quedan en null porque no tienen
resultado, si quieres que esten en otro valor distinto de null entonces
usar Isnull(campo,valor)


-
MS-MVP SQL SERVER
"Edmundo J. Davila" escribió en el mensaje
news:%
Hola :

Tengo el siguiente SP, probablemente no sea la forma mas optima de
hacerlo, pero creo que resuelve. Lo que hago es crear una tabla
temporal donde pongo uno datos que inmediatmente paso a la tabla
INSS_DETALLE, luego borro de INSS_TEMP, le pongo otros datos y los
vuelvo a pasar a INSS_DETALLE. El asunto los campos SAL-DEVENGADO,
SAL-MENSUAL Y APORTE quedan con valores NULL siempre.

Agradecería de parte de ustedes 2 cosas:

1. ¿como podria cambiar este SP para optimizar su ejecucion?
2. ¿que estoy haciendo mal que me deja los valores que quiero actualizar
en NULL?
3. ¿hay alguna forma de ver la ejecucion de un SP paso a paso?

De antemano muchas gracias por su ayuda.

EDU
>>> CREATE PROCEDURE DBO.PA_PAGOINSS @pdPeriodo DateTime, @psSemana
SmallInt, @psNominaI VarChar(4), @psNominaF Varchar(4) AS

BEGIN TRANSACTION

DELETE FROM OCEXACTUS.DBO.INSS_DETALLE
IF @psSemana=4
INSERT INTO OCEXACTUS.DBO.INSS_DETALLE
SELECT EMPLEADO, ASEGURADO, NOMBRE_PILA, PRIMER_APELLIDO, NOMINA, '01',
@pdPeriodo, 0, 0, 0, '1111',CENTRO_COSTO, 'P'
FROM EXACTUS.MONISA.EMPLEADO
WHERE NOMINA BETWEEN @psNominaI AND @psNominaF AND ACTIVO='S'
ELSE
INSERT INTO OCEXACTUS.DBO.INSS_DETALLE
SELECT EMPLEADO, ASEGURADO, NOMBRE_PILA, PRIMER_APELLIDO, NOMINA, '01',
@pdPeriodo, 0, 0, 0, '11111',CENTRO_COSTO, 'P'
FROM EXACTUS.MONISA.EMPLEADO
WHERE NOMINA BETWEEN @psNominaI AND @psNominaF AND ACTIVO='S'

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'INSS_TEMP')
DROP TABLE INSS_TEMP

CREATE TABLE INSS_TEMP
(
EMPLEADO varchar(10),
MONTO float,
)

INSERT INTO OCEXACTUS.DBO.INSS_TEMP
SELECT EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO,
SUM(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.TOTAL) AS SALDEV
FROM EXACTUS.MONISA.EMPLEADO_CONC_NOMI INNER JOIN
EXACTUS.MONISA.NOMINA_HISTORICO ON
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NOMINA AND
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NUMERO_NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NUMERO_NOMINA
WHERE (EXACTUS.MONISA.NOMINA_HISTORICO.PERIODO = @pdPeriodo) AND
(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA BETWEEN @psNominaI AND
@psNominaF) AND (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO LIKE 'B%')
GROUP BY EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO

UPDATE OCEXACTUS.DBO.INSS_DETALLE
SET [SAL-DEVENGADO]>>> (SELECT MONTO FROM OCEXACTUS.DBO.INSS_TEMP
WHERE
OCEXACTUS.DBO.INSS_DETALLE.EMPLEADO=OCEXACTUS.DBO.INSS_TEMP.EMPLEADO)
FROM OCEXACTUS.DBO.INSS_DETALLE,OCEXACTUS.DBO.INSS_TEMP

DELETE FROM OCEXACTUS.DBO.INSS_TEMP

INSERT INTO OCEXACTUS.DBO.INSS_TEMP
SELECT EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO,
SUM(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.TOTAL) AS SALMEN
FROM EXACTUS.MONISA.EMPLEADO_CONC_NOMI INNER JOIN
EXACTUS.MONISA.NOMINA_HISTORICO ON
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NOMINA AND
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NUMERO_NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NUMERO_NOMINA
WHERE (EXACTUS.MONISA.NOMINA_HISTORICO.PERIODO = @pdPeriodo) AND
(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA BETWEEN @psNominaI AND
@psNominaF) AND (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO LIKE 'B%')
AND (NOT (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO IN ('BG01', 'BQ04',
'BS04')))
GROUP BY EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO

UPDATE OCEXACTUS.DBO.INSS_DETALLE
SET [SAL-MENSUAL]>>> (SELECT MONTO FROM OCEXACTUS.DBO.INSS_TEMP
WHERE
OCEXACTUS.DBO.INSS_DETALLE.EMPLEADO=OCEXACTUS.DBO.INSS_TEMP.EMPLEADO)
FROM OCEXACTUS.DBO.INSS_DETALLE,OCEXACTUS.DBO.INSS_TEMP

DELETE FROM OCEXACTUS.DBO.INSS_TEMP

INSERT INTO OCEXACTUS.DBO.INSS_TEMP
SELECT EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO,
SUM(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.TOTAL) AS APORTE
FROM EXACTUS.MONISA.EMPLEADO_CONC_NOMI INNER JOIN
EXACTUS.MONISA.NOMINA_HISTORICO ON
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NOMINA AND
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NUMERO_NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NUMERO_NOMINA
WHERE (EXACTUS.MONISA.NOMINA_HISTORICO.PERIODO = @pdPeriodo) AND
(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA BETWEEN @psNominaI AND
@psNominaF) AND (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO IN
('DQ03','DQ10','DS03','DS10'))
GROUP BY EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO

UPDATE OCEXACTUS.DBO.INSS_DETALLE
SET APORTE>>> (SELECT MONTO FROM OCEXACTUS.DBO.INSS_TEMP
WHERE
OCEXACTUS.DBO.INSS_DETALLE.EMPLEADO=OCEXACTUS.DBO.INSS_TEMP.EMPLEADO)
FROM OCEXACTUS.DBO.INSS_DETALLE,OCEXACTUS.DBO.INSS_TEMP

COMMIT TRANSACTIONGO









Respuesta Responder a este mensaje
#4 Edmundo J. Davila
12/10/2005 - 16:47 | Informe spam
Maxi,

No estas viendo mal, lo que sucede que lo unico que cambia en el insert es
el numero de '1111' en uno son 4 y en otro son 5, se que se pudiera hacer de
una manera mas elegante, pero por la prisa lo estaba haciendo asi. Voy a
tratar con SQL dinamico a ver que tal me va.

Saludos y gracias por tus comentarios,

Edmundo Davila

"Maxi [MVP SQL Server]" escribió en el
mensaje news:
Hola, pero o yo estoy viendo mal (que es una posibilidad a esta hora de la
noche ;-)) o estas haciendo el mismo Insert

INSERT INTO OCEXACTUS.DBO.INSS_DETALLE
SELECT EMPLEADO, ASEGURADO, NOMBRE_PILA, PRIMER_APELLIDO, NOMINA, '01',
@pdPeriodo, 0, 0, 0, '1111',CENTRO_COSTO, 'P'
FROM EXACTUS.MONISA.EMPLEADO
WHERE NOMINA BETWEEN @psNominaI AND @psNominaF AND ACTIVO='S'
ELSE

INSERT INTO OCEXACTUS.DBO.INSS_DETALLE
SELECT EMPLEADO, ASEGURADO, NOMBRE_PILA, PRIMER_APELLIDO, NOMINA, '01',
@pdPeriodo, 0, 0, 0, '11111',CENTRO_COSTO, 'P'
FROM EXACTUS.MONISA.EMPLEADO
WHERE NOMINA BETWEEN @psNominaI AND @psNominaF AND ACTIVO='S'


[Microsoft MVP SQL SERVER]
Culminis SQL-Server Speakers (http://latam.culminis.com)

Maxi - Buenos Aires - Argentina
Msn_messager:
mail: Maxi.da[arroba]gmail.com

"Edmundo J. Davila" escribió en el mensaje
news:
Maxi,

Si lo quisiera hacer todo en la tabla principal y no pasar por la
temporal, lo que deberia hacer es un UPDATE, porque si te fijas agrego
una serie de registros a la tabla INSS_DETALLE al comienzo del SP.

DELETE FROM OCEXACTUS.DBO.INSS_DETALLE
IF @psSemana=4
INSERT INTO OCEXACTUS.DBO.INSS_DETALLE
SELECT EMPLEADO, ASEGURADO, NOMBRE_PILA, PRIMER_APELLIDO, NOMINA, '01',
@pdPeriodo, 0, 0, 0, '1111',CENTRO_COSTO, 'P'
FROM EXACTUS.MONISA.EMPLEADO
WHERE NOMINA BETWEEN @psNominaI AND @psNominaF AND ACTIVO='S'
ELSE
INSERT INTO OCEXACTUS.DBO.INSS_DETALLE
SELECT EMPLEADO, ASEGURADO, NOMBRE_PILA, PRIMER_APELLIDO, NOMINA, '01',
@pdPeriodo, 0, 0, 0, '11111',CENTRO_COSTO, 'P'
FROM EXACTUS.MONISA.EMPLEADO
WHERE NOMINA BETWEEN @psNominaI AND @psNominaF AND ACTIVO='S'

Luego hago los updates basado en el campo EMPLEADO. Yo trate de hacerlo
directamente a la tabla INSS_DETALLE, pero me resulta mas de una columna
del select, da error. Yo trate originalmente de hacerlo asi:

UPDATE OCEXACTUS.DBO.INSS_DETALLE
SET [SAL-DEVENGADO]>> (SELECT EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO,
SUM(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.TOTAL) AS SALDEV
FROM EXACTUS.MONISA.EMPLEADO_CONC_NOMI INNER JOIN
EXACTUS.MONISA.NOMINA_HISTORICO ON
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA >> EXACTUS.MONISA.NOMINA_HISTORICO.NOMINA AND
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NUMERO_NOMINA >> EXACTUS.MONISA.NOMINA_HISTORICO.NUMERO_NOMINA
WHERE (EXACTUS.MONISA.NOMINA_HISTORICO.PERIODO = @pdPeriodo) AND
(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA BETWEEN @psNominaI AND
@psNominaF) AND (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO LIKE 'B%')
GROUP BY EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO)
FROM

Por otro lado, los campos que dices que no tienen valor, si lo tienen en
la tabla INSS_TEMP y es desde esa tabla que actualizo en INSS_DETALLE, lo
que esta pasando es que por alguna razon no reemplaza los campos de
INSS_TEMP en INSS_DETALLE.

Saludos y cualquier otra sugerencia sera bienvenida.

Gracias.

Edmundo Davila


"Maxi (MVP SQL)" escribió en el mensaje
news:
Hola, a ver, porque no hacer un solo insert a la tabla final? o sea si
hacer INSERT into tabla final SELECT no pasarias por la temporal.

Si lo que quieres es tener mas de un select dentro del mismo insert
entonces puedes usar UNION ALL.

A tu otra pregunta, esos campos quedan en null porque no tienen
resultado, si quieres que esten en otro valor distinto de null entonces
usar Isnull(campo,valor)


-
MS-MVP SQL SERVER
"Edmundo J. Davila" escribió en el mensaje
news:%
Hola :

Tengo el siguiente SP, probablemente no sea la forma mas optima de
hacerlo, pero creo que resuelve. Lo que hago es crear una tabla
temporal donde pongo uno datos que inmediatmente paso a la tabla
INSS_DETALLE, luego borro de INSS_TEMP, le pongo otros datos y los
vuelvo a pasar a INSS_DETALLE. El asunto los campos SAL-DEVENGADO,
SAL-MENSUAL Y APORTE quedan con valores NULL siempre.

Agradecería de parte de ustedes 2 cosas:

1. ¿como podria cambiar este SP para optimizar su ejecucion?
2. ¿que estoy haciendo mal que me deja los valores que quiero
actualizar en NULL?
3. ¿hay alguna forma de ver la ejecucion de un SP paso a paso?

De antemano muchas gracias por su ayuda.

EDU
>>>> CREATE PROCEDURE DBO.PA_PAGOINSS @pdPeriodo DateTime, @psSemana
SmallInt, @psNominaI VarChar(4), @psNominaF Varchar(4) AS

BEGIN TRANSACTION

DELETE FROM OCEXACTUS.DBO.INSS_DETALLE
IF @psSemana=4
INSERT INTO OCEXACTUS.DBO.INSS_DETALLE
SELECT EMPLEADO, ASEGURADO, NOMBRE_PILA, PRIMER_APELLIDO, NOMINA, '01',
@pdPeriodo, 0, 0, 0, '1111',CENTRO_COSTO, 'P'
FROM EXACTUS.MONISA.EMPLEADO
WHERE NOMINA BETWEEN @psNominaI AND @psNominaF AND ACTIVO='S'
ELSE
INSERT INTO OCEXACTUS.DBO.INSS_DETALLE
SELECT EMPLEADO, ASEGURADO, NOMBRE_PILA, PRIMER_APELLIDO, NOMINA, '01',
@pdPeriodo, 0, 0, 0, '11111',CENTRO_COSTO, 'P'
FROM EXACTUS.MONISA.EMPLEADO
WHERE NOMINA BETWEEN @psNominaI AND @psNominaF AND ACTIVO='S'

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'INSS_TEMP')
DROP TABLE INSS_TEMP

CREATE TABLE INSS_TEMP
(
EMPLEADO varchar(10),
MONTO float,
)

INSERT INTO OCEXACTUS.DBO.INSS_TEMP
SELECT EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO,
SUM(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.TOTAL) AS SALDEV
FROM EXACTUS.MONISA.EMPLEADO_CONC_NOMI INNER JOIN
EXACTUS.MONISA.NOMINA_HISTORICO ON
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NOMINA AND
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NUMERO_NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NUMERO_NOMINA
WHERE (EXACTUS.MONISA.NOMINA_HISTORICO.PERIODO = @pdPeriodo) AND
(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA BETWEEN @psNominaI AND
@psNominaF) AND (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO LIKE 'B%')
GROUP BY EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO

UPDATE OCEXACTUS.DBO.INSS_DETALLE
SET [SAL-DEVENGADO]>>>> (SELECT MONTO FROM OCEXACTUS.DBO.INSS_TEMP
WHERE
OCEXACTUS.DBO.INSS_DETALLE.EMPLEADO=OCEXACTUS.DBO.INSS_TEMP.EMPLEADO)
FROM OCEXACTUS.DBO.INSS_DETALLE,OCEXACTUS.DBO.INSS_TEMP

DELETE FROM OCEXACTUS.DBO.INSS_TEMP

INSERT INTO OCEXACTUS.DBO.INSS_TEMP
SELECT EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO,
SUM(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.TOTAL) AS SALMEN
FROM EXACTUS.MONISA.EMPLEADO_CONC_NOMI INNER JOIN
EXACTUS.MONISA.NOMINA_HISTORICO ON
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NOMINA AND
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NUMERO_NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NUMERO_NOMINA
WHERE (EXACTUS.MONISA.NOMINA_HISTORICO.PERIODO = @pdPeriodo) AND
(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA BETWEEN @psNominaI AND
@psNominaF) AND (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO LIKE 'B%')
AND (NOT (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO IN ('BG01',
'BQ04', 'BS04')))
GROUP BY EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO

UPDATE OCEXACTUS.DBO.INSS_DETALLE
SET [SAL-MENSUAL]>>>> (SELECT MONTO FROM OCEXACTUS.DBO.INSS_TEMP
WHERE
OCEXACTUS.DBO.INSS_DETALLE.EMPLEADO=OCEXACTUS.DBO.INSS_TEMP.EMPLEADO)
FROM OCEXACTUS.DBO.INSS_DETALLE,OCEXACTUS.DBO.INSS_TEMP

DELETE FROM OCEXACTUS.DBO.INSS_TEMP

INSERT INTO OCEXACTUS.DBO.INSS_TEMP
SELECT EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO,
SUM(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.TOTAL) AS APORTE
FROM EXACTUS.MONISA.EMPLEADO_CONC_NOMI INNER JOIN
EXACTUS.MONISA.NOMINA_HISTORICO ON
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NOMINA AND
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NUMERO_NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NUMERO_NOMINA
WHERE (EXACTUS.MONISA.NOMINA_HISTORICO.PERIODO = @pdPeriodo) AND
(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA BETWEEN @psNominaI AND
@psNominaF) AND (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO IN
('DQ03','DQ10','DS03','DS10'))
GROUP BY EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO

UPDATE OCEXACTUS.DBO.INSS_DETALLE
SET APORTE>>>> (SELECT MONTO FROM OCEXACTUS.DBO.INSS_TEMP
WHERE
OCEXACTUS.DBO.INSS_DETALLE.EMPLEADO=OCEXACTUS.DBO.INSS_TEMP.EMPLEADO)
FROM OCEXACTUS.DBO.INSS_DETALLE,OCEXACTUS.DBO.INSS_TEMP

COMMIT TRANSACTIONGO













Respuesta Responder a este mensaje
#5 Maxi
12/10/2005 - 16:53 | Informe spam
Hola, parate un seg!! no vayas con sql-dinamico aun!! dejame entender bien
el problema ;-)

No estas viendo mal, lo que sucede que lo unico que cambia en el insert es
el numero de '1111' en uno son 4 y en otro son 5, se que se pudiera hacer
de una manera mas elegante, pero por la prisa lo estaba haciendo asi. Voy
a tratar con SQL dinamico a ver que tal me va.



Porque decis que en uno son 4 y en otro son 5, a que te referis


Salu2
Maxi [MVP SQL SERVER]


"Edmundo J. Davila" escribió en el mensaje
news:
Maxi,

No estas viendo mal, lo que sucede que lo unico que cambia en el insert es
el numero de '1111' en uno son 4 y en otro son 5, se que se pudiera hacer
de una manera mas elegante, pero por la prisa lo estaba haciendo asi. Voy
a tratar con SQL dinamico a ver que tal me va.

Saludos y gracias por tus comentarios,

Edmundo Davila

"Maxi [MVP SQL Server]" escribió en el
mensaje news:
Hola, pero o yo estoy viendo mal (que es una posibilidad a esta hora de
la noche ;-)) o estas haciendo el mismo Insert

INSERT INTO OCEXACTUS.DBO.INSS_DETALLE
SELECT EMPLEADO, ASEGURADO, NOMBRE_PILA, PRIMER_APELLIDO, NOMINA, '01',
@pdPeriodo, 0, 0, 0, '1111',CENTRO_COSTO, 'P'
FROM EXACTUS.MONISA.EMPLEADO
WHERE NOMINA BETWEEN @psNominaI AND @psNominaF AND ACTIVO='S'
ELSE

INSERT INTO OCEXACTUS.DBO.INSS_DETALLE
SELECT EMPLEADO, ASEGURADO, NOMBRE_PILA, PRIMER_APELLIDO, NOMINA, '01',
@pdPeriodo, 0, 0, 0, '11111',CENTRO_COSTO, 'P'
FROM EXACTUS.MONISA.EMPLEADO
WHERE NOMINA BETWEEN @psNominaI AND @psNominaF AND ACTIVO='S'


[Microsoft MVP SQL SERVER]
Culminis SQL-Server Speakers (http://latam.culminis.com)

Maxi - Buenos Aires - Argentina
Msn_messager:
mail: Maxi.da[arroba]gmail.com

"Edmundo J. Davila" escribió en el mensaje
news:
Maxi,

Si lo quisiera hacer todo en la tabla principal y no pasar por la
temporal, lo que deberia hacer es un UPDATE, porque si te fijas agrego
una serie de registros a la tabla INSS_DETALLE al comienzo del SP.

DELETE FROM OCEXACTUS.DBO.INSS_DETALLE
IF @psSemana=4
INSERT INTO OCEXACTUS.DBO.INSS_DETALLE
SELECT EMPLEADO, ASEGURADO, NOMBRE_PILA, PRIMER_APELLIDO, NOMINA, '01',
@pdPeriodo, 0, 0, 0, '1111',CENTRO_COSTO, 'P'
FROM EXACTUS.MONISA.EMPLEADO
WHERE NOMINA BETWEEN @psNominaI AND @psNominaF AND ACTIVO='S'
ELSE
INSERT INTO OCEXACTUS.DBO.INSS_DETALLE
SELECT EMPLEADO, ASEGURADO, NOMBRE_PILA, PRIMER_APELLIDO, NOMINA, '01',
@pdPeriodo, 0, 0, 0, '11111',CENTRO_COSTO, 'P'
FROM EXACTUS.MONISA.EMPLEADO
WHERE NOMINA BETWEEN @psNominaI AND @psNominaF AND ACTIVO='S'

Luego hago los updates basado en el campo EMPLEADO. Yo trate de hacerlo
directamente a la tabla INSS_DETALLE, pero me resulta mas de una columna
del select, da error. Yo trate originalmente de hacerlo asi:

UPDATE OCEXACTUS.DBO.INSS_DETALLE
SET [SAL-DEVENGADO]>>> (SELECT EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO,
SUM(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.TOTAL) AS SALDEV
FROM EXACTUS.MONISA.EMPLEADO_CONC_NOMI INNER JOIN
EXACTUS.MONISA.NOMINA_HISTORICO ON
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA >>> EXACTUS.MONISA.NOMINA_HISTORICO.NOMINA AND
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NUMERO_NOMINA >>> EXACTUS.MONISA.NOMINA_HISTORICO.NUMERO_NOMINA
WHERE (EXACTUS.MONISA.NOMINA_HISTORICO.PERIODO = @pdPeriodo) AND
(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA BETWEEN @psNominaI AND
@psNominaF) AND (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO LIKE 'B%')
GROUP BY EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO)
FROM

Por otro lado, los campos que dices que no tienen valor, si lo tienen en
la tabla INSS_TEMP y es desde esa tabla que actualizo en INSS_DETALLE,
lo que esta pasando es que por alguna razon no reemplaza los campos de
INSS_TEMP en INSS_DETALLE.

Saludos y cualquier otra sugerencia sera bienvenida.

Gracias.

Edmundo Davila


"Maxi (MVP SQL)" escribió en el mensaje
news:
Hola, a ver, porque no hacer un solo insert a la tabla final? o sea si
hacer INSERT into tabla final SELECT no pasarias por la temporal.

Si lo que quieres es tener mas de un select dentro del mismo insert
entonces puedes usar UNION ALL.

A tu otra pregunta, esos campos quedan en null porque no tienen
resultado, si quieres que esten en otro valor distinto de null entonces
usar Isnull(campo,valor)


-
MS-MVP SQL SERVER
"Edmundo J. Davila" escribió en el mensaje
news:%
Hola :

Tengo el siguiente SP, probablemente no sea la forma mas optima de
hacerlo, pero creo que resuelve. Lo que hago es crear una tabla
temporal donde pongo uno datos que inmediatmente paso a la tabla
INSS_DETALLE, luego borro de INSS_TEMP, le pongo otros datos y los
vuelvo a pasar a INSS_DETALLE. El asunto los campos SAL-DEVENGADO,
SAL-MENSUAL Y APORTE quedan con valores NULL siempre.

Agradecería de parte de ustedes 2 cosas:

1. ¿como podria cambiar este SP para optimizar su ejecucion?
2. ¿que estoy haciendo mal que me deja los valores que quiero
actualizar en NULL?
3. ¿hay alguna forma de ver la ejecucion de un SP paso a paso?

De antemano muchas gracias por su ayuda.

EDU
>>>>> CREATE PROCEDURE DBO.PA_PAGOINSS @pdPeriodo DateTime, @psSemana
SmallInt, @psNominaI VarChar(4), @psNominaF Varchar(4) AS

BEGIN TRANSACTION

DELETE FROM OCEXACTUS.DBO.INSS_DETALLE
IF @psSemana=4
INSERT INTO OCEXACTUS.DBO.INSS_DETALLE
SELECT EMPLEADO, ASEGURADO, NOMBRE_PILA, PRIMER_APELLIDO, NOMINA,
'01', @pdPeriodo, 0, 0, 0, '1111',CENTRO_COSTO, 'P'
FROM EXACTUS.MONISA.EMPLEADO
WHERE NOMINA BETWEEN @psNominaI AND @psNominaF AND ACTIVO='S'
ELSE
INSERT INTO OCEXACTUS.DBO.INSS_DETALLE
SELECT EMPLEADO, ASEGURADO, NOMBRE_PILA, PRIMER_APELLIDO, NOMINA,
'01', @pdPeriodo, 0, 0, 0, '11111',CENTRO_COSTO, 'P'
FROM EXACTUS.MONISA.EMPLEADO
WHERE NOMINA BETWEEN @psNominaI AND @psNominaF AND ACTIVO='S'

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'INSS_TEMP')
DROP TABLE INSS_TEMP

CREATE TABLE INSS_TEMP
(
EMPLEADO varchar(10),
MONTO float,
)

INSERT INTO OCEXACTUS.DBO.INSS_TEMP
SELECT EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO,
SUM(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.TOTAL) AS SALDEV
FROM EXACTUS.MONISA.EMPLEADO_CONC_NOMI INNER JOIN
EXACTUS.MONISA.NOMINA_HISTORICO ON
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NOMINA AND
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NUMERO_NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NUMERO_NOMINA
WHERE (EXACTUS.MONISA.NOMINA_HISTORICO.PERIODO = @pdPeriodo) AND
(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA BETWEEN @psNominaI AND
@psNominaF) AND (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO LIKE 'B%')
GROUP BY EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO

UPDATE OCEXACTUS.DBO.INSS_DETALLE
SET [SAL-DEVENGADO]>>>>> (SELECT MONTO FROM OCEXACTUS.DBO.INSS_TEMP
WHERE
OCEXACTUS.DBO.INSS_DETALLE.EMPLEADO=OCEXACTUS.DBO.INSS_TEMP.EMPLEADO)
FROM OCEXACTUS.DBO.INSS_DETALLE,OCEXACTUS.DBO.INSS_TEMP

DELETE FROM OCEXACTUS.DBO.INSS_TEMP

INSERT INTO OCEXACTUS.DBO.INSS_TEMP
SELECT EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO,
SUM(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.TOTAL) AS SALMEN
FROM EXACTUS.MONISA.EMPLEADO_CONC_NOMI INNER JOIN
EXACTUS.MONISA.NOMINA_HISTORICO ON
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NOMINA AND
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NUMERO_NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NUMERO_NOMINA
WHERE (EXACTUS.MONISA.NOMINA_HISTORICO.PERIODO = @pdPeriodo) AND
(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA BETWEEN @psNominaI AND
@psNominaF) AND (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO LIKE 'B%')
AND (NOT (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO IN ('BG01',
'BQ04', 'BS04')))
GROUP BY EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO

UPDATE OCEXACTUS.DBO.INSS_DETALLE
SET [SAL-MENSUAL]>>>>> (SELECT MONTO FROM OCEXACTUS.DBO.INSS_TEMP
WHERE
OCEXACTUS.DBO.INSS_DETALLE.EMPLEADO=OCEXACTUS.DBO.INSS_TEMP.EMPLEADO)
FROM OCEXACTUS.DBO.INSS_DETALLE,OCEXACTUS.DBO.INSS_TEMP

DELETE FROM OCEXACTUS.DBO.INSS_TEMP

INSERT INTO OCEXACTUS.DBO.INSS_TEMP
SELECT EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO,
SUM(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.TOTAL) AS APORTE
FROM EXACTUS.MONISA.EMPLEADO_CONC_NOMI INNER JOIN
EXACTUS.MONISA.NOMINA_HISTORICO ON
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NOMINA AND
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NUMERO_NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NUMERO_NOMINA
WHERE (EXACTUS.MONISA.NOMINA_HISTORICO.PERIODO = @pdPeriodo) AND
(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA BETWEEN @psNominaI AND
@psNominaF) AND (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO IN
('DQ03','DQ10','DS03','DS10'))
GROUP BY EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO

UPDATE OCEXACTUS.DBO.INSS_DETALLE
SET APORTE>>>>> (SELECT MONTO FROM OCEXACTUS.DBO.INSS_TEMP
WHERE
OCEXACTUS.DBO.INSS_DETALLE.EMPLEADO=OCEXACTUS.DBO.INSS_TEMP.EMPLEADO)
FROM OCEXACTUS.DBO.INSS_DETALLE,OCEXACTUS.DBO.INSS_TEMP

COMMIT TRANSACTIONGO

















email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida