Problema con Estore procedure

17/06/2005 - 17:09 por Danilo | Informe spam
Saludos.
Utilizo Access 2000 y SQL Server.

Estoy tratando de ejecutar un procedimiento almacenado desde access con la
siguiente sentencia de conexion y siempre me da error de timeout expired.
Desde el SQL QUERY ANALIZER, se ejecuta sin problema.

oCon.Provider = "sqloledb"
oCon.Properties("Data Source").Value = swServidor
oCon.Properties("Initial Catalog").Value = swBaseDatos
oCon.Properties("user id").Value = Nz(DLookup("UID", "[Datos
Servidor]"), "")
oCon.Properties("password").Value = Nz(DLookup("PWD", "[Datos
Servidor]"), "")
oCon.ConnectionTimeout = 30
oCon.Open

oCon.Execute "ActualizaListaPrecios" '< Linea donde se para la
ejecucion
oCon.Close

'********Procedimiento almacenado para su analisis*******
CREATE PROCEDURE ActualizaListaPrecios AS

BEGIN

SET NOCOUNT ON

DECLARE @ins_error INT
DECLARE @del_Error INT
DECLARE @upd_PreciosFinish INT
DECLARE @upd_PreciosAcces INT
DECLARE @upd_PreciosLabor INT
DECLARE @upd_PreciosPartScrap INT
DECLARE @upd_PreciosPlata INT
DECLARE @upd_PreciosUnitario INT

BEGIN TRAN

INSERT INTO Articulos (Codigo, Descripcion, Tipo, Clase, Categoria, [Unidad
Medida], [Peso Estandar], Minimo, [Precio Unitario])
SELECT Nuevos_Items.Articulo, Nuevos_Items.Tipo, Nuevos_Items.Tipo,
'Item/Articulo', Nuevos_Items.[KT], 'DWT',
Nuevos_Items.[Peso Estandar], 0,0
FROM Nuevos_Items

SET @ins_error = @@ERROR

UPDATE [Costos de Envio] SET [Tipo Factura] = N.[Tipo Factura],
[Precio Material] = N.[Precio Material],
[Precio Labor] = N.[Precio Labor],
[Cantidad Piedra] = N.[Cantidad Piedra],
[Precio Piedra] = N.[Precio Piedra],
[Cantidad Accesorio] = N.[Cantidad Accesorio],
[Precio Accesorio] = N.[Precio Accesorio],
[Precio Unitario] = N.[Precio Unitario],
[Peso Estandar] = N.[Peso Estandar]
FROM [Costos de Envio] C INNER JOIN [Nuevos Precios] N
ON C.Articulo = N.[Articulo]
CROSS JOIN [Configuracion Local] L
WHERE (C.[Tipo] NOT Like '%'+L.[Prefijo Desperdicio]+'%'
AND C.[Tipo] NOT Like '%'+L.[Prefijo Parte]+'%')

SET @upd_PreciosFinish = @@ERROR

UPDATE [Costos de Envio] SET [Cantidad Piedra] =
CASE WHEN [Precio Piedra] > 0 THEN 1 ELSE 0 END,
[Cantidad Accesorio] CASE WHEN [Precio Accesorio] > 0 THEN 1 ELSE 0 END
WHERE ([Precio Accesorio] > 0 OR [Precio Piedra] >0)

SET @upd_PreciosAcces = @@ERROR

UPDATE [Costos de Envio] SET [Precio Labor]=0, [Tipo Factura]='A'
FROM [Costos de Envio] CROSS JOIN [Configuracion Local] C
WHERE [Costos de Envio].[Tipo] Like '%'+C.[Prefijo sin terminar]+'%'
SET @upd_PreciosLabor = @@ERROR

UPDATE [Costos de Envio] SET [Precio Material] CASE Categoria
WHEN '10K' THEN 7.79 ELSE 10.94
END, [Precio Unitario] CASE Categoria
WHEN '10K' THEN 7.79 ELSE 10.94
END, [Tipo Factura]='A', [Tipo Multiplicacion]='Por Peso',
[Precio Labor]=0, [Precio Accesorio]=0, [Precio Piedra]=0,
[Cantidad Piedra]=0, [Cantidad Accesorio]=0
FROM [Costos de Envio] CROSS JOIN [Configuracion Local] C
WHERE ([Costos de Envio].[Tipo] Like '%'+C.[Prefijo Parte]+'%'
OR [Costos de Envio].[Tipo] Like '%'+C.[Prefijo Desperdicio]+'%')

SET @upd_PreciosPartScrap = @@ERROR

UPDATE [Costos de Envio] SET [Precio Material]=.30, [Precio Unitario] =.30
FROM [Costos de Envio] CROSS JOIN [Configuracion Local] C
WHERE ([Costos de Envio].[Tipo] Like '%'+C.[Prefijo Parte]+'%'
OR [Costos de Envio].[Tipo] Like '%'+C.[Prefijo Desperdicio]+'%')
AND Categoria='SS'

SET @upd_PreciosPlata = @@ERROR

UPDATE [Costos de Envio] SET [Precio Unitario] [Precio Material]+[Precio Labor]+[Precio Piedra]+[Precio Accesorio]
FROM [Costos de Envio]

SET @upd_PreciosUnitario = @@ERROR

DELETE [Nuevos Precios]
SET @del_error = @@ERROR

IF @ins_error = 0 AND @del_error = 0 AND @upd_PreciosFinish = 0
AND @upd_PreciosAcces = 0 AND @upd_PreciosLabor = 0
AND @upd_PreciosPartScrap = 0 AND @upd_PreciosPlata = 0
AND @upd_PreciosUnitario = 0
BEGIN
COMMIT TRAN
END
ELSE
BEGIN
RAISERROR('Error durante la actualizacion de precios',16,1)

ROLLBACK TRAN
END

SET NOCOUNT OFF
END
GO

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
17/06/2005 - 18:27 | Informe spam
Danilo,

Cuando lo ejecutas en QA, has medido el tiempo que demora el sp en
ejecutarse?. Si es mayor a 30 segundos entonces debes incrementar la
propiedad CommandTimeout del objeto connection.

...
oCon.CommandTimeout = 50
...


AMB

"Danilo" wrote:

Saludos.
Utilizo Access 2000 y SQL Server.

Estoy tratando de ejecutar un procedimiento almacenado desde access con la
siguiente sentencia de conexion y siempre me da error de timeout expired.
Desde el SQL QUERY ANALIZER, se ejecuta sin problema.

oCon.Provider = "sqloledb"
oCon.Properties("Data Source").Value = swServidor
oCon.Properties("Initial Catalog").Value = swBaseDatos
oCon.Properties("user id").Value = Nz(DLookup("UID", "[Datos
Servidor]"), "")
oCon.Properties("password").Value = Nz(DLookup("PWD", "[Datos
Servidor]"), "")
oCon.ConnectionTimeout = 30
oCon.Open

oCon.Execute "ActualizaListaPrecios" '< Linea donde se para la
ejecucion
oCon.Close

'********Procedimiento almacenado para su analisis*******
CREATE PROCEDURE ActualizaListaPrecios AS

BEGIN

SET NOCOUNT ON

DECLARE @ins_error INT
DECLARE @del_Error INT
DECLARE @upd_PreciosFinish INT
DECLARE @upd_PreciosAcces INT
DECLARE @upd_PreciosLabor INT
DECLARE @upd_PreciosPartScrap INT
DECLARE @upd_PreciosPlata INT
DECLARE @upd_PreciosUnitario INT

BEGIN TRAN

INSERT INTO Articulos (Codigo, Descripcion, Tipo, Clase, Categoria, [Unidad
Medida], [Peso Estandar], Minimo, [Precio Unitario])
SELECT Nuevos_Items.Articulo, Nuevos_Items.Tipo, Nuevos_Items.Tipo,
'Item/Articulo', Nuevos_Items.[KT], 'DWT',
Nuevos_Items.[Peso Estandar], 0,0
FROM Nuevos_Items

SET @ins_error = @@ERROR

UPDATE [Costos de Envio] SET [Tipo Factura] = N.[Tipo Factura],
[Precio Material] = N.[Precio Material],
[Precio Labor] = N.[Precio Labor],
[Cantidad Piedra] = N.[Cantidad Piedra],
[Precio Piedra] = N.[Precio Piedra],
[Cantidad Accesorio] = N.[Cantidad Accesorio],
[Precio Accesorio] = N.[Precio Accesorio],
[Precio Unitario] = N.[Precio Unitario],
[Peso Estandar] = N.[Peso Estandar]
FROM [Costos de Envio] C INNER JOIN [Nuevos Precios] N
ON C.Articulo = N.[Articulo]
CROSS JOIN [Configuracion Local] L
WHERE (C.[Tipo] NOT Like '%'+L.[Prefijo Desperdicio]+'%'
AND C.[Tipo] NOT Like '%'+L.[Prefijo Parte]+'%')

SET @upd_PreciosFinish = @@ERROR

UPDATE [Costos de Envio] SET [Cantidad Piedra] =
CASE WHEN [Precio Piedra] > 0 THEN 1 ELSE 0 END,
[Cantidad Accesorio]> CASE WHEN [Precio Accesorio] > 0 THEN 1 ELSE 0 END
WHERE ([Precio Accesorio] > 0 OR [Precio Piedra] >0)

SET @upd_PreciosAcces = @@ERROR

UPDATE [Costos de Envio] SET [Precio Labor]=0, [Tipo Factura]='A'
FROM [Costos de Envio] CROSS JOIN [Configuracion Local] C
WHERE [Costos de Envio].[Tipo] Like '%'+C.[Prefijo sin terminar]+'%'
SET @upd_PreciosLabor = @@ERROR

UPDATE [Costos de Envio] SET [Precio Material]> CASE Categoria
WHEN '10K' THEN 7.79 ELSE 10.94
END, [Precio Unitario] > CASE Categoria
WHEN '10K' THEN 7.79 ELSE 10.94
END, [Tipo Factura]='A', [Tipo Multiplicacion]='Por Peso',
[Precio Labor]=0, [Precio Accesorio]=0, [Precio Piedra]=0,
[Cantidad Piedra]=0, [Cantidad Accesorio]=0
FROM [Costos de Envio] CROSS JOIN [Configuracion Local] C
WHERE ([Costos de Envio].[Tipo] Like '%'+C.[Prefijo Parte]+'%'
OR [Costos de Envio].[Tipo] Like '%'+C.[Prefijo Desperdicio]+'%')

SET @upd_PreciosPartScrap = @@ERROR

UPDATE [Costos de Envio] SET [Precio Material]=.30, [Precio Unitario] =.30
FROM [Costos de Envio] CROSS JOIN [Configuracion Local] C
WHERE ([Costos de Envio].[Tipo] Like '%'+C.[Prefijo Parte]+'%'
OR [Costos de Envio].[Tipo] Like '%'+C.[Prefijo Desperdicio]+'%')
AND Categoria='SS'

SET @upd_PreciosPlata = @@ERROR

UPDATE [Costos de Envio] SET [Precio Unitario]> [Precio Material]+[Precio Labor]+[Precio Piedra]+[Precio Accesorio]
FROM [Costos de Envio]

SET @upd_PreciosUnitario = @@ERROR

DELETE [Nuevos Precios]
SET @del_error = @@ERROR

IF @ins_error = 0 AND @del_error = 0 AND @upd_PreciosFinish = 0
AND @upd_PreciosAcces = 0 AND @upd_PreciosLabor = 0
AND @upd_PreciosPartScrap = 0 AND @upd_PreciosPlata = 0
AND @upd_PreciosUnitario = 0
BEGIN
COMMIT TRAN
END
ELSE
BEGIN
RAISERROR('Error durante la actualizacion de precios',16,1)

ROLLBACK TRAN
END

SET NOCOUNT OFF
END
GO

Respuesta Responder a este mensaje
#2 Liliana Sorrentino
17/06/2005 - 18:45 | Informe spam
Además del comentario de Alejandro, veo que estás actualizando varias (seis)
veces la misma tabla, Costos de Envío, con la condicion
LIKE '%' + dato + '%'
, y depende del tamaño de esa tabla, puede llevarte demasiado tiempo ya que
recorrerá todas las filas.
¿No habrá otra forma de delimitar la cantidad de filas a actualizar?

Saludos,
Liliana.

"Alejandro Mesa" escribió en el
mensaje news:
Danilo,

Cuando lo ejecutas en QA, has medido el tiempo que demora el sp en
ejecutarse?. Si es mayor a 30 segundos entonces debes incrementar la
propiedad CommandTimeout del objeto connection.

...
oCon.CommandTimeout = 50
...


AMB

"Danilo" wrote:

> Saludos.
> Utilizo Access 2000 y SQL Server.
>
> Estoy tratando de ejecutar un procedimiento almacenado desde access con


la
> siguiente sentencia de conexion y siempre me da error de timeout


expired.
> Desde el SQL QUERY ANALIZER, se ejecuta sin problema.
>
> oCon.Provider = "sqloledb"
> oCon.Properties("Data Source").Value = swServidor
> oCon.Properties("Initial Catalog").Value = swBaseDatos
> oCon.Properties("user id").Value = Nz(DLookup("UID", "[Datos
> Servidor]"), "")
> oCon.Properties("password").Value = Nz(DLookup("PWD", "[Datos
> Servidor]"), "")
> oCon.ConnectionTimeout = 30
> oCon.Open
>
> oCon.Execute "ActualizaListaPrecios" '< Linea donde se para la
> ejecucion
> oCon.Close
>
> '********Procedimiento almacenado para su analisis*******
> CREATE PROCEDURE ActualizaListaPrecios AS
>
> BEGIN
>
> SET NOCOUNT ON
>
> DECLARE @ins_error INT
> DECLARE @del_Error INT
> DECLARE @upd_PreciosFinish INT
> DECLARE @upd_PreciosAcces INT
> DECLARE @upd_PreciosLabor INT
> DECLARE @upd_PreciosPartScrap INT
> DECLARE @upd_PreciosPlata INT
> DECLARE @upd_PreciosUnitario INT
>
> BEGIN TRAN
>
> INSERT INTO Articulos (Codigo, Descripcion, Tipo, Clase, Categoria,


[Unidad
> Medida], [Peso Estandar], Minimo, [Precio Unitario])
> SELECT Nuevos_Items.Articulo, Nuevos_Items.Tipo, Nuevos_Items.Tipo,
> 'Item/Articulo', Nuevos_Items.[KT], 'DWT',
> Nuevos_Items.[Peso Estandar], 0,0
> FROM Nuevos_Items
>
> SET @ins_error = @@ERROR
>
> UPDATE [Costos de Envio] SET [Tipo Factura] = N.[Tipo Factura],
> [Precio Material] = N.[Precio Material],
> [Precio Labor] = N.[Precio Labor],
> [Cantidad Piedra] = N.[Cantidad Piedra],
> [Precio Piedra] = N.[Precio Piedra],
> [Cantidad Accesorio] = N.[Cantidad Accesorio],
> [Precio Accesorio] = N.[Precio Accesorio],
> [Precio Unitario] = N.[Precio Unitario],
> [Peso Estandar] = N.[Peso Estandar]
> FROM [Costos de Envio] C INNER JOIN [Nuevos Precios] N
> ON C.Articulo = N.[Articulo]
> CROSS JOIN [Configuracion Local] L
> WHERE (C.[Tipo] NOT Like '%'+L.[Prefijo Desperdicio]+'%'
> AND C.[Tipo] NOT Like '%'+L.[Prefijo Parte]+'%')
>
> SET @upd_PreciosFinish = @@ERROR
>
> UPDATE [Costos de Envio] SET [Cantidad Piedra] > > CASE WHEN [Precio Piedra] > 0 THEN 1 ELSE 0 END,
> [Cantidad Accesorio]> > CASE WHEN [Precio Accesorio] > 0 THEN 1 ELSE 0 END
> WHERE ([Precio Accesorio] > 0 OR [Precio Piedra] >0)
>
> SET @upd_PreciosAcces = @@ERROR
>
> UPDATE [Costos de Envio] SET [Precio Labor]=0, [Tipo Factura]='A'
> FROM [Costos de Envio] CROSS JOIN [Configuracion Local] C
> WHERE [Costos de Envio].[Tipo] Like '%'+C.[Prefijo sin terminar]+'%'
> SET @upd_PreciosLabor = @@ERROR
>
> UPDATE [Costos de Envio] SET [Precio Material]> > CASE Categoria
> WHEN '10K' THEN 7.79 ELSE 10.94
> END, [Precio Unitario] > > CASE Categoria
> WHEN '10K' THEN 7.79 ELSE 10.94
> END, [Tipo Factura]='A', [Tipo Multiplicacion]='Por Peso',
> [Precio Labor]=0, [Precio Accesorio]=0, [Precio Piedra]=0,
> [Cantidad Piedra]=0, [Cantidad Accesorio]=0
> FROM [Costos de Envio] CROSS JOIN [Configuracion Local] C
> WHERE ([Costos de Envio].[Tipo] Like '%'+C.[Prefijo Parte]+'%'
> OR [Costos de Envio].[Tipo] Like '%'+C.[Prefijo Desperdicio]+'%')
>
> SET @upd_PreciosPartScrap = @@ERROR
>
> UPDATE [Costos de Envio] SET [Precio Material]=.30, [Precio Unitario]


=.30
> FROM [Costos de Envio] CROSS JOIN [Configuracion Local] C
> WHERE ([Costos de Envio].[Tipo] Like '%'+C.[Prefijo Parte]+'%'
> OR [Costos de Envio].[Tipo] Like '%'+C.[Prefijo Desperdicio]+'%')
> AND Categoria='SS'
>
> SET @upd_PreciosPlata = @@ERROR
>
> UPDATE [Costos de Envio] SET [Precio Unitario]> > [Precio Material]+[Precio Labor]+[Precio Piedra]+[Precio Accesorio]
> FROM [Costos de Envio]
>
> SET @upd_PreciosUnitario = @@ERROR
>
> DELETE [Nuevos Precios]
> SET @del_error = @@ERROR
>
> IF @ins_error = 0 AND @del_error = 0 AND @upd_PreciosFinish = 0
> AND @upd_PreciosAcces = 0 AND @upd_PreciosLabor = 0
> AND @upd_PreciosPartScrap = 0 AND @upd_PreciosPlata = 0
> AND @upd_PreciosUnitario = 0
> BEGIN
> COMMIT TRAN
> END
> ELSE
> BEGIN
> RAISERROR('Error durante la actualizacion de precios',16,1)
>
> ROLLBACK TRAN
> END
>
> SET NOCOUNT OFF
> END
> GO
>
Respuesta Responder a este mensaje
#3 Isaias
17/06/2005 - 19:04 | Informe spam
¿En tu Query Analyzer se tarda MAS DE 30 SEGUNDOS?, es el limite que estas
definiendo en tu ODBC.
Respuesta Responder a este mensaje
#4 Danilo
17/06/2005 - 22:18 | Informe spam
Saludos Alejandro.

He medio el tiempo y tarda en promedio 1 min 16 seg.
He ahumentado CommandTimeout = 180 y se ejecuto sin problema.
Te comento que en promedio los articulos que se actualizan rondan por los
2000.
el maestro de Articulos es de 70,000 items en promedio y aumentando.
la tabla de [Costos de Envio] ronda por los 270,000.

Gracias por tu ayuda.


"Alejandro Mesa" wrote:

Danilo,

Cuando lo ejecutas en QA, has medido el tiempo que demora el sp en
ejecutarse?. Si es mayor a 30 segundos entonces debes incrementar la
propiedad CommandTimeout del objeto connection.

...
oCon.CommandTimeout = 50
...


AMB

"Danilo" wrote:

> Saludos.
> Utilizo Access 2000 y SQL Server.
>
> Estoy tratando de ejecutar un procedimiento almacenado desde access con la
> siguiente sentencia de conexion y siempre me da error de timeout expired.
> Desde el SQL QUERY ANALIZER, se ejecuta sin problema.
>
> oCon.Provider = "sqloledb"
> oCon.Properties("Data Source").Value = swServidor
> oCon.Properties("Initial Catalog").Value = swBaseDatos
> oCon.Properties("user id").Value = Nz(DLookup("UID", "[Datos
> Servidor]"), "")
> oCon.Properties("password").Value = Nz(DLookup("PWD", "[Datos
> Servidor]"), "")
> oCon.ConnectionTimeout = 30
> oCon.Open
>
> oCon.Execute "ActualizaListaPrecios" '< Linea donde se para la
> ejecucion
> oCon.Close
>
> '********Procedimiento almacenado para su analisis*******
> CREATE PROCEDURE ActualizaListaPrecios AS
>
> BEGIN
>
> SET NOCOUNT ON
>
> DECLARE @ins_error INT
> DECLARE @del_Error INT
> DECLARE @upd_PreciosFinish INT
> DECLARE @upd_PreciosAcces INT
> DECLARE @upd_PreciosLabor INT
> DECLARE @upd_PreciosPartScrap INT
> DECLARE @upd_PreciosPlata INT
> DECLARE @upd_PreciosUnitario INT
>
> BEGIN TRAN
>
> INSERT INTO Articulos (Codigo, Descripcion, Tipo, Clase, Categoria, [Unidad
> Medida], [Peso Estandar], Minimo, [Precio Unitario])
> SELECT Nuevos_Items.Articulo, Nuevos_Items.Tipo, Nuevos_Items.Tipo,
> 'Item/Articulo', Nuevos_Items.[KT], 'DWT',
> Nuevos_Items.[Peso Estandar], 0,0
> FROM Nuevos_Items
>
> SET @ins_error = @@ERROR
>
> UPDATE [Costos de Envio] SET [Tipo Factura] = N.[Tipo Factura],
> [Precio Material] = N.[Precio Material],
> [Precio Labor] = N.[Precio Labor],
> [Cantidad Piedra] = N.[Cantidad Piedra],
> [Precio Piedra] = N.[Precio Piedra],
> [Cantidad Accesorio] = N.[Cantidad Accesorio],
> [Precio Accesorio] = N.[Precio Accesorio],
> [Precio Unitario] = N.[Precio Unitario],
> [Peso Estandar] = N.[Peso Estandar]
> FROM [Costos de Envio] C INNER JOIN [Nuevos Precios] N
> ON C.Articulo = N.[Articulo]
> CROSS JOIN [Configuracion Local] L
> WHERE (C.[Tipo] NOT Like '%'+L.[Prefijo Desperdicio]+'%'
> AND C.[Tipo] NOT Like '%'+L.[Prefijo Parte]+'%')
>
> SET @upd_PreciosFinish = @@ERROR
>
> UPDATE [Costos de Envio] SET [Cantidad Piedra] =
> CASE WHEN [Precio Piedra] > 0 THEN 1 ELSE 0 END,
> [Cantidad Accesorio]> > CASE WHEN [Precio Accesorio] > 0 THEN 1 ELSE 0 END
> WHERE ([Precio Accesorio] > 0 OR [Precio Piedra] >0)
>
> SET @upd_PreciosAcces = @@ERROR
>
> UPDATE [Costos de Envio] SET [Precio Labor]=0, [Tipo Factura]='A'
> FROM [Costos de Envio] CROSS JOIN [Configuracion Local] C
> WHERE [Costos de Envio].[Tipo] Like '%'+C.[Prefijo sin terminar]+'%'
> SET @upd_PreciosLabor = @@ERROR
>
> UPDATE [Costos de Envio] SET [Precio Material]> > CASE Categoria
> WHEN '10K' THEN 7.79 ELSE 10.94
> END, [Precio Unitario] > > CASE Categoria
> WHEN '10K' THEN 7.79 ELSE 10.94
> END, [Tipo Factura]='A', [Tipo Multiplicacion]='Por Peso',
> [Precio Labor]=0, [Precio Accesorio]=0, [Precio Piedra]=0,
> [Cantidad Piedra]=0, [Cantidad Accesorio]=0
> FROM [Costos de Envio] CROSS JOIN [Configuracion Local] C
> WHERE ([Costos de Envio].[Tipo] Like '%'+C.[Prefijo Parte]+'%'
> OR [Costos de Envio].[Tipo] Like '%'+C.[Prefijo Desperdicio]+'%')
>
> SET @upd_PreciosPartScrap = @@ERROR
>
> UPDATE [Costos de Envio] SET [Precio Material]=.30, [Precio Unitario] =.30
> FROM [Costos de Envio] CROSS JOIN [Configuracion Local] C
> WHERE ([Costos de Envio].[Tipo] Like '%'+C.[Prefijo Parte]+'%'
> OR [Costos de Envio].[Tipo] Like '%'+C.[Prefijo Desperdicio]+'%')
> AND Categoria='SS'
>
> SET @upd_PreciosPlata = @@ERROR
>
> UPDATE [Costos de Envio] SET [Precio Unitario]> > [Precio Material]+[Precio Labor]+[Precio Piedra]+[Precio Accesorio]
> FROM [Costos de Envio]
>
> SET @upd_PreciosUnitario = @@ERROR
>
> DELETE [Nuevos Precios]
> SET @del_error = @@ERROR
>
> IF @ins_error = 0 AND @del_error = 0 AND @upd_PreciosFinish = 0
> AND @upd_PreciosAcces = 0 AND @upd_PreciosLabor = 0
> AND @upd_PreciosPartScrap = 0 AND @upd_PreciosPlata = 0
> AND @upd_PreciosUnitario = 0
> BEGIN
> COMMIT TRAN
> END
> ELSE
> BEGIN
> RAISERROR('Error durante la actualizacion de precios',16,1)
>
> ROLLBACK TRAN
> END
>
> SET NOCOUNT OFF
> END
> GO
>
Respuesta Responder a este mensaje
#5 Danilo
17/06/2005 - 22:40 | Informe spam
Saludos Liliana.

Gracias por tu ayuda.
He aumentado el CommandTimeout = 180 como me sugirio alejandro y el proceso
se ejecuto sin problema. Le puse 180 porque el proceso dura 1 min. 16 seg en
promedio.
Te comento el proceso para ver si se puede mejorar.
Este es un sistema de manufactura de joya.

Las tablas que se actualizaran son las sigtes.
Articulos y [Costos de Envio]
Tablas auxiliares:
[Nuevos precios] contiene los nuevos precios de los items a actualizar en
promedio 2000 items.
[Configuracion Local] un solo registro.
Campos:
[Prefijo Sin Terminar] Para los articulos No Finish
[Prefijo Parte] Para el scrap de Part
[Prefijo Desperdicio] Para los articulos Scrap
...
Otros campos

Query:Nuevos_Items.

En el sistema existen cuatros tipos de items.
Ejemplo: Articulo Buenos, Scrap, No Finish, Part.
Esto es por cada Articulo que hay en el mastro de articulo existen cuatro
en la tabla de [Costo de Envio].
Ejemplo [Costos de Envio]:
Articulo Tipo ... Otros campos
E79633 14K Earring/Arete de 14K <-- Articulo buenos
E79633 14K Earring/Arete de 14K (No Finish) <-- Articulos no terminados
E79633 14K Earring/Arete de 14K (Part) <-- Partes
E79633 14K Earring/Arete de 14K (Scrap) <-- Articulos dañados.

1. Paso
Insertar articulos Nuevos, aqui se usa el Query de Nuevos_Items el cual
selecciona los articulos que estan en [Nuevos Precios] y no existen el
maestro de articulo.
Se dispara trigger por cada articulo insertado en el maestro de Articulo, el
cual inserta los cuatro tipo de articulo en la tabla de [Costos de Envio].

2. Paso.
Actualizar los precios de articulos Buenos y No Finish.
Aqui se actualizan solamentes los articulos buenos y finish se descartan el
Scrap y las partes.

3. Paso.
Actualizar Campo cantidad de piedra y Cantidad de Accesorio = 1 para cuando
el campo [Precio piedra] y [Precio Accesorio] se Mayor que cero.

4. Paso.
Actualiza Campo [Precio Labor]=0 para los articulos (No Finish) esto es
porque en el paso 2 tanto los articulos buenos y No Finish se actualizaron
con los mismo precios y cuando son (No Finish) hay que quitarle el precio de
labor.

5. Paso.
Actualizar Costos articulos Part & Scrap
Aqui dependiendo del Kilate tendran un precio diferente:
10K=7.79, (14K,18K,20K).94

6. Paso.
Actualizar precios scrap articulos de Plata.
Los articulos de plata son los que el campo Categoria='SS'
Aqui tuve que hacer un update separado ya que no pude incluirlo en el paso 5.

7. Paso.
Aqui se actualiza el precio unitario de todos los articulos el cual sera [Precio de material]+[Precio Labor]+[Precio Piedra]+[Precio Accesorio]

por ultimo se elimina los datos de la tabla [Nuevos Precios]

Cualquier informacion adicional, estoy a su dispocion.

Gracias.



"Liliana Sorrentino" wrote:

Además del comentario de Alejandro, veo que estás actualizando varias (seis)
veces la misma tabla, Costos de Envío, con la condicion
LIKE '%' + dato + '%'
, y depende del tamaño de esa tabla, puede llevarte demasiado tiempo ya que
recorrerá todas las filas.
¿No habrá otra forma de delimitar la cantidad de filas a actualizar?

Saludos,
Liliana.

"Alejandro Mesa" escribió en el
mensaje news:
> Danilo,
>
> Cuando lo ejecutas en QA, has medido el tiempo que demora el sp en
> ejecutarse?. Si es mayor a 30 segundos entonces debes incrementar la
> propiedad CommandTimeout del objeto connection.
>
> ...
> oCon.CommandTimeout = 50
> ...
>
>
> AMB
>
> "Danilo" wrote:
>
> > Saludos.
> > Utilizo Access 2000 y SQL Server.
> >
> > Estoy tratando de ejecutar un procedimiento almacenado desde access con
la
> > siguiente sentencia de conexion y siempre me da error de timeout
expired.
> > Desde el SQL QUERY ANALIZER, se ejecuta sin problema.
> >
> > oCon.Provider = "sqloledb"
> > oCon.Properties("Data Source").Value = swServidor
> > oCon.Properties("Initial Catalog").Value = swBaseDatos
> > oCon.Properties("user id").Value = Nz(DLookup("UID", "[Datos
> > Servidor]"), "")
> > oCon.Properties("password").Value = Nz(DLookup("PWD", "[Datos
> > Servidor]"), "")
> > oCon.ConnectionTimeout = 30
> > oCon.Open
> >
> > oCon.Execute "ActualizaListaPrecios" '< Linea donde se para la
> > ejecucion
> > oCon.Close
> >
> > '********Procedimiento almacenado para su analisis*******
> > CREATE PROCEDURE ActualizaListaPrecios AS
> >
> > BEGIN
> >
> > SET NOCOUNT ON
> >
> > DECLARE @ins_error INT
> > DECLARE @del_Error INT
> > DECLARE @upd_PreciosFinish INT
> > DECLARE @upd_PreciosAcces INT
> > DECLARE @upd_PreciosLabor INT
> > DECLARE @upd_PreciosPartScrap INT
> > DECLARE @upd_PreciosPlata INT
> > DECLARE @upd_PreciosUnitario INT
> >
> > BEGIN TRAN
> >
> > INSERT INTO Articulos (Codigo, Descripcion, Tipo, Clase, Categoria,
[Unidad
> > Medida], [Peso Estandar], Minimo, [Precio Unitario])
> > SELECT Nuevos_Items.Articulo, Nuevos_Items.Tipo, Nuevos_Items.Tipo,
> > 'Item/Articulo', Nuevos_Items.[KT], 'DWT',
> > Nuevos_Items.[Peso Estandar], 0,0
> > FROM Nuevos_Items
> >
> > SET @ins_error = @@ERROR
> >
> > UPDATE [Costos de Envio] SET [Tipo Factura] = N.[Tipo Factura],
> > [Precio Material] = N.[Precio Material],
> > [Precio Labor] = N.[Precio Labor],
> > [Cantidad Piedra] = N.[Cantidad Piedra],
> > [Precio Piedra] = N.[Precio Piedra],
> > [Cantidad Accesorio] = N.[Cantidad Accesorio],
> > [Precio Accesorio] = N.[Precio Accesorio],
> > [Precio Unitario] = N.[Precio Unitario],
> > [Peso Estandar] = N.[Peso Estandar]
> > FROM [Costos de Envio] C INNER JOIN [Nuevos Precios] N
> > ON C.Articulo = N.[Articulo]
> > CROSS JOIN [Configuracion Local] L
> > WHERE (C.[Tipo] NOT Like '%'+L.[Prefijo Desperdicio]+'%'
> > AND C.[Tipo] NOT Like '%'+L.[Prefijo Parte]+'%')
> >
> > SET @upd_PreciosFinish = @@ERROR
> >
> > UPDATE [Costos de Envio] SET [Cantidad Piedra] > > > CASE WHEN [Precio Piedra] > 0 THEN 1 ELSE 0 END,
> > [Cantidad Accesorio]> > > CASE WHEN [Precio Accesorio] > 0 THEN 1 ELSE 0 END
> > WHERE ([Precio Accesorio] > 0 OR [Precio Piedra] >0)
> >
> > SET @upd_PreciosAcces = @@ERROR
> >
> > UPDATE [Costos de Envio] SET [Precio Labor]=0, [Tipo Factura]='A'
> > FROM [Costos de Envio] CROSS JOIN [Configuracion Local] C
> > WHERE [Costos de Envio].[Tipo] Like '%'+C.[Prefijo sin terminar]+'%'
> > SET @upd_PreciosLabor = @@ERROR
> >
> > UPDATE [Costos de Envio] SET [Precio Material]> > > CASE Categoria
> > WHEN '10K' THEN 7.79 ELSE 10.94
> > END, [Precio Unitario] > > > CASE Categoria
> > WHEN '10K' THEN 7.79 ELSE 10.94
> > END, [Tipo Factura]='A', [Tipo Multiplicacion]='Por Peso',
> > [Precio Labor]=0, [Precio Accesorio]=0, [Precio Piedra]=0,
> > [Cantidad Piedra]=0, [Cantidad Accesorio]=0
> > FROM [Costos de Envio] CROSS JOIN [Configuracion Local] C
> > WHERE ([Costos de Envio].[Tipo] Like '%'+C.[Prefijo Parte]+'%'
> > OR [Costos de Envio].[Tipo] Like '%'+C.[Prefijo Desperdicio]+'%')
> >
> > SET @upd_PreciosPartScrap = @@ERROR
> >
> > UPDATE [Costos de Envio] SET [Precio Material]=.30, [Precio Unitario]
=.30
> > FROM [Costos de Envio] CROSS JOIN [Configuracion Local] C
> > WHERE ([Costos de Envio].[Tipo] Like '%'+C.[Prefijo Parte]+'%'
> > OR [Costos de Envio].[Tipo] Like '%'+C.[Prefijo Desperdicio]+'%')
> > AND Categoria='SS'
> >
> > SET @upd_PreciosPlata = @@ERROR
> >
> > UPDATE [Costos de Envio] SET [Precio Unitario]> > > [Precio Material]+[Precio Labor]+[Precio Piedra]+[Precio Accesorio]
> > FROM [Costos de Envio]
> >
> > SET @upd_PreciosUnitario = @@ERROR
> >
> > DELETE [Nuevos Precios]
> > SET @del_error = @@ERROR
> >
> > IF @ins_error = 0 AND @del_error = 0 AND @upd_PreciosFinish = 0
> > AND @upd_PreciosAcces = 0 AND @upd_PreciosLabor = 0
> > AND @upd_PreciosPartScrap = 0 AND @upd_PreciosPlata = 0
> > AND @upd_PreciosUnitario = 0
> > BEGIN
> > COMMIT TRAN
> > END
> > ELSE
> > BEGIN
> > RAISERROR('Error durante la actualizacion de precios',16,1)
> >
> > ROLLBACK TRAN
> > END
> >
> > SET NOCOUNT OFF
> > END
> > GO
> >



Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida